File: HDFPulseWriter.cpp

package info (click to toggle)
pbseqlib 0~20161219-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 5,924 kB
  • ctags: 5,123
  • sloc: cpp: 82,727; makefile: 305; python: 239; sh: 8
file content (110 lines) | stat: -rw-r--r-- 3,728 bytes parent folder | download | duplicates (2)
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
#include "../pbdata/libconfig.h"
#ifdef USE_PBBAM
#include "HDFPulseWriter.hpp"

HDFPulseWriter::HDFPulseWriter(const std::string & filename,
                           const std::string & basecallerVersion,
                           const std::map<char, size_t>& baseMap,
                           const std::vector<PacBio::BAM::BaseFeature> & qvsToWrite,
                           const H5::FileAccPropList & fileAccPropList)
    : HDFWriterBase(filename)
    , fileaccproplist_(fileAccPropList)
    , basecallsWriter_(nullptr) 
    , pulsecallsWriter_(nullptr)
    , regionsWriter_(nullptr)
{
    // open file 
    outfile_.Open(filename_, H5F_ACC_TRUNC, fileaccproplist_);

    // Add PulseData group to the root group '/'
    AddChildGroup(outfile_.rootGroup, pulseDataGroup_, PacBio::GroupNames::pulsedata);

    if (basecallerVersion.empty()) {
        AddErrorMessage("Base caller version must be specified.");
    }

    // Create a BaseCaller writer.
    basecallsWriter_.reset(new HDFBaseCallsWriter(filename_, pulseDataGroup_, baseMap, basecallerVersion, qvsToWrite));

    // Create a PulseCalls writer
    pulsecallsWriter_.reset(new HDFPulseCallsWriter(filename_, pulseDataGroup_, baseMap, basecallerVersion, qvsToWrite));
}

HDFPulseWriter::HDFPulseWriter(const std::string & filename,
                           const std::string & basecallerVersion,
                           const std::map<char, size_t>& baseMap,
                           const std::vector<PacBio::BAM::BaseFeature> & qvsToWrite,
                           const std::vector<std::string> & regionTypes,
                           const H5::FileAccPropList & fileAccPropList)
    :HDFPulseWriter(filename, basecallerVersion, baseMap, qvsToWrite, fileAccPropList)
{
    // Create a Regions writer.
    regionsWriter_.reset(new HDFRegionsWriter(filename_, pulseDataGroup_, regionTypes));
}
 

HDFPulseWriter::~HDFPulseWriter(void) {
    this->Close();
}

void HDFPulseWriter::Flush(void) {
    basecallsWriter_->Flush();
    pulsecallsWriter_->Flush();
    if (HasRegions()) regionsWriter_->Flush();
}

std::vector<std::string> HDFPulseWriter::Errors(void) {
    std::vector<std::string> errors = errors_;

    for (auto error: basecallsWriter_->Errors())
        errors.emplace_back(error);

    for (auto error: pulsecallsWriter_->Errors())
        errors.emplace_back(error);

    if (HasRegions()) {
        for (auto error: regionsWriter_->Errors())
            errors.emplace_back(error);
    }

    return errors;
}

void HDFPulseWriter::SetInverseGain(float igain) {
    pulsecallsWriter_->SetInverseGain(igain);
}

void HDFPulseWriter::Close(void) {
    if (basecallsWriter_) basecallsWriter_.reset();
    if (pulsecallsWriter_) pulsecallsWriter_.reset();
    if (HasRegions() and regionsWriter_) regionsWriter_.reset();
    outfile_.Close();
}

bool HDFPulseWriter::WriteOneZmw(const SMRTSequence & seq) {
    bool OK = basecallsWriter_->WriteOneZmw(seq);
    OK = OK and pulsecallsWriter_->WriteOneZmw(seq);
    return OK;
}

bool HDFPulseWriter::WriteOneZmw(const SMRTSequence & seq, 
                                 const std::vector<RegionAnnotation> & regions) {
    if (not this->WriteOneZmw(seq)) {
        return false;
    }
    if (HasRegions()) {
        if (regions.size() == 0) {
            std::vector<RegionAnnotation> fake = {RegionAnnotation(seq.HoleNumber(), HQRegion, 0, 0, 0)};
            return regionsWriter_->Write(fake);
        } else {
            return regionsWriter_->Write(regions);
        }
    }
    return true;
} 

bool HDFPulseWriter::WriteFakeDataSets() {
    return basecallsWriter_->WriteFakeDataSets() and
           pulsecallsWriter_->WriteFakeDataSets();
}
#endif // ifndef USE_PBBAM