By default, an AlignmentFile object maintains a single file position. If you attempt to create multiple iterators (e.g., by calling .fetch() multiple times) on the same file object, the iterators will interfere with each other because they share that single file position.
To use multiple iterators simultaneously, use the multiple_iterators=True argument in the .fetch() method. This causes pysam to return an iterator backed by a newly opened file handle, preventing interference. Note that this incurs a performance penalty due to re-opening the file.
Incorrect usage (interfering iterators):
samfile = pysam.AlignmentFile("pysam_ex1.bam", "rb")
iter1 = samfile.fetch("chr1")
print(next(iter1).reference_id)
iter2 = samfile.fetch("chr2")
print(next(iter2).reference_id)
print(next(iter1).reference_id) # This will fail or return unexpected results
Correct usage:
samfile = pysam.AlignmentFile("pysam_ex1.bam", "rb")
iter1 = samfile.fetch("chr1", multiple_iterators=True)
print(next(iter1).reference_id)
iter2 = samfile.fetch("chr2")
print(next(iter2).reference_id)
print(next(iter1).reference_id) # This works correctly
samfile = pysam.AlignmentFile("pysam_ex1.bam", "rb")
iter1 = samfile.fetch("chr1", multiple_iterators=True)
print(next(iter1).reference_id)
iter2 = samfile.fetch("chr2")
print(next(iter2).reference_id)
print(next(iter1).reference_id)