@@ -210,12 +210,12 @@ void InterCalib::assign(int ih, bool ismod)
210210 } else if (ih == 5 ) {
211211 nid = 1 ;
212212 id = id_5;
213- LOG (warn) << " InterCalib::assign unimplemented coefficient ih = " << ih;
213+ LOG (warn) << " InterCalib::assign is not implemented for coefficient ih = " << ih;
214214 return ;
215215 } else if (ih == 6 ) {
216216 nid = 1 ;
217217 id = id_6;
218- LOG (warn) << " InterCalib::assign unimplemented coefficient ih = " << ih;
218+ LOG (warn) << " InterCalib::assign is not implemented for coefficient ih = " << ih;
219219 return ;
220220 } else if (ih == 7 || ih == 8 ) {
221221 nid = 4 ;
@@ -246,15 +246,23 @@ void InterCalib::assign(int ih, bool ismod)
246246 if (oldval > 0 ) {
247247 val = val * mPar [ih][iid + 1 ];
248248 }
249- if (mVerbosity > DbgZero) {
249+ if (mTowerParamUpd .modified [ich]) {
250+ LOGF (warn, " %s OVERWRITING MODIFIED PARAMETER %8.6f" , ChannelNames[ich].data (), mTowerParamUpd .getTowerCalib (ich));
251+ LOGF (info, " %s updated %8.6f -> %8.6f" , ChannelNames[ich].data (), oldval, val);
252+ } else if (mVerbosity > DbgZero) {
250253 LOGF (info, " %s updated %8.6f -> %8.6f" , ChannelNames[ich].data (), oldval, val);
251254 }
252255 mTowerParamUpd .setTowerCalib (ich, val, true );
253256 } else {
254- if (mVerbosity > DbgZero) {
255- LOGF (info, " %s NOT CHANGED %8.6f" , ChannelNames[ich].data (), oldval);
257+ // Check if another fit has already modified the parameters
258+ if (mTowerParamUpd .modified [ich]) {
259+ LOGF (warn, " %s NOT OVERWRITING MODIFIED PARAMETER %8.6f" , ChannelNames[ich].data (), mTowerParamUpd .getTowerCalib (ich));
260+ } else {
261+ if (mVerbosity > DbgZero) {
262+ LOGF (info, " %s NOT CHANGED %8.6f" , ChannelNames[ich].data (), oldval);
263+ }
264+ mTowerParamUpd .setTowerCalib (ich, oldval, false );
256265 }
257- mTowerParamUpd .setTowerCalib (ich, oldval, false );
258266 }
259267 }
260268}
@@ -294,6 +302,10 @@ int InterCalib::process(const char* hname, int ic)
294302 ih = HidZNI;
295303 } else if (hn.EqualTo (" hZPI" )) {
296304 ih = HidZPI;
305+ } else if (hn.EqualTo (" hZPAX" )) {
306+ ih = HidZPAX;
307+ } else if (hn.EqualTo (" hZPCX" )) {
308+ ih = HidZPCX;
297309 } else {
298310 LOGF (error, " Not recognized histogram name: %s\n " , hname);
299311 return -1 ;
@@ -434,18 +446,32 @@ void InterCalib::add(int ih, o2::dataformats::FlatHisto2D<float>& h2)
434446
435447void InterCalib::cumulate (int ih, double tc, double t1, double t2, double t3, double t4, double w = 1 )
436448{
449+ constexpr double minfty = -std::numeric_limits<double >::infinity ();
437450 if (tc < mInterCalibConfig ->cutLow [ih] || tc > mInterCalibConfig ->cutHigh [ih]) {
438451 return ;
439452 }
440- double val[NPAR] = {0 , 0 , 0 , 0 , 0 , 1 };
441- val[0 ] = tc;
442- val[1 ] = t1;
443- val[2 ] = t2;
444- val[3 ] = t3;
445- val[4 ] = t4;
446- for (int32_t i = 0 ; i < NPAR; i++) {
447- for (int32_t j = i; j < NPAR; j++) {
448- mData .mSum [ih][i][j] += val[i] * val[j] * w;
453+ if ((ih == HidZPA || ih == HidZPAX)) {
454+ if (t1 < mInterCalibConfig ->towerCutLow_ZPA [0 ] || t2 < mInterCalibConfig ->towerCutLow_ZPA [1 ] || t3 < mInterCalibConfig ->towerCutLow_ZPA [2 ] || t4 < mInterCalibConfig ->towerCutLow_ZPA [3 ]) {
455+ return ;
456+ }
457+ if (t1 > mInterCalibConfig ->towerCutHigh_ZPA [0 ] || t2 > mInterCalibConfig ->towerCutHigh_ZPA [1 ] || t3 > mInterCalibConfig ->towerCutHigh_ZPA [2 ] || t4 > mInterCalibConfig ->towerCutHigh_ZPA [3 ]) {
458+ return ;
459+ }
460+ }
461+ if (ih == HidZPC || ih == HidZPCX) {
462+ if (t1 < mInterCalibConfig ->towerCutLow_ZPC [0 ] || t2 < mInterCalibConfig ->towerCutLow_ZPC [1 ] || t3 < mInterCalibConfig ->towerCutLow_ZPC [2 ] || t4 < mInterCalibConfig ->towerCutLow_ZPC [3 ]) {
463+ return ;
464+ }
465+ if (t1 > mInterCalibConfig ->towerCutHigh_ZPC [0 ] || t2 > mInterCalibConfig ->towerCutHigh_ZPC [1 ] || t3 > mInterCalibConfig ->towerCutHigh_ZPC [2 ] || t4 > mInterCalibConfig ->towerCutHigh_ZPC [3 ]) {
466+ return ;
467+ }
468+ }
469+ double val[NPAR] = {tc, t1, t2, t3, t4, 1 };
470+ if (tc > minfty && t1 > minfty && t2 > minfty && t3 > minfty && t4 > minfty) {
471+ for (int32_t i = 0 ; i < NPAR; i++) {
472+ for (int32_t j = i; j < NPAR; j++) {
473+ mData .mSum [ih][i][j] += val[i] * val[j] * w;
474+ }
449475 }
450476 }
451477 // mData.mSum[ih][5][5] contains the number of analyzed events
@@ -470,6 +496,9 @@ void InterCalib::fcn(int& npar, double* gin, double& chi, double* par, int iflag
470496 chi += (i == 0 ? par[i] : -par[i]) * (j == 0 ? par[j] : -par[j]) * mAdd [i][j];
471497 }
472498 }
499+ // Following line modifies the chisquare computation (sum of squares of residuals)
500+ // to perform orthogonal least squares instead of ordinary least squares minimization
501+ chi = chi / (1 + par[1 ] * par[1 ] + par[2 ] * par[2 ] + par[3 ] * par[3 ] + par[4 ] * par[4 ]);
473502}
474503
475504int InterCalib::mini (int ih)
@@ -498,15 +527,11 @@ int InterCalib::mini(int ih)
498527 // Calibration cvoefficient is forced to and step is forced to zero
499528 mMn [ih]->mnparm (0 , " c0" , 1 ., 0 ., 1 ., 1 ., ierflg);
500529
501- // Special fit for proton calorimeters: fit least exposed towers with using previous
502- // fit of all towers
530+ // Special fit for proton calorimeters: fit least exposed towers
531+ // starting from parameters of previous fit to all towers
503532
504533 // Tower 1
505- if (ih == HidZPCX) {
506- mMn [ih]->mnparm (1 , " c1" , mPar [HidZPC][1 ], 0 , l_bnd, u_bnd, ierflg);
507- } else {
508- mMn [ih]->mnparm (1 , " c1" , start, step, l_bnd, u_bnd, ierflg);
509- }
534+ mMn [ih]->mnparm (1 , " c1" , start, step, l_bnd, u_bnd, ierflg);
510535
511536 // Tower 2
512537 // Only two ZEM calorimeters: equalize response
@@ -518,20 +543,11 @@ int InterCalib::mini(int ih)
518543 step = 0 ;
519544 }
520545
521- if (ih == HidZPCX) {
522- mMn [ih]->mnparm (2 , " c2" , mPar [HidZPC][2 ], 0 , l_bnd, u_bnd, ierflg);
523- } else {
524- mMn [ih]->mnparm (2 , " c2" , start, step, l_bnd, u_bnd, ierflg);
525- }
546+ mMn [ih]->mnparm (2 , " c2" , start, step, l_bnd, u_bnd, ierflg);
526547
527548 // Towers 3 and 4
528- if (ih == HidZPAX) {
529- mMn [ih]->mnparm (3 , " c3" , mPar [HidZPA][3 ], 0 , l_bnd, u_bnd, ierflg);
530- mMn [ih]->mnparm (4 , " c4" , mPar [HidZPA][4 ], 0 , l_bnd, u_bnd, ierflg);
531- } else {
532- mMn [ih]->mnparm (3 , " c3" , start, step, l_bnd, u_bnd, ierflg);
533- mMn [ih]->mnparm (4 , " c4" , start, step, l_bnd, u_bnd, ierflg);
534- }
549+ mMn [ih]->mnparm (3 , " c3" , start, step, l_bnd, u_bnd, ierflg);
550+ mMn [ih]->mnparm (4 , " c4" , start, step, l_bnd, u_bnd, ierflg);
535551
536552 // Offset
537553 l_bnd = mInterCalibConfig ->l_bnd_o [ih];
@@ -551,13 +567,15 @@ int InterCalib::mini(int ih)
551567 l_bnd = mInterCalibConfig ->l_bnd [ih];
552568 u_bnd = mInterCalibConfig ->u_bnd [ih];
553569 for (int i = 1 ; i <= 4 ; i++) {
554- if (TMath::Abs (mPar [ih][i] - l_bnd) < 1e-3 || TMath::Abs (mPar [ih][i] - u_bnd) < 1e-3 ) {
570+ if (TMath::Abs (mPar [ih][i] - l_bnd) < 1e-2 || TMath::Abs (mPar [ih][i] - u_bnd) < 1e-2 ) {
555571 retry = true ;
556572 LOG (warn) << " ih=" << ih << " par " << i << " too close to boundaries" ;
557573 if (ih == 1 || ih == 7 ) {
558- mMn [ih]->mnparm (i, parn[i], mTowerParam ->tower_calib [IdZPAC + i], 0 , l_bnd, u_bnd, ierflg);
574+ // mMn[ih]->mnparm(i, parn[i], mTowerParam->tower_calib[IdZPAC + i], 0, l_bnd, u_bnd, ierflg);
575+ mMn [ih]->mnparm (i, parn[i], mInterCalibConfig ->start [ih], 0 , l_bnd, u_bnd, ierflg);
559576 } else if (ih == 3 || ih == 8 ) {
560- mMn [ih]->mnparm (i, parn[i], mTowerParam ->tower_calib [IdZPCC + i], 0 , l_bnd, u_bnd, ierflg);
577+ // mMn[ih]->mnparm(i, parn[i], mTowerParam->tower_calib[IdZPCC + i], 0, l_bnd, u_bnd, ierflg);
578+ mMn [ih]->mnparm (i, parn[i], mInterCalibConfig ->start [ih], 0 , l_bnd, u_bnd, ierflg);
561579 } else {
562580 LOG (fatal) << " ERROR on InterCalib minimization ih=" << ih;
563581 }
0 commit comments