1421
/* spin structure: n1 = which alignment, n2 = start on first row, n3 =
1422
alignment length on 1st row, n4 = start on 2nd row, n5 = 2nd strand */
1423
static void SetSpinValuesForSeqAlign (SeqAlignPtr salp, SQN_nPtr spin, Int4 list_pos, Int4 first_row)
1429
if (salp == NULL || spin == NULL || first_row > 2)
1434
spin->n1 = list_pos;
1435
AlnMgr2GetNthSeqRangeInSA(salp, first_row, &start, &stop);
1436
spin->n3 = stop - start;
1438
AlnMgr2GetNthSeqRangeInSA(salp, 3-first_row, &start, &stop);
1440
strand = AlnMgr2GetNthStrand(salp, 3-first_row);
1441
if (strand == Seq_strand_minus)
1456
Boolean row1_conflict = FALSE, row2_conflict = FALSE;
1457
Int4 left_aln_overlap = 0;
1458
Int4 right_aln_overlap = 0;
1459
Int4 spin1_row1_start, spin1_row1_stop;
1460
Int4 spin2_row1_start, spin2_row1_stop;
1461
Int4 spin1_row2_start, spin1_row2_stop;
1462
Int4 spin2_row2_start, spin2_row2_stop;
1465
Boolean resolved = FALSE;
1467
if (spin1 == NULL || spin2 == NULL || salp == NULL)
1472
spin1_row1_start = spin1->n2;
1473
spin1_row1_stop = spin1->n2 + spin1->n3 - 1;
1475
spin2_row1_start = spin2->n2;
1476
spin2_row1_stop = spin2->n2 + spin2->n3 - 1;
1478
spin1_row2_start = spin1->n4;
1479
spin1_row2_stop = spin1->n4 + spin1->n3 - 1;
1481
spin2_row2_start = spin2->n4;
1482
spin2_row2_stop = spin2->n4 + spin2->n3 - 1;
1486
aln_len = SeqAlignLength (salp);
1488
/* NOTE - the spins were previously sorted, so it is impossible for
1489
* spin2 to be longer than spin1
1490
* Also, row 1 is required to be on the plus strand for both spins.
1491
* We want to find the amount by which the alignment should be truncated,
1492
* either on the left or on the right. If the alignment needs to be truncated
1493
* on both sides, there's probably something wrong.
1494
* The alignment should not overlap on the first row or the second row.
1497
/* make sure we aren't aligning out of order */
1500
if ((spin1_row1_start > spin2_row1_start && spin1_row2_start < spin2_row2_start)
1501
|| (spin1_row1_start < spin2_row1_start && spin1_row2_start > spin2_row2_start))
1508
if ((spin1_row1_start > spin2_row1_start && spin1_row2_start > spin2_row2_start)
1509
|| (spin1_row1_start < spin2_row1_start && spin1_row2_start < spin2_row2_start))
1515
/* check first for overlap on first row */
1516
/* see if second is contained in first */
1517
if (spin2_row1_start >= spin1_row1_start
1518
&& spin2_row1_stop <= spin1_row1_stop)
1521
* spin1 row 1: <---------->
1522
* spin2 row 1: <----->
1524
/* spin2 is contained in spin1 - no overlap could be removed */
1527
/* look for overlap on right */
1528
if (spin2_row1_stop > spin1_row1_start
1529
&& spin2_row1_start < spin1_row1_start)
1532
* spin1 row 1: <----->
1533
* spin2 row 1: <----->
1535
right_aln_overlap = aln_len - AlnMgr2MapBioseqToSeqAlign (salp, spin1_row1_start, 1);
1537
/* look for overlap on left */
1538
if (spin2_row1_start < spin1_row1_stop
1539
&& spin2_row1_stop > spin1_row1_stop)
1542
* spin1 row 1: <----->
1543
* spin2 row 1: <----->
1545
left_aln_overlap = AlnMgr2MapBioseqToSeqAlign (salp, spin1_row1_stop, 1);
1548
/* check for overlap on second row */
1549
/* see if second is contained in first */
1550
if (spin2_row2_start >= spin1_row2_start
1551
&& spin2_row2_stop <= spin1_row2_stop)
1554
* spin1 row 2: <---------->
1555
* spin2 row 2: <----->
1557
/* spin2 is contained in spin1 - no overlap could be removed */
1561
/* look for overlap on right */
1562
if (spin2_row2_start < spin1_row2_start
1563
&& spin2_row2_stop > spin1_row2_start)
1566
* spin1 row 2: <----->
1567
* spin2 row 2: <----->
1571
right_aln_overlap = MAX (right_aln_overlap,
1572
aln_len - AlnMgr2MapBioseqToSeqAlign (salp, spin1_row2_start, 1));
1576
left_aln_overlap = MAX (left_aln_overlap, aln_len - AlnMgr2MapBioseqToSeqAlign (salp, spin1_row2_start, 1));
1579
/* look for overlap on left */
1580
if (spin2_row2_start < spin1_row2_stop
1581
&& spin2_row2_stop > spin1_row2_stop)
1584
* spin1 row 2: <----->
1585
* spin2 row 2: <----->
1589
left_aln_overlap = MAX (left_aln_overlap, AlnMgr2MapBioseqToSeqAlign (salp, spin1_row2_stop, 1));
1593
right_aln_overlap = MAX (right_aln_overlap, AlnMgr2MapBioseqToSeqAlign (salp, spin1_row2_stop, 1));
1597
if (left_aln_overlap > 0 && right_aln_overlap == 0)
1599
if (TruncateAlignment (salp, left_aln_overlap, TRUE))
1601
SetSpinValuesForSeqAlign (salp, spin2, spin2->n1, first_row);
1605
else if (left_aln_overlap == 0 && right_aln_overlap > 0)
1607
if (TruncateAlignment (salp, right_aln_overlap, FALSE))
1609
SetSpinValuesForSeqAlign (salp, spin2, spin2->n1, first_row);
1403
1618
extern void ACT_RemoveInconsistentAlnsFromSet (SeqAlignPtr sap, Int4 fuzz, Int4 n)
1405
AMAlignIndex2Ptr amaip;
1620
AMAlignIndex2Ptr amaip;
1406
1621
Boolean conflict;
1750
1975
sap->segs = (Pointer)dsp;
1751
1976
sap->segtype = SAS_DENSEG;
1758
AlnMgr2IndexLite(sap);
1759
ACT_RemoveInconsistentAlnsFromSet(sap, 20, 1);
1760
amaip = (AMAlignIndex2Ptr)(sap->saip);
1761
AlnMgr2SortAlnSetByNthRowPos(sap, 1);
1762
ACT_GetNthSeqRangeInSASet(sap, 1, &nstart1, &nstop1);
1763
ACT_GetNthSeqRangeInSASet(sap, 2, &nstart2, &nstop2);
1764
strand = AlnMgr2GetNthStrand(amaip->saps[0], 2);
1766
if (strand != Seq_strand_minus)
1768
if (nstart1 > start1+20 && nstart2 > start2+20)
1770
slp1 = SeqLocIntNew(start1, nstart1, Seq_strand_plus, bsp1->id);
1771
slp2 = SeqLocIntNew(start2, nstart2, strand, bsp2->id);
1772
sap_head = ACT_FindBestAlnByDotPlot(slp1, slp2);
1778
if (nstart1 > start1+20 && nstop2 < stop2 - 20)
1780
slp1 = SeqLocIntNew(start1, nstart1, Seq_strand_plus, bsp1->id);
1781
slp2 = SeqLocIntNew(nstop2, stop2, strand, bsp2->id);
1782
sap_head = ACT_FindBestAlnByDotPlot(slp1, slp2);
1787
for (i=0; i<amaip->numsaps-1; i++)
1789
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 1, NULL, &nstart1);
1790
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 1, &nstop1, NULL);
1791
if (strand != Seq_strand_minus)
1793
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 2, NULL, &nstart2);
1794
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 2, &nstop2, NULL);
1797
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 2, &nstop2, NULL);
1798
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 2, NULL, &nstart2);
1801
ACT_GetNthSeqRangeInSASet(sap, 1, &nstart1, &nstop1);
1802
ACT_GetNthSeqRangeInSASet(sap, 2, &nstart2, &nstop2);
1803
sap_prev = sap_head;
1804
if (sap_prev != NULL)
1806
while (sap_prev->next != NULL)
1808
sap_prev = sap_prev->next;
1811
if (strand != Seq_strand_minus)
1813
if (nstop1 < stop1-20 && nstop2 < stop2-20) /* missing piece at the end */
1815
slp1 = SeqLocIntNew(nstop1, stop1, Seq_strand_plus, bsp1->id);
1816
slp2 = SeqLocIntNew(nstop2, stop2, strand, bsp2->id);
1817
sap_new = ACT_FindBestAlnByDotPlot(slp1, slp2);
1820
if (sap_new != NULL)
1822
if (sap_head != NULL)
1824
sap_prev->next = sap_new;
1827
sap_head = sap_prev = sap_new;
1832
if (nstop1 < stop1-20 && nstart2 > start2 + 20)
1834
slp1 = SeqLocIntNew(nstop1, stop1, Seq_strand_plus, bsp1->id);
1835
slp2 = SeqLocIntNew(start2, nstart2, strand, bsp2->id);
1836
sap_new = ACT_FindBestAlnByDotPlot(slp1, slp2);
1839
if (sap_new != NULL)
1841
if (sap_head != NULL)
1843
sap_prev->next = sap_new;
1846
sap_head = sap_prev = sap_new;
1850
sap_new = (SeqAlignPtr)(sap->segs);
1851
while (sap_new->next != NULL)
1853
sap_new = sap_new->next;
1855
sap_new->next = sap_head;
1856
sap_head = (SeqAlignPtr)(sap->segs);
1978
else if (sap->next != NULL)
1980
/* combine the alignments returned (if there are more than one) into
1981
* a mini global alignment to cover the requested interval
1983
AlnMgr2IndexLite(sap);
1984
ACT_RemoveInconsistentAlnsFromSet(sap, 20, 1);
1985
amaip = (AMAlignIndex2Ptr)(sap->saip);
1986
AlnMgr2SortAlnSetByNthRowPos(sap, 1);
1987
ACT_GetNthSeqRangeInSASet(sap, 1, &nstart1, &nstop1);
1988
ACT_GetNthSeqRangeInSASet(sap, 2, &nstart2, &nstop2);
1989
strand = AlnMgr2GetNthStrand(amaip->saps[0], 2);
1991
if (strand != Seq_strand_minus)
1993
if (nstart1 > start1+20 && nstart2 > start2+20)
1995
slp1 = SeqLocIntNew(start1, nstart1, Seq_strand_plus, bsp1->id);
1996
slp2 = SeqLocIntNew(start2, nstart2, strand, bsp2->id);
1997
sap_head = ACT_FindBestAlnByDotPlot(slp1, slp2);
2004
if (nstart1 > start1+20 && nstop2 < stop2 - 20)
2006
slp1 = SeqLocIntNew(start1, nstart1, Seq_strand_plus, bsp1->id);
2007
slp2 = SeqLocIntNew(nstop2, stop2, strand, bsp2->id);
2008
sap_head = ACT_FindBestAlnByDotPlot(slp1, slp2);
2013
for (i=0; i<amaip->numsaps-1; i++)
2015
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 1, NULL, &nstart1);
2016
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 1, &nstop1, NULL);
2017
if (strand != Seq_strand_minus)
2019
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 2, NULL, &nstart2);
2020
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 2, &nstop2, NULL);
2024
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i], 2, &nstop2, NULL);
2025
AlnMgr2GetNthSeqRangeInSA(amaip->saps[i+1], 2, NULL, &nstart2);
2028
ACT_GetNthSeqRangeInSASet(sap, 1, &nstart1, &nstop1);
2029
ACT_GetNthSeqRangeInSASet(sap, 2, &nstart2, &nstop2);
2030
sap_prev = sap_head;
2031
if (sap_prev != NULL)
2033
while (sap_prev->next != NULL)
2035
sap_prev = sap_prev->next;
2038
if (strand != Seq_strand_minus)
2040
if (nstop1 < stop1-20 && nstop2 < stop2-20) /* missing piece at the end */
2042
slp1 = SeqLocIntNew(nstop1, stop1, Seq_strand_plus, bsp1->id);
2043
slp2 = SeqLocIntNew(nstop2, stop2, strand, bsp2->id);
2044
sap_new = ACT_FindBestAlnByDotPlot(slp1, slp2);
2047
if (sap_new != NULL)
2049
if (sap_head != NULL)
2051
sap_prev->next = sap_new;
2055
sap_head = sap_prev = sap_new;
2061
if (nstop1 < stop1-20 && nstart2 > start2 + 20)
2063
slp1 = SeqLocIntNew(nstop1, stop1, Seq_strand_plus, bsp1->id);
2064
slp2 = SeqLocIntNew(start2, nstart2, strand, bsp2->id);
2065
sap_new = ACT_FindBestAlnByDotPlot(slp1, slp2);
2068
if (sap_new != NULL)
2070
if (sap_head != NULL)
2072
sap_prev->next = sap_new;
2076
sap_head = sap_prev = sap_new;
2080
sap_new = (SeqAlignPtr)(sap->segs);
2081
while (sap_new->next != NULL)
2083
sap_new = sap_new->next;
2085
sap_new->next = sap_head;
2086
sap_head = (SeqAlignPtr)(sap->segs);
1862
2094
static void ACT_ExtendAlnRight(SeqAlignPtr sap, Int4 which_row, Int4 start, Int4 stop)
2709
2988
sap_head = NULL;
2711
2990
if (start1 > 6 && start1 < extnd)
2712
sap_head = sap_prev = ACT_FindPiece(bsp1, bsp2, MAX(start1-SQN_WINDOW, 0), start1, MAX(start1-SQN_WINDOW, 0), start2, strand, SQN_LEFT);
2991
sap_head = sap_prev = ACT_FindPiece(bsp1, bsp2, MAX(start1-SQN_WINDOW, 0), start1, MAX(start1-SQN_WINDOW, 0), start2, strand, SQN_LEFT, aln_piece_func);
2713
2992
else if (start1 > 0 && start1 < extnd)
2714
2993
SQN_ExtendAlnAlg(amaip->saps[0], start1, SQN_LEFT, Seq_strand_plus);
2715
2994
ACT_GetNthSeqRangeInSASet(sap, 1, &start1, &stop1);
2716
2995
ACT_GetNthSeqRangeInSASet(sap, 2, &start2, &stop2);
2717
2996
if (start2 > 6 && start2 < extnd)
2719
sap_new = ACT_FindPiece(bsp2, bsp1, MAX(start2-SQN_WINDOW, 0), start2, MAX(start1-SQN_WINDOW, 0), start1, strand, SQN_LEFT);
2998
sap_new = ACT_FindPiece(bsp2, bsp1, MAX(start2-SQN_WINDOW, 0), start2, MAX(start1-SQN_WINDOW, 0), start1, strand, SQN_LEFT, aln_piece_func);
2720
2999
if (sap_new != NULL)
2721
3000
SPI_flip_sa_list(sap_new);
2722
3001
if (sap_head != NULL)