]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/AliAODForwardMult.h
A better way to specify the Nch axis for the MultDists task.
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliAODForwardMult.h
CommitLineData
f49fc45d 1//
2// See implementation or Doxygen comments for more information
3//
4#ifndef ALIAODFORWARDMULT_H
5#define ALIAODFORWARDMULT_H
ffca499d 6/**
7 * @file AliAODForwardMult.h
8 * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
9 * @date Wed Mar 23 13:58:00 2011
10 *
11 * @brief
12 *
bd6f5206 13 * @ingroup pwglf_forward_aod
ffca499d 14 *
15 */
7e4038b5 16#include <TObject.h>
17#include <TH2D.h>
18class TBrowser;
e938e22b 19class TH1I;
7e4038b5 20/**
21 * Class that contains the forward multiplicity data per event
22 *
23 * This class contains a histogram of
24 * @f[
25 * \frac{d^2N_{ch}}{d\eta d\phi}\quad,
26 * @f]
27 * as well as a trigger mask for each analysed event.
28 *
29 * The eta acceptance of the event is stored in the underflow bins of
30 * the histogram. So to build the final histogram, one needs to
31 * correct for this acceptance (properly weighted by the events), and
32 * the vertex efficiency. This simply boils down to defining a 2D
33 * histogram and summing the event histograms in that histogram. One
34 * should of course also do proper book-keeping of the accepted event.
35 *
36 * @code
fa4236ed 37 * TTree* GetAODTree()
38 * {
39 * TFile* file = TFile::Open("AliAODs.root","READ");
40 * TTree* tree = static_cast<TTree*>(file->Get("aodTree"));
41 * return tree;
42 * }
43 *
44 * void Analyse()
45 * {
46 * TH2D* sum = 0; // Summed hist
47 * TTree* tree = GetAODTree(); // AOD tree
48 * AliAODForwardMult* mult = 0; // AOD object
49 * Int_t nTriggered = 0; // # of triggered ev.
50 * Int_t nWithVertex= 0; // # of ev. w/vertex
51 * Int_t nAccepted = 0; // # of ev. used
52 * Int_t nAvailable = tree->GetEntries(); // How many entries
53 * Float_t vzLow = -10; // Lower ip cut
54 * Float_t vzHigh = 10; // Upper ip cut
55 * Int_t mask = AliAODForwardMult::kInel;// Trigger mask
56 * tree->SetBranchAddress("forward", &forward); // Set the address
7e4038b5 57 *
58 * for (int i = 0; i < nAvailable; i++) {
59 * // Create sum histogram on first event - to match binning to input
60 * if (!sum) sum = static_cast<TH2D*>(mult->Clone("d2ndetadphi"));
61 *
62 * tree->GetEntry(i);
63 *
64 * // Other trigger/event requirements could be defined
65 * if (!mult->IsTriggerBits(mask)) continue;
66 * nTriggered++;
fa4236ed 67 *
68 * // Check if we have vertex
69 * if (!mult->HasIpZ()) continue;
70 * nWithVertex++;
7e4038b5 71 *
72 * // Select vertex range (in centimeters)
73 * if (!mult->InRange(vzLow, vzHigh) continue;
74 * nAccepted++;
75 *
76 * // Add contribution from this event
77 * sum->Add(&(mult->GetHistogram()));
78 * }
79 *
80 * // Get acceptance normalisation from underflow bins
cd548b09 81 * TH1D* norm = sum->ProjectionX("norm", 0, 1, "");
7e4038b5 82 * // Project onto eta axis - _ignoring_underflow_bins_!
83 * TH1D* dndeta = sum->Projection("dndeta", 1, -1, "e");
84 * // Normalize to the acceptance
85 * dndeta->Divide(norm);
86 * // Scale by the vertex efficiency
fa4236ed 87 * dndeta->Scale(Double_t(nWithVertex)/nTriggered, "width");
7e4038b5 88 * // And draw the result
89 * dndeta->Draw();
fa4236ed 90 * }
7e4038b5 91 * @endcode
92 *
93 * The above code will draw the final @f$ dN_{ch}/d\eta@f$ for the
94 * selected event class and vertex range
95 *
96 * The histogram can be used as input for other kinds of analysis too,
97 * like flow, event-plane, centrality, and so on.
98 *
bd6f5206 99 * @ingroup pwglf_forward
100 * @ingroup pwglf_forward_aod
7e4038b5 101 */
102class AliAODForwardMult : public TObject
103{
104public:
105 /**
106 * Bits of the trigger pattern
107 */
108 enum {
109 /** In-elastic collision */
8449e3e0 110 kInel = 0x0001,
7e4038b5 111 /** In-elastic collision with at least one SPD tracklet */
8449e3e0 112 kInelGt0 = 0x0002,
7e4038b5 113 /** Non-single diffractive collision */
8449e3e0 114 kNSD = 0x0004,
7e4038b5 115 /** Empty bunch crossing */
8449e3e0 116 kEmpty = 0x0008,
7e4038b5 117 /** A-side trigger */
8449e3e0 118 kA = 0x0010,
7e4038b5 119 /** B(arrel) trigger */
8449e3e0 120 kB = 0x0020,
7e4038b5 121 /** C-side trigger */
8449e3e0 122 kC = 0x0080,
7e4038b5 123 /** Empty trigger */
8449e3e0 124 kE = 0x0100,
e58000b7 125 /** pileup from SPD */
8449e3e0 126 kPileUp = 0x0200,
e58000b7 127 /** true NSD from MC */
8449e3e0 128 kMCNSD = 0x0400,
0be6c8cd 129 /** Offline MB triggered */
8449e3e0 130 kOffline = 0x0800,
5bb5d1f6 131 /** At least one SPD cluster */
e6463868 132 kNClusterGt0 = 0x1000,
133 /** V0-AND trigger */
8449e3e0 134 kV0AND = 0x2000,
135 /** Satellite event */
136 kSatellite = 0x4000
7e4038b5 137 };
e938e22b 138 /**
139 * Bin numbers in trigger histograms
140 */
141 enum {
142 kBinAll=1,
143 kBinInel,
144 kBinInelGt0,
145 kBinNSD,
e6463868 146 kBinV0AND,
e938e22b 147 kBinA,
148 kBinB,
149 kBinC,
150 kBinE,
8449e3e0 151 kBinSatellite,
e938e22b 152 kBinPileUp,
153 kBinMCNSD,
0be6c8cd 154 kBinOffline,
5bb5d1f6 155 kBinNClusterGt0,
e938e22b 156 kWithTrigger,
157 kWithVertex,
158 kAccepted
159 };
bfab35d9 160 /**
161 * User bits of these objects (bits 14-23 can be used)
162 */
163 enum {
164 /** Secondary correction maps where applied */
165 kSecondary = (1 << 14),
166 /** Vertex bias correction was applied */
167 kVertexBias = (1 << 15),
168 /** Acceptance correction was applied */
169 kAcceptance = (1 << 16),
170 /** Merging efficiency correction was applied */
171 kMergingEfficiency = (1 << 17),
172 /** Signal in overlaps is the sum */
173 kSum = (1 << 18),
174 /** Used eta dependent empirical correction - to be implemented */
175 kEmpirical = (1 << 19)
176 };
177 /**
178 * Return codes of CheckEvent
179 */
180 enum ECheckStatus {
181 /** Event accepted by cuts */
182 kGoodEvent = 0,
183 /** Event centrality not in range */
184 kWrongCentrality,
185 /** Event trigger isn't in the supplied mask */
186 kWrongTrigger,
187 /** Event is a pile-up event */
188 kIsPileup,
189 /** Event has no interaction point information */
190 kNoVertex,
191 /** Event interaction point is out of range */
192 kWrongVertex
193 };
194
7e4038b5 195 /**
196 * Default constructor
197 *
198 * Used by ROOT I/O sub-system - do not use
199 */
200 AliAODForwardMult();
201 /**
202 * Constructor
203 *
f49fc45d 204 * @param isMC Whether this was from MC or not
7e4038b5 205 */
f49fc45d 206 AliAODForwardMult(Bool_t isMC);
7e4038b5 207 /**
208 * Destructor
209 */
f49fc45d 210 virtual ~AliAODForwardMult() {} // Destructor
7e4038b5 211 /**
212 * Initialize
213 *
214 * @param etaAxis Pseudo-rapidity axis
215 */
216 void Init(const TAxis& etaAxis);
217 /**
218 * Get the @f$ d^2N_{ch}/d\eta d\phi@f$ histogram,
219 *
220 * @return @f$ d^2N_{ch}/d\eta d\phi@f$ histogram,
221 */
f49fc45d 222 const TH2D& GetHistogram() const { return fHist; } // Get histogram
7e4038b5 223 /**
224 * Get the @f$ d^2N_{ch}/d\eta d\phi@f$ histogram,
225 *
226 * @return @f$ d^2N_{ch}/d\eta d\phi@f$ histogram,
227 */
f49fc45d 228 TH2D& GetHistogram() { return fHist; } // Get histogram
7e4038b5 229 /**
9453b19e 230 * Get the trigger bits
7e4038b5 231 *
9453b19e 232 * @return Trigger bits
7e4038b5 233 */
9453b19e 234 UInt_t GetTriggerBits() const { return fTriggers; } // Get triggers
7e4038b5 235 /**
236 * Set the trigger mask
237 *
238 * @param trg Trigger mask
239 */
f49fc45d 240 void SetTriggerMask(UInt_t trg) { fTriggers = trg; } // Set triggers
7e4038b5 241 /**
242 * Set bit(s) in trigger mask
243 *
244 * @param bits bit(s) to set
245 */
f49fc45d 246 void SetTriggerBits(UInt_t bits) { fTriggers |= bits; } // Set trigger bits
7e4038b5 247 /**
5bb5d1f6 248 * Check if all bit(s) are set in the trigger mask. Note, this is
249 * an @e and between the bits. If you need an @e or you should use
250 * the member function IsTriggerOrBits
7e4038b5 251 *
252 * @param bits Bits to test for
253 *
5bb5d1f6 254 * @return true if all enabled bits in the argument is also set in
255 * the trigger word
7e4038b5 256 */
257 Bool_t IsTriggerBits(UInt_t bits) const;
5bb5d1f6 258 /**
259 * Check if any of bit(s) are enabled in the trigger word. This is
260 * an @e or between the selected bits. If you need and @a and you
261 * should use the member function IsTriggerBits;
262 *
263 * @param bits Bits to check for
264 *
265 * @return true if any of the enabled bits in the arguments are also
266 * enabled in the trigger mask
267 */
268 Bool_t IsTriggerOrBits(UInt_t bits) const;
7e4038b5 269 /**
270 * Whether we have any trigger bits
290052e7 271 *
272 * @return true if we have some trigger
7e4038b5 273 */
f49fc45d 274 Bool_t HasTrigger() const { return fTriggers != 0; } // Check for triggers
7e4038b5 275 /**
276 * Clear all data
277 *
278 * @param option Passed on to TH2::Reset verbatim
279 */
280 void Clear(Option_t* option="");
281 /**
282 * browse this object
283 *
284 * @param b Browser
285 */
286 void Browse(TBrowser* b);
287 /**
288 * This is a folder
289 *
290 * @return Always true
291 */
f49fc45d 292 Bool_t IsFolder() const { return kTRUE; } // Always true
bfab35d9 293
294 Bool_t IsSecondaryCorrected() const { return TestBit(kSecondary); }
295 Bool_t IsVertexBiasCorrected() const { return TestBit(kVertexBias); }
296 Bool_t IsAcceptanceCorrected() const { return TestBit(kAcceptance); }
297 Bool_t IsMergingEfficiencyCorrected() const {
298 return TestBit(kMergingEfficiency); }
299 Bool_t IsEmpiricalCorrected() const { return TestBit(kEmpirical); }
300 Bool_t IsSumSignal() const { return TestBit(kSum); }
7e4038b5 301 /**
302 * Print content
303 *
304 * @param option Passed verbatim to TH2::Print
305 */
306 void Print(Option_t* option="") const;
307 /**
308 * Set the z coordinate of the interaction point
309 *
310 * @param ipZ Interaction point z coordinate
311 */
f49fc45d 312 void SetIpZ(Float_t ipZ) { fIpZ = ipZ; } // Set Ip's Z coordinate
b2e7f2d6 313 /**
314 * Set the center of mass energy per nucleon-pair. This is stored
315 * in the (0,0) of the histogram
316 *
317 * @param sNN Center of mass energy per nucleon pair (GeV)
318 */
319 void SetSNN(UShort_t sNN);
320 /**
321 * Get the collision system number
322 * - 0: Unknown
323 * - 1: pp
324 * - 2: PbPb
325 *
326 * @param sys Collision system number
327 */
328 void SetSystem(UShort_t sys);
e58000b7 329 /**
330 * Set the event centrality
331 *
332 * @param c Centrality
333 */
334 void SetCentrality(Float_t c) { fCentrality = c; }
7e4038b5 335 /**
336 * Set the z coordinate of the interaction point
337 *
338 * @return Interaction point z coordinate
339 */
f49fc45d 340 Float_t GetIpZ() const { return fIpZ; } // Get Ip's Z coordinate
7e4038b5 341 /**
342 * Check if we have a valid z coordinate of the interaction point
343 *
344 * @return True if we have a valid interaction point z coordinate
345 */
346 Bool_t HasIpZ() const;
b2e7f2d6 347 /**
348 * Get the center of mass energy per nucleon pair (GeV)
349 *
350 * @return Center of mass energy per nucleon pair (GeV)
351 */
352 UShort_t GetSNN() const;
353 /**
354 * Get the collision system number
355 * - 0: Unknown
356 * - 1: pp
357 * - 2: PbPb
358 *
359 * @return Collision system number
360 */
361 UShort_t GetSystem() const;
7e4038b5 362 /**
363 * Check if the z coordinate of the interaction point is within the
364 * given limits. Note that the convention used corresponds to the
365 * convention used in ROOTs TAxis.
366 *
367 * @param low Lower cut (inclusive)
368 * @param high Upper cut (exclusive)
369 *
370 * @return true if @f$ low \ge ipz < high@f$
371 */
372 Bool_t InRange(Float_t low, Float_t high) const;
e58000b7 373 /**
374 * Get the event centrality
375 *
376 *
377 * @return
378 */
379 Float_t GetCentrality() const { return fCentrality; }
380 /**
381 * Check if we have a valid centrality
382 *
383 *
384 * @return
385 */
386 Bool_t HasCentrality() const { return !(fCentrality < 0); }
5bb5d1f6 387 /**
388 * Get the number of SPD clusters seen in @f$ |\eta|<1@f$
389 *
390 * @return Number of SPD clusters seen
391 */
392 UShort_t GetNClusters() const { return fNClusters; }
393 /**
394 * Set the number of SPD clusters seen in @f$ |\eta|<1@f$
395 *
396 * @param n Number of SPD clusters
397 */
398 void SetNClusters(UShort_t n) { fNClusters = n; }
7e4038b5 399 /**
400 * Get the name of the object
401 *
402 * @return Name of object
403 */
f49fc45d 404 const Char_t* GetName() const { return (fIsMC ? "ForwardMC" : "Forward"); }
e938e22b 405 /**
ffca499d 406 * Check if event meets the passses requirements.
407 *
408 * It returns true if @e all of the following is true
409 *
410 * - The trigger is within the bit mask passed.
411 * - The vertex is within the specified limits.
412 * - The centrality is within the specified limits, or if lower
413 * limit is equal to or larger than the upper limit.
414 *
950ab33b 415 * Note, for data with out a centrality estimate (e.g., pp), one
416 * must pass equal centrality cuts, or no data will be accepted. In
417 * other words, for pp data, always pass cMin=0, cMax=0
418 *
ffca499d 419 * If a histogram is passed in the last parameter, then that
420 * histogram is filled with the trigger bits.
e938e22b 421 *
422 * @param triggerMask Trigger mask
423 * @param vzMin Minimum @f$ v_z@f$ (in centimeters)
424 * @param vzMax Maximum @f$ v_z@f$ (in centimeters)
425 * @param cMin Minimum centrality (in percent)
426 * @param cMax Maximum centrality (in percent)
427 * @param hist Histogram to fill
428 *
429 * @return @c true if the event meets the requirements
430 */
431 Bool_t CheckEvent(Int_t triggerMask=kInel,
432 Double_t vzMin=-10, Double_t vzMax=10,
433 UShort_t cMin=0, UShort_t cMax=100,
bfab35d9 434 TH1* hist=0,
435 TH1* status=0) const;
7e4038b5 436 /**
437 * Get a string correspondig to the trigger mask
438 *
439 * @param mask Trigger mask
440 *
441 * @return Static string (copy before use)
442 */
443 static const Char_t* GetTriggerString(UInt_t mask);
e938e22b 444 /**
ffca499d 445 * Make a histogram to record triggers in.
446 *
447 * The bins defined by the trigger enumeration in this class. One
448 * can use this enumeration to retrieve the number of triggers for
449 * each class.
e938e22b 450 *
451 * @param name Name of the histogram
33438b4c 452 * @param mask Trigger mask
e938e22b 453 *
454 * @return Newly allocated histogram
455 */
321cf27d 456 static TH1I* MakeTriggerHistogram(const char* name="triggers",
457 Int_t mask=0);
bfab35d9 458 /**
459 * Make a histogram to record status in.
460 *
461 * The bins defined by the status enumeration in this class.
462 *
463 * @param name Name of the histogram
464 *
465 * @return Newly allocated histogram
466 */
467 static TH1I* MakeStatusHistogram(const char* name="status");
9453b19e 468 /**
469 * Utility function to make a trigger mask from the passed string.
470 *
471 * The string is a comma or space seperated list of case-insensitive
472 * strings
473 *
474 * - INEL
475 * - INEL>0
476 * - NSD
477 *
478 * @param what Which triggers to put in the mask.
479 *
480 * @return The generated trigger mask.
481 */
482 static UInt_t MakeTriggerMask(const char* what);
7e4038b5 483protected:
290052e7 484 /** From MC or not */
5bb5d1f6 485 Bool_t fIsMC; // Whether this is from MC
290052e7 486 /** Histogram of @f$d^2N_{ch}/(d\eta d\phi)@f$ for this event */
5bb5d1f6 487 TH2D fHist; // Histogram of d^2N_{ch}/(deta dphi) for this event
290052e7 488 /** Trigger bits */
5bb5d1f6 489 UInt_t fTriggers; // Trigger bit mask
290052e7 490 /** Interaction point @f$z@f$ coordinate */
5bb5d1f6 491 Float_t fIpZ; // Z coordinate of the interaction point
290052e7 492 /** Centrality */
5bb5d1f6 493 Float_t fCentrality; // Event centrality
290052e7 494 /** Number of clusters in @f$|\eta|<1@f$ */
5bb5d1f6 495 UShort_t fNClusters; // Number of SPD clusters in |eta|<1
290052e7 496 /** Invalid value for interaction point @f$z@f$ coordiante */
7e4038b5 497 static const Float_t fgkInvalidIpZ; // Invalid IpZ value
bfab35d9 498 ClassDef(AliAODForwardMult,5); // AOD forward multiplicity
7e4038b5 499};
500
501//____________________________________________________________________
502inline Bool_t
503AliAODForwardMult::InRange(Float_t low, Float_t high) const
504{
505 return HasIpZ() && fIpZ >= low && fIpZ < high;
506}
507
508//____________________________________________________________________
509inline Bool_t
510AliAODForwardMult::IsTriggerBits(UInt_t bits) const
511{
0be6c8cd 512 return HasTrigger() && ((fTriggers & bits) == bits);
7e4038b5 513}
5bb5d1f6 514//____________________________________________________________________
515inline Bool_t
516AliAODForwardMult::IsTriggerOrBits(UInt_t bits) const
517{
518 return HasTrigger() && ((fTriggers & bits) != 0);
519}
7e4038b5 520
521#endif
522// Local Variables:
523// mode: C++
524// End:
525