File: ContextOutputList.hpp

package info (click to toggle)
pbseqlib 5.3.1%2Bdfsg-2.1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 7,136 kB
  • sloc: cpp: 77,246; python: 570; makefile: 312; sh: 111; ansic: 9
file content (108 lines) | stat: -rw-r--r-- 3,135 bytes parent folder | download | duplicates (4)
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
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef _SIMULATOR_CONTEXT_OUTPUT_LIST_HPP_
#define _SIMULATOR_CONTEXT_OUTPUT_LIST_HPP_

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <map>
#include <string>

#include <alignment/simulator/OutputList.hpp>
#include <pbdata/utils.hpp>

class ContextOutputList
{
public:
    std::map<std::string, OutputList *> outputMap;
    int contextLength;
    int ParsePair(std::string &output, std::string &outStr, int &outCount)
    {
        std::string contextStr, outCountStr;
        int i;
        for (i = 0; i < output.size(); i++) {
            if (output[i] == '=') {
                int start = 0;
                while (start < i and (output[start] == ' ' or output[start] == '\t')) {
                    start++;
                }
                outStr.assign(&output[start], i - start);
                outCountStr.assign(&output[i + 1], output.size() - i - 1);
                outCount = atoi(outCountStr.c_str());
                return 1;
            }
        }
        return 0;
    }

    int SampleRandomContext(std::string refContext, std::string &readContext)
    {
        //
        // Chec to see if there is a distribution for this ref context, if
        // not, just return the ref context so that things may proceed,
        // but return a fail code.
        //
        if (outputMap.find(refContext) == outputMap.end()) {
            readContext = refContext;
            return 0;
        } else {
            outputMap[refContext]->SelectRandomContect(readContext);
            return 1;
        }
    }

    void Read(std::string &inName)
    {
        std::ifstream in;
        CrucialOpen(inName, in, std::ios::in);
        Read(in);
    }

    void Read(std::ifstream &in)
    {
        int nLines = 0;
        contextLength = 0;
        while (in) {
            std::string context;
            if (!(in >> context)) break;

            contextLength = context.size();
            std::string outputsLine;
            std::getline(in, outputsLine);
            // parse ctx=num; pairs
            int i;
            int e;
            i = 0;
            if (outputMap.find(context) == outputMap.end()) {
                outputMap[context] = ProtectedNew<OutputList>();
            }

            while (i < outputsLine.size()) {
                e = i + 1;
                while (e < outputsLine.size() and outputsLine[e] != ';')
                    e++;
                std::string pairStr;
                pairStr.assign(&outputsLine[i], e - i);
                if (e > i + 1) {
                    std::string outStr;
                    int outCount;
                    ParsePair(pairStr, outStr, outCount);
                    outputMap[context]->AddOutput(outStr, outCount);
                }
                i = e + 1;
            }
            outputMap[context]->StoreCumulativeCounts();
        }
    }

    void Free()
    {
        std::map<std::string, OutputList *>::iterator mapIt;
        for (mapIt = outputMap.begin(); mapIt != outputMap.end(); ++mapIt) {
            if (mapIt->second) {
                delete mapIt->second;
            }
        }
    }
};

#endif