9 int Analysis::FindMaximum(vector<int> & data)
\r
12 for (int ii=1; ii < data.size(); ++ii)
\r
14 if (data[ii] > data[maxIndex])
\r
20 void Analysis::AnalyseData(vector<int> & input, map<float, vector<int> > & output, float peakEnergy, float timeRes, float m, float L, float peakCutOff, int spectraNumber)
\r
22 //Create vector for each spectra
\r
23 vector<vector<int> > inputs;
\r
24 for (int ii=0; ii < spectraNumber; ++ii)
\r
25 inputs.push_back(vector<int>());
\r
30 bool nextReady = false;
\r
31 for (int ii=0; ii < input.size() && index < inputs.size(); ++ii)
\r
47 inputs[index].push_back(input[ii]);
\r
51 for (int ii=0; ii < inputs.size(); ++ii)
\r
53 AnalyseSpectrum(inputs[ii], output, peakEnergy, timeRes, m, L, peakCutOff);
\r
58 void Analysis::AnalyseSpectrum(vector<int> & input, map<float, vector<int> > & output, float peakEnergy, float timeRes, float m, float L, float peakCutOff)
\r
60 int peakBin = FindMaximum(input);
\r
62 if (peakCutOff != 100)
\r
64 peakCutOff /= 100; //Convert from percentage to a scaling factor
\r
66 //Sum all valid values
\r
68 for (int ii=0; ii < input.size(); ++ii)
\r
70 if (input[ii] >= input[peakBin]*peakCutOff)
\r
74 //Now find the middle
\r
77 for (ii=0; ii < input.size() && halfSum < sum/2; ++ii)
\r
79 if (input[ii] >= input[peakBin]*peakCutOff)
\r
80 halfSum += input[ii];
\r
85 timeRes *= pow(10.0f,-12.0f); //Convert resolution to s
\r
86 peakEnergy *= (1.602f * pow(10.0f, -19.0f)); //Convert energy to J
\r
87 m = m * 1.783f * pow(10.0f, -30.0f); //Convert mass to kg
\r
88 L = L * pow(10.0f, -3.0f); //Convert length to m
\r
91 for (int ii=0; ii < input.size(); ++ii)
\r
94 float dT = (peakBin - ii) * timeRes;
\r
98 float E = 0.5f*m * pow(L/(L*pow(m/(2.0f*peakEnergy), 0.5f) + dT), 2.0f);
\r
99 E = E / (1.602f * pow(10.0f, -19.0f)); //Convert J to eV
\r
101 if (E <= 10*peakEnergy || output[E].size() > 0 || input[ii] != 0) //Don't add zero count values above 10*Epeak
\r
102 output[E].push_back(input[ii]);
\r