+template<class ModelType>
+void init_model_related(char* modelF) {
+ ModelType model;
+ model.read(modelF);
+
+ calcExpectedEffectiveLengths<ModelType>(M, refs, model, eel);
+ memcpy(mw, model.getMW(), sizeof(double) * (M + 1)); // otherwise, after exiting this procedure, mw becomes undefined
+}
+
+// assign threads
+void init() {
+ int quotient, left;
+ char outF[STRLEN];
+
+ quotient = NSAMPLES / nThreads;
+ left = NSAMPLES % nThreads;
+
+ sprintf(cvsF, "%s.countvectors", imdName);
+ paramsArray = new Params[nThreads];
+ threads = new pthread_t[nThreads];
+
+ hasSeed ? engineFactory::init(seed) : engineFactory::init();
+ for (int i = 0; i < nThreads; i++) {
+ paramsArray[i].no = i;
+
+ paramsArray[i].nsamples = quotient;
+ if (i < left) paramsArray[i].nsamples++;
+
+ sprintf(outF, "%s%d", cvsF, i);
+ paramsArray[i].fo = fopen(outF, "w");
+
+ paramsArray[i].engine = engineFactory::new_engine();
+ paramsArray[i].pme_c = new double[M + 1];
+ memset(paramsArray[i].pme_c, 0, sizeof(double) * (M + 1));
+ paramsArray[i].pve_c = new double[M + 1];
+ memset(paramsArray[i].pve_c, 0, sizeof(double) * (M + 1));
+ paramsArray[i].pme_tpm = new double[M + 1];
+ memset(paramsArray[i].pme_tpm, 0, sizeof(double) * (M + 1));
+ paramsArray[i].pme_fpkm = new double[M + 1];
+ memset(paramsArray[i].pme_fpkm, 0, sizeof(double) * (M + 1));
+
+ paramsArray[i].pve_c_genes = new double[m];
+ memset(paramsArray[i].pve_c_genes, 0, sizeof(double) * m);
+
+ paramsArray[i].pve_c_trans = NULL;
+ if (alleleS) {
+ paramsArray[i].pve_c_trans = new double[m_trans];
+ memset(paramsArray[i].pve_c_trans, 0, sizeof(double) * m_trans);