#ifndef __BARCODE_MODEL_HPP__ #define __BARCODE_MODEL_HPP__ #include #include #include #include #include #include "AlevinUtils.hpp" #include "BarcodeGroup.hpp" namespace alevin{ namespace model{ /* Caluclates Probability argmax_A {P(b | A,d)} */ bool calculateAlnProbability(const std::string& s1, const std::string& s2, double& probability){ int32_t l1{static_cast(s1.size())}, l2 {static_cast(s2.size())}; // Shouldn't happen i.e. length diff are greater than 1 if ( std::abs(l1-l2) > 1 ){ probability = 0; return false; } char edit{'M'}; uint32_t distance{0}; if(std::abs(l1-l2) == 1){ distance = 1; } for (int32_t i=0, j=0; i std::vector sort_indexes(const std::vector &v, const std::vector& trueBarcodes) { // initialize original index locations std::vector idx(v.size()); iota(idx.begin(), idx.end(), 0); // sort indexes based on comparing values in v sort(idx.begin(), idx.end(), [&v, &trueBarcodes](size_t i1, size_t i2) { if (v[i1] > v[i2]) return true; else if (v[i1] < v[i2]) return false; else if (trueBarcodes[i1] > trueBarcodes[i2]) return true; else return false; }); //if(v.size()>1 and v[idx[0]] == v[idx[1]]){ // size_t maxIdx = idx[0]; // size_t maxBase = 0; // for (size_t qbase=1; qbase v[maxIdx]) { // std::cout << "ERROR in sorting the barcode probability" <& trueBarcodes, MapT& dumpPair){ if(trueBarcodes.size() == 1){ dumpPair.push_back(std::make_pair(trueBarcodes.front(), 1.0)); } else{ std::vector probabilityVec; double alnProbability, probabilityNorm; for(const std::string trueBarcode: trueBarcodes){ //save the sequence of the true barcodes for dumping bool isOneEdit = calculateAlnProbability(trueBarcode, barcode, alnProbability); if(!isOneEdit){ std::cerr << "Barcode model receveived wrong barcode mapping." << "should not happen, Please report the bug\n"; std::cerr << trueBarcode << "\n" << barcode < cumProbVec(probabilityVec.size()); //std::partial_sum(probabilityVec.begin(), probabilityVec.end(), // cumProbVec.begin()); //dumping the tuple (true barcode seq, cum. prob.). //for(size_t i=0; i < trueBarcodes.size(); i++){ // dumpPair.push_back(std::make_pair(trueBarcodes[i], cumProbVec[i])); //} }//end-else } } } #endif