pub struct Intersect<R, V> { /* private fields */ }Expand description
An intersection of SAF file readers.
The intersection takes an arbitrary number of readers and returns data where all readers contain data for the same contig and position. It is assumed that contigs are sorted in the same order in each file, and that positions are sorted numerically within each contig.
Implementations§
Source§impl<R, V> Intersect<R, V>
impl<R, V> Intersect<R, V>
Sourcepub fn create_record_bufs(&self) -> Vec<Record<Id, V::Item>>
pub fn create_record_bufs(&self) -> Vec<Record<Id, V::Item>>
Returns a new collection of records suitable for use in reading.
Examples found in repository?
10fn main() -> io::Result<()> {
11 let readers = env::args()
12 .skip(1)
13 .map(|p| saf::reader::Builder::v3().build_from_member_path(p))
14 .collect::<io::Result<Vec<_>>>()?;
15
16 // Note also the [`Reader::intersect`] and [`Intersect::intersect`] methods to construct
17 // intersecting reader when the number of readers are statically known.
18 let mut intersect = saf::Intersect::new(readers);
19
20 let stdout = io::stdout();
21 let mut writer = stdout.lock();
22
23 let mut bufs = intersect.create_record_bufs();
24 while intersect.read_records(&mut bufs)?.is_not_done() {
25 for (reader, buf) in intersect.get_readers().iter().zip(bufs.iter()) {
26 let contig = reader.index().records()[*buf.contig_id()].name();
27 let position = buf.position();
28 write!(writer, "{contig}\t{position}")?;
29
30 for v in buf.item().iter() {
31 write!(writer, "\t{v:.2}")?;
32 }
33
34 writeln!(writer)?;
35 }
36 }
37
38 Ok(())
39}Sourcepub fn intersect(self, reader: Reader<R, V>) -> Self
pub fn intersect(self, reader: Reader<R, V>) -> Self
Creates a new intersecting reader with an additional reader, consuming self.
Since self is consumed, rather than mutated, this can be chained to build intersections
of multiple readers. See also the Reader::intersect method for a way to start create
the initial intersecting reader.
Sourcepub fn get_readers(&self) -> &[Reader<R, V>]
pub fn get_readers(&self) -> &[Reader<R, V>]
Returns the inner readers.
Examples found in repository?
10fn main() -> io::Result<()> {
11 let readers = env::args()
12 .skip(1)
13 .map(|p| saf::reader::Builder::v3().build_from_member_path(p))
14 .collect::<io::Result<Vec<_>>>()?;
15
16 // Note also the [`Reader::intersect`] and [`Intersect::intersect`] methods to construct
17 // intersecting reader when the number of readers are statically known.
18 let mut intersect = saf::Intersect::new(readers);
19
20 let stdout = io::stdout();
21 let mut writer = stdout.lock();
22
23 let mut bufs = intersect.create_record_bufs();
24 while intersect.read_records(&mut bufs)?.is_not_done() {
25 for (reader, buf) in intersect.get_readers().iter().zip(bufs.iter()) {
26 let contig = reader.index().records()[*buf.contig_id()].name();
27 let position = buf.position();
28 write!(writer, "{contig}\t{position}")?;
29
30 for v in buf.item().iter() {
31 write!(writer, "\t{v:.2}")?;
32 }
33
34 writeln!(writer)?;
35 }
36 }
37
38 Ok(())
39}Sourcepub fn get_readers_mut(&mut self) -> &mut [Reader<R, V>]
pub fn get_readers_mut(&mut self) -> &mut [Reader<R, V>]
Returns a mutable reference to the inner readers.
Sourcepub fn into_readers(self) -> Vec<Reader<R, V>>
pub fn into_readers(self) -> Vec<Reader<R, V>>
Returns the inner readers, consuming self.
Sourcepub fn new(readers: Vec<Reader<R, V>>) -> Self
pub fn new(readers: Vec<Reader<R, V>>) -> Self
Examples found in repository?
10fn main() -> io::Result<()> {
11 let readers = env::args()
12 .skip(1)
13 .map(|p| saf::reader::Builder::v3().build_from_member_path(p))
14 .collect::<io::Result<Vec<_>>>()?;
15
16 // Note also the [`Reader::intersect`] and [`Intersect::intersect`] methods to construct
17 // intersecting reader when the number of readers are statically known.
18 let mut intersect = saf::Intersect::new(readers);
19
20 let stdout = io::stdout();
21 let mut writer = stdout.lock();
22
23 let mut bufs = intersect.create_record_bufs();
24 while intersect.read_records(&mut bufs)?.is_not_done() {
25 for (reader, buf) in intersect.get_readers().iter().zip(bufs.iter()) {
26 let contig = reader.index().records()[*buf.contig_id()].name();
27 let position = buf.position();
28 write!(writer, "{contig}\t{position}")?;
29
30 for v in buf.item().iter() {
31 write!(writer, "\t{v:.2}")?;
32 }
33
34 writeln!(writer)?;
35 }
36 }
37
38 Ok(())
39}Sourcepub fn read_records(
&mut self,
bufs: &mut [Record<Id, V::Item>],
) -> Result<ReadStatus>
pub fn read_records( &mut self, bufs: &mut [Record<Id, V::Item>], ) -> Result<ReadStatus>
Reads a set of intersecting records, one from each contained reader.
If successful, a record from each inner reader will be read into the corresponding buffer such that all resulting records will be on the same contig and the same position.
Note that the record buffer needs to be correctly set up. Use Self::create_record_bufs
for a correctly initialised record buffers to use for reading.
Examples found in repository?
10fn main() -> io::Result<()> {
11 let readers = env::args()
12 .skip(1)
13 .map(|p| saf::reader::Builder::v3().build_from_member_path(p))
14 .collect::<io::Result<Vec<_>>>()?;
15
16 // Note also the [`Reader::intersect`] and [`Intersect::intersect`] methods to construct
17 // intersecting reader when the number of readers are statically known.
18 let mut intersect = saf::Intersect::new(readers);
19
20 let stdout = io::stdout();
21 let mut writer = stdout.lock();
22
23 let mut bufs = intersect.create_record_bufs();
24 while intersect.read_records(&mut bufs)?.is_not_done() {
25 for (reader, buf) in intersect.get_readers().iter().zip(bufs.iter()) {
26 let contig = reader.index().records()[*buf.contig_id()].name();
27 let position = buf.position();
28 write!(writer, "{contig}\t{position}")?;
29
30 for v in buf.item().iter() {
31 write!(writer, "\t{v:.2}")?;
32 }
33
34 writeln!(writer)?;
35 }
36 }
37
38 Ok(())
39}