为什么有的研究将trinity 参数假设检验的研究min

10037人阅读
这几天有些空闲时间,把改编自MangOS的魔兽私服Trinitycore代码梳理一下,也给有这方面兴趣的童鞋一个交流空间,可能会连载15篇左右,大家慢慢看首先把整体架构网络层说一下
打开整个工程,找到Trinitycore项目,game这个库引用了framework,shared等库,以后有时间再一一介绍
Trinitycore_build_8128_for_client_333a/src/trinitycore/Main.cpp
这个主函数其实就是提取配置文件名称和在Windows环境下以WIN32 服务方式使用的三种情况,这种编程手法在我们很多项目中都很常见,就不多说了
最主要的就是这句
&return sMaster.Run();
这里最重要的一个步骤就是void World::SetInitialWorldSettings()其实我们做过网游开发的人都应该知道,这就是加载服务器的各种资源文件,初始化场景,初始化脚本引擎,序列化文件读取之类的步骤,每款游戏各有不同,但都是启动前最耗时间的一段程序
然后就是启动4个线程&ACE_Based::Thread world_thread(new WorldRunnable);&&& &world_thread.setPriority(ACE_Based::Highest);
&ACE_Based::Thread* cliThread = NULL;
&cliThread = new ACE_Based::Thread(new CliRunnable);
&ACE_Based::Thread rar_thread(new RARunnable);&FreezeDetectorRunnable *fdr = new FreezeDetectorRunnable();
接着取得IP,和端口开始网络服务int WorldSocketMgr::StartNetwork (ACE_UINT16 port, const char* address)这个函数很明显,大家都可以找到,也可以很轻松找到下一个函数
int& WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address)
在分析这个函数时不得不去仔细阅读一下另一个类的声明,只看一部分就够了typedef ACE_Svc_Handler&ACE_SOCK_STREAM, ACE_NULL_SYNCH& WorldHclass WorldSocket : protected WorldHandler{&&& public:&&&&&&& /// Declare some friends&&&&&&& friend class ACE_Acceptor& WorldSocket, ACE_SOCK_ACCEPTOR &;&&&&&&& friend class WorldSocketM&&&&&&& friend class ReactorR
&&&&&&& /// Declare the acceptor for this class&&&&&&& typedef ACE_Acceptor& WorldSocket, ACE_SOCK_ACCEPTOR & A----------这个模板定义很重要
WorldSocket 的 open 方法由接受器工厂在连接建立之后调用的时候调用
这样思路就完全清晰了
int WorldSocket::open (void *a)
函数中通过&& if (sWorldSocketMgr-&OnSocketOpen (this) == -1)&----这个方法,把这个SOCKET对象放入了一个合适的线程中&&&&&& &&return -1;
最后就是网络包对应逻辑处理的流程
WorldSocket::handle_input (ACE_HANDLE)---WorldSocket::handle_input_missing_data---WorldSocket::handle_input_payload---WorldSocket::ProcessIncoming (WorldPacket* new_pct)---最后进入int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)此函数最重要的部分,列出如下
//这句话生成了玩家的session,并保存&&& ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale), -1);
&&& m_Crypt.Init(&K);
&&& m_Session-&LoadGlobalAccountData();&&& m_Session-&LoadTutorialsData();&&& m_Session-&ReadAddonsInfo(recvPacket);
&&& // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec&&& ACE_OS::sleep (ACE_Time_Value (0, 10000));
&&& sWorld.AddSession (m_Session);
网络这一块真是难以用很漂亮的语言描述清楚,中间再加一个小插曲
WorldSocketMgr.cpp中定义了一个主动对象类,这个就是sWorldSocketMgr-&OnSocketOpen函数中分担各个WorldSocket的那个线程类
&&&&&&& virtual int svc ()&&&&&&& {&&&&&&&&&&& DEBUG_LOG ("Network Thread Starting");
&&&&&&&&&&& WorldDatabase.ThreadStart();
&&&&&&&&&&& ACE_ASSERT (m_Reactor);
&&&&&&&&&&& SocketSet::iterator i,
&&&&&&&&&&& while (!m_Reactor-&reactor_event_loop_done ())&&&&&&&&&&& {&&&&&&&&&&&&&&& // dont be too smart to move this outside the loop&&&&&&&&&&&&&&& // the run_reactor_event_loop will modify interval&&&&&&&&&&&&&&& ACE_Time_Value interval (0, 10000);
&&&&&&&&&&&&&&& if (m_Reactor-&run_reactor_event_loop (interval) == -1)&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& AddNewSockets ();
&&&&&&&&&&&&&&& for (i = m_Sockets.begin (); i != m_Sockets.end ();)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& if ((*i)-&Update () == -1)-------------这就是int WorldSocket::Update (void)&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& t =&&&&&&&&&&&&&&&&&&&&&&& ++i;&&&&&&&&&&&&&&&&&&&&&&& (*t)-&CloseSocket ();&&&&&&&&&&&&&&&&&&&&&&& (*t)-&RemoveReference ();&&&&&&&&&&&&&&&&&&&&&&& --m_C&&&&&&&&&&&&&&&&&&&&&&& m_Sockets.erase (t);&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& else&&&&&&&&&&&&&&&&&&&&&&& ++i;&&&&&&&&&&&&&&& }&&&&&&&&&&& }
&&&&&&&&&&& WorldDatabase.ThreadEnd();
&&&&&&&&&&& DEBUG_LOG ("Network Thread Exitting");
&&&&&&&&&&& return 0;&&&&&&& }
然而在AddNewSockets ()中,他把这一批次生成的新连接保存到另一个叫作
m_Sockets的数据成员中,并把起初保存WorldSocket的m_NewSockets清空而正是由于在下面这个函数中m_NewSockets被填充
&&&&&&& int AddSocket (WorldSocket* sock)&&&&&&& &{&&&&&&&&&&& &&ACE_GUARD_RETURN (ACE_Thread_Mutex, Guard, m_NewSockets_Lock, -1);
&&&&&&&&&&& &&++m_C&&&&&&&&&&& &&sock-&AddReference();&&&&&&&&&&& &&sock-&reactor (m_Reactor);&&&&&&&&&&& &&m_NewSockets.insert (sock);
&&&&&&&&&& &&&return 0;&&&&&&& &}
导火索又回到了
int WorldSocketMgr::OnSocketOpen (WorldSocket* sock){
&&& for (size_t i = 1; i & m_NetThreadsC ++i)&&&&&&& &if (m_NetThreads[i].Connections () & m_NetThreads[min].Connections ())&&&&&&&&&&& &&min =
&&& &&& return m_NetThreads[min].AddSocket (sock);}
最后,我们进入最关键的类World
还记得刚才描述过的流程吗在这一步
int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)里面生成了玩家的Session
&&& ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale), -1);&.....&&& sWorld.AddSession (m_Session);
注意有一个插曲
void World::AddSession(WorldSession* s)
&addSessQueue.add(s);//先暂时放到了 ACE_Based::LockedQueue&WorldSession*, ACE_Thread_Mutex& addSessQ}
而后再下面这个函数中
void World::UpdateSessions(uint32 diff){&&& ///- Add new sessions&&& WorldSession*&&& while (addSessQueue.next(sess))&&&&&&& AddSession_ (sess);&//又通过AddSession_ 将WorldSession*保存到了一个typedef UNORDERED_MAP&uint32, WorldSession*& SessionM& SessionMap m_sessions 这样类型的容器中;
&&& ///- Then send an update signal to remaining ones&&& for (SessionMap::iterator itr = m_sessions.begin(), itr != m_sessions.end(); itr = next)&&& {&&&&&&& next =&&&&&&& ++
&&&&&&& ///- and remove not active sessions from the list&&&&&&& if (!itr-&second-&Update(diff))&&&&&&&&&&&&&&&&&&&&& // As interval = 0&&&&&&& {&&&&&&&&&&& if (!RemoveQueuedPlayer(itr-&second) && itr-&second && getConfig(CONFIG_INTERVAL_DISCONNECT_TOLERANCE))&&&&&&&&&&&&&&& m_disconnects[itr-&second-&GetAccountId()] = time(NULL);&&&&&&&&&&& delete itr-&&&&&&&&&&&& m_sessions.erase(itr);&&&&&&& }&&& }}其实这种先放到一个,再放入一个正式的容器,其实是为了踢号用的
最后指出几个地方,这是处理逻辑的
world的update在此调用
/// Heartbeat for the Worldvoid WorldRunnable::run(){&&& ///- Init new SQL thread for the world database&&& WorldDatabase.ThreadStart();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // let thread do safe mySQL requests (one connection call enough)
&&& sWorld.InitResultQueue();
&&& uint32 realCurrTime = 0;&&& uint32 realPrevTime = getMSTime();
&&& uint32 prevSleepTime = 0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // used for balanced full tick time length near WORLD_SLEEP_CONST
&&& ///- While we have not World::m_stopEvent, update the world&&& while (!World::IsStopped())&&& {&&&&&&& ++World::m_worldLoopC&&&&&&& realCurrTime = getMSTime();
&&&&&&& uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime);
&&&&&&& sWorld.Update( diff );------------------------------------------------------在这&&&&&&& realPrevTime = realCurrT
&&&&&&& // diff (D0) include time of previous sleep (d0) + tick time (t0)&&&&&&& // we want that next d1 + t1 == WORLD_SLEEP_CONST&&&&&&& // we can't know next t1 and then can use (t0 + d1) == WORLD_SLEEP_CONST requirement&&&&&&& // d1 = WORLD_SLEEP_CONST - t0 = WORLD_SLEEP_CONST - (D0 - d0) = WORLD_SLEEP_CONST + d0 - D0&&&&&&& if (diff &= WORLD_SLEEP_CONST+prevSleepTime)&&&&&&& {&&&&&&&&&&& prevSleepTime = WORLD_SLEEP_CONST+prevSleepTime-&&&&&&&&&&& ACE_Based::Thread::Sleep(prevSleepTime);&&&&&&& }&&&&&&& else&&&&&&&&&&& prevSleepTime = 0;
&&&&&&& #ifdef WIN32&&&&&&&&&&& if (m_ServiceStatus == 0) World::StopNow(SHUTDOWN_EXIT_CODE);&&&&&&&&&&& while (m_ServiceStatus == 2) Sleep(1000);&&&&&&& #endif&&& }
&&& sWorld.KickAll();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // save and kick all players&&& sWorld.UpdateSessions( 1 );&&&&&&&&&&&&&&&&&&&&&&&&&&&& // real players unload required UpdateSessions call
&&& // unload battleground templates before different singletons destroyed&&& sBattleGroundMgr.DeleteAllBattleGrounds();
&&& sWorldSocketMgr-&StopNetwork();
&&& MapManager::Instance().UnloadAll();&&&&&&&&&&&&&&&&&&&& // unload all grids (including locked in memory)
&&& ///- End the database thread&&& WorldDatabase.ThreadEnd();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // free mySQL thread resources}
worldsession 的update在
/// Update the World !void World::Update(uint32 diff){&&& m_updateTime = uint32(diff);&&& if (m_configs[CONFIG_INTERVAL_LOG_UPDATE])&&& {&&&&&&& if (m_updateTimeSum & m_configs[CONFIG_INTERVAL_LOG_UPDATE])&&&&&&& {&&&&&&&&&&& sLog.outBasic("Update time diff: %u. Players online: %u.", m_updateTimeSum / m_updateTimeCount, GetActiveSessionCount());&&&&&&&&&&& m_updateTimeSum = m_updateT&&&&&&&&&&& m_updateTimeCount = 1;&&&&&&& }&&&&&&& else&&&&&&& {&&&&&&&&&&& m_updateTimeSum += m_updateT&&&&&&&&&&& ++m_updateTimeC&&&&&&& }&&& }
&&& ///- Update the different timers&&& for (int i = 0; i & WUPDATE_COUNT; ++i)&&&&&&& if (m_timers[i].GetCurrent() &= 0)&&&&&&&&&&& m_timers[i].Update(diff);&&& else m_timers[i].SetCurrent(0);
&&& ///- Update the game time and check for shutdown time&&& _UpdateGameTime();
&&& /// Handle daily quests reset time&&& if (m_gameTime & m_NextDailyQuestReset)&&& {&&&&&&& ResetDailyQuests();&&&&&&& m_NextDailyQuestReset += DAY;&&& }
&&& if (m_gameTime & m_NextWeeklyQuestReset)&&&&&&& ResetWeeklyQuests();
&&& /// &ul&&li& Handle auctions when the timer has passed&&& if (m_timers[WUPDATE_AUCTIONS].Passed())&&& {&&&&&&& auctionbot.Update();&&&&&&& m_timers[WUPDATE_AUCTIONS].Reset();
&&&&&&& ///- Update mails (return old mails with item, or delete them)&&&&&&& //(tested... works on win)&&&&&&& if (++mail_timer & mail_timer_expires)&&&&&&& {&&&&&&&&&&& mail_timer = 0;&&&&&&&&&&& objmgr.ReturnOrDeleteOldMails(true);&&&&&&& }
&&&&&&& ///- Handle expired auctions&&&&&&& auctionmgr.Update();&&& }
&&& /// &li& Handle session updates when the timer has passed&&& RecordTimeDiff(NULL);&&& UpdateSessions(diff);-----------------------------------------------------在这里&&& RecordTimeDiff("UpdateSessions");
&&& /// &li& Handle weather updates when the timer has passed&&& if (m_timers[WUPDATE_WEATHERS].Passed())&&& {&&&&&&& m_timers[WUPDATE_WEATHERS].Reset();
&&&&&&& ///- Send an update signal to Weather objects&&&&&&& WeatherMap::iterator itr,&&&&&&& for (itr = m_weathers.begin(); itr != m_weathers.end(); itr = next)&&&&&&& {&&&&&&&&&&& next =&&&&&&&&&&& ++
&&&&&&&&&&& ///- and remove Weather objects for zones with no player&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //As interval & WorldTick&&&&&&&&&&& if (!itr-&second-&Update(m_timers[WUPDATE_WEATHERS].GetInterval()))&&&&&&&&&&& {&&&&&&&&&&&&&&& delete itr-&&&&&&&&&&&&&&&& m_weathers.erase(itr);&&&&&&&&&&& }&&&&&&& }&&& }&&& /// &li& Update uptime table&&& if (m_timers[WUPDATE_UPTIME].Passed())&&& {&&&&&&& uint32 tmpDiff = (m_gameTime - m_startTime);&&&&&&& uint32 maxClientsNum = GetMaxActiveSessionCount();
&&&&&&& m_timers[WUPDATE_UPTIME].Reset();&&&&&&& loginDatabase.PExecute("UPDATE uptime SET uptime = %u, maxplayers = %u WHERE realmid = %u AND starttime = " UI64FMTD, tmpDiff, maxClientsNum, realmID, uint64(m_startTime));&&& }
&&& /// &li& Clean logs table&&& if (sWorld.getConfig(CONFIG_LOGDB_CLEARTIME) & 0) // if not enabled, ignore the timer&&& {&&&&&&& if (m_timers[WUPDATE_CLEANDB].Passed())&&&&&&& {&&&&&&&&&&& //uint32 tmpDiff = (m_gameTime - m_startTime);&&&&&&&&&&& //uint32 maxClientsNum = sWorld.GetMaxActiveSessionCount();
&&&&&&&&&&& m_timers[WUPDATE_CLEANDB].Reset();&&&&&&&&&&& loginDatabase.PExecute("DELETE FROM logs WHERE (time + %u) & "UI64FMTD";",&&&&&&&&&&&&&&& sWorld.getConfig(CONFIG_LOGDB_CLEARTIME), uint64(time(0)));&&&&&&& }&&& }
&&& /// &li& Handle all other objects&&& ///- Update objects when the timer has passed (maps, transport, creatures,...)&&& MapManager::Instance().Update(diff);&&&&&&&&&&&&&&& // As interval = 0
&&& /*if (m_timers[WUPDATE_OBJECTS].Passed())&&& {&&&&&&& m_timers[WUPDATE_OBJECTS].Reset();&&&&&&& MapManager::Instance().DoDelayedMovesAndRemoves();&&& }*/
&&& static uint32 autobroadcaston = 0;&&& autobroadcaston = sConfig.GetIntDefault("AutoBroadcast.On", 0);&&& if (autobroadcaston == 1)&&& {&&&&&& if (m_timers[WUPDATE_AUTOBROADCAST].Passed())&&&&&& {&&&&&&&&& m_timers[WUPDATE_AUTOBROADCAST].Reset();&&&&&&&&& SendRNDBroadcast();&&&&&& }&&& }
&&& sBattleGroundMgr.Update(diff);&&& RecordTimeDiff("UpdateBattleGroundMgr");
&&& sOutdoorPvPMgr.Update(diff);&&& RecordTimeDiff("UpdateOutdoorPvPMgr");
&&& // execute callbacks from sql queries that were queued recently&&& UpdateResultQueue();&&& RecordTimeDiff("UpdateResultQueue");
&&& ///- Erase corpses once every 20 minutes&&& if (m_timers[WUPDATE_CORPSES].Passed())&&& {&&&&&&& m_timers[WUPDATE_CORPSES].Reset();
&&&&&&& CorpsesErase();&&& }
&&& ///- Process Game events when necessary&&& if (m_timers[WUPDATE_EVENTS].Passed())&&& {&&&&&&& m_timers[WUPDATE_EVENTS].Reset();&&&&&&&&&&&&&&&&&& // to give time for Update() to be processed&&&&&&& uint32 nextGameEvent = gameeventmgr.Update();&&&&&&& m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent);&&&&&&& m_timers[WUPDATE_EVENTS].Reset();&&& }
&&& // update the instance reset times&&& sInstanceSaveManager.Update();
&&& // And last, but not least handle the issued cli commands&&& ProcessCliCommands();}
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50886次
排名:千里之外
原创:19篇
评论:33条
(1)(3)(2)(6)(3)(6)Trinity的安装与使用
一、 Trinity简介
开发的转录组de
novo组装软件,由三个独立的软件模块组成:Inchworm,Chrysalis和Butterfly。三个软件依次来处理大规模的RNA-seq的reads数据。Trinity的简要工作流程为:
将RNA-seq的原始reads数据组装成Unique序列; Chrysalis:
将上一步生成的contigs聚类,然后对每个类构建Bruijn图; Butterfly:
处理这些Bruijn图,依据图中reads和成对的reads来寻找路径,从而得到具有可变剪接的全长转录子,同时将旁系同源基因的转录子分开。
Trinity发表在 。
二、 Trinity的安装
2. 安装Trinity。
$ tar zxvf trinityrnaseq_r.tgz
$ cd trinityrnaseq_r
仅需要在安装目录下进行make即可。该命令编译了由C++编写的Inchworm和Chrysalis,而
使用Java编写的Butterfly则不需要编译,可以直接使用。
三、Trinity的使用
直接运行安装目录下的程序Trinity.pl来使用该软件,不带参数则给出使用帮助。其典型用法为:
Trinity.pl --seqType fq --JM 50G --left reads_1.fq
--right reads_2.fq --CPU 6
2. Trinity参数
必须的参数:
reads的类型:(cfa, cfq, fa, or fq)
jellyfish使用多少G内存用来进行k-mer的计算,包含‘G’这个字符
左边的reads的文件名
右边的reads的文件名
不成对的reads的文件名
可选参数:
--SS_lib_type
reads的方向。成对的reads: RF or FR; 不成对的reads
: F or R。在数据具有链特异性的时候,设置此参数,则正义和反义转录子能得到区分。默认
情况下,不设置此参数,reads被当作非链特异性处理。FR: 匹配时,read1在5'端上游,
和前导链一致, read2在3'下游, 和前导链反向互补. 或者read2在上游, read1在下游反
向互补; RF: read1在5'端上游, 和前导链反向互补, read2在3'端下游, 和前导链一致;
输出结果文件夹。默认情况下生成trinity_out_dir文件夹并
将输出结果保存到此文件夹中。
使用的CPU线程数,默认为2
--min_contig_length
报告出的最短的contig长度。默认为200
--jaccard_clip
如果两个转录子之间有UTR区重叠,则这两个转录子很有可能在
de novo组装的时候被拼接成一条序列,称为融合转录子(Fusion Transcript)。如果有
fastq格式的paired reads,并尽可能减少此类组装错误,则选用此参数。值得说明的是:
1. 适合于基因在基因组比较稠密,转录子经常在UTR区域重叠的物种,比如真菌基因组。而对
于脊椎动物和植物,则不推荐使用此参数; 2. 要求fastq格式的paired reads文件(文件
中reads名分别以/1和/2结尾,以利于软件识别),同时还需要安装bowtie软件用于reads
3. 单独使用具有链特异性的RNA-seq数据的时候,能极大地减少UTR重叠区很小的
融合转录子; 4. 此选项耗费运算,若没必要,则不用此参数。
仅仅准备一些文件(利于I/O)并在kmer计算前停止程序运行
--no_cleanup
保留所有的中间输入文件
--full_cleanup
仅保留Trinity fasta文件,并重命名成${output_dir}.
Trinity.fasta
显示Trinity文献引证和一些参与的软件工具
报告Trinity版本并推出
Inchworm 和 K-mer 计算相关选项:
--min_kmer_cov
使用Inchworm来计算K-mer数量时候,设置的Kmer的最小值。
--inchworm_cpu
Inchworm使用的CPU线程数,默认为6和--CPU设置的值中的
Chrysalis相关选项:
--max_reads_per_graph
在一个Bruijn图中锚定的最大的reads数目,默认为200
--no_run_chrysalis
运行Inchworm完毕,在运行chrysalis之前停止运行
--no_run_quantifygraph
在平行化运算quantifygrahp前停止运行Trinity
Butterfly相关选项:
--bfly_opts
Butterfly额外的参数
--max_number_of_paths_per_node 从node A -& B,最多允许多少条路径。默认
--group_pairs_distance
最大插入片读长度,默认为500
--path_reinforcement_distance
延长转录子路径时候,reads间最小的重叠碱基
数。默认PE:75; SE:25
--no_triplet_lock
不锁定triplet-supported nodes
--bflyHeapSpaceMax
运行Butterfly时java最大的堆积空间,默认
--bflyHeapSpaceInit
java初始的堆积空间,默认为1G
--bflyGCThreads
java进行无用信息的整理时使用的线程数,默
认由java来决定
运行Butterfly时使用的CPU线程数,默认为2
--bflyCalculateCPU
计算Butterfly所运行的CPU线程数,由公式
&80% * max_memory / maxbflyHeapSpaceMax 得到
--no_run_butterfly
在Chrysalis运行完毕后,停止运行Butterfly
Grid-computing选项:
--grid_computing_module
选定Perl模块,在/Users/bhaas/SVN/trinityr
naseq/trunk/PerlLibAdaptors/。
适合于illumina测序数据的真菌物种转录组组装的Trinity命令为:
Trinity.pl --seqType fq --JM 50G --left reads_1.fq
--right reads_2.fq --SS_lib_type FR& --output transcriptome_tissue --CPU 24 --jaccard_clip --inchworm_cpu 24 --group_pairs_distance 500 --bflyCPU 24
4. Trinity生成的结果文件
运行程序结束后,转录组结果为trinity_out_dir/Trinity.fasta。可以使用软件所带的一支程序分析转录组统计信息。
$ $TRINITY_HOME/util/TrinityStats.pl trinity_out_dir/Trinity.fasta
Total trinity transcripts:
Total trinity components:
Contig N50: 554
三. Trinity运行原理与过程
检测java的可运行性,因为buttfly会用到
运行jellyfish,使用其dump命令得到jellyfish.kmers.fa文件
3. Inchworm(Linear contig
construction from k-mers)
assembles the RNA-seq data into
the unique sequences of transcripts, often generating full-length
transcripts for a dominant isoform, but then reports just the
unique portions of alternatively spliced transcripts.
4. Chrysalis
clusters the Inchworm contigs
into clusters and constructs complete de Bruijn graphs for each
cluster. Each cluster represents the full transcriptonal complexity
for a given gene (or sets of genes that share sequences in common).
Chrysalis then partitions the full read set among these disjoint
5. Butterfly
then processes the individual
graphs in parallel, tracing the paths that reads and pairs of reads
take within the graph, ultimately reporting full-length transcripts
for alternatively spliced isoforms, and teasing apart transcripts
that corresponds to paralogous genes.
四. 注意事项
1 Trinity分步运行
当数据量比较大的时候,trinity运行的时间会很长,同时,内存不够等情况出现的时候有可能程序运行崩溃。最好是分步运行。下一步会接着前一步进行下去。
Stage 1: generate the
kmer-catalog and run Inchworm: &no_run_chrysalis
Stage 2: Chrysalis clustering of
inchworm contigs and mapping reads:
&no_run_quantifygraph
Stage 3: Chrysalis deBruijn graph
construction: &no_run_butterfly
Stage 4: Run butterfly, generate
final Trinity.fasta file. (exclude &no_ options)
2 计算资源
Ideally, you will have access to
a large-memory server, ideally having ~1G of RAM per 1M reads to be
assembled (but often, much less memory may be required).
The assembly from start to finish
can take anywhere from ~1/2 hour to 1 hour per million reads (your
mileage may vary). 个人记录了一次,使用dell服务器,64GB RAM,24 threads : 53M
的reads,运行了16.5h(平均3.2M/h),内存使用峰值为43G.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您的位置: &
3min台阶测试中不同水平人群的脑电活动参数的研究Canticle of the Trinity - Lévon Minassian/Armand Amar - 网易云音乐
Canticle of the Trinity
歌手: - (勒翁.米纳希安) /
所属专辑:
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:

我要回帖

更多关于 ipadmin2参数 的文章

 

随机推荐