]>
Commit | Line | Data |
---|---|---|
9b37718a | 1 | #ifndef ALIPHOSFITTER_H |
2 | #define ALIPHOSFITTER_H | |
3 | /* Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved. * | |
4 | * See cxx source for full Copyright notice */ | |
5 | ||
6 | ||
7 | ||
8 | /** | |
9 | * The PhosFitter class is the class for extracting the basic signal parameters | |
10 | * "timing" and "energy" from the PHOS raw data. Physical data will for a given readout channel be | |
11 | * a sequense of ADC digitized 10 bit integer values, however for performance reasons all values used in | |
12 | * calculation is of type double. | |
13 | **/ | |
14 | class AliPHOSFitter | |
15 | { | |
16 | public: | |
17 | /** | |
18 | * Default constructor | |
19 | **/ | |
20 | AliPHOSFitter(); | |
21 | ||
22 | /** | |
23 | * Main constructor | |
24 | * @param dataPtr Data array for wich a subarray will be taken to perform the fit | |
25 | * @param fs the sampling frequency in entities of MHz. Needed in order to calculate physical time | |
26 | **/ | |
27 | AliPHOSFitter(double *dataPtr, double fs); | |
28 | ||
29 | /** | |
30 | * Destructor | |
31 | **/ | |
32 | ~AliPHOSFitter(); | |
33 | ||
34 | ||
35 | /** | |
36 | * Attemps to level the basline to zero. | |
37 | * The baseline will be calculated from the pretrigger samples and subtracted from the | |
38 | * data array. | |
39 | * If pretrigger samples are not present then the basline correction will be incorrect. | |
40 | * @param dataPtr array for wich to correct the basline | |
41 | * @param N the number of pretrigger samples used to calculate the baseline. | |
42 | **/ | |
43 | void BaselineCorrection(double *dataPtr, int N); | |
44 | ||
45 | /** | |
46 | * Shifts the basline with the amount given by baselineValue | |
47 | * If pretrigger samples are not present then the basline correction will be incorrect. | |
48 | * @param dataPtr array for wich to correct the basline | |
49 | * @param BaslineValue the basline value to subtract.. | |
50 | **/ | |
51 | void BaselineCorrection(double *dataPtr, double baselineValue); | |
52 | ||
53 | /** | |
54 | * Extraction of timing and energy using a least square fit assuming uncorrelated measurement errors. | |
55 | * This is also called a "Chi square fit". The default method is the Levenberg Marquardt nonlinear fit. | |
56 | * If the errors are correlated (which is typically the case) | |
57 | * the timing and energy will not be mimimum variance lower bound. Correlated errors might also give a | |
58 | * systematic error. The parameters "start" and "length" defines the subarray of the data array set in the | |
59 | * constructor that will be used in the fit. "start + length" cannot exeed the length of the data array. | |
60 | * The baseline must be subtracted before performing the fit othervise the result can be biased. | |
61 | * the initial guess parameters is found by the method "MakeInitialGuess". | |
62 | * @param start the start index of the subarray of the data array. | |
63 | * @param length the number of samples to use starting from index | |
64 | * @param start the start index of the subarray of the data array. | |
65 | * @param length the number of samples to use starting from index | |
66 | **/ | |
67 | void FitChiSquare(int start, int lenght); | |
68 | ||
69 | /** | |
70 | * Extraction of timing and energy using a least square fit assuming uncorrelated measurement errors. | |
71 | * This is also called a "Chi square fit". The default method is the Levenberg Marquardt nonlinear fit. | |
72 | * If the errors are correlated (which is typically the case) | |
73 | * the timing and energy will not be mimimum variance lower bound. Correlated errors might also give a | |
74 | * systematic error. The parameters "start" and "length" defines the subarray of the data array set in the | |
75 | * constructor that will be used in the fit. "start + length" cannot exeed the length of the data array. | |
76 | * The baseline must be subtracted before performing the fit othervise the result can be biased. | |
77 | * A good initial guess greatly enchanes performance. A poor initial guess might give a solution that is a local | |
78 | * minima instead of a global minima. If the startindex of the pulse is the first sample above a low (2-3 ADC levels) | |
79 | * above the baseline, then the initial guess of t0 an be set to zero. A good initial guess for amplitude will | |
80 | * for a gamma 2 function be for instance (Max sample valu - baseline)*exp(2). If a Gamma N function is used | |
81 | * multiply with exp(N). | |
82 | * @param start the start index of the subarray of the data array. | |
83 | * @param length the number of samples to use starting from index | |
84 | * @param tGuess initial guess for timing (in entities of samples) | |
85 | * @param aGuess initial guess for energy in entities of (ADC channels)*exp(2) (for a gamma 2 fuction) | |
86 | **/ | |
87 | void FitChiSquare(int start, int lenght, double tGuess, double aGuess); | |
88 | ||
89 | /** | |
90 | * Extraction of timing an energy using the | |
91 | * K-level method. | |
92 | * @param kLevel the K-level | |
93 | * "start" and "length" defines the subarray of the data array (set in the constructor) | |
94 | * @param start index of samples to use relative to the the data array | |
95 | * @param length the number of samples to use (starting at "start") | |
96 | **/ | |
97 | void FitKLevel(double kLevel, int start, int lenght); | |
98 | ||
99 | /** | |
100 | * This method gives the statistically best possible unbiased estimate of t0 and amplitude provided that a good | |
101 | * estimate of the covariance matrix exists. | |
102 | * Extraction of timing and energy using a least square fit assuming correlated errors. | |
103 | * The user must supply the autocovariance matrix. For N number of samples this matrix | |
104 | * will be a NxN matrix. | |
105 | * The default method is the Levenberg Marquardt nonlinear fit. | |
106 | * The parameters "start" and "length" defines the subarray of the data array set in the | |
107 | * constructor that will be used in the fit. "start + length" cannot exeed the length of the data array. | |
108 | * The baseline must be subtracted before performing the fit othervise the result wil biased. | |
109 | * If the startindex of the pulse is the first sample above a low (2-3 ADC levels) | |
110 | * above the baseline, then the initial guess of t0 an be set to zero. A good initial guess for amplitude will | |
111 | * for a gamma 2 function be for instance (Max sample valu - baseline)*exp(2). If a Gamma N function is used | |
112 | * multiply with exp(N). | |
113 | * The correlation matrix for the parameters is written to the matrix pointe to by pCovar | |
114 | * @param start the start index of the subarray of the data array. | |
115 | * @param length the number of samples to use starting from "start" | |
116 | * @param kmCovarPtrPtr the measurement correlation matrix | |
117 | * @param pCovarPtrPtr the correlation matrix of the estimated parameters | |
118 | * @param tGuess initial guess of t0 in entities of sampling intervals | |
119 | * @param aGuess initial guess of the amplitude in entities of ADC levels*exp(2) | |
120 | **/ | |
121 | void FitLeastMeanSquare(int start, int lenght, const double **kmCovarPtrPtr, double **pCovarPtrPtr); | |
122 | ||
123 | /** | |
124 | * This method gives the statistically best possible unbiased estimate of t0 and amplitude provided that a good | |
125 | * estimate of the covariance matrix exists. | |
126 | * For N number of samples this covariance matrix must be an NxN matrix. | |
127 | * The default method is the Levenberg Marquardt nonlinear fit. | |
128 | * The parameters "start" and "length" defines the subarray of the data array set in the | |
129 | * constructor that will be used in the fit. "start + length" cannot exeed the length of the data array. | |
130 | * The baseline must be subtracted before performing the fit othervise the result wil biased. | |
131 | * A good initial guess will greatly enchance performance. | |
132 | * a poor initial guess will slow down the algorithm and possibly lead to convergens to local minima | |
133 | * of the cost function instead of the global minima. A very bad intial guess might give divergence of the solution. | |
134 | * If the startindex of the pulse is the first sample above a low (2-3 ADC levels) | |
135 | * above the baseline, then the initial guess of t0 can be set to zero. A good initial guess for amplitude will | |
136 | * for a gamma 2 function be for instance (Max sample value - baseline)*exp(2). If a Gamma N function is used | |
137 | * multiply with exp(N). | |
138 | * @param start the start index of the subarray of the data array. | |
139 | * @param length the number of samples to use starting from index | |
140 | * @param mCovar the measurement correlation matrix | |
141 | * @param pCovar the correlation matrix of the estimated parameters | |
142 | * @param tGuess initial guess of t0 in entities of sampling intervals | |
143 | * @param aGuess initial guess of the amplitude in entities of ADC levels*exp(2) | |
144 | **/ | |
145 | void FitLeastMeanSquare(int start, int lenght, const double **kmCovarPtrPtr, double **pCovarPtrPtr, double tGuess, double aGuess); | |
146 | ||
147 | /** | |
148 | * Extraction of timing and energy using the Peakfinde Algorithm. | |
149 | * The. The parameters "start" and "length" defines a sub array of the data array | |
150 | * that will be used for the the fit. If start+length must not exeed the total length | |
151 | * of the Data array. "start" must be chosen as close as possible to t0. | |
152 | * The baseline must also be subtracted. | |
153 | * The length of "tVector" and "aVector" mus be equal to length. | |
154 | * "index + length" must not exeed the length of the data array set in the constructor. | |
155 | * @param start the start index of the subarray of the data array. | |
156 | * @param length the number of samples to use starting from index | |
157 | * @param tVector the peakfinder vector for timing | |
158 | * @param aVector the peakfinder vector for amplitude (energy) | |
159 | **/ | |
160 | void FitPeakFinder(int start, int lenght, double *tVector, double *aVector); | |
161 | ||
162 | /** | |
163 | * This method finds the start index of the pulse (relative to the data array) by serching for | |
164 | * three or more continious samples above trheshold. | |
165 | * @param treshold treshold to use when searchin for the start of the pulse | |
166 | **/ | |
167 | int FindStartIndex(double treshold); | |
168 | ||
169 | /** | |
170 | * Gives the timing in entities of sample indexes | |
171 | * Physical time is found by multiplying with the sampling intervall (Ts). | |
172 | **/ | |
173 | float GetTiming(); | |
174 | ||
175 | /** | |
176 | * Gives the time in entities of ADC channels (quantization levels). | |
177 | * Absolute enrgy is found by multiplying with offline calibration constants. | |
178 | **/ | |
179 | float GetEnergy(); | |
180 | ||
181 | // /** | |
182 | // * Set data array. Overrrides the data array set in the constructor. | |
183 | // **/ | |
184 | // void SetData(int *data); | |
185 | ||
186 | /** | |
187 | * Set data array. Overrides data data array set in the constructor. | |
188 | **/ | |
189 | void SetData(double *data); | |
190 | ||
191 | ||
192 | private: | |
193 | ||
194 | /** | |
195 | * This function applies only to the Chi and Least mean square fit. An initial guess is made | |
196 | * based on the average of the first 5 samples and the first value exeeding this value. | |
197 | **/ | |
198 | void MakeInitialGuess(); | |
199 | ||
200 | /** | |
201 | * This function applies only to the Chi and Least mean square fit. An initial guess is made | |
202 | * based on the average of the first 5 samples and the first value exeeding threshold + this value. | |
203 | * @param treshold The index of the first value above treshold is ntaken to be the first value. | |
204 | **/ | |
205 | void MakeInitialGuess(int treshold); | |
206 | ||
207 | double *fFloatDataPtr; /**<Float representation of data that should be fitted */ | |
208 | double fSampleFrequency; /**<The ADC sample frequency in MHz used under data taking */ | |
209 | double fTau; /**<The risetime in micro seconds*/ | |
210 | double fDTof; /**<Time of flight in entities of sample intervals */ | |
211 | double fDAmpl; /**<Amplitude in entities of ADC levels*/ | |
212 | double fDTofGuess; /**<Initial guess for t0*/ | |
213 | double fDAmplGuess; /**<Initial guess for amplitude*/ | |
214 | double **kfMCovarPtrPtr; /**<Covariance matrix of the measurements*/ | |
215 | double **fPCovarPtrPtr; /**<Covariance matrix of the estimated parameters*/ | |
216 | }; | |
217 | ||
218 | #endif |