Project
Loading...
Searching...
No Matches
Cluster.cxx
Go to the documentation of this file.
1// Copyright 2020-2022 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include <TRandom.h>
13#include <TMarker.h>
15#include "Framework/Logger.h"
16#include <TGeoManager.h>
17#include <TVirtualFitter.h>
18#include <cmath>
19
21namespace o2
22{
23namespace hmpid
24{
25
27
28// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29// Calculates naive cluster position as a center of gravity of its digits.
31{
32 if (!mDigs) {
33 LOGP(fatal, "digits are missing in the cluster");
34 }
35
36 int minPadX = 999;
37 int minPadY = 999;
38 int maxPadX = -1;
39 int maxPadY = -1; // for box finding
40
41 if (mDigs->size() == 0) {
42 return;
43 } // no digits in this cluster
44 mXX = mYY = mQRaw = 0; // init summable parameters
45 mCh = -1; // init chamber
46 int maxQpad = -1;
47 int maxQ = -1; // to calculate the pad with the highest charge
48
49 o2::hmpid::Digit* pDig = nullptr;
50 for (int iDig = 0; iDig < mDigs->size(); iDig++) { // digits loop
51 int x, y, mod;
52 int padId = (*mDigs)[iDig]->getPadID();
53 o2::hmpid::Digit::pad2Absolute(padId, &mod, &x, &y);
54 if (x > maxPadX) {
55 maxPadX = x;
56 } // find the minimum box that contain the cluster MaxX
57 if (y > maxPadY) {
58 maxPadY = y;
59 } // MaxY
60 if (x < minPadX) {
61 minPadX = x;
62 } // MinX
63 if (y < minPadY) {
64 minPadY = y;
65 } // MinY
66
67 float q = (*mDigs)[iDig]->mQ; // get QDC
68 mXX += o2::hmpid::Digit::lorsX(padId) * q;
69 mYY += o2::hmpid::Digit::lorsY(padId) * q; // add digit center weighted by QDC
70 mQRaw += q; // increment total charge
71 if (q > maxQ) {
72 maxQpad = padId;
73 maxQ = (int)q;
74 } // to find pad with highest charge
75 mCh = mod; // initialize chamber number
76 } // digits loop
77
78 mBox = (maxPadX - minPadX + 1) * 100 + maxPadY - minPadY + 1; // dimension of the box: format Xdim*100+Ydim
79 if (mQRaw != 0) {
80 mXX /= mQRaw;
81 mYY /= mQRaw;
82 } // final center of gravity
83
84 if (mDigs->size() > 1 && fgDoCorrSin) {
85 corrSin();
86 } // correct it by sinoid
87
88 mQ = mQRaw; // Before starting fit procedure, Q and QRaw must be equal
89 mMaxQpad = maxQpad;
90 mMaxQ = maxQ; // store max charge pad to the field
91 mChi2 = 0; // no Chi2 to find
92 mNlocMax = 0; // proper status from this method
94 return;
95 // setClusterParams(mXX, mYY, mCh); //need to fill the AliCluster3D part
96} // CoG()
97
98// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
99// Correction of cluster x position due to sinoid, see HMPID TDR page 30
101{
103 int pc;
104 int px;
105 int py;
106 o2::hmpid::Param::lors2Pad(mXX, mYY, pc, px, py); // tmp digit to get it center
107 double x = mXX - param->lorsX(pc, px); // diff between cluster x and center of the pad contaning this cluster
108 double xpi8on10 = M_PI / 0.8 * x;
109 mXX += 3.31267e-2 * sin(2.0 * xpi8on10) - 2.66575e-3 * sin(4.0 * xpi8on10) + 2.80553e-3 * sin(6.0 * xpi8on10) + 0.0070;
110 return;
111}
112
113// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
114/*void Cluster::draw(Option_t*)
115{
116 TMarker *pMark = new TMarker(X(), Y(), 5);
117 pMark->SetUniqueID(mSt);pMark->SetMarkerColor(kBlue); pMark->Draw();
118}
119*/
120// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
121void Cluster::fitFunc(int& iNpars, double* deriv, double& chi2, double* par, int iflag)
122{
123 // Cluster fit function
124 // par[0]=x par[1]=y par[2]=q for the first Mathieson shape
125 // par[3]=x par[4]=y par[5]=q for the second Mathieson shape and so on up to iNpars/3 Mathieson shapes
126 // For each pad of the cluster calculates the difference between actual pad charge and the charge induced to this pad by all Mathieson distributions
127 // Then the chi2 is calculated as the sum of this value squared for all pad in the cluster.
128 // Arguments: iNpars - number of parameters which is number of local maxima of cluster * 3
129 // chi2 - function result to be minimised
130 // par - parameters array of size iNpars
131 // Returns: none
132 Cluster* pClu = (Cluster*)TVirtualFitter::GetFitter()->GetObjectFit();
133 int nPads = pClu->mSi;
134 chi2 = 0;
135 int iNshape = iNpars / 3;
136 for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster
137 double dQpadMath = 0;
138 for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad
139 int baseOff = 3 * j;
140 int baseOff1 = baseOff + 1;
141 int baseOff2 = baseOff + 2;
142 double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], pClu->dig(i)->getPadID());
143 dQpadMath += par[baseOff2] * fracMathi; // par[3*j+2] is charge par[3*j] is x par[3*j+1] is y of current Mathieson
144 }
145 if (dQpadMath > 0 && pClu->dig(i)->mQ > 0) {
146 chi2 += std::pow((pClu->dig(i)->mQ - dQpadMath), 2.0) / pClu->dig(i)->mQ; // chi2 function to be minimized
147 }
148 }
149 //---calculate gradients...
150 if (iflag == 2) {
151 std::vector<std::vector<float>> derivPart(iNpars, std::vector<float>(nPads, 0.0f));
152 double dHalfPadX = o2::hmpid::Param::sizeHalfPadX();
153 double dHalfPadY = o2::hmpid::Param::sizeHalfPadY();
154
155 for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster
156 int iPadId = pClu->dig(i)->getPadID();
157 double lx = o2::hmpid::Digit::lorsX(iPadId);
158 double ly = o2::hmpid::Digit::lorsY(iPadId);
159 for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad
160 int baseOff = 3 * j;
161 int baseOff1 = baseOff + 1;
162 int baseOff2 = baseOff + 2;
163 double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], iPadId);
164 derivPart[baseOff][i] += par[baseOff2] * (o2::hmpid::Digit::mathiesonX(par[baseOff] - lx - dHalfPadX) - o2::hmpid::Digit::mathiesonX(par[baseOff] - lx + dHalfPadX)) *
165 o2::hmpid::Digit::intPartMathiY(par[baseOff1], iPadId);
166 derivPart[baseOff1][i] += par[baseOff2] * (o2::hmpid::Digit::mathiesonY(par[baseOff1] - ly - dHalfPadY) - o2::hmpid::Digit::mathiesonY(par[baseOff1] - ly + dHalfPadY)) *
167 o2::hmpid::Digit::intPartMathiX(par[baseOff], iPadId);
168 derivPart[baseOff2][i] += fracMathi;
169 }
170 }
171 // loop on all pads of the cluster
172 for (int i = 0; i < nPads; i++) { // loop on all pads of the cluster
173 int iPadId = pClu->dig(i)->getPadID();
174 double dPadmQ = pClu->dig(i)->mQ;
175 double dQpadMath = 0.0; // pad charge collector
176 double twoOverMq = 2.0 / dPadmQ;
177 for (int j = 0; j < iNshape; j++) { // Mathiesons loop as all of them may contribute to this pad
178 int baseOff = 3 * j;
179 int baseOff1 = baseOff + 1;
180 int baseOff2 = baseOff + 2;
181 double fracMathi = o2::hmpid::Digit::intMathieson(par[baseOff], par[baseOff1], iPadId);
182 dQpadMath += par[baseOff2] * fracMathi;
183 if (dQpadMath > 0 && dPadmQ > 0) {
184 double appoggio = twoOverMq * (dPadmQ - dQpadMath);
185 deriv[baseOff] += appoggio * derivPart[baseOff][i];
186 deriv[baseOff1] += appoggio * derivPart[baseOff1][i];
187 deriv[baseOff2] += appoggio * derivPart[baseOff2][i];
188 }
189 }
190 }
191 } //---gradient calculations ended
192 // fit ended. Final calculations
193} // FitFunction()
194
195//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
196// Print current cluster
197void Cluster::print(Option_t* opt) const
198{
199 const char* status = nullptr;
200 switch (mSt) {
201 case kFrm:
202 status = "formed ";
203 break;
204 case kUnf:
205 status = "unfolded (fit)";
206 break;
207 case kCoG:
208 status = "coged ";
209 break;
210 case kLo1:
211 status = "locmax 1 (fit)";
212 break;
213 case kMax:
214 status = "exceeded (cog)";
215 break;
216 case kNot:
217 status = "not done (cog)";
218 break;
219 case kEmp:
220 status = "empty ";
221 break;
222 case kEdg:
223 status = "edge (fit)";
224 break;
225 case kSi1:
226 status = "size 1 (cog)";
227 break;
228 case kNoLoc:
229 status = "no LocMax(fit)";
230 break;
231 case kAbn:
232 status = "Abnormal fit ";
233 break;
234 case kBig:
235 status = "Big Clu(>100) ";
236 break;
237 default:
238 status = "??????";
239 break;
240 }
241 float ratio = 0;
242 if (mQ > 0.0 && mQRaw > 0.0) {
243 ratio = mQ / mQRaw * 100;
244 }
245 printf("%sCLU: ch=%i (X = %7.3f, Y = %7.3f) Q=%8.3f Qraw=%8.3f(%3.0f%%) Size=%2i DimBox=%i LocMax=%i Chi2=%7.3f %s\n",
246 opt, mCh, mXX, mYY, mQ, mQRaw, ratio, mSi, mBox, mNlocMax, mChi2, status);
247 if (mDigs && mDigs->size() > 0) {
248 std::cout << "Digits of Cluster" << std::endl;
249 for (int i; i < mDigs->size(); i++) {
250 std::cout << (*mDigs)[i] << std::endl;
251 }
252 }
253 return;
254} // Print()
255
256//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
257int Cluster::solve(std::vector<o2::hmpid::Cluster>* pCluLst, float* pSigmaCut, bool isTryUnfold)
258{
259 // This methode is invoked when the cluster is formed to solve it. Solve the cluster means to try to unfold the cluster
260 // into the local maxima number of clusters. This methode is invoked by AliHMPIDRconstructor::Dig2Clu() on cluster by cluster basis.
261 // At this point, cluster contains a list of digits, cluster charge and size is precalculated in AddDigit(), position is preset to (-1,-1) in ctor,
262 // status is preset to kFormed in AddDigit(), chamber-sector info is preseted to actual values in AddDigit()
263 // Method first finds number of local maxima and if it's more then one tries to unfold this cluster into local maxima number of clusters
264 // Arguments: pCluLst - cluster list pointer where to add new cluster(s)
265 // isTryUnfold - flag to switch on/off unfolding
266 // Returns: number of local maxima of original cluster
268 if (!mDigs) {
269 LOGP(fatal, "digits are missing in the cluster");
270 }
271 const int kMaxLocMax = 6; // max allowed number of loc max for fitting
272 coG(); // First calculate CoG for the given cluster
273 int iCluCnt = pCluLst->size(); // get current number of clusters already stored in the list by previous operations
274 int rawSize = mSi; // get current raw cluster size
275 if (rawSize > 100) {
276 mSt = kBig;
277 } else if (isTryUnfold == false) {
278 mSt = kNot;
279 } else if (rawSize == 1) {
280 mSt = kSi1;
281 }
282 if (rawSize > 100 || isTryUnfold == false || rawSize == 1) { // No deconv if: 1 - big cluster (also avoid no zero suppression!)
283 // setClusterParams(mXX, mYY, mCh); // 2 - flag is set to FALSE
284 // new ((*pCluLst)[iCluCnt++]) Cluster(*this); // 3 - size = 1
285 pCluLst->push_back(o2::hmpid::Cluster(*this));
286 pCluLst->back().cleanPointers();
287 return 1; // add this raw cluster
288 }
289
290 // Phase 0. Initialise Fitter
291 double arglist[10]{0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
292 float ierflg = 0.;
293 TVirtualFitter* fitter = TVirtualFitter::Fitter((TObject*)this, 3 * 6); // initialize Fitter
294 if (fitter == nullptr) {
295 LOG(fatal) << "TVirtualFitter could not be created";
296 return 1;
297 }
298 arglist[0] = -1;
299 ierflg = fitter->ExecuteCommand("SET PRI", arglist, 1); // no printout
300 ierflg = fitter->ExecuteCommand("SET NOW", arglist, 0); // no warning messages
301 arglist[0] = 1;
302 ierflg = fitter->ExecuteCommand("SET GRA", arglist, 1); // force Fitter to use my gradient
303 fitter->SetFCN(Cluster::fitFunc);
304 // Phase 1. Find number of local maxima. Strategy is to check if the current pad has QDC more then all neigbours. Also find the box contaning the cluster
305 mNlocMax = 0;
306 for (int iDig1 = 0; iDig1 < rawSize; iDig1++) { // first digits loop
307 auto pDig1 = (*mDigs)[iDig1]; // take next digit
308 int iCnt = 0; // counts how many neighbouring pads has QDC more then current one
309 for (int iDig2 = 0; iDig2 < rawSize; iDig2++) { // loop on all digits again
310 if (iDig1 == iDig2) {
311 continue;
312 } // the same digit, no need to compare
313 auto pDig2 = (*mDigs)[iDig2]; // take second digit to compare with the first one
314 int dist = TMath::Sign(int(pDig1->mX - pDig2->mX), 1) + TMath::Sign(int(pDig1->mY - pDig2->mY), 1); // distance between pads
315 if (dist == 1) { // means dig2 is a neighbour of dig1
316 if (pDig2->mQ >= pDig1->mQ) {
317 iCnt++; // count number of pads with Q more then Q of current pad
318 }
319 }
320 } // second digits loop
321 if (iCnt == 0 && mNlocMax < kMaxLocMax) { // this pad has Q more then any neighbour so it's local maximum
322 float xStart = o2::hmpid::Digit::lorsX(pDig1->getPadID());
323 float yStart = o2::hmpid::Digit::lorsY(pDig1->getPadID());
324 float xMin = xStart - param->sizePadX();
325 float xMax = xStart + param->sizePadX();
326 float yMin = yStart - param->sizePadY();
327 float yMax = yStart + param->sizePadY();
328 ierflg = fitter->SetParameter(3 * mNlocMax, Form("x%i", mNlocMax), xStart, 0.1, xMin, xMax); // X,Y,Q initial values of the loc max pad
329 ierflg = fitter->SetParameter(3 * mNlocMax + 1, Form("y%i", mNlocMax), yStart, 0.1, yMin, yMax); // X, Y constrained to be near the loc max
330 ierflg = fitter->SetParameter(3 * mNlocMax + 2, Form("q%i", mNlocMax), pDig1->mQ, 0.1, 0, 10000); // Q constrained to be positive
331 mNlocMax++;
332 } // if this pad is local maximum
333 } // first digits loop
334
335 // Phase 2. Fit loc max number of Mathiesons or add this current cluster to the list
336 // case 1 -> no loc max found
337 if (mNlocMax == 0) { // case of no local maxima found: pads with same charge...
338 mNlocMax = 1;
339 mSt = kNoLoc;
340 // setClusterParams(mXX, mYY, mCh); //need to fill the AliCluster3D part
341 pCluLst->push_back(o2::hmpid::Cluster(*this)); // add new unfolded cluster pCluLst->push_back(o2::hmpid::Cluster(*this));
342 pCluLst->back().cleanPointers();
343 return mNlocMax;
344 }
345
346 // case 2 -> loc max found. Check # of loc maxima
347 if (mNlocMax >= kMaxLocMax) {
348 // setClusterParams(mXX, mYY, mCh); // if # of local maxima exceeds kMaxLocMax...
349 mSt = kMax;
350 pCluLst->push_back(o2::hmpid::Cluster(*this)); //...add this raw cluster
351 pCluLst->back().cleanPointers();
352 } else { // or resonable number of local maxima to fit and user requested it
353 // Now ready for minimization step
354 arglist[0] = 500; // number of steps and sigma on pads charges
355 arglist[1] = 1.; //
356 /*
357 ierflg = fitter->ExecuteCommand("SIMPLEX", arglist, 2); // start fitting with Simplex
358 if (!ierflg) {
359 fitter->ExecuteCommand("MIGRAD", arglist, 2); // fitting improved by Migrad
360 }
361 if (ierflg) {
362 double strategy = 2.;
363 ierflg = fitter->ExecuteCommand("SET STR", &strategy, 1); // change level of strategy
364 if (!ierflg) {
365 ierflg = fitter->ExecuteCommand("SIMPLEX", arglist, 2); // start fitting with Simplex
366 if (!ierflg) {
367 fitter->ExecuteCommand("MIGRAD", arglist, 2); // fitting improved by Migrad
368 }
369 }
370 }
371 */
372
373 double strategy = 2.;
374 ierflg = fitter->ExecuteCommand("SET STR", &strategy, 1); // change level of strategy
375 if (!ierflg) {
376 fitter->ExecuteCommand("MIGRAD", arglist, 2); // fitting improved by Migrad
377 }
378
379 if (ierflg) {
380 mSt = kAbn; // no convergence of the fit...
381 }
382 double dummy;
383 char sName[80]; // vars to get results from Minuit
384 double edm;
385 double errdef;
386 int nvpar;
387 int nparx;
388 for (int i = 0; i < mNlocMax; i++) { // store the local maxima parameters
389 fitter->GetParameter(3 * i, sName, mXX, mErrX, dummy, dummy); // X
390 fitter->GetParameter(3 * i + 1, sName, mYY, mErrY, dummy, dummy); // Y
391 fitter->GetParameter(3 * i + 2, sName, mQ, mErrQ, dummy, dummy); // Q
392 fitter->GetStats(mChi2, edm, errdef, nvpar, nparx); // get fit infos
393 // Printf("********************loc. max. = %i, X= %f, Y = %f, Q = %f**************************",i,mXX,mYY,mQ);
394 if (mNlocMax > 1) {
395 findClusterSize(i, pSigmaCut); // find clustersize for deconvoluted clusters
396 // after this call, fSi temporarly is the calculated size. Later is set again
397 // to its original value
398 }
399 if (mSt != kAbn) {
400 if (mNlocMax != 1) {
401 mSt = kUnf; // if unfolded
402 }
403 if (mNlocMax == 1 && mSt != kNoLoc) {
404 mSt = kLo1; // if only 1 loc max
405 }
406 if (!isInPc()) {
407 mSt = kEdg; // if Out of Pc
408 }
409 if (mSt == kNoLoc) {
410 mNlocMax = 0; // if with no loc max (pads with same charge..)
411 }
412 }
413 // setClusterParams(mXX, mYY, mCh); //need to fill the AliCluster3D part
414 // Printf("********************loc. max. = %i, X= %f, Y = %f, Q = %f**************************",i,mXX,mYY,mQ);
415 pCluLst->push_back(o2::hmpid::Cluster(*this)); // add new unfolded cluster
416 pCluLst->back().cleanPointers();
417 if (mNlocMax > 1) {
418 setSize(rawSize); // Original raw size is set again to its proper value
419 }
420 }
421 }
422 return mNlocMax;
423} // Solve()
424
425//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
426// Estimate of the clustersize for a deconvoluted cluster
427void Cluster::findClusterSize(int i, float* pSigmaCut)
428{
429 int size = 0;
430 for (int iDig = 0; iDig < mSi; iDig++) { // digits loop
431 auto pDig = dig(iDig); // take digit
432 int iCh = pDig->mCh;
433 double qPad = mQ * o2::hmpid::Digit::intMathieson(x(), y(), pDig->getPadID()); // pad charge pDig->
434 // AliDebug(1,Form("Chamber %i X %i Y %i SigmaCut %i pad %i qpadMath %8.2f qPadRaw %8.2f Qtotal %8.2f cluster n.%i",
435 // iCh, o2::hmpid::Digit::a2X(pDig->getPadID()), o2::hmpid::Digit::a2Y(pDig->getPadID()),
436 // pSigmaCut[iCh],iDig,qPad,pDig->mQ,mQRaw,i));
437 if (qPad > pSigmaCut[iCh]) {
438 size++;
439 }
440 }
441 // AliDebug(1,Form(" Calculated size %i",size));
442 if (size > 0) {
443 setSize(size); // in case of size == 0, original raw clustersize used
444 }
445}
446//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
448{
449 // Check if (X,Y) position is inside the PC limits
450 // Arguments:
451 // Returns: True or False
453 if (!mDigs) {
454 LOGP(fatal, "digits are missing in the cluster");
455 }
456 int pc = (*mDigs)[0]->getPh(); // (o2::hmpid::Digit*)&mDigs.at(iDig)
457
458 if (mXX < param->minPcX(pc) || mXX > param->maxPcX(pc) || mYY < param->minPcY(pc) || mYY > param->maxPcY(pc)) {
459 return false;
460 }
461
462 return true;
463}
464//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
465void Cluster::digAdd(const Digit* pDig)
466{
467 // Adds a given digit to the list of digits belonging to this cluster, cluster is not owner of digits
468 // Arguments: pDig - pointer to digit to be added
469 // Returns: none
470 if (!mDigs) {
471 LOGP(fatal, "digits are not set to the cluster");
472 }
473 if (mDigs->size() == 0) { // create list of digits in the first invocation
474 mSi = 0;
475 }
476 // fDigs->Add(pDig);
477 mDigs->push_back(pDig);
478 mSt = kFrm;
479 mSi++;
480 return;
481}
482//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
484{
485 //
487 // mDigs={0x0};
488 mSt = kEmp;
489 mQRaw = mQ = 0;
490 mXX = mYY = 0;
491 mCh = mSi = mBox = mNlocMax = mMaxQpad = -1;
492 mMaxQ = mErrQ = mErrX = mErrY = mChi2 = -1; // empty ctor
493}
494
495} // namespace hmpid
496} // namespace o2
ClassImp(o2::hmpid::Cluster)
int32_t i
float & yMax
uint32_t j
Definition RawData.h:0
HMPID cluster implementation.
Definition Cluster.h:27
std::vector< const o2::hmpid::Digit * > * mDigs
Definition Cluster.h:117
void cleanPointers()
Definition Cluster.h:49
void setSize(int size)
Definition Cluster.h:94
void print(Option_t *opt="") const
Definition Cluster.cxx:197
const o2::hmpid::Digit * dig(int i) const
Definition Cluster.h:56
static void fitFunc(int &iNpars, double *deriv, double &chi2, double *par, int iflag)
Definition Cluster.cxx:121
void findClusterSize(int i, float *pSigmaCut)
Definition Cluster.cxx:427
static bool fgDoCorrSin
list of digits forming this cluster
Definition Cluster.h:120
void digAdd(const o2::hmpid::Digit *pDig)
Definition Cluster.cxx:465
int solve(std::vector< o2::hmpid::Cluster > *pCluLst, float *pSigmaCut, bool isUnfold)
Definition Cluster.cxx:257
HMPID Digit declaration.
Definition Digit.h:36
static double mathiesonY(double x)
Definition Digit.cxx:386
static void pad2Absolute(uint32_t pad, int *Module, int *x, int *y)
Definition Digit.cxx:211
static float lorsY(int pad)
Definition Digit.h:142
static double intPartMathiX(double x, int pad)
Definition Digit.cxx:326
uint16_t mQ
Definition Digit.h:126
static float lorsX(int pad)
Definition Digit.h:141
static double intPartMathiY(double y, int pad)
Definition Digit.cxx:344
static double mathiesonX(double x)
Definition Digit.cxx:372
static double intMathieson(double localX, double localY, int pad)
Definition Digit.cxx:363
int getPadID() const
Definition Digit.h:84
static float sizeHalfPadX()
Definition Param.h:72
static Param * instanceNoGeo()
Definition Param.cxx:450
static float sizeHalfPadY()
Definition Param.h:73
static void lors2Pad(float x, float y, Int_t &pc, Int_t &px, Int_t &py)
Definition Param.cxx:488
GLint GLenum GLint x
Definition glcorearb.h:403
GLsizeiptr size
Definition glcorearb.h:659
GLenum GLfloat param
Definition glcorearb.h:271
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"