File: glfHandler.h

package info (click to toggle)
libstatgen 1.0.15-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,588 kB
  • sloc: cpp: 49,624; ansic: 1,408; makefile: 320; sh: 60
file content (149 lines) | stat: -rw-r--r-- 3,867 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 *  Copyright (C) 2010  Regents of the University of Michigan
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __GLF_HANDLER_H__
#define __GLF_HANDLER_H__

#include "InputFile.h"
#include "StringBasics.h"

#if defined(__APPLE__)
// #pragma warn "Caution, glfHandler.h is non-portable"
#else
#pragma pack(push)
#pragma pack(1)
#endif

struct glfIndel
{
    // Likelihood for the 1/1, 2/2 and 1/2
    unsigned char lk[3];

    // Allele lengths
    short length[2];

    unsigned char padding[3];
};

struct glfEntry
{
    /**  "XACMGRSVTWYHKDBN"[ref_base] gives the reference base */
    unsigned char refBase:4, recordType:4;

    /** offset of this record from the previous one, in bases */
    unsigned int offset;

    /** log10 minimum likelihood * 10 and the number of mapped reads */
    unsigned depth:24, minLLK:8;

    /** root mean squared maximum mapping quality for overlapping reads */
    unsigned char mapQuality;

    union
    {
        /** log10 likelihood ratio * 10 for genotypes AA, AC, AG, AT, CC, CG, CT, GG, GT, TT */
        unsigned char lk[10];
        glfIndel indel;
    };

    glfEntry & operator = (glfEntry & rhs);
};

#if defined(__APPLE__)
// #pragma warn "Caution, glfHandler.h is non-portable"
#else
#pragma pack(pop)
#endif

class glfHandler
{
public:
    // Global information about the current GLF file
    bool     isStub;
    IFILE    handle;
    String   header;

    // Information about the current section
    String   label;
    int      sections;
    int      currentSection;
    int      maxPosition;

    // Information on whether the end of the current section has been reached
    bool   endOfSection;

    // Currently active GLF record
    glfEntry data;
    int      position;
    double   likelihoods[10];
    String   indelSequence[2];

    // Error message in case previous command fails
    const char * errorMsg;

    glfHandler();
    ~glfHandler();

    bool Open(const String & filename);
    void OpenStub();
    bool Create(const String & filename);
    bool isOpen();
    void Close();
    void Rewind();

    bool NextSection();
    bool NextEntry();
    bool NextBaseEntry();

    void BeginSection(const String & sectionLabel, int sectionLength);
    void EndSection();

    void WriteEntry(int outputPosition);

    char     GetReference(int position, char defaultBase);
    int      GetDepth(int position);
    const double * GetLikelihoods(int position);
    const unsigned char *   GetLogLikelihoods(int position);
    int      GetMapQuality(int position);

    static const double * GetDefaultLikelihoods()
    {
        return nullLikelihoods;
    }
    static const unsigned char * GetDefaultLogLikelihoods()
    {
        return nullLogLikelihoods;
    }

    static int GenotypeIndex(int base1, int base2)
    {
        return base1 < base2 ? (base1 - 1) *(10 - base1) / 2 + (base2 - base1) :
               (base2 - 1) *(10 - base2) / 2 + (base1 - base2);
    }

private:
    static char           translateBase[16];
    static char           backTranslateBase[5];
    static double         nullLikelihoods[10];
    static unsigned char  nullLogLikelihoods[10];

    bool ReadHeader();
    void WriteHeader(const String & headerText = "");
};

#endif