Skip to content

Commit 99b0c6c

Browse files
authored
Add Tree for RICH and minor improvements (#37)
- Set basket size in AOD tree - Add RICH delta measurements to table - Use parameters for RICH config in conversion macro - Update uncertainty on expected angle - Fix name of output TF to the name of the run undergoing
1 parent 195f8f4 commit 99b0c6c

File tree

3 files changed

+101
-5
lines changed

3 files changed

+101
-5
lines changed

examples/aod/createO2tables.C

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,18 @@ R__LOAD_LIBRARY(libDelphesO2)
2727
#include "createO2tables.h"
2828

2929
// Detector parameters
30-
const double Bz = 0.2; // [T]
30+
const double Bz = 0.2; // [T]
31+
// TOF
3132
const double tof_radius = 100.; // [cm]
3233
const double tof_length = 200.; // [cm]
3334
const double tof_sigmat = 0.02; // [ns]
35+
// RICH
36+
const double rich_radius = 100.; // [cm]
37+
const double rich_length = 200.; // [cm]
38+
const double rich_index = 1.03;
39+
const double rich_radiator_length = 2.;
40+
const double rich_efficiency = 0.4;
41+
const double rich_sigma = 7.e-3;
3442

3543
// Simulation parameters
3644
const bool do_vertexing = true;
@@ -101,11 +109,19 @@ void createO2tables(const char* inputFile = "delphes.root",
101109
// TOF layer
102110
o2::delphes::TOFLayer toflayer;
103111
toflayer.setup(tof_radius, tof_length, tof_sigmat);
112+
// RICH layer
113+
o2::delphes::RICHdetector richdetector;
114+
richdetector.setup(rich_radius, rich_length);
115+
richdetector.setIndex(rich_index);
116+
richdetector.setRadiatorLength(rich_radiator_length);
117+
richdetector.setEfficiency(rich_efficiency);
118+
richdetector.setSigma(rich_sigma);
104119

105120
// create output
106121
auto fout = TFile::Open(outputFile, "RECREATE");
107122
TTree* tBC = MakeTreeO2bc();
108123
TTree* fTracks = MakeTreeO2track();
124+
TTree* fRICH = MakeTreeO2rich();
109125
TTree* tEvents = MakeTreeO2collision();
110126
TTree* tMCvtx = MakeTreeO2mccollision();
111127
TTree* tKinematics = MakeTreeO2mcparticle();
@@ -122,6 +138,7 @@ void createO2tables(const char* inputFile = "delphes.root",
122138
const UInt_t mTrackSignal = 0xFFFFFFFF; // PID signals and track length
123139

124140
int fOffsetLabel = 0;
141+
int fTrackCounter = 0; // Counter for the track index, needed for derived tables e.g. RICH. To be incremented at every track filled!
125142
for (Int_t ientry = 0; ientry < numberOfEntries; ++ientry) {
126143

127144
// Load selected branches with data from specified event
@@ -238,12 +255,34 @@ void createO2tables(const char* inputFile = "delphes.root",
238255
mytracks.fTOFSignal = -999.f;
239256
mytracks.fTOFExpMom = -999.f;
240257
}
258+
// check if has hit on RICH
259+
if (richdetector.hasRICH(*track)) {
260+
const auto measurement = richdetector.getMeasuredAngle(*track);
261+
rich.fCollisionsID = ientry + eventOffset;
262+
rich.fTracksID = fTrackCounter; // Index in the Track table
263+
rich.fRICHSignal = measurement.first;
264+
rich.fRICHSignalError = measurement.second;
265+
std::array<float, 5> deltaangle, nsigma;
266+
richdetector.makePID(*track, deltaangle, nsigma);
267+
rich.fRICHDeltaEl = deltaangle[0];
268+
rich.fRICHDeltaMu = deltaangle[1];
269+
rich.fRICHDeltaPi = deltaangle[2];
270+
rich.fRICHDeltaKa = deltaangle[3];
271+
rich.fRICHDeltaPr = deltaangle[4];
272+
rich.fRICHNsigmaEl = nsigma[0];
273+
rich.fRICHNsigmaMu = nsigma[1];
274+
rich.fRICHNsigmaPi = nsigma[2];
275+
rich.fRICHNsigmaKa = nsigma[3];
276+
rich.fRICHNsigmaPr = nsigma[4];
277+
fRICH->Fill();
278+
}
241279
if (do_vertexing) {
242280
o2::InteractionRecord ir(ientry + eventOffset, 0);
243281
const float t = (ir.bc2ns() + gRandom->Gaus(0., 100.)) * 1e-3;
244282
tracks_for_vertexing.push_back(TrackAlice3{o2track, t, 100.f * 1e-3, TMath::Abs(alabel)});
245283
}
246284
fTracks->Fill();
285+
fTrackCounter++;
247286
// fill histograms
248287
}
249288

@@ -345,10 +384,10 @@ void createO2tables(const char* inputFile = "delphes.root",
345384
TString out_dir = outputFile;
346385
out_dir.ReplaceAll(".root", "");
347386
out_dir.ReplaceAll("AODRun5.", "");
348-
if (out_dir.IsDec()) {
387+
if (!out_dir.IsDec()) {
349388
out_dir = "TF_0";
350389
} else {
351-
out_dir = Form("TF_%010i", out_dir.Atoi());
390+
out_dir = Form("TF_%i", out_dir.Atoi());
352391
}
353392
fout->mkdir(out_dir);
354393
fout->cd(out_dir);

examples/aod/createO2tables.h

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@ enum TreeIndex { // Index of the output trees
2222
kMcCaloLabel,
2323
kMcCollisionLabel,
2424
kBC,
25+
kRICH,
2526
kTrees
2627
};
2728

29+
const int fBasketSizeEvents = 1000000; // Maximum basket size of the trees for events
30+
const int fBasketSizeTracks = 10000000; // Maximum basket size of the trees for tracks
31+
2832
TList* TreeList = new TList();
2933
TTree* CreateTree(TreeIndex t)
3034
{
31-
const TString TreeName[kTrees] = {"O2collision", "DbgEventExtra", "O2track", "O2calo", "O2calotrigger", "O2muon", "O2muoncluster", "O2zdc", "O2fv0a", "O2fv0c", "O2ft0", "O2fdd", "O2v0", "O2cascade", "O2tof", "O2mcparticle", "O2mccollision", "O2mctracklabel", "O2mccalolabel", "O2mccollisionlabel", "O2bc"};
32-
const TString TreeTitle[kTrees] = {"Collision tree", "Collision extra", "Barrel mytracks", "Calorimeter cells", "Calorimeter triggers", "MUON mytracks", "MUON clusters", "ZDC", "FV0A", "FV0C", "FT0", "FDD", "V0s", "Cascades", "TOF hits", "Kinematics", "MC collisions", "MC track labels", "MC calo labels", "MC collision labels", "BC info"};
35+
const TString TreeName[kTrees] = {"O2collision", "DbgEventExtra", "O2track", "O2calo", "O2calotrigger", "O2muon", "O2muoncluster", "O2zdc", "O2fv0a", "O2fv0c", "O2ft0", "O2fdd", "O2v0", "O2cascade", "O2tof", "O2mcparticle", "O2mccollision", "O2mctracklabel", "O2mccalolabel", "O2mccollisionlabel", "O2bc", "O2rich"};
36+
const TString TreeTitle[kTrees] = {"Collision tree", "Collision extra", "Barrel mytracks", "Calorimeter cells", "Calorimeter triggers", "MUON mytracks", "MUON clusters", "ZDC", "FV0A", "FV0C", "FT0", "FDD", "V0s", "Cascades", "TOF hits", "Kinematics", "MC collisions", "MC track labels", "MC calo labels", "MC collision labels", "BC info", "RICH info"};
3337
TTree* tree = new TTree(TreeName[t], TreeTitle[t]);
3438
TreeList->Add(tree);
3539
return tree;
@@ -79,6 +83,7 @@ TTree* MakeTreeO2collision()
7983
tEvents->Branch("fCollisionTime", &collision.fCollisionTime, "fCollisionTime/F");
8084
tEvents->Branch("fCollisionTimeRes", &collision.fCollisionTimeRes, "fCollisionTimeRes/F");
8185
tEvents->Branch("fCollisionTimeMask", &collision.fCollisionTimeMask, "fCollisionTimeMask/b");
86+
tEvents->SetBasketSize("*", fBasketSizeEvents);
8287
return tEvents;
8388
}
8489

@@ -125,6 +130,7 @@ TTree* MakeTreeO2mccollision()
125130
tMCvtx->Branch("fT", &mccollision.fT, "fT/F");
126131
tMCvtx->Branch("fWeight", &mccollision.fWeight, "fWeight/F");
127132
tMCvtx->Branch("fImpactParameter", &mccollision.fImpactParameter, "fImpactParameter/F");
133+
tMCvtx->SetBasketSize("*", fBasketSizeEvents);
128134
return tMCvtx;
129135
}
130136

@@ -140,6 +146,7 @@ TTree* MakeTreeO2bc()
140146
tBC->Branch("fRunNumber", &bc.fRunNumber, "fRunNumber/I");
141147
tBC->Branch("fGlobalBC", &bc.fGlobalBC, "fGlobalBC/l");
142148
tBC->Branch("fTriggerMask", &bc.fTriggerMask, "fTriggerMask/l");
149+
tBC->SetBasketSize("*", fBasketSizeEvents);
143150
return tBC;
144151
}
145152

@@ -266,6 +273,7 @@ TTree* MakeTreeO2track()
266273
tTracks->Branch("fTOFExpMom", &mytracks.fTOFExpMom, "fTOFExpMom/F");
267274
tTracks->Branch("fTrackEtaEMCAL", &mytracks.fTrackEtaEMCAL, "fTrackEtaEMCAL/F");
268275
tTracks->Branch("fTrackPhiEMCAL", &mytracks.fTrackPhiEMCAL, "fTrackPhiEMCAL/F");
276+
tTracks->SetBasketSize("*", fBasketSizeTracks);
269277
return tTracks;
270278
}
271279

@@ -320,6 +328,47 @@ void ConnectTreeO2track(TTree* fTracks)
320328
fTracks->SetBranchAddress("fTrackPhiEMCAL", &mytracks.fTrackPhiEMCAL);
321329
}
322330

331+
struct {
332+
// RICH data
333+
334+
Int_t fCollisionsID = -1; /// Collision ID
335+
Int_t fTracksID = -1; /// Track ID
336+
337+
Float_t fRICHSignal = -999.f; /// RICH signal
338+
Float_t fRICHSignalError = -999.f; /// RICH signal error
339+
Float_t fRICHDeltaEl = -999.f; /// Delta for El
340+
Float_t fRICHDeltaMu = -999.f; /// Delta for Mu
341+
Float_t fRICHDeltaPi = -999.f; /// Delta for Pi
342+
Float_t fRICHDeltaKa = -999.f; /// Delta for Ka
343+
Float_t fRICHDeltaPr = -999.f; /// Delta for Pr
344+
Float_t fRICHNsigmaEl = -999.f; /// Nsigma for El
345+
Float_t fRICHNsigmaMu = -999.f; /// Nsigma for Mu
346+
Float_t fRICHNsigmaPi = -999.f; /// Nsigma for Pi
347+
Float_t fRICHNsigmaKa = -999.f; /// Nsigma for Ka
348+
Float_t fRICHNsigmaPr = -999.f; /// Nsigma for Pr
349+
} rich; //! structure to keep RICH info
350+
351+
TTree* MakeTreeO2rich()
352+
{
353+
TTree* t = CreateTree(kRICH);
354+
t->Branch("fCollisionsID", &rich.fCollisionsID, "fCollisionsID/I");
355+
t->Branch("fTracksID", &rich.fTracksID, "fTracksID/I");
356+
t->Branch("fRICHSignal", &rich.fRICHSignal, "fRICHSignal/F");
357+
t->Branch("fRICHSignalError", &rich.fRICHSignalError, "fRICHSignalError/F");
358+
t->Branch("fRICHDeltaEl", &rich.fRICHDeltaEl, "fRICHDeltaEl/F");
359+
t->Branch("fRICHDeltaMu", &rich.fRICHDeltaMu, "fRICHDeltaMu/F");
360+
t->Branch("fRICHDeltaPi", &rich.fRICHDeltaPi, "fRICHDeltaPi/F");
361+
t->Branch("fRICHDeltaKa", &rich.fRICHDeltaKa, "fRICHDeltaKa/F");
362+
t->Branch("fRICHDeltaPr", &rich.fRICHDeltaPr, "fRICHDeltaPr/F");
363+
t->Branch("fRICHNsigmaEl", &rich.fRICHNsigmaEl, "fRICHNsigmaEl/F");
364+
t->Branch("fRICHNsigmaMu", &rich.fRICHNsigmaMu, "fRICHNsigmaMu/F");
365+
t->Branch("fRICHNsigmaPi", &rich.fRICHNsigmaPi, "fRICHNsigmaPi/F");
366+
t->Branch("fRICHNsigmaKa", &rich.fRICHNsigmaKa, "fRICHNsigmaKa/F");
367+
t->Branch("fRICHNsigmaPr", &rich.fRICHNsigmaPr, "fRICHNsigmaPr/F");
368+
t->SetBasketSize("*", fBasketSizeTracks);
369+
return t;
370+
}
371+
323372
struct {
324373
// MC particle
325374

@@ -367,6 +416,7 @@ TTree* MakeTreeO2mcparticle()
367416
tKinematics->Branch("fVy", &mcparticle.fVy, "fVy/F");
368417
tKinematics->Branch("fVz", &mcparticle.fVz, "fVz/F");
369418
tKinematics->Branch("fVt", &mcparticle.fVt, "fVt/F");
419+
tKinematics->SetBasketSize("*", fBasketSizeTracks);
370420
return tKinematics;
371421
}
372422

@@ -384,6 +434,7 @@ TTree* MakeTreeO2mctracklabel()
384434
TTree* tLabels = CreateTree(kMcTrackLabel);
385435
tLabels->Branch("fLabel", &mctracklabel.fLabel, "fLabel/i");
386436
tLabels->Branch("fLabelMask", &mctracklabel.fLabelMask, "fLabelMask/s");
437+
tLabels->SetBasketSize("*", fBasketSizeTracks);
387438
return tLabels;
388439
}
389440
struct {
@@ -398,5 +449,6 @@ TTree* MakeTreeO2mccollisionlabel()
398449
TTree* tCollisionLabels = CreateTree(kMcCollisionLabel);
399450
tCollisionLabels->Branch("fLabel", &mccollisionlabel.fLabel, "fLabel/i");
400451
tCollisionLabels->Branch("fLabelMask", &mccollisionlabel.fLabelMask, "fLabelMask/s");
452+
tCollisionLabels->SetBasketSize("*", fBasketSizeEvents);
401453
return tCollisionLabels;
402454
}

examples/scripts/createO2tables.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ def opt(entry, require=True):
115115
output_path = ""
116116
output_path = os.path.join(os.getcwd(), output_path)
117117
msg("Output will be found in", f"'{output_path}'")
118+
if not os.path.isdir(output_path):
119+
msg("Creating output path")
120+
os.makedirs(output_path)
121+
if not os.path.isdir(output_path):
122+
raise RuntimeError("Cannot find output path", output_path)
118123

119124
# detector configuration
120125
bField = opt("bField")

0 commit comments

Comments
 (0)