19 #include "../helper/helpFuncs.h" 28 #define EQ_TOLV(f,g,h) (fabs( (f) - (g)) < (h)) 47 float massDelta,
const set<unsigned int> &skipIDs,
48 vector<pair<size_t ,size_t> > &overlapIdx,
49 vector<pair<float,float> > &overlapMasses)
54 for(
unsigned int ui=0;ui<massDistributions.size();ui++)
57 if(skipIDs.find(ui) !=skipIDs.end())
60 for(
unsigned int uj=0;uj<massDistributions[ui].size();uj++)
62 if(skipIDs.find(uj) !=skipIDs.end())
65 m1=massDistributions[ui][uj].first;
68 for(
unsigned int uk=ui+1;uk<massDistributions.size();uk++)
71 for(
unsigned int ul=0;ul<massDistributions[uk].size();ul++)
75 m2=massDistributions[uk][ul].first;
79 overlapIdx.push_back(std::make_pair(ui,uk));
80 overlapMasses.push_back(std::make_pair(m1,m2));
95 const RangeFile &rng,
float massDelta,
unsigned int maxCharge,
96 vector<pair< size_t,size_t> > &overlapIdx, vector<pair<float,float> > &overlapMasses )
101 const float PEAK_MIN_PROBABILITY=10.0/1e6;
102 const float PEAK_GROUP_DIST = 0.01;
104 vector<pair<unsigned int ,vector<size_t> > > overlaps;
109 vector<vector<pair<float,float> > > massDistributions;
110 set<unsigned int> skipIDs;
112 for(
unsigned int ui=0;ui<rng.
getNumIons(); ui++)
118 vector<pair<string,size_t> > fragments;
119 vector<pair<float,float> > nullDist;
124 for(
unsigned int uj=0;uj<maxCharge;uj++)
125 massDistributions.push_back(nullDist);
131 vector<pair<size_t,unsigned int> > symbolIdxFreq;
137 for(
unsigned int uj=0;uj<symbolIdxFreq.size();uj++)
139 if(symbolIdxFreq[uj].first == (
size_t)-1)
152 for(
auto uj=0u;uj<maxCharge;uj++)
153 massDistributions.push_back(nullDist);
157 vector<size_t> elementIdx,freq;
158 elementIdx.resize(symbolIdxFreq.size());
159 freq.resize(symbolIdxFreq.size());
160 for(
unsigned int uj=0;uj<symbolIdxFreq.size();uj++)
162 elementIdx[uj]=symbolIdxFreq[uj].first;
163 freq[uj] = symbolIdxFreq[uj].second;
167 vector<pair<float,float> > massDist;
172 vector<bool> killVec(massDist.size(),
false);
173 for(
unsigned int uj=0;uj<massDist.size();uj++)
174 killVec[uj]=(massDist[uj].second < PEAK_MIN_PROBABILITY);
180 unsigned int nElectrons=0;
181 for(
auto uj=0;uj<elementIdx.size(); uj++)
186 unsigned int maxMultiplicity=std::min(maxCharge,nElectrons);
189 for(
unsigned int uj=1;uj<=maxMultiplicity;uj++)
191 vector<pair<float,float> > tmpDist;
197 for(
unsigned int uk=0;uk<tmpDist.size();uk++)
198 tmpDist[uk].first/=uj;
201 massDistributions.push_back(tmpDist);
211 overlapMasses.clear();
219 const vector<string> &ionNames,
float massDelta,
unsigned int maxCharge,
220 vector<pair< size_t,size_t> > &overlapIdx, vector<pair<float,float> > &overlapMasses )
226 for(
unsigned int ui=0;ui<ionNames.size();ui++)
228 rng.
addIon(ionNames[ui],ionNames[ui],rgb);
232 findOverlaps(natData, rng, massDelta,maxCharge,overlapIdx,overlapMasses);
236 bool testOverlapDetect()
242 unsigned int ionIdTi,ionIdO;
243 ionIdTi =rng.
addIon(
"Ti",
"Ti",c);
244 ionIdO =rng.
addIon(
"O",
"O",c);
248 if(natData.
open(
"naturalAbundance.xml"))
251 vector<pair< size_t,size_t> > overlapIdx;
252 vector<pair<float,float> > overlapMasses;
255 const unsigned int MAX_CHARGESTATE=3;
256 findOverlaps(natData,rng, 0.1,MAX_CHARGESTATE,overlapIdx,overlapMasses);
258 TEST(overlapIdx.size() >=1,
"Overlaps exist");
unsigned int addIon(const std::string &shortName, const std::string &longName, const RGBf &ionCol)
Add the ion to the database returns ion ID if successful, -1 otherwise.
Data holder for colour as float.
void vectorMultiErase(std::vector< T > &vec, const std::vector< bool > &wantKill)
Remove elements from the vector, without preserving order.
void findOverlaps(const AbundanceData &natData, const RangeFile &rng, float massDelta, unsigned int maxCharge, std::vector< std::pair< size_t, size_t > > &overlapIdx, std::vector< std::pair< float, float > > &overlapMasses)
Find the overlaps stemming from a given rangefile.
void getSymbolIndices(const std::vector< std::string > &symbols, std::vector< size_t > &indices) const
Return a vector of symbol indices.
void generateGroupedIsotopeDist(const std::vector< size_t > &elementIdx, const std::vector< size_t > &frequency, std::vector< std::pair< float, float > > &massDist, float massTolerance) const
As per generateIsotopeDist, however, this convenience groups the distribution to limit the effect of ...
size_t open(const char *file, bool strict=false)
Attempt to open the abundance data file, return 0 on success, nonzero on failure. ...
Class to load abundance information for natural isotopes.
bool decomposeIonById(unsigned int ionId, std::vector< std::pair< std::string, size_t > > &fragments) const
Perform decomposeIonNames(...) for a given ionID.
void findOverlapsFromSpectra(const std::vector< std::vector< std::pair< float, float > > > &massDistributions, float massDelta, const std::set< unsigned int > &skipIDs, std::vector< std::pair< size_t, size_t > > &overlapIdx, std::vector< std::pair< float, float > > &overlapMasses)
Find overlaps in the given mass distributions, as per findOverlaps(...Rangefile...)
Data storage and retrieval class for various range files.
unsigned int getNumIons() const
Get the number of unique ions.
unsigned int getAtomicNumber(size_t elemIdx) const
Obtain the atomic number for the given element, by element index.
unsigned int addRange(float start, float end, unsigned int ionID)
Add a range to the rangefile. Returns ID number of added range.