@@ -1582,12 +1582,10 @@ static Tuple4<Map<Integer, Map<String, Variation>>, Map<Integer, Map<String, Var
15821582
15831583 int mateAlignmentStart = record .getMateAlignmentStart ();
15841584
1585- boolean isPairedAndTheSameChromosome = record .getReadPairedFlag ()
1586- && record .getMateReferenceName ().equals (record .getReferenceName ());
1587-
1585+ processCigar :
15881586 //Loop over CIGAR records
15891587 for (int ci = 0 ; ci < cigar .numCigarElements (); ci ++) {
1590- if (conf . uniqueModeOn && ! dir && isPairedAndTheSameChromosome && start >= mateAlignmentStart ) {
1588+ if (skipOverlappingReads ( conf , record , dir , start , mateAlignmentStart ) ) {
15911589 break ;
15921590 }
15931591 //length of segment in CIGAR
@@ -2474,8 +2472,8 @@ && isNotEquals('N', ref.get(start))) {
24742472 p ++;
24752473 }
24762474 // Skip read if it is overlap
2477- if (conf . uniqueModeOn && ! dir && isPairedAndTheSameChromosome && start >= mateAlignmentStart ) {
2478- break ;
2475+ if (skipOverlappingReads ( conf , record , dir , start , mateAlignmentStart ) ) {
2476+ break processCigar ;
24792477 }
24802478 }
24812479 if (moffset != 0 ) {
@@ -2500,28 +2498,59 @@ && isNotEquals('N', ref.get(start))) {
25002498 }
25012499
25022500 if (conf .performLocalRealignment ) {
2503- if (conf .y )
2504- System .err .println ("Start Realigndel" );
2505- realigndel (hash , dels5 , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2506- if (conf .y )
2507- System .err .println ("Start Realignins" );
2508- realignins (hash , iHash , ins , cov , sclip5 , sclip3 , ref , region .chr , chrs , conf );
2509- if (conf .y )
2510- System .err .println ("Start Realignlgdel" );
2511- realignlgdel (hash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2512- if (conf .y )
2513- System .err .println ("Start Realignlgins" );
2514- realignlgins (hash , iHash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2515- if (conf .y )
2516- System .err .println ("Start Realignlgins30" );
2517- realignlgins30 (hash , iHash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2501+ realignIndels (region , chrs , rlen , ref , conf , bams , hash , iHash , cov , sclip3 , sclip5 , ins , dels5 );
25182502 }
25192503
25202504 adjMNP (hash , mnp , cov , ref , sclip3 , sclip5 , conf );
25212505
25222506 return tuple (hash , iHash , cov , rlen );
25232507 }
25242508
2509+ private static void realignIndels (Region region , Map <String , Integer > chrs , int rlen , Map <Integer , Character > ref , Configuration conf , String [] bams , Map <Integer , Map <String , Variation >> hash , Map <Integer , Map <String , Variation >> iHash , Map <Integer , Integer > cov , Map <Integer , Sclip > sclip3 , Map <Integer , Sclip > sclip5 , Map <Integer , Map <String , Integer >> ins , Map <Integer , Map <String , Integer >> dels5 ) throws IOException {
2510+ if (conf .y )
2511+ System .err .println ("Start Realigndel" );
2512+ realigndel (hash , dels5 , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2513+ if (conf .y )
2514+ System .err .println ("Start Realignins" );
2515+ realignins (hash , iHash , ins , cov , sclip5 , sclip3 , ref , region .chr , chrs , conf );
2516+ if (conf .y )
2517+ System .err .println ("Start Realignlgdel" );
2518+ realignlgdel (hash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2519+ if (conf .y )
2520+ System .err .println ("Start Realignlgins" );
2521+ realignlgins (hash , iHash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2522+ if (conf .y )
2523+ System .err .println ("Start Realignlgins30" );
2524+ realignlgins30 (hash , iHash , cov , sclip5 , sclip3 , ref , region .chr , chrs , rlen , bams , conf );
2525+ }
2526+
2527+ private static boolean skipOverlappingReads (Configuration conf , SAMRecord record , boolean dir , int start , int mateAlignmentStart ) {
2528+ if (conf .uniqueModeAlignmentEnabled && isPairedAndSameChromosome (record )
2529+ && !dir && start >= mateAlignmentStart ) {
2530+ return true ;
2531+ }
2532+ if (conf .uniqueModeSecondInPairEnabled && record .getSecondOfPairFlag () && isPairedAndSameChromosome (record )
2533+ && isReadsOverlap (record , start , mateAlignmentStart )) {
2534+ return true ;
2535+ }
2536+ return false ;
2537+ }
2538+
2539+ private static boolean isReadsOverlap (SAMRecord record , int start , int mateAlignmentStart ){
2540+ if (record .getAlignmentStart () >= mateAlignmentStart ) {
2541+ return start >= mateAlignmentStart
2542+ && start <= (mateAlignmentStart + record .getCigar ().getReferenceLength () - 1 );
2543+ }
2544+ else {
2545+ return start >= mateAlignmentStart
2546+ && record .getMateAlignmentStart () <= record .getAlignmentEnd ();
2547+ }
2548+ }
2549+
2550+ private static boolean isPairedAndSameChromosome (SAMRecord record ) {
2551+ return record .getReadPairedFlag () && record .getMateReferenceName ().equals (record .getReferenceName ());
2552+ }
2553+
25252554 private static void sclip3HighQualityProcessing (Region region , Configuration conf , Map <Integer , Sclip > sclip3 ,
25262555 String querySequence , int mappingQuality , String queryQuality ,
25272556 int nm , int n , boolean dir , int start , int m , int q ,
0 commit comments