@@ -45,6 +45,8 @@ o2::vertexing::FwdDCAFitterN<3> VarManager::fgFitterThreeProngFwd;
4545o2::globaltracking::MatchGlobalFwd VarManager::mMatching ;
4646std::map<VarManager::CalibObjects, TObject*> VarManager::fgCalibs;
4747bool VarManager::fgRunTPCPostCalibration[4 ] = {false , false , false , false };
48+ int VarManager::fgCalibrationType = 0 ; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb
49+ bool VarManager::fgUseInterpolatedCalibration = true ; // use interpolated calibration histograms (default: true)
4850
4951// __________________________________________________________________
5052VarManager::VarManager () : TObject()
@@ -209,6 +211,148 @@ float VarManager::calculateCosPA(KFParticle kfp, KFParticle PV)
209211{
210212 return cpaFromKF (kfp, PV);
211213}
214+
215+ // __________________________________________________________________
216+ double VarManager::ComputePIDcalibration (int species, double nSigmaValue)
217+ {
218+ // species: 0 - electron, 1 - pion, 2 - kaon, 3 - proton
219+ // Depending on the PID calibration type, we use different types of calibration histograms
220+
221+ if (fgCalibrationType == 1 ) {
222+ // get the calibration histograms
223+ CalibObjects calibMean, calibSigma;
224+ switch (species) {
225+ case 0 :
226+ calibMean = kTPCElectronMean ;
227+ calibSigma = kTPCElectronSigma ;
228+ break ;
229+ case 1 :
230+ calibMean = kTPCPionMean ;
231+ calibSigma = kTPCPionSigma ;
232+ break ;
233+ case 2 :
234+ calibMean = kTPCKaonMean ;
235+ calibSigma = kTPCKaonSigma ;
236+ break ;
237+ case 3 :
238+ calibMean = kTPCProtonMean ;
239+ calibSigma = kTPCProtonSigma ;
240+ break ;
241+ default :
242+ LOG (fatal) << " Invalid species for PID calibration: " << species;
243+ return -999.0 ; // Return zero if species is invalid
244+ };
245+
246+ TH3F* calibMeanHist = reinterpret_cast <TH3F*>(fgCalibs[calibMean]);
247+ TH3F* calibSigmaHist = reinterpret_cast <TH3F*>(fgCalibs[calibSigma]);
248+ if (!calibMeanHist || !calibSigmaHist) {
249+ LOG (fatal) << " Calibration histograms not found for species: " << species;
250+ return -999.0 ; // Return zero if histograms are not found
251+ }
252+
253+ // Get the bin indices for the calibration histograms
254+ int binTPCncls = calibMeanHist->GetXaxis ()->FindBin (fgValues[kTPCncls ]);
255+ binTPCncls = (binTPCncls == 0 ? 1 : binTPCncls);
256+ binTPCncls = (binTPCncls > calibMeanHist->GetXaxis ()->GetNbins () ? calibMeanHist->GetXaxis ()->GetNbins () : binTPCncls);
257+ int binPin = calibMeanHist->GetYaxis ()->FindBin (fgValues[kPin ]);
258+ binPin = (binPin == 0 ? 1 : binPin);
259+ binPin = (binPin > calibMeanHist->GetYaxis ()->GetNbins () ? calibMeanHist->GetYaxis ()->GetNbins () : binPin);
260+ int binEta = calibMeanHist->GetZaxis ()->FindBin (fgValues[kEta ]);
261+ binEta = (binEta == 0 ? 1 : binEta);
262+ binEta = (binEta > calibMeanHist->GetZaxis ()->GetNbins () ? calibMeanHist->GetZaxis ()->GetNbins () : binEta);
263+
264+ double mean = calibMeanHist->GetBinContent (binTPCncls, binPin, binEta);
265+ double sigma = calibSigmaHist->GetBinContent (binTPCncls, binPin, binEta);
266+ return (nSigmaValue - mean) / sigma; // Return the calibrated nSigma value
267+ } else if (fgCalibrationType == 2 ) {
268+ // get the calibration histograms
269+ CalibObjects calibMean, calibSigma, calibStatus;
270+ switch (species) {
271+ case 0 :
272+ calibMean = kTPCElectronMean ;
273+ calibSigma = kTPCElectronSigma ;
274+ calibStatus = kTPCElectronStatus ;
275+ break ;
276+ case 1 :
277+ calibMean = kTPCPionMean ;
278+ calibSigma = kTPCPionSigma ;
279+ calibStatus = kTPCPionStatus ;
280+ break ;
281+ case 2 :
282+ calibMean = kTPCKaonMean ;
283+ calibSigma = kTPCKaonSigma ;
284+ calibStatus = kTPCKaonStatus ;
285+ break ;
286+ case 3 :
287+ calibMean = kTPCProtonMean ;
288+ calibSigma = kTPCProtonSigma ;
289+ calibStatus = kTPCProtonStatus ;
290+ break ;
291+ default :
292+ LOG (fatal) << " Invalid species for PID calibration: " << species;
293+ return -999.0 ; // Return zero if species is invalid
294+ };
295+
296+ THnF* calibMeanHist = reinterpret_cast <THnF*>(fgCalibs[calibMean]);
297+ THnF* calibSigmaHist = reinterpret_cast <THnF*>(fgCalibs[calibSigma]);
298+ THnF* calibStatusHist = reinterpret_cast <THnF*>(fgCalibs[calibStatus]);
299+ if (!calibMeanHist || !calibSigmaHist || !calibStatusHist) {
300+ LOG (fatal) << " Calibration histograms not found for species: " << species;
301+ return -999.0 ; // Return zero if histograms are not found
302+ }
303+
304+ // Get the bin indices for the calibration histograms
305+ int binEta = calibMeanHist->GetAxis (0 )->FindBin (fgValues[kEta ]);
306+ binEta = (binEta == 0 ? 1 : binEta);
307+ binEta = (binEta > calibMeanHist->GetAxis (0 )->GetNbins () ? calibMeanHist->GetAxis (0 )->GetNbins () : binEta);
308+ int binNpv = calibMeanHist->GetAxis (1 )->FindBin (fgValues[kVtxNcontribReal ]);
309+ binNpv = (binNpv == 0 ? 1 : binNpv);
310+ binNpv = (binNpv > calibMeanHist->GetAxis (1 )->GetNbins () ? calibMeanHist->GetAxis (1 )->GetNbins () : binNpv);
311+ int binNlong = calibMeanHist->GetAxis (2 )->FindBin (fgValues[kNTPCcontribLongA ]);
312+ binNlong = (binNlong == 0 ? 1 : binNlong);
313+ binNlong = (binNlong > calibMeanHist->GetAxis (2 )->GetNbins () ? calibMeanHist->GetAxis (2 )->GetNbins () : binNlong);
314+ int binTlong = calibMeanHist->GetAxis (3 )->FindBin (fgValues[kNTPCmedianTimeLongA ]);
315+ binTlong = (binTlong == 0 ? 1 : binTlong);
316+ binTlong = (binTlong > calibMeanHist->GetAxis (3 )->GetNbins () ? calibMeanHist->GetAxis (3 )->GetNbins () : binTlong);
317+
318+ int bin[4 ] = {binEta, binNpv, binNlong, binTlong};
319+ int status = static_cast <int >(calibStatusHist->GetBinContent (bin));
320+ double mean = calibMeanHist->GetBinContent (bin);
321+ double sigma = calibSigmaHist->GetBinContent (bin);
322+ switch (status) {
323+ case 0 :
324+ // good calibration, return the calibrated nSigma value
325+ return (nSigmaValue - mean) / sigma;
326+ break ;
327+ case 1 :
328+ // calibration not valid, return the original nSigma value
329+ return nSigmaValue;
330+ break ;
331+ case 2 : // calibration constant has poor stat uncertainty, consider the user option for what to do
332+ case 3 :
333+ // calibration constants have been interpolated
334+ if (fgUseInterpolatedCalibration) {
335+ return (nSigmaValue - mean) / sigma;
336+ } else {
337+ // return the original nSigma value
338+ return nSigmaValue;
339+ }
340+ break ;
341+ case 4 :
342+ // calibration constants interpolation failed, return the original nSigma value
343+ return nSigmaValue;
344+ break ;
345+ default :
346+ return nSigmaValue; // unknown status, return the original nSigma value
347+ break ;
348+ };
349+ } else {
350+ // unknown calibration type, return the original nSigma value
351+ LOG (fatal) << " Unknown calibration type: " << fgCalibrationType;
352+ return nSigmaValue; // Return the original nSigma value
353+ }
354+ }
355+
212356// __________________________________________________________________
213357void VarManager::SetDefaultVarNames ()
214358{
@@ -1451,8 +1595,6 @@ void VarManager::SetDefaultVarNames()
14511595 fgVarNamesMap[" kTPCnCRoverFindCls" ] = kTPCnCRoverFindCls ;
14521596 fgVarNamesMap[" kTPCchi2" ] = kTPCchi2 ;
14531597 fgVarNamesMap[" kTPCsignal" ] = kTPCsignal ;
1454- fgVarNamesMap[" kTPCsignalRandomized" ] = kTPCsignalRandomized ;
1455- fgVarNamesMap[" kTPCsignalRandomizedDelta" ] = kTPCsignalRandomizedDelta ;
14561598 fgVarNamesMap[" kPhiTPCOuter" ] = kPhiTPCOuter ;
14571599 fgVarNamesMap[" kTrackIsInsideTPCModule" ] = kTrackIsInsideTPCModule ;
14581600 fgVarNamesMap[" kTRDsignal" ] = kTRDsignal ;
@@ -1476,20 +1618,14 @@ void VarManager::SetDefaultVarNames()
14761618 fgVarNamesMap[" kTrackCTglTgl" ] = kTrackCTglTgl ;
14771619 fgVarNamesMap[" kTrackC1Pt21Pt2" ] = kTrackC1Pt21Pt2 ;
14781620 fgVarNamesMap[" kTPCnSigmaEl" ] = kTPCnSigmaEl ;
1479- fgVarNamesMap[" kTPCnSigmaElRandomized" ] = kTPCnSigmaElRandomized ;
1480- fgVarNamesMap[" kTPCnSigmaElRandomizedDelta" ] = kTPCnSigmaElRandomizedDelta ;
14811621 fgVarNamesMap[" kTPCnSigmaMu" ] = kTPCnSigmaMu ;
14821622 fgVarNamesMap[" kTPCnSigmaPi" ] = kTPCnSigmaPi ;
1483- fgVarNamesMap[" kTPCnSigmaPiRandomized" ] = kTPCnSigmaPiRandomized ;
1484- fgVarNamesMap[" kTPCnSigmaPiRandomizedDelta" ] = kTPCnSigmaPiRandomizedDelta ;
14851623 fgVarNamesMap[" kTPCnSigmaKa" ] = kTPCnSigmaKa ;
14861624 fgVarNamesMap[" kTPCnSigmaPr" ] = kTPCnSigmaPr ;
14871625 fgVarNamesMap[" kTPCnSigmaEl_Corr" ] = kTPCnSigmaEl_Corr ;
14881626 fgVarNamesMap[" kTPCnSigmaPi_Corr" ] = kTPCnSigmaPi_Corr ;
14891627 fgVarNamesMap[" kTPCnSigmaKa_Corr" ] = kTPCnSigmaKa_Corr ;
14901628 fgVarNamesMap[" kTPCnSigmaPr_Corr" ] = kTPCnSigmaPr_Corr ;
1491- fgVarNamesMap[" kTPCnSigmaPrRandomized" ] = kTPCnSigmaPrRandomized ;
1492- fgVarNamesMap[" kTPCnSigmaPrRandomizedDelta" ] = kTPCnSigmaPrRandomizedDelta ;
14931629 fgVarNamesMap[" kTOFnSigmaEl" ] = kTOFnSigmaEl ;
14941630 fgVarNamesMap[" kTOFnSigmaMu" ] = kTOFnSigmaMu ;
14951631 fgVarNamesMap[" kTOFnSigmaPi" ] = kTOFnSigmaPi ;
0 commit comments