132 Cluster* pClu = (
Cluster*)TVirtualFitter::GetFitter()->GetObjectFit();
133 int nPads = pClu->
mSi;
135 int iNshape = iNpars / 3;
136 for (
int i = 0;
i < nPads;
i++) {
137 double dQpadMath = 0;
138 for (
int j = 0;
j < iNshape;
j++) {
140 int baseOff1 = baseOff + 1;
141 int baseOff2 = baseOff + 2;
143 dQpadMath += par[baseOff2] * fracMathi;
145 if (dQpadMath > 0 && pClu->
dig(
i)->
mQ > 0) {
151 std::vector<std::vector<float>> derivPart(iNpars, std::vector<float>(nPads, 0.0f));
155 for (
int i = 0;
i < nPads;
i++) {
159 for (
int j = 0;
j < iNshape;
j++) {
161 int baseOff1 = baseOff + 1;
162 int baseOff2 = baseOff + 2;
168 derivPart[baseOff2][
i] += fracMathi;
172 for (
int i = 0;
i < nPads;
i++) {
174 double dPadmQ = pClu->
dig(
i)->
mQ;
175 double dQpadMath = 0.0;
176 double twoOverMq = 2.0 / dPadmQ;
177 for (
int j = 0;
j < iNshape;
j++) {
179 int baseOff1 = baseOff + 1;
180 int baseOff2 = baseOff + 2;
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];
257int Cluster::solve(std::vector<o2::hmpid::Cluster>* pCluLst,
float* pSigmaCut,
bool isTryUnfold)
269 LOGP(fatal,
"digits are missing in the cluster");
271 const int kMaxLocMax = 6;
273 int iCluCnt = pCluLst->size();
277 }
else if (isTryUnfold ==
false) {
279 }
else if (rawSize == 1) {
282 if (rawSize > 100 || isTryUnfold ==
false || rawSize == 1) {
286 pCluLst->back().cleanPointers();
291 double arglist[10]{0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
293 TVirtualFitter* fitter = TVirtualFitter::Fitter((
TObject*)
this, 3 * 6);
294 if (fitter ==
nullptr) {
295 LOG(fatal) <<
"TVirtualFitter could not be created";
299 ierflg = fitter->ExecuteCommand(
"SET PRI", arglist, 1);
300 ierflg = fitter->ExecuteCommand(
"SET NOW", arglist, 0);
302 ierflg = fitter->ExecuteCommand(
"SET GRA", arglist, 1);
306 for (
int iDig1 = 0; iDig1 < rawSize; iDig1++) {
307 auto pDig1 = (*mDigs)[iDig1];
309 for (
int iDig2 = 0; iDig2 < rawSize; iDig2++) {
310 if (iDig1 == iDig2) {
313 auto pDig2 = (*mDigs)[iDig2];
314 int dist = TMath::Sign(
int(pDig1->mX - pDig2->mX), 1) + TMath::Sign(
int(pDig1->mY - pDig2->mY), 1);
316 if (pDig2->mQ >= pDig1->mQ) {
321 if (iCnt == 0 &&
mNlocMax < kMaxLocMax) {
324 float xMin = xStart -
param->sizePadX();
325 float xMax = xStart +
param->sizePadX();
326 float yMin = yStart -
param->sizePadY();
328 ierflg = fitter->SetParameter(3 *
mNlocMax, Form(
"x%i",
mNlocMax), xStart, 0.1, xMin, xMax);
329 ierflg = fitter->SetParameter(3 *
mNlocMax + 1, Form(
"y%i",
mNlocMax), yStart, 0.1, yMin,
yMax);
330 ierflg = fitter->SetParameter(3 *
mNlocMax + 2, Form(
"q%i",
mNlocMax), pDig1->mQ, 0.1, 0, 10000);
342 pCluLst->back().cleanPointers();
351 pCluLst->back().cleanPointers();
373 double strategy = 2.;
374 ierflg = fitter->ExecuteCommand(
"SET STR", &strategy, 1);
376 fitter->ExecuteCommand(
"MIGRAD", arglist, 2);
389 fitter->GetParameter(3 *
i, sName,
mXX,
mErrX, dummy, dummy);
390 fitter->GetParameter(3 *
i + 1, sName,
mYY,
mErrY, dummy, dummy);
391 fitter->GetParameter(3 *
i + 2, sName,
mQ,
mErrQ, dummy, dummy);
392 fitter->GetStats(
mChi2, edm, errdef, nvpar, nparx);
416 pCluLst->back().cleanPointers();