File: HDFPulseWriter.cpp

package info (click to toggle)
pbseqlib 5.3.4%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 7,020 kB
  • sloc: cpp: 77,246; python: 331; sh: 103; makefile: 42
file content (113 lines) | stat: -rw-r--r-- 3,749 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
#include <LibBlasrConfig.h>

#ifdef USE_PBBAM

#include <hdf/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