+ if (alleleS && (curtid >= 0)) {
+ if (gi.spAt(ciParams->end_gene_id) - curaid > 1) {
+ calcCI(nSamples, itsamples, iso_tpm[curtid].lb, iso_tpm[curtid].ub);
+ calcCI(nSamples, ifsamples, iso_fpkm[curtid].lb, iso_fpkm[curtid].ub);
+ }
+ else {
+ iso_tpm[curtid] = tpm[curaid];
+ iso_fpkm[curtid] = fpkm[curaid];
+ }
+ }
+
+ delete[] tsamples;
+ delete[] fsamples;
+ if (alleleS) {
+ delete[] itsamples;
+ delete[] ifsamples;
+ }
+ delete[] gtsamples;
+ delete[] gfsamples;
+
+ return NULL;
+}
+
+void calculate_credibility_intervals(char* imdName) {
+ FILE *fo;
+ char outF[STRLEN];
+ int num_threads = nThreads;
+
+ tpm = new CIType[M + 1];
+ fpkm = new CIType[M + 1];
+ if (alleleS) {
+ iso_tpm = new CIType[m_trans];
+ iso_fpkm = new CIType[m_trans];
+ }
+ gene_tpm = new CIType[m];
+ gene_fpkm = new CIType[m];
+
+ assert(M > 0);
+ int quotient = M / num_threads;
+ if (quotient < 1) { num_threads = M; quotient = 1; }
+ int cur_gene_id = 0;
+ int num_isoforms = 0;
+
+ // A just so so strategy for paralleling
+ ciParamsArray = new CIParams[num_threads];
+ for (int i = 0; i < num_threads; i++) {
+ ciParamsArray[i].no = i;
+ ciParamsArray[i].start_gene_id = cur_gene_id;
+ num_isoforms = 0;
+
+ while ((m - cur_gene_id > num_threads - i - 1) && (i == num_threads - 1 || num_isoforms < quotient)) {
+ num_isoforms += gi.spAt(cur_gene_id + 1) - gi.spAt(cur_gene_id);
+ ++cur_gene_id;
+ }
+
+ ciParamsArray[i].end_gene_id = cur_gene_id;
+ }
+
+ threads = new pthread_t[num_threads];
+
+ /* set thread attribute to be joinable */
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+ // paralleling
+ for (int i = 0; i < num_threads; i++) {
+ rc = pthread_create(&threads[i], &attr, &calcCI_batch, (void*)(&ciParamsArray[i]));
+ pthread_assert(rc, "pthread_create", "Cannot create thread " + itos(i) + " (numbered from 0) in calculate_credibility_intervals!");
+ }
+ for (int i = 0; i < num_threads; i++) {
+ rc = pthread_join(threads[i], NULL);
+ pthread_assert(rc, "pthread_join", "Cannot join thread " + itos(i) + " (numbered from 0) in calculate_credibility_intervals!");
+ }
+
+ // releasing resources
+
+ /* destroy attribute */
+ pthread_attr_destroy(&attr);
+ delete[] threads;
+
+ delete[] ciParamsArray;
+
+ alleleS ? sprintf(outF, "%s.allele_res", imdName) : sprintf(outF, "%s.iso_res", imdName);