def test_flag_operations(self):
        '''Check all the methods involving flags do the right thing'''
        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t16\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertTrue(s.is_mapped())
        self.assertFalse(s.is_forward_strand())
        self.assertFalse(s.is_paired())
        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t4\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertFalse(s.is_mapped())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t147\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertTrue(s.is_proper_pair())
        self.assertTrue(s.is_paired())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t81\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertFalse(s.is_proper_pair())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t87\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertTrue(s.is_first_of_pair())
        self.assertFalse(s.is_second_of_pair())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t147\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertFalse(s.is_first_of_pair())
        self.assertTrue(s.is_second_of_pair())
        self.assertTrue(s.is_mate_mapped())

        self.assertEqual(s.query_strand(), '-')

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t0\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertEqual(s.query_strand(), '+')
        self.assertTrue(s.is_forward_strand())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t95\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertFalse(s.is_mate_mapped())

        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t95\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertFalse(s.is_duplicate())
        s = sam.SamRecord(
            'HS4_6280:2:1104:12102:124607\t1089\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        )
        self.assertTrue(s.is_duplicate())
    def test_ref_hit_end_position(self):
        '''Check that we get the end position of a hit correctly'''
        s_good = sam.SamRecord(
            'ID\t0\tref\t1\t47\t2S10M1I10M1D10M4H\t=\t362\t438\tACGTA\tIIIII')
        s_bad = sam.SamRecord(
            'ID\t4\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\tIIIII')
        self.assertTrue(s_good.ref_hit_end_position(), 30)

        with self.assertRaises(sam.Error):
            s_bad.ref_hit_end_position()
    def test_init_SamRecord(self):
        '''__init__ for SamRecord should do as expected'''
        testline = 'HS4_6280:2:1104:12102:124607\t99\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        testline_no_tags = 'HS4_6280:2:1104:12102:124607\t99\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF'

        self.assertEqual(testline, str(sam.SamRecord(testline)))
        self.assertEqual(testline_no_tags,
                         str(sam.SamRecord(testline_no_tags)))

        bad_testlines = [
            'HS4_6280:2:1104:12102:124607\t99\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT',
            'HS4_6280:2:1104:12102:124607\tAA\tPyYM_01_v1\t1\t47\t2S73M\t=\t362\t438\tTGTTAAAAATATCATTTATATAATATAATTAAAATTATTTATTTTTAGATATTATAATATTATGAATAATAGTAT\tHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGFHHHHHHHEHHHHHHHFCHFHHHHGFHCHHFHFAFFEFECF@BF\tAS:i:73\tNM:i:1'
        ]

        for l in bad_testlines:
            with self.assertRaises(sam.Error):
                self.assertEqual(l, str(sam.SamRecord(l)))
    def test_to_fastn(self):
        '''Check conversion to fastq with to_fastq()'''
        sams = [
            sam.SamRecord(
                'ID\t0\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\tIIIII'),
            sam.SamRecord(
                'ID\t16\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\tIIIII'),
            sam.SamRecord(
                'ID\t65\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\tIIIII'),
            sam.SamRecord(
                'ID\t129\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\tIIIII'),
            sam.SamRecord('ID\t0\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\t*'),
            sam.SamRecord('ID\t16\tref\t1\t47\t2S73M\t=\t362\t438\tACGTA\t*')
        ]
        seqs = [
            fastn.Fastq('ID', 'ACGTA', 'IIIII'),
            fastn.Fastq('ID', 'TACGT', 'IIIII'),
            fastn.Fastq('ID/1', 'ACGTA', 'IIIII'),
            fastn.Fastq('ID/2', 'ACGTA', 'IIIII'),
            fastn.Fasta('ID', 'ACGTA'),
            fastn.Fasta('ID', 'TACGT')
        ]

        for i in range(len(sams)):
            self.assertEqual(seqs[i], sams[i].to_fastn())
WRONG_DIST = 4
WRONG_ORDER = 8
NA = 16
DUP = 32


f = utils.open_file_read(options.infile)
lines = f.readlines()
utils.close(f)

nodes = {}

i = 0
for i in range(0, len(lines), 3):
    flag = int(lines[i])
    sam1 = sam.SamRecord(lines[i+1].strip())
    sam2 = sam.SamRecord(lines[i+2].strip())

    if sam1.id not in nodes:
        nodes[sam1.id] = set()


    if sam2.id not in nodes:
        nodes[sam2.id] = set()

    if sam1.rname == sam2.rname:

        if sam1.pos < sam2.pos:
            if sam1.query_strand() == sam2.query_strand() == '+':
                nodes[sam1.id].add(sam2.id)
            elif sam1.query_strand() == sam2.query_strand() == '-':