File: AlignmentModel.hpp

package info (click to toggle)
salmon 1.10.3%2Bds1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 35,148 kB
  • sloc: cpp: 200,707; ansic: 171,082; sh: 859; python: 792; makefile: 238
file content (86 lines) | stat: -rw-r--r-- 2,789 bytes parent folder | download | duplicates (3)
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
#ifndef ALIGNMENT_MODEL
#define ALIGNMENT_MODEL

#include <mutex>

#include "AlignmentCommon.hpp"
#include "AtomicMatrix.hpp"
#include "oneapi/tbb/concurrent_vector.h"

class AlignmentModel
  : public AlignmentCommon
{
public:
  AlignmentModel(double alpha, uint32_t readBins = 4);

  /**
   *  For unpaired reads, update the error model to account for errors
   *  we've observed in this read pair. primaryAln contains the first
   *  alignment in the alignment group.
   */
  void update(const UnpairedRead& aln, const UnpairedRead& primaryAln,
              Transcript& ref, double p, double mass);

  /**
   * Compute the log-likelihood of the observed unpaired alignment
   * given the current error model. primaryAln contains the first
   * alignment in the alignment group.
   */
  double logLikelihood(const UnpairedRead&, const UnpairedRead& primaryAln, Transcript& ref);

  // The primaryAln is ignored by the ReadPair overlaods (at least for now)

  /**
   *  For paired-end reads, update the error model to account for
   *  errors we've observed in this read pair.
   */
  void update(const ReadPair& aln, const ReadPair& primaryAln,
              Transcript& ref, double p, double mass);

  /**
   * Compute the log-likelihood of the observed paire-end alignment given the
   * current error model.
   */
  double logLikelihood(const ReadPair& aln, const ReadPair& primaryAln, Transcript& ref);

  void normalize();

private:

  // std::stringstream& readStr, std::stringstream& matchStr,
  // std::stringstream& refstr);

  // 11 states --- the 9 listed in "AlignmentModelChar" plus START (9) i
  // and END (10)
  constexpr static uint32_t numAlignmentStates() { return 82; }
  constexpr static uint32_t numStates = 9;
  constexpr static uint32_t startStateIdx = 81;

  struct AlnModelProb {
    double fg{salmon::math::LOG_1};
    double bg{salmon::math::LOG_1};
  };

  /**
   * These functions, which work directly on bam_seq_t* types, drive the
   * update() and logLikelihood() methods above.
   */
  void update(bam_seq_t* read, bam_seq_t* primary, Transcript& ref, double p, double mass,
              std::vector<AtomicMatrix<double>>& mismatchProfile);
  AlnModelProb logLikelihood(bam_seq_t* read, bam_seq_t* primary, Transcript& ref,
                       std::vector<AtomicMatrix<double>>& mismatchProfile);

  // NOTE: Do these need to be concurrent_vectors as before?
  // Store the mismatch probability tables for the left and right reads
  std::vector<AtomicMatrix<double>> transitionProbsLeft_;
  std::vector<AtomicMatrix<double>> transitionProbsRight_;

  bool isEnabled_;
  // size_t maxLen_;
  size_t readBins_;
  // Maintain a mutex in case the error model wants to talk to the
  // console / log.
  std::mutex outputMutex_;
};

#endif // ERROR_MODEL