@@ -27,8 +27,9 @@ pub fn r_bamcoverage(
2727 // processing options
2828 mnase : bool ,
2929 _offset : Py < PyList > , // list of 2 [offset 5', offset 3'], if no offset is required we have [0, 0]
30- extendreads : u32 , // if 0, no extension
31- centerreads : bool ,
30+ extendreads : bool , // true for extension of reads
31+ extendreadslen : u32 , // if extendreads is set, and SE, this length is used for extension.
32+ centerreads : bool , // to center the reads or not.
3233 filterrnastrand : & str , // forward, reverse or 'None'
3334 blacklist : & str , // path to blacklist filename, or 'None'
3435 _ignorechr : Py < PyList > , // list of chromosomes to ignore. Is empty if none.
@@ -69,14 +70,21 @@ pub fn r_bamcoverage(
6970 if norm != "None" && scalefactor != 1.0 {
7071 println ! ( "Warning: You have set a normalization option ({}), but also a scale factor. Only the scale factor will be used" , norm) ;
7172 }
72- if mnase && offset != ( 1 , - 1 ) {
73+ if mnase && offset != ( 0 , 0 ) {
7374 println ! ( "Warning: Both MNase and offset are set. The offset will be ignored !" ) ;
7475 }
7576 if offset != ( 0 , 0 ) {
7677 if offset. 1 > 0 && offset. 1 < offset. 0 {
7778 panic ! ( "Right side offset cannot be smaller than the left side offset." ) ;
7879 }
7980 }
81+ if extendreads && extendreadslen == 0 && !ispe {
82+ panic ! ( "Error: Extendreads is set, but not to a specific length (and library is single end). Specify the length with the --extendReads parameter." ) ;
83+ }
84+ if centerreads && !extendreads {
85+ println ! ( "Warning: Centerreads is set, but extendreads is not. Centering will do nothing in this case." ) ;
86+ }
87+
8088 if verbose {
8189 println ! ( "Chromosomes to ignore for normalization: {:?}" , ignorechr) ;
8290 }
@@ -120,7 +128,7 @@ pub fn r_bamcoverage(
120128 }
121129 }
122130 // Set alignment filters
123- let filters = Alignmentfilters :: new (
131+ let mut filters = Alignmentfilters :: new (
124132 backlistregions,
125133 Some ( minmappingquality) ,
126134 Some ( samflaginclude) ,
@@ -131,8 +139,18 @@ pub fn r_bamcoverage(
131139 Some ( offset) ,
132140 Some ( filterrnastrand. to_string ( ) ) ,
133141 Some ( extendreads) ,
142+ Some ( extendreadslen) ,
134143 Some ( centerreads) ,
135144 ) ;
145+ // If extendreads, extendreadslen & ispe, we need a pass over the bamfile already now to get the mean fraglen.
146+ if filters. extendreads && filters. extendreadslen == 0 && ispe {
147+ // We need a pass over the bamfile already to get the mean fragment length.
148+ filters. set_extendreadslen ( bamifile, nproc, & regions) ;
149+ if verbose {
150+ println ! ( "fragment length for read extension set as: {}" , filters. extendreadslen) ;
151+ }
152+ }
153+
136154 let pool = ThreadPoolBuilder :: new ( ) . num_threads ( nproc) . build ( ) . unwrap ( ) ;
137155 let ( bg, mapped, _unmapped, readlen, fraglen) = pool. install ( || {
138156 regionblocks. par_iter ( )
@@ -145,10 +163,12 @@ pub fn r_bamcoverage(
145163 _fraglen. extend ( fraglen) ;
146164 _mapped += mapped;
147165 _unmapped += unmapped;
166+
148167 ( _bg, _mapped, _unmapped, _readlen, _fraglen)
149168 }
150169 )
151170 } ) ;
171+
152172 let readlen = median ( readlen) ;
153173 let fraglen = median ( fraglen) ;
154174 if verbose {
@@ -166,7 +186,7 @@ pub fn r_bamcoverage(
166186 scalefactor,
167187 & verbose
168188 ) ;
169-
189+
170190 // Create output stream
171191 let lines = bg. into_iter ( ) . flat_map (
172192 |bg| {
@@ -187,30 +207,7 @@ pub fn r_bamcoverage(
187207 if verbose {
188208 println ! ( "Writing output to: {}" , ofile) ;
189209 }
190-
191- write_covfile ( lines, ofile, ofiletype, chromsizes) ;
192-
193- // // Create output stream
194- // let lines: Vec<(String, Value)> = bg.into_par_iter().flat_map(
195- // |bg| {
196- // let reader = BufReader::new(File::open(bg).unwrap());
197- // reader.lines().map(
198- // |l| {
199- // let l = l.unwrap();
200- // let fields: Vec<&str> = l.split('\t').collect();
201- // let chrom: String = fields[0].to_string();
202- // let start: u32 = fields[1].parse().unwrap();
203- // let end: u32 = fields[2].parse().unwrap();
204- // let cov: f32 = fields[3].parse().unwrap();
205- // (chrom, Value {start: start, end: end, value: cov * sf})
206- // }
207- // ).collect::<Vec<_>>()
208- // }
209- // ).collect();
210- // if verbose {
211- // println!("Writing output to: {}", ofile);
212- // }
213- // write_covfile(lines.into_iter(), ofile, ofiletype, chromsizes);
214210
211+ write_covfile ( lines, ofile, ofiletype, chromsizes) ;
215212 Ok ( ( ) )
216213}
0 commit comments