2 // Class that contains the forward multiplicity data per event
4 // This class contains a histogram of
6 // \frac{d^2N_{ch}}{d\eta d\phi}\quad,
8 // as well as a trigger mask for each analysed event.
10 // The eta acceptance of the event is stored in the underflow bins of
11 // the histogram. So to build the final histogram, one needs to
12 // correct for this acceptance (properly weighted by the events), and
13 // the vertex efficiency. This simply boils down to defining a 2D
14 // histogram and summing the event histograms in that histogram. One
15 // should of course also do proper book-keeping of the accepted event.
17 #include "AliAODForwardMult.h"
21 #include <TObjString.h>
22 #include <TObjArray.h>
24 ClassImp(AliAODForwardMult)
29 //____________________________________________________________________
30 const Float_t AliAODForwardMult::fgkInvalidIpZ = 1e6;
32 //____________________________________________________________________
33 AliAODForwardMult::AliAODForwardMult()
46 //____________________________________________________________________
47 AliAODForwardMult::AliAODForwardMult(Bool_t isMC)
49 fHist("forwardMult", "d^{2}N_{ch}/d#etad#varphi in the forward regions",
50 200, -4, 6, 20, 0, 2*TMath::Pi()),
60 // isMC If set to true this is for MC data (effects branch name)
62 fHist.SetXTitle("#eta");
63 fHist.SetYTitle("#varphi [radians]");
64 fHist.SetZTitle("#frac{d^{2}N_{ch}}{d#etad#varphi}");
65 fHist.SetDirectory(0);
69 //____________________________________________________________________
71 AliAODForwardMult::Init(const TAxis& etaAxis)
73 // Initialize the histogram with an eta axis
76 // etaAxis Eta axis to use
78 fHist.SetBins(etaAxis.GetNbins(), etaAxis.GetXmin(), etaAxis.GetXmax(),
79 20, 0, 2*TMath::Pi());
82 //____________________________________________________________________
84 AliAODForwardMult::Clear(Option_t* option)
86 // Clear (or reset) internal values
89 // option Passed to TH1::Reset
96 //____________________________________________________________________
98 AliAODForwardMult::SetSNN(UShort_t snn)
100 // set the center of mass energy per nucleon pair (GeV).
101 // This is stored in bin (0,0) of the histogram
104 // sNN Center of mass energy per nuclean
105 fHist.SetBinContent(0,0,snn);
107 //____________________________________________________________________
109 AliAODForwardMult::SetSystem(UShort_t sys)
111 // set the center of mass energy per nucleon pair (GeV).
112 // This is stored in bin (N+1,0) of the histogram
115 // sys Collision system number
116 fHist.SetBinContent(fHist.GetNbinsX()+1,0,sys);
119 //____________________________________________________________________
121 AliAODForwardMult::HasIpZ() const
123 // Check if we have valid z coordinate of the interaction point
126 // true if the z coordinate of the interaction point is valid
128 return TMath::Abs(fIpZ - fgkInvalidIpZ) > 1;
131 //____________________________________________________________________
133 AliAODForwardMult::GetSNN() const
135 // set the center of mass energy per nucleon pair (GeV).
136 // This is stored in bin (0,0) of the histogram
139 // sNN Center of mass energy per nuclean
140 return UShort_t(fHist.GetBinContent(0,0));
143 //____________________________________________________________________
145 AliAODForwardMult::GetSystem() const
147 // set the center of mass energy per nucleon pair (GeV).
148 // This is stored in bin (N+1,0) of the histogram
151 // sNN Center of mass energy per nuclean
152 return UShort_t(fHist.GetBinContent(fHist.GetNbinsX()+1,0));
155 //____________________________________________________________________
157 AliAODForwardMult::Browse(TBrowser* b)
159 // Browse this object
163 static TObjString ipz;
164 static TObjString trg;
165 static TObjString cnt;
166 static TObjString ncl;
167 ipz = Form("ip_z=%fcm", fIpZ);
168 trg = GetTriggerString(fTriggers);
169 cnt = Form("%+6.1f%%", fCentrality);
170 ncl = Form("%d clusters", fNClusters);
179 void AppendAnd(TString& trg, const TString& what)
181 if (!trg.IsNull()) trg.Append(" & ");
185 //____________________________________________________________________
187 AliAODForwardMult::GetTriggerString(UInt_t mask)
189 // Get a string that describes the triggers
192 // mask Bit pattern of triggers
194 // Character string representation of mask
197 if ((mask & kInel) != 0x0) AppendAnd(trg, "MBOR");
198 if ((mask & kInelGt0) != 0x0) AppendAnd(trg, "INEL>0");
199 if ((mask & kNSD) != 0x0) AppendAnd(trg, "MBAND");
200 if ((mask & kV0AND) != 0x0) AppendAnd(trg, "V0AND");
201 if ((mask & kA) != 0x0) AppendAnd(trg, "A");
202 if ((mask & kB) != 0x0) AppendAnd(trg, "B");
203 if ((mask & kC) != 0x0) AppendAnd(trg, "C");
204 if ((mask & kE) != 0x0) AppendAnd(trg, "E");
205 if ((mask & kMCNSD) != 0x0) AppendAnd(trg, "MCNSD");
206 if ((mask & kNClusterGt0) != 0x0) AppendAnd(trg, "NCluster>0");
207 if ((mask & kSatellite) != 0x0) AppendAnd(trg, "Satellite");
208 if ((mask & kOffline) != 0x0) AppendAnd(trg, "Offline");
212 //____________________________________________________________________
214 AliAODForwardMult::MakeTriggerHistogram(const char* name, Int_t mask)
217 // Make a histogram to record triggers in.
219 // The bins defined by the trigger enumeration in this class. One
220 // can use this enumeration to retrieve the number of triggers for
224 // name Name of the histogram
227 // Newly allocated histogram
232 sel = GetTriggerString(mask);
233 andSel = GetTriggerString(mask & ~kB);
234 andSel.Prepend(" & ");
236 TH1I* ret = new TH1I(name, "Triggers", kAccepted+1, -.5, kAccepted+.5);
237 ret->SetYTitle("Events");
238 ret->SetFillColor(kRed+1);
239 ret->SetFillStyle(3001);
240 ret->GetXaxis()->SetBinLabel(kBinAll, "All events");
241 ret->GetXaxis()->SetBinLabel(kBinB, Form("B (Coll.)%s",
243 ret->GetXaxis()->SetBinLabel(kBinA, Form("A%s", andSel.Data()));
244 ret->GetXaxis()->SetBinLabel(kBinC, Form("C%s", andSel.Data()));
245 ret->GetXaxis()->SetBinLabel(kBinE, Form("E%s", andSel.Data()));
246 ret->GetXaxis()->SetBinLabel(kBinInel, "Coll. & MBOR");
247 ret->GetXaxis()->SetBinLabel(kBinInelGt0, "Coll. & MBOR&&nTracklet>0");
248 ret->GetXaxis()->SetBinLabel(kBinNSD, "Coll. & V0AND||FASTOR>5");
249 ret->GetXaxis()->SetBinLabel(kBinV0AND, "Coll. & V0AND");
250 ret->GetXaxis()->SetBinLabel(kBinMCNSD, "NSD (MC truth)");
251 ret->GetXaxis()->SetBinLabel(kBinSatellite, "Satellite");
252 ret->GetXaxis()->SetBinLabel(kBinPileUp, "w/Pileup");
253 ret->GetXaxis()->SetBinLabel(kBinOffline, "w/Offline");
254 ret->GetXaxis()->SetBinLabel(kBinNClusterGt0, "w/N_{cluster}>1");
255 ret->GetXaxis()->SetBinLabel(kWithVertex, "w/Vertex");
256 ret->GetXaxis()->SetBinLabel(kWithTrigger, Form("w/Selected trigger (%s)",
258 ret->GetXaxis()->SetBinLabel(kAccepted, "Accepted by cut");
259 ret->GetXaxis()->SetNdivisions(kAccepted, false);
265 //____________________________________________________________________
267 AliAODForwardMult::MakeStatusHistogram(const char* name)
270 // Make a histogram to record status in.
272 // The bins defined by the status enumeration in this class.
275 // name Name of the histogram
278 // Newly allocated histogram
280 Int_t nBins = kOutlierEvent;
281 TH1I* ret = new TH1I(name, "Event selection status", nBins+1, -.5, nBins+.5);
282 ret->SetYTitle("Events");
283 ret->SetFillColor(kBlue+1);
284 ret->SetFillStyle(3001);
285 ret->GetXaxis()->SetBinLabel(kGoodEvent+1, "Good");
286 ret->GetXaxis()->SetBinLabel(kWrongCentrality+1, "Out-of-range centrality");
287 ret->GetXaxis()->SetBinLabel(kWrongTrigger+1, "Wrong trigger");
288 ret->GetXaxis()->SetBinLabel(kIsPileup+1, "Pile-up");
289 ret->GetXaxis()->SetBinLabel(kNoVertex+1, "No IP_{z}");
290 ret->GetXaxis()->SetBinLabel(kWrongVertex+1, "Out-or-range IP_{z}");
291 ret->GetXaxis()->SetBinLabel(kOutlierEvent+1, "SPD Outlier");
292 ret->GetXaxis()->SetNdivisions(nBins, false);
297 //____________________________________________________________________
299 AliAODForwardMult::MakeTriggerMask(const char* what)
301 UShort_t trgMask = 0;
304 TObjArray* parts = trgs.Tokenize("&");
307 while ((trg = static_cast<TObjString*>(next()))) {
308 TString s(trg->GetString());
309 s.Strip(TString::kBoth, ' ');
311 if (s.IsNull()) continue;
312 if (s.CompareTo("INEL") == 0) trgMask |= kInel;
313 else if (s.CompareTo("MBOR") == 0) trgMask |= kInel;
314 else if (s.CompareTo("INEL>0") == 0) trgMask |= kInelGt0;
315 else if (s.CompareTo("INELGT0") == 0) trgMask |= kInelGt0;
316 else if (s.CompareTo("MBAND") == 0) trgMask |= kNSD;
317 else if (s.CompareTo("NSD") == 0) trgMask |= kV0AND;
318 else if (s.CompareTo("V0AND") == 0) trgMask |= kV0AND;
319 else if (s.CompareTo("MCNSD") == 0) trgMask |= kMCNSD;
320 else if (s.CompareTo("B") == 0) trgMask |= kB;
321 else if (s.CompareTo("A") == 0) trgMask |= kA;
322 else if (s.CompareTo("C") == 0) trgMask |= kC;
323 else if (s.CompareTo("SAT") == 0) trgMask |= kSatellite;
324 else if (s.CompareTo("E") == 0) trgMask |= kE;
325 else if (s.CompareTo("NCLUSTER>0") == 0) trgMask |= kNClusterGt0;
326 else if (s.CompareTo("CENT") == 0) trgMask |= kInel;
327 else if (s.CompareTo("OFFLINE") == 0) trgMask |= kOffline;
328 // trgMask &= ~(kInel|kInelGt0|kNSD|kV0AND|kMCNSD);
330 AliWarningGeneral("MakeTriggerMask",
331 Form("Unknown trigger %s", s.Data()));
337 //____________________________________________________________________
339 AliAODForwardMult::CheckEvent(Int_t triggerMask,
340 Double_t vzMin, Double_t vzMax,
341 UShort_t cMin, UShort_t cMax,
342 TH1* hist, TH1* status,
343 Bool_t removePileup) const
346 // Check if event meets the passses requirements.
348 // It returns true if @e all of the following is true
350 // - The trigger is within the bit mask passed.
351 // - The vertex is within the specified limits.
352 // - The centrality is within the specified limits, or if lower
353 // limit is equal to or larger than the upper limit.
355 // If a histogram is passed in the last parameter, then that
356 // histogram is filled with the trigger bits.
359 // triggerMask Trigger mask
360 // vzMin Minimum @f$ v_z@f$ (in centimeters)
361 // vzMax Maximum @f$ v_z@f$ (in centimeters)
362 // cMin Minimum centrality (in percent)
363 // cMax Maximum centrality (in percent)
364 // hist Histogram to fill
367 // @c true if the event meets the requirements
369 if (cMin < cMax && (cMin > fCentrality || cMax <= fCentrality)) {
370 if (status) status->Fill(kWrongCentrality);
375 Int_t tmp = triggerMask & ~kB;
376 hist->AddBinContent(kBinAll);
377 if (IsTriggerBits(kB|tmp)) hist->AddBinContent(kBinB);
378 if (IsTriggerBits(kA|tmp)) hist->AddBinContent(kBinA);
379 if (IsTriggerBits(kC|tmp)) hist->AddBinContent(kBinC);
380 if (IsTriggerBits(kE|tmp)) hist->AddBinContent(kBinE);
381 if (IsTriggerBits(kB|kInel)) hist->AddBinContent(kBinInel);
382 if (IsTriggerBits(kB|kInelGt0)) hist->AddBinContent(kBinInelGt0);
383 if (IsTriggerBits(kB|kNSD)) hist->AddBinContent(kBinNSD);
384 if (IsTriggerBits(kB|kV0AND)) hist->AddBinContent(kBinV0AND);
385 if (IsTriggerBits(kPileUp)) hist->AddBinContent(kBinPileUp);
386 if (IsTriggerBits(kMCNSD)) hist->AddBinContent(kBinMCNSD);
387 if (IsTriggerBits(kOffline)) hist->AddBinContent(kBinOffline);
388 if (IsTriggerBits(kNClusterGt0)) hist->AddBinContent(kBinNClusterGt0);
389 if (IsTriggerBits(kSatellite)) hist->AddBinContent(kBinSatellite);
390 if (IsTriggerBits(triggerMask) && !IsTriggerBits(kB|tmp))
391 Warning("CheckEvent", "event: 0x%x, mask: 0x%x, tmp: 0x%x, tmp|b: 0x%x",
392 fTriggers, triggerMask, tmp, tmp|kB);
394 // Check if we have an event of interest.
395 Int_t mask = triggerMask; //|kB
396 if (!IsTriggerBits(mask)) {
397 if (status) status->Fill(kWrongTrigger);
400 // Check if event is SPD outlier
401 if (IsTriggerBits(kSPDOutlier)) {
402 if (status) status->Fill(kOutlierEvent);
406 if (IsTriggerBits(kPileUp)) {
407 if (status) status->Fill(kIsPileup);
408 if (removePileup) return false;
410 if (hist) hist->AddBinContent(kWithTrigger);
412 // Check that we have a valid vertex
413 if (vzMin < vzMax && !HasIpZ()) {
414 if (status) status->Fill(kNoVertex);
417 if (hist) hist->AddBinContent(kWithVertex);
419 // Check that vertex is within cuts
420 if (vzMin < vzMax && !InRange(vzMin, vzMax)) {
421 if (status) status->Fill(kWrongVertex);
424 if (hist) hist->AddBinContent(kAccepted);
426 if (status) status->Fill(kGoodEvent);
430 //____________________________________________________________________
432 AliAODForwardMult::Print(Option_t* option) const
437 // option Passed to TH1::Print
439 UShort_t sys = GetSystem();
440 TString str = "unknown";
442 case 1: str = "pp"; break;
443 case 2: str = "PbPb"; break;
444 case 3: str = "pPb" ; break;
446 std::cout << "Ipz: " << fIpZ << "cm " << (HasIpZ() ? "" : "in")
448 << "Triggers: " << GetTriggerString(fTriggers) << "\n"
449 << "sNN: " << GetSNN() << "GeV\n"
450 << "System: " << str << "\n"
451 << "Centrality: " << fCentrality << "%"
455 //____________________________________________________________________