File: caller.cpp

package info (click to toggle)
staden 2.0.0%2Bb11-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,584 kB
  • sloc: ansic: 240,605; tcl: 65,360; cpp: 12,854; makefile: 11,203; sh: 3,023; fortran: 2,033; perl: 63; awk: 46
file content (95 lines) | stat: -rw-r--r-- 2,655 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * Copyright (c) Medical Research Council 2002. All rights reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * this copyright and notice appears in all copies.
 *
 * This file was written as part of the Staden Package at the MRC Laboratory
 * of Molecular Biology, Hills Road, Cambridge, CB2 2QH, United Kingdom.
 *
 * MRC disclaims all warranties with regard to this software.
 *
 */


#include <caller.hpp>



int Caller::LoadPeaks( SimpleMatrix<int>& Peak, int nPos, int nAmbiguityWindow, call_t data[4] )
{
    assert(data != NULL);
    assert(nPos>=0);
    assert(nAmbiguityWindow>0);
    int peaks = 0;


    // Load in default data
    for( int n=0; n<4; n++ )
    {
        data[n].Index     =  n;
        data[n].Position  = -1;
        data[n].Amplitude = Peak[n][nPos];
    }


    // For each base that has no peak at nPos, search within ambiguity window
    // for another very close peak. Work outwards from middle position.
    const int rows = 4;
    const int cols = Peak.Cols();
    for( int r=0; r<rows; r++ )
    {
        // If base has a peak at nPos, record the position
        if( data[r].Amplitude )
        {
            data[r].Position = nPos;
            peaks++;
            continue;
        }


        // No peak, search for one nearby, within window
        int j   = nPos;
        int off = 1;
        int win = nAmbiguityWindow;
        while( (win>0) && ((j-off)>=0) && ((j+off)<cols) )
        {
            if( Peak[r][j-off] > 0 )
            {
                data[r].Position  = j-off;
                data[r].Amplitude = Peak[r][j-off];
                peaks++;
                break;
            }
            if( Peak[r][j+off] > 0 )
            {
                data[r].Position  = j+off;
                data[r].Amplitude = Peak[r][j+off];
                peaks++;
                break;
            }
            off++;
            win--;
        }
    }
    return peaks;
}


void Caller::SortAscending( call_t data[4] )
{
    // Sort into amplitude order, lowest to highest

    if( data[0].Amplitude > data[1].Amplitude )          // 1st pair
        Swap( data[0], data[1] );
    if( data[2].Amplitude > data[3].Amplitude )          // 2nd pair
        Swap( data[2], data[3] );
    if( data[0].Amplitude > data[2].Amplitude )          // Tops
        Swap( data[0], data[2] );
    if( data[1].Amplitude > data[3].Amplitude )          // Bottoms
        Swap( data[1], data[3] );
    if( data[1].Amplitude > data[2].Amplitude )          // Middle
        Swap( data[1], data[2] );
}