自动Centiloid计算工具笔记
因为做科研需要大量计算Centiloid指标,遂尝试编写一款简单的portable小程序,研究发现技术栈用cpp比较合适,研究过程记录如下。
关键步骤重点参考了CMU的课程Methods in (Bio)Medical Image Analysis
编译SimpleITK
编译SITK可以参考下面两篇文章
SITK官网教程
CMU入门课程
下面开始进行SimpleITK的安装
git clone https://github.com/SimpleITK/SimpleITK.git到本地
根目录名称不能太长,Windows下对路径有最大长度限制(~260),而SITK里面嵌套的目录很长
C++的包管理似乎都是在本地的,不像python有pip那么方便
进行out-of-tree-build
简单说,in-tree-build就是先写代码,然后吧代码跟sitk一起编译,这种方法可以修改sitk原始代码,但是容器引起混乱
out-of-tree-build是先把代码编译成二进制,然后再使用
sitk源码路径./SimpleITK
目标编译路径./SITKBin
启动CM ...
MOT格式笔记
需要注意的是
MOT的标准格式为frame, id, x, y, w, h, …
mmdetection/segTracker的返回一般为xyxy
SuStaIn学习笔记
问题
对于慢性病而言,疾病有自身的亚型差异与演进过程。
然而,横断面研究只能捕获某一瞬间某个个体的患病情况。
我们该如何根据许多个横断面,同时推测人群中的个体所患疾病的亚型,以及疾病的演进过程?
SuStaIn
我们定义,如果某种疾病的某些标志物以某一种特定形式演进,那它就构成一种亚型。
对于个体jjj,我们可以测量生物标志物iii,得到观测xijx_{ij}xij,我们的数据集可以表示为Xxij∣i=1,⋯ ,I,j=1,⋯ ,JX{x_{ij}|i=1, \cdots, I,j=1, \cdots, J}Xxij∣i=1,⋯,I,j=1,⋯,J。如果生物标志物iii提示了异常(或者指示了某个事件),就记作EiE_iEi。
我们想计算在这个群体中事件发生的顺序SSS,可以使下面的式子概率最大
P(X∣S)=∏j=1J[∑k=0I(P(k)∏i=1kP(xij∣Ei)∏i=k+1IP(xij∣¬Ei))]P(X|S) = \prod_{j=1}^J\left[\sum_{k=0}^I\left(P(k)\prod_{i=1}^kP\left(x_{ij}|E_i\right)\p ...
生信生存指南
Gene Ontology Analysis
GO分析用于回答一个简单而关键的问题:
“Given a list of genes found to be differentially expressed in my phenotype (e.g. disease) vs. control (e.g. healthy), what are the biological processes, cellular components and molecular functions that are implicated in this phenotype?”
GO富集分析:假如我有200个基因,我去数据库里找这200个基因都有什么功能。假如200个基因里160都跟细胞分裂有关,就有一定把握认为,这种疾病可能与细胞分裂有关。
需要注意的是,不能简单的用计数方法来评判哪些生物过程更重要,因为不同生物过程复杂程度不一样,一些生物过程可能涉及海量基因,另一些可能只涉及几个基因!
Gene Set Enrichment Analysis(GSEA)分析:假如你在研究某种心脏病(例如畸形),你从病 ...
访问者模式
访问者模式可以将算法与其操作的对象类进行解耦。这种模式通过构建一个新的Visitor类,以防止新功能被整合进已有的类中(至少以更小的代价被整合进已有类中)。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364class Shape { public: virtual void move(int x, int y) = 0; virtual void draw() = 0; virtual void accept(Visitor* v) = 0; virtual ~Shape() {}};class Dot: public Shape { // ... void accept(Visitor* v) override { v->visitDot(this); }};class Ci ...
模板模式
模板方法允许程序员实现一种算法骨架,在具体算法中实现骨架中的每个具体步骤而不改变骨架本身。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class GameAI { public: std::vector<Structure*> builtStructures; void turn() { collectResources(); buildStructures(); buildUnits(); attack(); } void collectResources() { for (Structure* s: builtStructures) { s->collect(); } } virtual buildStructures() = 0; virtual ...
状态机模式
状态机模式允许一个类在内部状态发生变化时更改其行为,仿佛它转变为另一个类一样。状态机模式与有限状态机密切相关。
通常的状态机实现随着类所能具有的状态数量增加而显著增加。状态机模式建议将所有所有模式转化为不同的类,并将所有与状态有关的操作封装在这些类当中。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788class AudioPlayer { public: State* state; Song* currentSong; int volume; AudioPlayer() { state = new ReadyState(this); } ~AudioPlayer() { if (state) delete ...
观察者模式
观察者模式是一种订阅机制:观察者对象可以第一时间收到其观察对象变化的通知
一个包含所有订阅者对象的表
几个用于订阅和取消订阅的方法
必要时,被订阅者将遍历订阅表,并调用每个观察者的特定方法以通知对应的观察者。
总结起来,观察者模式有一个EventManager,通过它维护订阅关系。消息发布者调用其notify方法,来通知所有订阅者。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990#include <vector>#include <string>#include <map>class EventManager { private: std::map<std::string, std::vector<EventListener* ...
备忘录模式
允许在不暴露对象实现细节的情况下,将对象恢复到之前的状态。
快照对象应该是不可变对象,仅被初始化一次
快照发起者可以实现restore(Momento* m)方法,也可以由快照实现restore()方法。后者可以将快照对象与照看者对象(CareTaker)解耦。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354class Editor { private: std::string text; int curX, curY, selectionWidth; public: void setText(std::string t) { text = t; } void setCursor(int x, int y) { curX = x; curY = y; } void setSelectionWdith(int ...
中介者模式
组件之间存在复杂依赖的时候,可以构造一个中介者统一管理组件之间的通讯。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960class Mediator { public: virtual ~Mediator() {} virtual void notify(Component* sender, std::string event) = 0; };class AuthenticationDialog: public Mediator { private: std::string title; Checkbox *loginOrRegisterChkBx; Textbox *loginUsername, *loginPassword; Textbox *registrationUsername, *registrationPassw ...