|
1 | | -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. |
| 1 | +// Copyright 2020-2022 CERN and copyright holders of ALICE O2. |
2 | 2 | // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. |
3 | 3 | // All rights not expressly granted are reserved. |
4 | 4 | // |
@@ -167,7 +167,8 @@ void Cluster::corrSin() |
167 | 167 | int py; |
168 | 168 | o2::hmpid::Param::lors2Pad(mXX, mYY, pc, px, py); // tmp digit to get it center |
169 | 169 | double x = mXX - mParam->lorsX(pc, px); // diff between cluster x and center of the pad contaning this cluster |
170 | | - mXX += 3.31267e-2 * sin(2 * M_PI / 0.8 * x) - 2.66575e-3 * sin(4 * M_PI / 0.8 * x) + 2.80553e-3 * sin(6 * M_PI / 0.8 * x) + 0.0070; |
| 170 | + double xpi8on10 = M_PI / 0.8 * x; |
| 171 | + mXX += 3.31267e-2 * sin(2.0 * xpi8on10) - 2.66575e-3 * sin(4.0 * xpi8on10) + 2.80553e-3 * sin(6.0 * xpi8on10) + 0.0070; |
171 | 172 | return; |
172 | 173 | } |
173 | 174 |
|
@@ -197,54 +198,58 @@ void Cluster::fitFunc(int& iNpars, double* deriv, double& chi2, double* par, int |
197 | 198 | for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster |
198 | 199 | double dQpadMath = 0; |
199 | 200 | for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad |
200 | | - double fracMathi = o2::hmpid::Digit::intMathieson(par[3 * j], par[3 * j + 1], pClu->dig(i)->getPadID()); |
201 | | - dQpadMath += par[3 * j + 2] * fracMathi; // par[3*j+2] is charge par[3*j] is x par[3*j+1] is y of current Mathieson |
| 201 | + int baseOff = 3 * j; |
| 202 | + int baseOff1 = baseOff + 1; |
| 203 | + int baseOff2 = baseOff + 2; |
| 204 | + double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], pClu->dig(i)->getPadID()); |
| 205 | + dQpadMath += par[baseOff2] * fracMathi; // par[3*j+2] is charge par[3*j] is x par[3*j+1] is y of current Mathieson |
202 | 206 | } |
203 | 207 | if (dQpadMath > 0 && pClu->dig(i)->mQ > 0) { |
204 | 208 | chi2 += std::pow((pClu->dig(i)->mQ - dQpadMath), 2.0) / pClu->dig(i)->mQ; // chi2 function to be minimized |
205 | 209 | } |
206 | 210 | } |
207 | 211 | //---calculate gradients... |
208 | 212 | if (iflag == 2) { |
209 | | - float** derivPart; |
210 | | - derivPart = new float*[iNpars]; |
211 | | - for (int j = 0; j < iNpars; j++) { |
212 | | - deriv[j] = 0; |
213 | | - derivPart[j] = new float[nPads]; |
214 | | - for (int i = 0; i < nPads; i++) { |
215 | | - derivPart[j][i] = 0; |
216 | | - } |
217 | | - } |
218 | | - for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster |
| 213 | + std::vector<std::vector<float>> derivPart(iNpars, std::vector<float>(nPads, 0.0f)); |
| 214 | + double dHalfPadX = o2::hmpid::Param::sizeHalfPadX(); |
| 215 | + double dHalfPadY = o2::hmpid::Param::sizeHalfPadY(); |
| 216 | + |
| 217 | + for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster |
| 218 | + int iPadId = pClu->dig(i)->getPadID(); |
| 219 | + double lx = o2::hmpid::Digit::lorsX(iPadId); |
| 220 | + double ly = o2::hmpid::Digit::lorsY(iPadId); |
219 | 221 | for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad |
220 | | - double fracMathi = o2::hmpid::Digit::intMathieson(par[3 * j], par[3 * j + 1], pClu->dig(i)->getPadID()); |
221 | | - double lx = o2::hmpid::Digit::lorsX(pClu->dig(i)->getPadID()); |
222 | | - double ly = o2::hmpid::Digit::lorsY(pClu->dig(i)->getPadID()); |
223 | | - derivPart[3 * j][i] += par[3 * j + 2] * (o2::hmpid::Digit::mathiesonX(par[3 * j] - lx - 0.5 * o2::hmpid::Param::sizePadX()) - o2::hmpid::Digit::mathiesonX(par[3 * j] - lx + 0.5 * o2::hmpid::Param::sizePadX())) * |
224 | | - o2::hmpid::Digit::intPartMathiY(par[3 * j + 1], pClu->dig(i)->getPadID()); |
225 | | - derivPart[3 * j + 1][i] += par[3 * j + 2] * (o2::hmpid::Digit::mathiesonY(par[3 * j + 1] - ly - 0.5 * o2::hmpid::Param::sizePadY()) - o2::hmpid::Digit::mathiesonY(par[3 * j + 1] - ly + 0.5 * o2::hmpid::Param::sizePadY())) * |
226 | | - o2::hmpid::Digit::intPartMathiX(par[3 * j], pClu->dig(i)->getPadID()); |
227 | | - derivPart[3 * j + 2][i] += fracMathi; |
| 222 | + int baseOff = 3 * j; |
| 223 | + int baseOff1 = baseOff + 1; |
| 224 | + int baseOff2 = baseOff + 2; |
| 225 | + double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], iPadId); |
| 226 | + derivPart[baseOff][i] += par[baseOff2] * (o2::hmpid::Digit::mathiesonX(par[baseOff] - lx - dHalfPadX) - o2::hmpid::Digit::mathiesonX(par[baseOff] - lx + dHalfPadX)) * |
| 227 | + o2::hmpid::Digit::intPartMathiY(par[baseOff1], iPadId); |
| 228 | + derivPart[baseOff1][i] += par[baseOff2] * (o2::hmpid::Digit::mathiesonY(par[baseOff1] - ly - dHalfPadY) - o2::hmpid::Digit::mathiesonY(par[baseOff1] - ly + dHalfPadY)) * |
| 229 | + o2::hmpid::Digit::intPartMathiX(par[baseOff], iPadId); |
| 230 | + derivPart[baseOff2][i] += fracMathi; |
228 | 231 | } |
229 | 232 | } |
230 | 233 | // loop on all pads of the cluster |
231 | | - for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster |
232 | | - double dQpadMath = 0; // pad charge collector |
| 234 | + for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster |
| 235 | + int iPadId = pClu->dig(i)->getPadID(); |
| 236 | + double dPadmQ = pClu->dig(i)->mQ; |
| 237 | + double dQpadMath = 0.0; // pad charge collector |
| 238 | + double twoOverMq = 2.0 / dPadmQ; |
233 | 239 | for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad |
234 | | - float fracMathi = o2::hmpid::Digit::intMathieson(par[3 * j], par[3 * j + 1], pClu->dig(i)->getPadID()); |
235 | | - dQpadMath += par[3 * j + 2] * fracMathi; |
236 | | - if (dQpadMath > 0 && pClu->dig(i)->mQ > 0) { |
237 | | - deriv[3 * j] += 2 / pClu->dig(i)->mQ * (pClu->dig(i)->mQ - dQpadMath) * derivPart[3 * j][i]; |
238 | | - deriv[3 * j + 1] += 2 / pClu->dig(i)->mQ * (pClu->dig(i)->mQ - dQpadMath) * derivPart[3 * j + 1][i]; |
239 | | - deriv[3 * j + 2] += 2 / pClu->dig(i)->mQ * (pClu->dig(i)->mQ - dQpadMath) * derivPart[3 * j + 2][i]; |
| 240 | + int baseOff = 3 * j; |
| 241 | + int baseOff1 = baseOff + 1; |
| 242 | + int baseOff2 = baseOff + 2; |
| 243 | + double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], iPadId); |
| 244 | + dQpadMath += par[baseOff2] * fracMathi; |
| 245 | + if (dQpadMath > 0 && dPadmQ > 0) { |
| 246 | + double appoggio = twoOverMq * (dPadmQ - dQpadMath); |
| 247 | + deriv[baseOff] += appoggio * derivPart[baseOff][i]; |
| 248 | + deriv[baseOff1] += appoggio * derivPart[baseOff1][i]; |
| 249 | + deriv[baseOff2] += appoggio * derivPart[baseOff2][i]; |
240 | 250 | } |
241 | 251 | } |
242 | 252 | } |
243 | | - // delete array... |
244 | | - for (int i = 0; i < iNpars; i++) { |
245 | | - delete[] derivPart[i]; |
246 | | - } |
247 | | - delete[] derivPart; |
248 | 253 | } //---gradient calculations ended |
249 | 254 | // fit ended. Final calculations |
250 | 255 | } // FitFunction() |
@@ -321,6 +326,7 @@ int Cluster::solve(std::vector<o2::hmpid::Cluster>* pCluLst, float* pSigmaCut, b |
321 | 326 | // Arguments: pCluLst - cluster list pointer where to add new cluster(s) |
322 | 327 | // isTryUnfold - flag to switch on/off unfolding |
323 | 328 | // Returns: number of local maxima of original cluster |
| 329 | + |
324 | 330 | const int kMaxLocMax = 6; // max allowed number of loc max for fitting |
325 | 331 | coG(); // First calculate CoG for the given cluster |
326 | 332 | int iCluCnt = pCluLst->size(); // get current number of clusters already stored in the list by previous operations |
@@ -497,6 +503,7 @@ void Cluster::digAdd(const Digit* pDig) |
497 | 503 | // Adds a given digit to the list of digits belonging to this cluster, cluster is not owner of digits |
498 | 504 | // Arguments: pDig - pointer to digit to be added |
499 | 505 | // Returns: none |
| 506 | + |
500 | 507 | if (mDigs.size() == 0) { // create list of digits in the first invocation |
501 | 508 | mSi = 0; |
502 | 509 | // std::vector<o2::hmpid::Digit*> fDigs; |
|
0 commit comments