From 162fca4bd495a8e9d5c4ad9f5aa29b66c71f1256 Mon Sep 17 00:00:00 2001 From: Roberto Preghenella Date: Mon, 31 Aug 2020 18:01:55 +0200 Subject: [PATCH] Macro to inspect TOF data in O2 tables --- examples/aod/createO2tables.h | 68 +++++++++++++++++++++++++ examples/aod/inspectTOF.C | 93 +++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 examples/aod/inspectTOF.C diff --git a/examples/aod/createO2tables.h b/examples/aod/createO2tables.h index 84b8216..338beb7 100644 --- a/examples/aod/createO2tables.h +++ b/examples/aod/createO2tables.h @@ -45,6 +45,25 @@ TTree* MakeTreeO2collision() return tEvents; } +void ConnectTreeO2collision(TTree *tEvents) +{ + tEvents->SetBranchAddress("fBCsID", &collision.fBCsID); + tEvents->SetBranchAddress("fPosX", &collision.fPosX); + tEvents->SetBranchAddress("fPosY", &collision.fPosY); + tEvents->SetBranchAddress("fPosZ", &collision.fPosZ); + tEvents->SetBranchAddress("fCovXX", &collision.fCovXX); + tEvents->SetBranchAddress("fCovXY", &collision.fCovXY); + tEvents->SetBranchAddress("fCovXZ", &collision.fCovXZ); + tEvents->SetBranchAddress("fCovYY", &collision.fCovYY); + tEvents->SetBranchAddress("fCovYZ", &collision.fCovYZ); + tEvents->SetBranchAddress("fCovZZ", &collision.fCovZZ); + tEvents->SetBranchAddress("fChi2", &collision.fChi2); + tEvents->SetBranchAddress("fNumContrib", &collision.fN); + tEvents->SetBranchAddress("fCollisionTime", &collision.fCollisionTime); + tEvents->SetBranchAddress("fCollisionTimeRes", &collision.fCollisionTimeRes); + tEvents->SetBranchAddress("fCollisionTimeMask", &collision.fCollisionTimeMask); +} + struct { // MC collision Int_t fBCsID = 0u; /// Index to BC table @@ -206,6 +225,55 @@ TTree* MakeTreeO2track() return fTracks; } +void ConnectTreeO2track(TTree *fTracks) +{ + fTracks->SetBranchAddress("fCollisionsID", &mytracks.fCollisionsID); + fTracks->SetBranchAddress("fTrackType", &mytracks.fTrackType); + // fTracks->SetBranchAddress("fTOFclsIndex", &mytracks.fTOFclsIndex); + // fTracks->SetBranchAddress("fNTOFcls", &mytracks.fNTOFcls); + fTracks->SetBranchAddress("fX", &mytracks.fX); + fTracks->SetBranchAddress("fAlpha", &mytracks.fAlpha); + fTracks->SetBranchAddress("fY", &mytracks.fY); + fTracks->SetBranchAddress("fZ", &mytracks.fZ); + fTracks->SetBranchAddress("fSnp", &mytracks.fSnp); + fTracks->SetBranchAddress("fTgl", &mytracks.fTgl); + fTracks->SetBranchAddress("fSigned1Pt", &mytracks.fSigned1Pt); + // Modified covariance matrix + fTracks->SetBranchAddress("fSigmaY", &mytracks.fSigmaY); + fTracks->SetBranchAddress("fSigmaZ", &mytracks.fSigmaZ); + fTracks->SetBranchAddress("fSigmaSnp", &mytracks.fSigmaSnp); + fTracks->SetBranchAddress("fSigmaTgl", &mytracks.fSigmaTgl); + fTracks->SetBranchAddress("fSigma1Pt", &mytracks.fSigma1Pt); + fTracks->SetBranchAddress("fRhoZY", &mytracks.fRhoZY); + fTracks->SetBranchAddress("fRhoSnpY", &mytracks.fRhoSnpY); + fTracks->SetBranchAddress("fRhoSnpZ", &mytracks.fRhoSnpZ); + fTracks->SetBranchAddress("fRhoTglY", &mytracks.fRhoTglY); + fTracks->SetBranchAddress("fRhoTglZ", &mytracks.fRhoTglZ); + fTracks->SetBranchAddress("fRhoTglSnp", &mytracks.fRhoTglSnp); + fTracks->SetBranchAddress("fRho1PtY", &mytracks.fRho1PtY); + fTracks->SetBranchAddress("fRho1PtZ", &mytracks.fRho1PtZ); + fTracks->SetBranchAddress("fRho1PtSnp", &mytracks.fRho1PtSnp); + fTracks->SetBranchAddress("fRho1PtTgl", &mytracks.fRho1PtTgl); + // + fTracks->SetBranchAddress("fTPCInnerParam", &mytracks.fTPCinnerP); + fTracks->SetBranchAddress("fFlags", &mytracks.fFlags); + fTracks->SetBranchAddress("fITSClusterMap", &mytracks.fITSClusterMap); + fTracks->SetBranchAddress("fTPCNClsFindable", &mytracks.fTPCNClsFindable); + fTracks->SetBranchAddress("fTPCNClsFindableMinusFound",&mytracks.fTPCNClsFindableMinusFound); + fTracks->SetBranchAddress("fTPCNClsFindableMinusCrossedRows", &mytracks.fTPCNClsFindableMinusCrossedRows); + fTracks->SetBranchAddress("fTPCNClsShared", &mytracks.fTPCNClsShared); + fTracks->SetBranchAddress("fTRDPattern", &mytracks.fTRDPattern); + fTracks->SetBranchAddress("fITSChi2NCl", &mytracks.fITSChi2NCl); + fTracks->SetBranchAddress("fTPCChi2NCl", &mytracks.fTPCChi2NCl); + fTracks->SetBranchAddress("fTRDChi2", &mytracks.fTRDChi2); + fTracks->SetBranchAddress("fTOFChi2", &mytracks.fTOFChi2); + fTracks->SetBranchAddress("fTPCSignal", &mytracks.fTPCSignal); + fTracks->SetBranchAddress("fTRDSignal", &mytracks.fTRDSignal); + fTracks->SetBranchAddress("fTOFSignal", &mytracks.fTOFSignal); + fTracks->SetBranchAddress("fLength", &mytracks.fLength); + fTracks->SetBranchAddress("fTOFExpMom", &mytracks.fTOFExpMom); +} + struct { // MC particle diff --git a/examples/aod/inspectTOF.C b/examples/aod/inspectTOF.C new file mode 100644 index 0000000..8739379 --- /dev/null +++ b/examples/aod/inspectTOF.C @@ -0,0 +1,93 @@ +R__LOAD_LIBRARY(libDelphes) +R__LOAD_LIBRARY(libDelphesO2) + +#include "createO2tables.h" + +using O2Track = o2::track::TrackParCov; + +void +inspectTOF(const char *filename) +{ + auto fin = TFile::Open(filename); + + auto tcollision = (TTree *)fin->Get("O2collision"); + auto ncollision = tcollision->GetEntries(); + ConnectTreeO2collision(tcollision); + + auto ttracks = (TTree *)fin->Get("O2track"); + auto ntracks = ttracks->GetEntries(); + ConnectTreeO2track(ttracks); + + /** histograms **/ + auto hTZero = new TH1F("hTZero", ";t_{0} (ns)", 1000, -1., 1.); + auto hBetaP = new TH2F("hBetaP", ";#it{p} (GeV/#it{c});#it{v}/#it{c}", 500., 0., 5., 500, 0.1, 1.1); + auto hNsigmaP = new TH2F("hNsigmaP", ";#it{p} (GeV/#it{c});n#sigma_{K}", 500., 0., 5., 500, -100., 100.); + + /** loop over collisions **/ + for (int icollision = 0; icollision < ncollision; ++icollision) { + tcollision->GetEntry(icollision); + auto t0 = collision.fCollisionTime; + auto t0e = collision.fCollisionTimeRes; + hTZero->Fill(t0 * 0.001); + } + + /** loop over tracks **/ + for (int itrack = 0; itrack < ntracks; ++itrack) { + + /** get track **/ + ttracks->GetEntry(itrack); + + /** get collision and start time **/ + auto icollision = mytracks.fCollisionsID; + tcollision->GetEntry(icollision); + auto t0 = collision.fCollisionTime; + auto t0e = collision.fCollisionTimeRes; + + /** create o2 track **/ + O2Track o2track; + o2track.setX(mytracks.fX); + o2track.setAlpha(mytracks.fAlpha); + o2track.setY(mytracks.fY); + o2track.setZ(mytracks.fZ); + o2track.setSnp(mytracks.fSnp); + o2track.setTgl(mytracks.fTgl); + o2track.setQ2Pt(mytracks.fSigned1Pt); + + /** get track information **/ + auto p = o2track.getP(); + auto p2 = p * p; + auto pe = p * mytracks.fSigma1Pt; // this is wrong, needs to add pz contribution + auto d0 = mytracks.fY; + auto d0e = mytracks.fSigmaY; + + /** 3-sigma DCA cut on primaries **/ + if (fabs(d0 / d0e) > 1.) continue; + + /** get TOF information **/ + auto L = mytracks.fLength; + auto t = mytracks.fTOFSignal; + auto tof = t - t0; + auto beta = L / tof / 0.029979246; + auto mass = 0.49367700; + auto mass2 = mass * mass; + auto texp = L / p / 0.029979246 * hypot(mass, p); + auto texpe = L / 0.029979246 / p / p * mass * mass * hypot(mass, p) * pe; + auto sigma = hypot(hypot(20., t0e), texpe); + auto nsigma = (tof - texp) / sigma; + + hBetaP->Fill(p, beta); + hNsigmaP->Fill(p, nsigma); + + } + + /** write output **/ + auto fout = TFile::Open(std::string("inspectTOF." + std::string(filename)).c_str(), "RECREATE"); + hTZero->Write(); + hBetaP->Write(); + hNsigmaP->Write(); + fout->Close(); + + /** close input **/ + fin->Close(); + +}