1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#include "ReadAlign.h"
uint ReadAlign::alignCIGAR
samStreamCIGAR.str(std::string());
uint trimL;
if (Str==0 && Mate==0) {
trimL=clipMates[Mate][0].clippedN;
} else if (Str==0 && Mate==1) {
trimL=clipMates[Mate][1].clippedN;
} else if (Str==1 && Mate==0) {
trimL=clipMates[Mate][1].clippedN;
} else {
trimL=clipMates[Mate][0].clippedN;
};
uint trimL1 = trimL + trOut.exons[iEx1][EX_R] - (trOut.exons[iEx1][EX_R]<readLength[leftMate] ? 0 : readLength[leftMate]+1);
if (trimL1>0) {
samStreamCIGAR << trimL1 << "S"; //initial trimming
};
for (uint ii=iEx1;ii<=iEx2;ii++) {
if (ii>iEx1) {//record gaps
uint gapG=trOut.exons[ii][EX_G]-(trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]);
uint gapR=trOut.exons[ii][EX_R]-trOut.exons[ii-1][EX_R]-trOut.exons[ii-1][EX_L];
//it's possible to have a D or N and I at the same time
if (gapR>0){
samStreamCIGAR << gapR;
samStreamCIGAR << "I";
};
if (trOut.canonSJ[ii-1]>=0 || trOut.sjAnnot[ii-1]==1) {//junction: N
samStreamCIGAR << gapG;
samStreamCIGAR << "N";
samStreamSJmotif <<','<< trOut.canonSJ[ii-1] + (trOut.sjAnnot[ii-1]==0 ? 0 : SJ_SAM_AnnotatedMotifShift); //record junction type
// samStreamSJannot <<','<< (int) trOut.sjAnnot[ii-1]; //record annotation type
samStreamSJintron <<','<< trOut.exons[ii-1][EX_G] + trOut.exons[ii-1][EX_L] + 1 - P->chrStart[trOut.Chr] <<','\
<< trOut.exons[ii][EX_G] - P->chrStart[trOut.Chr]; //record intron loci
} else if (gapG>0) {//deletion: N
samStreamCIGAR << gapG;
samStreamCIGAR << "D";
};
};
samStreamCIGAR << trOut.exons[ii][EX_L] << "M";
};
string SJmotif = samStreamSJmotif.str();
string SJintron = samStreamSJintron.str();
// string SJannot = samStreamSJannot.str();
if (SJmotif.length()==0) {//no junctions recorded, mark with -1
SJmotif=",-1";
SJintron=",-1";
// SJannot=",-1";
};
uint trimR1=(trOut.exons[iEx1][EX_R]<readLength[leftMate] ? \
readLengthOriginal[leftMate] : readLength[leftMate]+1+readLengthOriginal[Mate]) \
- trOut.exons[iEx2][EX_R]-trOut.exons[iEx2][EX_L] - trimL;
if ( trimR1 > 0 ) {
samStreamCIGAR << trimR1 << "S"; //final trimming
};
CIGAR=samStreamCIGAR.str();
|