]>
Commit | Line | Data |
---|---|---|
eac83c86 | 1 | // |
2 | // Common macros used to analyze dst trees | |
3 | // Author: Ionut-Cristian Arsene, 2012/03/04 | |
4 | // email: i.c.arsene@gsi.de | |
5 | // | |
6 | #include <iostream> | |
7 | #include <fstream> | |
8 | using namespace std; | |
9 | ||
10 | #include <TObjArray.h> | |
11 | #include <TChain.h> | |
12 | #include <TMath.h> | |
13 | #include <TFile.h> | |
14 | #include <TDirectory.h> | |
15 | #include <THashList.h> | |
16 | #include <TH1F.h> | |
17 | #include <TH2F.h> | |
18 | #include <TH3F.h> | |
19 | #include <TProfile.h> | |
20 | #include <TProfile2D.h> | |
21 | #include <TIterator.h> | |
22 | #include <TKey.h> | |
23 | #include <TDirectory.h> | |
24 | #include <TAxis.h> | |
25 | ||
26 | #ifndef ALICORRELATIONREDUCEDEVENT_H | |
27 | #include "AliCorrelationReducedEvent.h" | |
28 | #endif | |
29 | ||
30 | namespace DstCommonMacros { | |
31 | ||
32 | enum ParticleId { | |
33 | kUnknown = -1, | |
34 | kElectron = 0, | |
35 | kPion, | |
36 | kKaon, | |
37 | kProton | |
38 | }; | |
39 | ||
40 | enum Variables { | |
41 | kNothing = -1, | |
42 | // Event wise variables | |
43 | kRunNo = 0, // run number | |
44 | kBC, // bunch crossing | |
45 | kTriggerMask, // trigger mask | |
46 | kOfflineTrigger, // offline trigger | |
47 | kOfflineTriggerFired, // offline trigger fired | |
48 | kOfflineTriggerFired2, // offline trigger if fired, -1 if not fired | |
49 | kIsPhysicsSelection, // physics selection | |
50 | kVtxX, // vtx X | |
51 | kVtxY, // vtx Y | |
52 | kVtxZ, // vtx Z | |
53 | kVtxXtpc, // vtx X from tpc | |
54 | kVtxYtpc, // vtx Y from tpc | |
55 | kVtxZtpc, // vtx Z from tpc | |
56 | kCentVZERO, // centrality from VZERO | |
57 | kCentSPD, // centrality from SPD | |
58 | kCentTPC, // centrality from TPC | |
59 | kCentZDC, // centrality from ZDC | |
60 | kCentQuality, // centrality quality | |
61 | kNV0total, // total number of V0s in the esd | |
62 | kNV0selected, // number of V0s selected | |
63 | kNdielectrons, // number of dielectron pairs | |
64 | kNpairsSelected, // number of selected dielectron pairs per event | |
65 | kNtracksTotal, // total number of tracks | |
66 | kNtracksSelected, // number of selected tracks | |
67 | kSPDntracklets, // SPD number of tracklets in |eta|<1.0 | |
68 | kEventMixingId, // Id of the event mixing category | |
69 | // VZERO event plane related variables | |
70 | kVZEROAemptyChannels, // Number of empty VZERO channels in A side | |
71 | kVZEROCemptyChannels, // Number of empty VZERO channels in C side | |
72 | kVZEROChannelMult, // VZERO multiplicity per channel | |
73 | kVZEROChannelEta = kVZEROChannelMult+64, // pseudo-rapidity of a VZERO channel | |
74 | kVZEROQvecX = kVZEROChannelEta+64, // Q-vector components for harmonics 1-6 and | |
75 | kVZEROQvecY = kVZEROQvecX+6*3, // 6- n-harmonics; 3- A,C and A&C options | |
76 | kVZERORP = kVZEROQvecY+6*3, // VZERO reaction plane from A,C and A&C sides (harmonics 1-6) | |
77 | kVZERORPres = kVZERORP+6*3, // VZERO reaction plane resolution (sqrt(n*(RPa-RPc))) | |
78 | kVZEROXaXc = kVZERORPres+6, // correlations for the components of the Q vector | |
79 | kVZEROXaYa = kVZEROXaXc+6, | |
80 | kVZEROXaYc = kVZEROXaYa+6, | |
81 | kVZEROYaXc = kVZEROXaYc+6, | |
82 | kVZEROYaYc = kVZEROYaXc+6, | |
83 | kVZEROXcYc = kVZEROYaYc+6, | |
84 | kVZEROdeltaRPac = kVZEROXcYc+6, // Psi_VZEROA-Psi_VZEROC | |
85 | kVZEROdeltaRPa = kVZEROdeltaRPac+6, // Psi_VZEROA6-Psi_VZEROA5, Psi_VZEROA7-Psi_VZEROA5, Psi_VZEROA6-Psi_VZEROA5 | |
86 | kVZEROdeltaRPc = kVZEROdeltaRPa+6*2, // Psi_VZEROA2-Psi_VZEROA1, Psi_VZEROA3-Psi_VZEROA1, Psi_VZEROA4-Psi_VZEROA1 | |
87 | kVZEROflowV2TPC = kVZEROdeltaRPc+6*2, // vzero v2 using TPC event plane | |
88 | // TPC event plane variables | |
89 | kTPCQvecX = kVZEROflowV2TPC+64, // TPC Q-vector components for harmonics 1-6 | |
90 | kTPCQvecY = kTPCQvecX+6, | |
91 | kTPCRP = kTPCQvecY+6, // Event plane using TPC | |
92 | kTPCRPres = kTPCRP+6, // Event plane resolution variables sqrt(n*(RPtpc-RPvzeroa)),sqrt(n*(RPtpc-RPvzeroc)) | |
93 | // Correlations between TPC and VZERO event planes | |
94 | kRPXtpcXvzeroa = kTPCRPres+6*2, | |
95 | kRPXtpcXvzeroc = kRPXtpcXvzeroa+6, | |
96 | kRPYtpcYvzeroa = kRPXtpcXvzeroc+6, | |
97 | kRPYtpcYvzeroc = kRPYtpcYvzeroa+6, | |
98 | kRPXtpcYvzeroa = kRPYtpcYvzeroc+6, | |
99 | kRPXtpcYvzeroc = kRPXtpcYvzeroa+6, | |
100 | kRPYtpcXvzeroa = kRPXtpcYvzeroc+6, | |
101 | kRPYtpcXvzeroc = kRPYtpcXvzeroa+6, | |
102 | kRPdeltaVZEROAtpc = kRPYtpcXvzeroc+6, | |
103 | kRPdeltaVZEROCtpc = kRPdeltaVZEROAtpc+6, | |
104 | kNEventVars = kRPdeltaVZEROCtpc+6, // number of event variables | |
105 | // Pair variables -------------------------------------- | |
106 | kMass=kNEventVars, | |
107 | kCandidateId, | |
108 | kPairType, // 0 ++; 1 +-; 2 -- | |
109 | kPairPt, | |
110 | kPairPx, | |
111 | kPairPy, | |
112 | kPairPz, | |
113 | kPairP, | |
114 | kPairRap, | |
115 | kPairEta, | |
116 | kPairTheta, | |
117 | kPairPhi, | |
118 | kPairLxy, | |
119 | kPairOpeningAngle, | |
120 | kPairCosNPhi, // cos (n*phi) | |
121 | kPairSinNPhi = kPairCosNPhi+6, // sin (n*phi) | |
122 | kPairDeltaPhiVZEROFlowVn = kPairSinNPhi+6, // phi - Psi_{VZERO} | |
123 | kPairDeltaPhiTPCFlowVn = kPairDeltaPhiVZEROFlowVn+6*3, // phi - Psi_{TPC} | |
124 | kPairVZEROFlowVn = kPairDeltaPhiTPCFlowVn+6, // vn{Psi_{n,VZERO}} | |
125 | kPairTPCFlowVn = kPairVZEROFlowVn+6*3, // vn{Psi_{n,TPC}} | |
126 | kPairVZEROFlowV3Psi2 = kPairTPCFlowVn+6, // v3{Psi_{2,VZERO}} | |
127 | kPairTPCFlowV3Psi2 = kPairVZEROFlowV3Psi2+3, // v3{Psi_{2,TPC}} | |
128 | // Track variables ------------------------------------- | |
129 | kPt=kPairTPCFlowV3Psi2+1, | |
130 | kP, | |
131 | kTheta, | |
132 | kPhi, | |
133 | kEta, | |
134 | kRap, | |
135 | kPtTPC, | |
136 | kPhiTPC, | |
137 | kEtaTPC, | |
138 | kPin, | |
139 | kTrackDeltaPhiVZEROFlowVn, | |
140 | kTrackVZEROFlowVn = kTrackDeltaPhiVZEROFlowVn+6*2, | |
141 | kDcaXY = kTrackVZEROFlowVn+6*2, | |
142 | kDcaZ, | |
143 | kITSncls, | |
144 | kITSsignal, | |
145 | kTPCncls, | |
146 | kTPCcrossedRows, | |
147 | kTPCnclsIter1, | |
148 | kTPCnclsF, | |
149 | kTPCnclsRatio, | |
150 | kTPCsignal, | |
151 | kTPCnSig, | |
152 | kTOFbeta=kTPCnSig+4, | |
153 | kTOFnSig, | |
154 | kTRDntracklets=kTOFnSig+4, | |
155 | kTRDntrackletsPID, | |
156 | kTRDpidProbabilities, | |
157 | kEMCALmatchedEnergy=kTRDpidProbabilities+2, | |
158 | kEMCALmatchedEOverP, | |
159 | // Calorimeter cluster variables -------------------------------------- | |
160 | kEMCALclusterEnergy, | |
161 | kEMCALclusterDx, | |
162 | kEMCALclusterDz, | |
163 | kEMCALdetector, // 0 - EMCAL; 1 - PHOS | |
164 | // Tracking flags ----------------------------------------------------- | |
165 | kTrackingFlag, | |
166 | // Correlation variables ---------------------------------------------- | |
167 | kDeltaPhi, | |
168 | kDeltaTheta, | |
169 | kDeltaEta, | |
170 | kNVars | |
171 | }; | |
172 | ||
173 | ||
174 | Bool_t gUsedVars[kNVars] = {kFALSE}; | |
175 | ||
176 | // tracking flags as in AliESDtrack.h | |
177 | // NOTE: check consistency with aliroot | |
178 | enum TrackingFlags { | |
179 | kITSin=0, | |
180 | kITSout, | |
181 | kITSrefit, | |
182 | kITSpid, | |
183 | kTPCin, | |
184 | kTPCout, | |
185 | kTPCrefit, | |
186 | kTPCpid, | |
187 | kTRDin, | |
188 | kTRDout, | |
189 | kTRDrefit, | |
190 | kTRDpid, | |
191 | kTOFin, | |
192 | kTOFout, | |
193 | kTOFrefit, | |
194 | kTOFpid, | |
195 | kTOFmismatch, | |
196 | kHMPIDout, | |
197 | kHMPIDpid, | |
198 | kEMCALmatch, | |
199 | kPHOSmatch, | |
200 | kTRDbackup, | |
201 | kTRDStop, | |
202 | kESDpid, | |
203 | kTIME, | |
204 | kGlobalMerge, | |
205 | kITSpureSA, | |
206 | kMultInV0, | |
207 | kMultSec, | |
208 | kTRDnPlanes, | |
209 | kEMCALNoMatch, | |
210 | kNTrackingFlags | |
211 | }; | |
212 | ||
213 | const Char_t* gkTrackingFlagNames[kNTrackingFlags] = { | |
214 | "kITSin", "kITSout", "kITSrefit", "kITSpid", | |
215 | "kTPCin", "kTPCout", "kTPCrefit", "kTPCpid", | |
216 | "kTRDin", "kTRDout", "kTRDrefit", "kTRDpid", | |
217 | "kTOFin", "kTOFout", "kTOFrefit", "kTOFpid", "kTOFmismatch", | |
218 | "kHMPIDout", "kHMPIDpid", | |
219 | "kEMCALmatch", "kPHOSmatch", | |
220 | "kTRDbackup", "kTRDStop", | |
221 | "kESDpid", "kTIME", "kGlobalMerge", | |
222 | "kITSpureSA", | |
223 | "kMultInV0", | |
224 | "kMultSec", | |
225 | "kTRDnPlanes", | |
226 | "kEMCALNoMatch" | |
227 | }; | |
228 | ||
229 | // offline triggers as defined in AliVEvent.h | |
230 | // NOTE: Check consistency with updates in aliroot!!! | |
231 | enum EOfflineTriggerTypes { | |
232 | kMB = BIT(0), // Minimum bias trigger, i.e. interaction trigger, offline SPD or V0 selection | |
233 | kINT7 = BIT(1), // V0AND trigger, offline V0 selection | |
234 | kMUON = BIT(2), // Muon trigger, offline SPD or V0 selection | |
235 | kHighMult = BIT(3), // High-multiplicity trigger (threshold defined online), offline SPD or V0 selection | |
236 | kEMC1 = BIT(4), // EMCAL trigger | |
237 | kCINT5 = BIT(5), // Minimum bias trigger without SPD. i.e. interaction trigger, offline V0 selection | |
238 | kCMUS5 = BIT(6), // Muon trigger, offline V0 selection | |
239 | kMUSPB = BIT(6), // idem for PbPb | |
240 | kMUSH7 = BIT(7), // Muon trigger: high pt, single muon, offline V0 selection, CINT7 suite | |
241 | kMUSHPB = BIT(7), // idem for PbPb | |
242 | kMUL7 = BIT(8), // Muon trigger: like sign dimuon, offline V0 selection, CINT7 suite | |
243 | kMuonLikePB = BIT(8), // idem for PbPb | |
244 | kMUU7 = BIT(9), // Muon trigger, unlike sign dimuon, offline V0 selection, CINT7 suite | |
245 | kMuonUnlikePB = BIT(9), // idem for PbPb | |
246 | kEMC7 = BIT(10), // EMCAL trigger, CINT7 suite | |
247 | kMUS7 = BIT(11), // Muon trigger: low pt, single muon, offline V0 selection, CINT7 suite | |
248 | kPHI1 = BIT(12), // PHOS trigger, CINT1 suite | |
249 | kPHI7 = BIT(13), // PHOS trigger, CINT7 suite | |
250 | kPHOSPb = BIT(13), // idem for PbPb | |
251 | kEMCEJE = BIT(14), // EMCAL jet patch trigger | |
252 | kEMCEGA = BIT(15), // EMCAL gamma trigger | |
253 | kCentral = BIT(16), // PbPb central collision trigger | |
254 | kSemiCentral = BIT(17), // PbPb semicentral collision trigger | |
255 | kDG5 = BIT(18), // Double gap diffractive | |
256 | kZED = BIT(19), // ZDC electromagnetic dissociation | |
257 | kUserDefined = BIT(27), // Set when custom trigger classes are set in AliPhysicsSelection, offline SPD or V0 selection | |
258 | // Bits 28 and above are reserved for FLAGS | |
259 | kFastOnly = BIT(30), // The fast cluster fired. This bit is set in to addition another trigger bit, e.g. kMB | |
260 | kAny = 0xffffffff, // to accept any trigger | |
261 | kAnyINT = kMB | kINT7 | kCINT5 // to accept any interaction (aka minimum bias) trigger | |
262 | }; | |
263 | ||
264 | const Char_t* gkOfflineTriggerNames[64] = { | |
265 | "MB", "INT7", "MUON", "HighMult", "EMC1", "CINT5", "CMUS5/MUSPB", "MUSH7/MUSHPB", | |
266 | "MUL7/MuonLikePB", "MUU7/MuonUnlikePB", "EMC7", "MUS7", "PHI1", "PHI7/PHOSPb", "EMCEJE", "EMCEGA", | |
267 | "Central", "SemiCentral", "DG5", "ZED", "N/A", "N/A", "N/A", "N/A", | |
268 | "N/A", "N/A", "N/A", "UserDefined", "N/A", "N/A", "FastOnly", "N/A", | |
269 | "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", | |
270 | "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", | |
271 | "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", | |
272 | "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A" | |
273 | }; | |
274 | ||
275 | enum ITSLayerMap { | |
276 | kITSfirst = 1, | |
277 | kITSsecond = 2, | |
278 | kITSthird = 4, | |
279 | kITSfourth = 8, | |
280 | kITSfifth = 16, | |
281 | kITSsixth = 32 | |
282 | }; | |
283 | ||
284 | // radii of VZERO channels centers (in cm) | |
285 | const Double_t gkVZEROChannelRadii[64] = {6.0567, 6.0567, 6.0567, 6.0567, 6.0567, 6.0567, 6.0567, 6.0567, | |
286 | 9.6977, 9.6977, 9.6977, 9.6977, 9.6977, 9.6977, 9.6977, 9.6977, | |
287 | 15.9504, 15.9504, 15.9504, 15.9504, 15.9504, 15.9504, 15.9504, 15.9504, | |
288 | 26.4031, 26.4031, 26.4031, 26.4031, 26.4031, 26.4031, 26.4031, 26.4031, | |
289 | 5.9347, 5.9347, 5.9347, 5.9347, 5.9347, 5.9347, 5.9347, 5.9347, | |
290 | 10.685, 10.685, 10.685, 10.685, 10.685, 10.685, 10.685, 10.685, | |
291 | 18.116, 18.116, 18.116, 18.116, 18.116, 18.116, 18.116, 18.116, | |
292 | 31.84, 31.84, 31.84, 31.84, 31.84, 31.84, 31.84, 31.84}; | |
293 | const Double_t gkVZEROAz = 340.0; // cm | |
294 | const Double_t gkVZEROCz = 90.0; // cm | |
295 | const Double_t gkVZEROminMult = 0.5; // minimum VZERO channel multiplicity | |
296 | ||
297 | // Pointer to the current event | |
298 | AliCorrelationReducedEvent* gCurrentEvent = 0x0; | |
299 | AliCorrelationReducedEventFriend* gCurrentEventFriend = 0x0; | |
300 | ||
301 | // Event mixing variables | |
302 | Int_t gEMCategories=0; | |
303 | TString* gEMCategoryNames; | |
304 | ||
305 | TObjArray* gHistLists=0x0; // main histogram list for the current running process | |
306 | TDirectoryFile* gHistListsOld=0x0; // main directory for a standard tree analysis output (used for calibration, plotting etc.) | |
307 | TFile* gHistFile = 0x0; // pointer to a TFile opened for reading | |
308 | ||
309 | TProfile2D* gVzeroAvMult[64] = {0x0}; // pointer to the array of average VZERO multiplicity per channel | |
310 | TProfile2D* gQvecCentering[AliCorrelationReducedEventFriend::kNdetectors][fgkNMaxHarmonics][2] = {{{0x0}}}; // pointer to the array of Qvec centering histograms | |
311 | ||
312 | // pt range for J/psi's | |
313 | const Float_t gkJpsiPtCut[2] = {0.0, 20.0}; | |
314 | ||
315 | // Function prototypes | |
316 | void WriteOutput(TFile* saveFile); | |
317 | //void DefineHistograms(const Char_t* histClasses); | |
318 | TChain* GetChain(const Char_t* filename, Int_t howMany, Int_t offset, Long64_t& entries, TChain* friendChain=0x0, const Char_t* friendChainFile=0x0); | |
319 | void FillEventInfo(AliCorrelationReducedEvent* event, Float_t* values, AliCorrelationReducedEventFriend* eventF=0x0); | |
320 | void FillEventOfflineTriggers(UShort_t triggerBit, Float_t* values); | |
321 | void FillTrackingFlag(AliCorrelationReducedTrack* track, UShort_t flag, Float_t* values); | |
322 | void FillTrackInfo(AliCorrelationReducedTrack* p, Float_t* values); | |
323 | void FillPairInfo(AliCorrelationReducedPair* p, Float_t* values); | |
324 | void FillPairInfo(AliCorrelationReducedTrack* t1, AliCorrelationReducedTrack* t2, Int_t type, Float_t* values); | |
325 | void FillCorrelationInfo(AliCorrelationReducedPair* p, AliCorrelationReducedTrack* t, Float_t* values); | |
326 | void FillCaloClusterInfo(AliCorrelationReducedCaloCluster* cl, Float_t* values); | |
327 | void FillHistClass(const Char_t* className, Float_t* values); | |
328 | void DoEventMixing(TList* list1, TList* list2, Float_t* values, Int_t mixingType, const Char_t* histClass); | |
329 | void EventMixingPairTracks(TList* pairs, TList* tracks, Float_t* values); | |
330 | void EventMixingResonanceLegs(TList* posLegs, TList* negLegs, Float_t* values, Int_t type, const Char_t* histClass); | |
331 | Double_t DeltaPhi(Double_t phi1, Double_t phi2); // calculate delta phi in the (-pi,+pi) interval | |
332 | Bool_t IsPairSelectedEM(Float_t* values); // pair selection used in the mixed event | |
333 | void AddHistClass(const Char_t* histClass); | |
334 | Int_t ValidateHistogramName(THashList* hList, const Char_t* name); | |
335 | void AddHistogram(const Char_t* histClass, | |
336 | const Char_t* name, const Char_t* title, Bool_t isProfile, | |
337 | Int_t nXbins, Double_t xmin, Double_t xmax, Int_t varX, | |
338 | Int_t nYbins=0, Double_t ymin=0, Double_t ymax=0, Int_t varY=kNothing, | |
339 | Int_t nZbins=0, Double_t zmin=0, Double_t zmax=0, Int_t varZ=kNothing, | |
340 | const Char_t* xLabels="", const Char_t* yLabels="", const Char_t* zLabels=""); | |
341 | void AddHistogram(const Char_t* histClass, | |
342 | const Char_t* name, const Char_t* title, Bool_t isProfile, | |
343 | Int_t nXbins, Double_t* xbins, Int_t varX, | |
344 | Int_t nYbins=0, Double_t* ybins=0x0, Int_t varY=kNothing, | |
345 | Int_t nZbins=0, Double_t* zbins=0x0, Int_t varZ=kNothing, | |
346 | const Char_t* xLabels="", const Char_t* yLabels="", const Char_t* zLabels=""); | |
347 | void MakeAxisLabels(TAxis* ax, const Char_t* labels); | |
348 | void InitFile(const Char_t* filename); // open an old output filename | |
349 | void CloseFile(); | |
350 | TObject* GetHistogram(const Char_t* listname, const Char_t* hname); // get a histogram from an old output | |
351 | ||
352 | } // end declarations for namespace DstCommonMacros | |
353 | ||
354 | //__________________________________________________________________ | |
355 | void DstCommonMacros::FillEventInfo(AliCorrelationReducedEvent* event, Float_t* values, AliCorrelationReducedEventFriend* eventF/*=0x0*/) { | |
356 | // | |
357 | // fill event wise info | |
358 | // | |
359 | values[kRunNo] = event->RunNo(); | |
360 | values[kBC] = event->BC(); | |
361 | values[kTriggerMask] = event->TriggerMask(); | |
362 | values[kIsPhysicsSelection] = (event->IsPhysicsSelection() ? 1.0 : 0.0); | |
363 | values[kVtxX] = event->Vertex(0); | |
364 | values[kVtxY] = event->Vertex(1); | |
365 | values[kVtxZ] = event->Vertex(2); | |
366 | values[kVtxXtpc] = event->VertexTPC(0); | |
367 | values[kVtxYtpc] = event->VertexTPC(1); | |
368 | values[kVtxZtpc] = event->VertexTPC(2); | |
369 | values[kCentVZERO] = event->CentralityVZERO(); | |
370 | values[kCentSPD] = event->CentralitySPD(); | |
371 | values[kCentTPC] = event->CentralityTPC(); | |
372 | values[kCentZDC] = event->CentralityZEMvsZDC(); | |
373 | values[kCentQuality] = event->CentralityQuality(); | |
374 | values[kNV0total] = event->NV0CandidatesTotal(); | |
375 | values[kNV0selected] = event->NV0Candidates(); | |
376 | values[kNdielectrons] = event->NDielectrons(); | |
377 | values[kNtracksTotal] = event->NTracksTotal(); | |
378 | values[kNtracksSelected] = event->NTracks(); | |
379 | values[kSPDntracklets] = event->SPDntracklets(); | |
380 | values[kVZEROAemptyChannels] = 0; | |
381 | values[kVZEROCemptyChannels] = 0; | |
382 | for(Int_t ich=0;ich<64;++ich) gUsedVars[kVZEROChannelMult+ich] = kTRUE; | |
383 | Float_t theta=0.0; | |
384 | for(Int_t ich=0;ich<64;++ich) { | |
385 | if(gUsedVars[kVZEROChannelMult+ich]) { | |
386 | values[kVZEROChannelMult+ich] = event->MultChannelVZERO(ich); | |
387 | if(!gVzeroAvMult[0] && values[kVZEROChannelMult+ich]<gkVZEROminMult) { | |
388 | gUsedVars[kVZEROChannelMult+ich] = kFALSE; // will not be filled in histograms by the histogram manager | |
389 | if(ich<32) values[kVZEROCemptyChannels] += 1; | |
390 | else values[kVZEROAemptyChannels] += 1; | |
391 | } | |
392 | } | |
393 | if(gUsedVars[kVZEROChannelEta+ich]) { | |
394 | if(ich<32) theta = TMath::ATan(gkVZEROChannelRadii[ich]/(gkVZEROCz-values[kVtxZ])); | |
395 | else theta = TMath::Pi()-TMath::ATan(gkVZEROChannelRadii[ich]/(gkVZEROAz-values[kVtxZ])); | |
396 | values[kVZEROChannelEta+ich] = -1.0*TMath::Log(TMath::Tan(theta/2.0)); | |
397 | } | |
398 | } | |
399 | ||
400 | if(eventF) { | |
401 | for(Int_t ih=0; ih<6; ++ih) { | |
402 | // VZERO event plane variables | |
403 | values[kVZEROQvecX+2*6+ih] = 0.0; | |
404 | values[kVZEROQvecY+2*6+ih] = 0.0; | |
405 | values[kVZERORP +2*6+ih] = 0.0; | |
406 | for(Int_t iVZEROside=0; iVZEROside<2; ++iVZEROside) { | |
407 | values[kVZEROQvecX+iVZEROside*6+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kVZEROA+iVZEROside, ih+1); | |
408 | values[kVZEROQvecY+iVZEROside*6+ih] = eventF->Qy(AliCorrelationReducedEventFriend::kVZEROA+iVZEROside, ih+1); | |
409 | values[kVZERORP +iVZEROside*6+ih] = eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROA+iVZEROside, ih+1); | |
410 | values[kVZEROQvecX+2*6 +ih] += values[kVZEROQvecX+iVZEROside*6+ih]; | |
411 | values[kVZEROQvecY+2*6 +ih] += values[kVZEROQvecY+iVZEROside*6+ih]; | |
412 | // cos(n(EPtpc-EPvzero A/C)) | |
413 | values[kTPCRPres+iVZEROside*6+ih] = DeltaPhi(eventF->EventPlane(AliCorrelationReducedEventFriend::kTPC, ih+1), eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROA+iVZEROside, ih+1)); | |
414 | values[kTPCRPres+iVZEROside*6+ih] = TMath::Cos(values[kTPCRPres+iVZEROside*6+ih]*(ih+1)); | |
415 | } | |
416 | values[kVZERORP +2*6+ih] = TMath::ATan2(values[kVZEROQvecY+2*6+ih],values[kVZEROQvecX+2*6+ih]); | |
417 | // cos (n*(psi_A-psi_C)) | |
418 | values[kVZERORPres + ih] = DeltaPhi(eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROA, ih+1), | |
419 | eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROC, ih+1)); | |
420 | values[kVZERORPres + ih] = TMath::Cos(values[kVZERORPres + ih]*(ih+1)); | |
421 | // Qx,Qy correlations for VZERO | |
422 | values[kVZEROXaXc+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kVZEROA, ih+1)*eventF->Qx(AliCorrelationReducedEventFriend::kVZEROC, ih+1); | |
423 | values[kVZEROXaYa+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kVZEROA, ih+1)*eventF->Qy(AliCorrelationReducedEventFriend::kVZEROA, ih+1); | |
424 | values[kVZEROXaYc+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kVZEROA, ih+1)*eventF->Qy(AliCorrelationReducedEventFriend::kVZEROC, ih+1); | |
425 | values[kVZEROYaXc+ih] = eventF->Qy(AliCorrelationReducedEventFriend::kVZEROA, ih+1)*eventF->Qx(AliCorrelationReducedEventFriend::kVZEROC, ih+1); | |
426 | values[kVZEROYaYc+ih] = eventF->Qy(AliCorrelationReducedEventFriend::kVZEROA, ih+1)*eventF->Qy(AliCorrelationReducedEventFriend::kVZEROC, ih+1); | |
427 | values[kVZEROXcYc+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kVZEROC, ih+1)*eventF->Qy(AliCorrelationReducedEventFriend::kVZEROC, ih+1); | |
428 | // Psi_A - Psi_C | |
429 | values[kVZEROdeltaRPac+ih] = DeltaPhi(eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROA, ih+1), | |
430 | eventF->EventPlane(AliCorrelationReducedEventFriend::kVZEROC, ih+1)); | |
431 | ||
432 | // TPC event plane | |
433 | values[kTPCQvecX+ih] = eventF->Qx(AliCorrelationReducedEventFriend::kTPC, ih+1); | |
434 | values[kTPCQvecY+ih] = eventF->Qy(AliCorrelationReducedEventFriend::kTPC, ih+1); | |
435 | values[kTPCRP +ih] = eventF->EventPlane(AliCorrelationReducedEventFriend::kTPC, ih+1); | |
436 | // TPC VZERO Q-vector correlations | |
437 | values[kRPXtpcXvzeroa+ih] = values[kTPCQvecX+ih]*values[kVZEROQvecX+ih]; | |
438 | values[kRPXtpcXvzeroc+ih] = values[kTPCQvecX+ih]*values[kVZEROQvecX+6+ih]; | |
439 | values[kRPYtpcYvzeroa+ih] = values[kTPCQvecY+ih]*values[kVZEROQvecY+ih]; | |
440 | values[kRPYtpcYvzeroc+ih] = values[kTPCQvecY+ih]*values[kVZEROQvecY+6+ih]; | |
441 | values[kRPXtpcYvzeroa+ih] = values[kTPCQvecX+ih]*values[kVZEROQvecY+ih]; | |
442 | values[kRPXtpcYvzeroc+ih] = values[kTPCQvecX+ih]*values[kVZEROQvecY+6+ih]; | |
443 | values[kRPYtpcXvzeroa+ih] = values[kTPCQvecY+ih]*values[kVZEROQvecX+ih]; | |
444 | values[kRPYtpcXvzeroc+ih] = values[kTPCQvecY+ih]*values[kVZEROQvecX+6+ih]; | |
445 | // Psi_TPC - Psi_VZERO A/C | |
446 | values[kRPdeltaVZEROAtpc+ih] = DeltaPhi(values[kVZERORP+0*6+ih], values[kTPCRP+ih]); | |
447 | values[kRPdeltaVZEROCtpc+ih] = DeltaPhi(values[kVZERORP+1*6+ih], values[kTPCRP+ih]); | |
448 | } // end loop over harmonics | |
449 | ||
450 | // VZERO v2 using TPC event plane | |
451 | Double_t vzeroChannelPhi[8] = {0.3927, 1.1781, 1.9635, 2.7489, -2.7489, -1.9635, -1.1781, -0.3927}; | |
452 | for(Int_t ich=0; ich<64; ++ich) { | |
453 | if(gUsedVars[kVZEROflowV2TPC]) { | |
454 | values[kVZEROflowV2TPC+ich] = values[kVZEROChannelMult+ich]*TMath::Cos(2.0*DeltaPhi(vzeroChannelPhi[ich%8],values[kTPCRP+1])); | |
455 | } | |
456 | } | |
457 | } // end if (eventF) | |
458 | } | |
459 | ||
460 | ||
461 | //_________________________________________________________________ | |
462 | void DstCommonMacros::FillTrackingFlag(AliCorrelationReducedTrack* track, UShort_t flag, Float_t* values) { | |
463 | // | |
464 | // fill the tracking flag | |
465 | // | |
466 | values[kTrackingFlag] = -1; | |
467 | if(track->CheckTrackStatus(flag)) values[kTrackingFlag] = flag; | |
468 | } | |
469 | ||
470 | ||
471 | //_________________________________________________________________ | |
472 | void DstCommonMacros::FillEventOfflineTriggers(UShort_t triggerBit, Float_t* values) { | |
473 | // | |
474 | // fill the trigger bit input | |
475 | // | |
476 | if(triggerBit>=64) return; | |
477 | if(!gCurrentEvent) return; | |
478 | ULong64_t trigger = BIT(0); | |
479 | values[kOfflineTrigger] = triggerBit; | |
480 | values[kOfflineTriggerFired] = (gCurrentEvent->TriggerMask()&(trigger<<triggerBit) ? 1.0 : 0.0); | |
481 | values[kOfflineTriggerFired2] = (values[kOfflineTriggerFired]>0.01 ? triggerBit : -1.0); | |
482 | } | |
483 | ||
484 | ||
485 | //_________________________________________________________________ | |
486 | void DstCommonMacros::FillTrackInfo(AliCorrelationReducedTrack* p, Float_t* values) { | |
487 | // | |
488 | // fill track information | |
489 | // | |
490 | values[kPt] = p->Pt(); | |
491 | values[kPtTPC] = p->PtTPC(); | |
492 | if(gUsedVars[kP]) values[kP] = p->P(); | |
493 | if(gUsedVars[kTheta]) values[kTheta] = p->Theta(); | |
494 | values[kPhi] = p->Phi(); | |
495 | values[kPhiTPC] = p->PhiTPC(); | |
496 | values[kEta] = p->Eta(); | |
497 | values[kEtaTPC] = p->EtaTPC(); | |
498 | values[kPin] = p->Pin(); | |
499 | values[kDcaXY] = p->DCAxy(); | |
500 | values[kDcaZ] = p->DCAz(); | |
501 | ||
502 | if(gUsedVars[kITSncls]) values[kITSncls] = p->ITSncls(); | |
503 | values[kITSsignal] = p->ITSsignal(); | |
504 | ||
505 | values[kTPCncls] = p->TPCncls(); | |
506 | if(gUsedVars[kTPCnclsRatio]) | |
507 | values[kTPCnclsRatio] = (p->TPCFindableNcls()>0 ? Float_t(p->TPCncls())/Float_t(p->TPCFindableNcls()) : 0.0); | |
508 | values[kTPCnclsIter1] = p->TPCnclsIter1(); | |
509 | values[kTPCnclsF] = p->TPCFindableNcls(); | |
510 | values[kTPCsignal] = p->TPCsignal(); | |
511 | ||
512 | values[kTOFbeta] = p->TOFbeta(); | |
513 | for(Int_t specie=kElectron; specie<=kProton; ++specie) { | |
514 | values[kTPCnSig+specie] = p->TPCnSig(specie); | |
515 | values[kTOFnSig+specie] = p->TOFnSig(specie); | |
516 | } | |
517 | values[kTRDpidProbabilities] = p->TRDpid(0); | |
518 | values[kTRDpidProbabilities+1] = p->TRDpid(1); | |
519 | ||
520 | values[kTRDntracklets] = p->TRDntracklets(0); | |
521 | values[kTRDntrackletsPID] = p->TRDntracklets(1); | |
522 | ||
523 | if(gUsedVars[kEMCALmatchedEnergy] || gUsedVars[kEMCALmatchedEOverP]) { | |
524 | AliCorrelationReducedCaloCluster* cluster = gCurrentEvent->GetCaloCluster(p->CaloClusterId()); | |
525 | values[kEMCALmatchedEnergy] = (cluster ? cluster->Energy() : -999.0); | |
526 | Float_t mom = p->P(); | |
527 | values[kEMCALmatchedEnergy] = (TMath::Abs(mom)>1.e-8 && cluster ? values[kEMCALmatchedEOverP]/mom : -999.0); | |
528 | } | |
529 | ||
530 | // Fill track flow variables | |
531 | for(Int_t iVZEROside=0; iVZEROside<2; ++iVZEROside) { | |
532 | for(Int_t ih=0; ih<6; ++ih) { | |
533 | if(gUsedVars[kTrackVZEROFlowVn+iVZEROside*6+ih] || gUsedVars[kTrackDeltaPhiVZEROFlowVn+iVZEROside*6+ih]) { | |
534 | values[kTrackVZEROFlowVn+iVZEROside*6+ih] = TMath::Cos(DeltaPhi(values[kPhi],values[kVZERORP+iVZEROside*6+ih])*(ih+1)); | |
535 | values[kTrackDeltaPhiVZEROFlowVn+iVZEROside*6+ih] = DeltaPhi(values[kPhi],values[kVZERORP+iVZEROside*6+ih]); | |
536 | } | |
537 | } | |
538 | } | |
539 | } | |
540 | ||
541 | ||
542 | //_________________________________________________________________ | |
543 | void DstCommonMacros::FillCaloClusterInfo(AliCorrelationReducedCaloCluster* cl, Float_t* values) { | |
544 | // | |
545 | // Fill calorimeter cluster information | |
546 | // | |
547 | values[kEMCALclusterEnergy] = cl->Energy(); | |
548 | values[kEMCALclusterDx] = cl->Dx(); | |
549 | values[kEMCALclusterDz] = cl->Dz(); | |
550 | values[kEMCALdetector] = (cl->IsEMCAL() ? AliCorrelationReducedCaloCluster::kEMCAL : AliCorrelationReducedCaloCluster::kPHOS); | |
551 | } | |
552 | ||
553 | ||
554 | //_________________________________________________________________ | |
555 | void DstCommonMacros::FillPairInfo(AliCorrelationReducedPair* p, Float_t* values) { | |
556 | // | |
557 | // fill pair information | |
558 | // | |
559 | ||
560 | values[kCandidateId] = p->CandidateId(); | |
561 | values[kPairType] = p->PairType(); | |
562 | if(gUsedVars[kMass]) { | |
563 | values[kMass] = p->Mass(); | |
564 | if(p->CandidateId()==AliCorrelationReducedPair::kLambda0ToPPi) values[kMass] = p->Mass(1); | |
565 | if(p->CandidateId()==AliCorrelationReducedPair::kALambda0ToPPi) values[kMass] = p->Mass(2); | |
566 | } | |
567 | values[kPairPt] = p->Pt(); | |
568 | if(gUsedVars[kPairP]) values[kPairP] = p->P(); | |
569 | if(gUsedVars[kPairPx]) values[kPairPx] = p->Px(); | |
570 | if(gUsedVars[kPairPy]) values[kPairPy] = p->Py(); | |
571 | if(gUsedVars[kPairPz]) values[kPairPz] = p->Pz(); | |
572 | values[kPairEta] = p->Eta(); | |
573 | if(gUsedVars[kPairRap]) values[kPairRap] = p->Rapidity(); | |
574 | values[kPairPhi] = p->Phi(); | |
575 | values[kPairLxy] = p->Lxy(); | |
576 | values[kPairOpeningAngle] = p->OpeningAngle(); | |
577 | if(gUsedVars[kPairTheta]) values[kPairTheta] = p->Theta(); | |
578 | ||
579 | // Flow variables | |
580 | // cos(n*phi), sin(n*phi) | |
581 | for(Int_t ih=0; ih<6; ++ih) { | |
582 | if(gUsedVars[kPairCosNPhi+ih]) values[kPairCosNPhi+ih] = TMath::Cos(values[kPairPhi]*(1.0+ih)); | |
583 | if(gUsedVars[kPairSinNPhi+ih]) values[kPairSinNPhi+ih] = TMath::Sin(values[kPairPhi]*(1.0+ih)); | |
584 | } | |
585 | // VZERO | |
586 | for(Int_t iVZEROside=0; iVZEROside<3; ++iVZEROside) { | |
587 | // v3 using VZERO Psi_2 | |
588 | if(gUsedVars[kPairVZEROFlowV3Psi2+iVZEROside]) | |
589 | values[kPairVZEROFlowV3Psi2+iVZEROside] = TMath::Cos(3.0*DeltaPhi(values[kPairPhi],values[kVZERORP+iVZEROside*6+1])); | |
590 | for(Int_t ih=0; ih<6; ++ih) { | |
591 | // vn using VZERO Psi_n | |
592 | if(gUsedVars[kPairVZEROFlowVn+iVZEROside*6+ih]) | |
593 | values[kPairVZEROFlowVn+iVZEROside*6+ih] = TMath::Cos(DeltaPhi(values[kPairPhi], values[kVZERORP+iVZEROside*6+ih])*(ih+1)); | |
594 | // phi - Psi_n | |
595 | if(gUsedVars[kPairDeltaPhiVZEROFlowVn+iVZEROside*6+ih]) | |
596 | values[kPairDeltaPhiVZEROFlowVn+iVZEROside*6+ih] = DeltaPhi(values[kPairPhi], values[kVZERORP+iVZEROside*6+ih]); | |
597 | } | |
598 | } | |
599 | // TPC | |
600 | // v3 using Psi_2 | |
601 | if(gUsedVars[kPairTPCFlowV3Psi2]) | |
602 | values[kPairTPCFlowV3Psi2] = TMath::Cos(3.0*DeltaPhi(values[kPairPhi],values[kTPCRP+1])); | |
603 | for(Int_t ih=0; ih<6; ++ih) { | |
604 | // vn using Psi_n | |
605 | if(gUsedVars[kPairTPCFlowVn+ih]) | |
606 | values[kPairTPCFlowVn+ih] = TMath::Cos(DeltaPhi(values[kPairPhi],values[kTPCRP+ih])*(ih+1)); | |
607 | if(gUsedVars[kPairDeltaPhiTPCFlowVn+ih]) | |
608 | values[kPairDeltaPhiTPCFlowVn+ih] = DeltaPhi(values[kPairPhi], values[kTPCRP+ih]); | |
609 | } | |
610 | } | |
611 | ||
612 | ||
613 | //_________________________________________________________________ | |
614 | void DstCommonMacros::FillPairInfo(AliCorrelationReducedTrack* t1, AliCorrelationReducedTrack* t2, Int_t type, Float_t* values) { | |
615 | // | |
616 | // fill pair information from 2 tracks | |
617 | // | |
618 | // type - Parameter encoding the resonance type | |
619 | // This is needed for making a mass assumption on the legs | |
620 | // | |
621 | if(gUsedVars[kPairType]) { | |
622 | if(t1->Charge()*t2->Charge()<0) values[kPairType] = 1; | |
623 | else if(t1->Charge()>0) values[kPairType] = 0; | |
624 | else values[kPairType] = 2; | |
625 | } | |
626 | Float_t kMass1 = 0.0; | |
627 | Float_t kMass2 = 0.0; | |
628 | switch (type) { | |
629 | case AliCorrelationReducedPair::kK0sToPiPi : | |
630 | kMass1 = 0.13957; kMass2 = 0.13957; | |
631 | break; | |
632 | case AliCorrelationReducedPair::kPhiToKK : | |
633 | kMass1 = 0.493677; kMass2 = 0.493677; | |
634 | break; | |
635 | case AliCorrelationReducedPair::kLambda0ToPPi : | |
636 | kMass1 = 0.938272; kMass2 = 0.13957; | |
637 | break; | |
638 | case AliCorrelationReducedPair::kALambda0ToPPi : | |
639 | kMass1 = 0.13957; kMass2 = 0.938272; | |
640 | break; | |
641 | case AliCorrelationReducedPair::kJpsiToEE : | |
642 | kMass1 = 0.000511; kMass2 = 0.000511; | |
643 | break; | |
644 | default : | |
645 | break; | |
646 | } | |
647 | ||
648 | if(gUsedVars[kMass]) { | |
649 | values[kMass] = kMass1*kMass1+kMass2*kMass2 + | |
650 | 2.0*(TMath::Sqrt(kMass1*kMass1+t1->P()*t1->P())*TMath::Sqrt(kMass2*kMass2+t2->P()*t2->P()) - | |
651 | t1->Px()*t2->Px() - t1->Py()*t2->Py() - t1->Pz()*t2->Pz()); | |
652 | if(values[kMass]<0.0) { | |
653 | cout << "FillPairInfo(track, track, type, values): Warning: Very small squared mass found. " | |
654 | << " Could be negative due to resolution of Float_t so it will be set to a small positive value." << endl; | |
655 | cout << " mass2: " << values[kMass] << endl; | |
656 | cout << "p1(p,x,y,z): " << t1->P() << ", " << t1->Px() << ", " << t1->Py() << ", " << t1->Pz() << endl; | |
657 | cout << "p2(p,x,y,z): " << t2->P() << ", " << t2->Px() << ", " << t2->Py() << ", " << t2->Pz() << endl; | |
658 | values[kMass] = 0.0; | |
659 | } | |
660 | else | |
661 | values[kMass] = TMath::Sqrt(values[kMass]); | |
662 | } | |
663 | ||
664 | if(gUsedVars[kPairPt]) values[kPairPt] = TMath::Sqrt((t1->Px()+t2->Px())*(t1->Px()+t2->Px()) + | |
665 | (t1->Py()+t2->Py())*(t1->Py()+t2->Py())); | |
666 | if(gUsedVars[kPairP]) values[kPairP] = TMath::Sqrt((t1->Px()+t2->Px())*(t1->Px()+t2->Px()) + | |
667 | (t1->Py()+t2->Py())*(t1->Py()+t2->Py()) + | |
668 | (t1->Pz()+t2->Pz())*(t1->Pz()+t2->Pz())); | |
669 | if(gUsedVars[kPairEta]) { | |
670 | Float_t p = TMath::Sqrt((t1->Px()+t2->Px())*(t1->Px()+t2->Px()) + | |
671 | (t1->Py()+t2->Py())*(t1->Py()+t2->Py()) + | |
672 | (t1->Pz()+t2->Pz())*(t1->Pz()+t2->Pz())); | |
673 | values[kPairEta] = p-t1->Pz()-t2->Pz(); | |
674 | values[kPairEta] = (TMath::Abs(values[kPairEta])>1.0e-8 ? (p+t1->Pz()+t2->Pz())/values[kPairEta] : 0.0); | |
675 | values[kPairEta] = (values[kPairEta]>1.0e-8 ? 0.5*TMath::Log(values[kPairEta]) : -999.); | |
676 | } | |
677 | if(gUsedVars[kPairRap]) { | |
678 | Float_t mass = kMass1*kMass1+kMass2*kMass2 + | |
679 | 2.0*(TMath::Sqrt(kMass1*kMass1+t1->P()*t1->P())*TMath::Sqrt(kMass2*kMass2+t2->P()*t2->P()) - | |
680 | t1->Px()*t2->Px() - t1->Py()*t2->Py() - t1->Pz()*t2->Pz()); | |
681 | if(mass<0.0) { | |
682 | cout << "Negative squared mass (Float_t resolution). Setting mass to zero" << endl; | |
683 | mass = 0.0; | |
684 | } | |
685 | else mass = TMath::Sqrt(mass); | |
686 | Float_t e = TMath::Sqrt(mass*mass+ | |
687 | (t1->Px()+t2->Px())*(t1->Px()+t2->Px()) + | |
688 | (t1->Py()+t2->Py())*(t1->Py()+t2->Py()) + | |
689 | (t1->Pz()+t2->Pz())*(t1->Pz()+t2->Pz())); | |
690 | values[kPairRap] = 0.5*TMath::Log((e+t1->Pz()+t2->Pz())/(e-t1->Pz()-t2->Pz())); | |
691 | } | |
692 | if(gUsedVars[kPairPhi]) { | |
693 | values[kPairPhi] = TMath::ATan2(t1->Py()+t2->Py(),t1->Px()+t2->Px()); | |
694 | if(values[kPairPhi]<0.0) values[kPairPhi] = 2.0*TMath::Pi() + values[kPairPhi]; | |
695 | } | |
696 | if(gUsedVars[kPairTheta]) values[kPairTheta] = TMath::ACos((t1->Pz()+t2->Pz())/ | |
697 | TMath::Sqrt((t1->Px()+t2->Px())*(t1->Px()+t2->Px()) + | |
698 | (t1->Py()+t2->Py())*(t1->Py()+t2->Py()) + | |
699 | (t1->Pz()+t2->Pz())*(t1->Pz()+t2->Pz()))); | |
700 | // Flow variables | |
701 | // cos(n*phi), sin(n*phi) | |
702 | for(Int_t ih=0; ih<6; ++ih) { | |
703 | if(gUsedVars[kPairCosNPhi+ih]) values[kPairCosNPhi+ih] = TMath::Cos(values[kPairPhi]*(1.0+ih)); | |
704 | if(gUsedVars[kPairSinNPhi+ih]) values[kPairSinNPhi+ih] = TMath::Sin(values[kPairPhi]*(1.0+ih)); | |
705 | } | |
706 | // VZERO | |
707 | for(Int_t iVZEROside=0; iVZEROside<3; ++iVZEROside) { | |
708 | // v3 using VZERO Psi_2 | |
709 | if(gUsedVars[kPairVZEROFlowV3Psi2+iVZEROside]) | |
710 | values[kPairVZEROFlowV3Psi2+iVZEROside] = TMath::Cos(3.0*DeltaPhi(values[kPairPhi],values[kVZERORP+iVZEROside*6+1])); | |
711 | for(Int_t ih=0; ih<6; ++ih) { | |
712 | // vn using VZERO Psi_n | |
713 | if(gUsedVars[kPairVZEROFlowVn+iVZEROside*6+ih]) | |
714 | values[kPairVZEROFlowVn+iVZEROside*6+ih] = TMath::Cos(DeltaPhi(values[kPairPhi], values[kVZERORP+iVZEROside*6+ih])*(ih+1)); | |
715 | // phi - Psi_n | |
716 | if(gUsedVars[kPairDeltaPhiVZEROFlowVn+iVZEROside*6+ih]) | |
717 | values[kPairDeltaPhiVZEROFlowVn+iVZEROside*6+ih] = DeltaPhi(values[kPairPhi], values[kVZERORP+iVZEROside*6+ih]); | |
718 | } | |
719 | } | |
720 | // TPC | |
721 | // v3 using Psi_2 | |
722 | if(gUsedVars[kPairTPCFlowV3Psi2]) | |
723 | values[kPairTPCFlowV3Psi2] = TMath::Cos(3.0*DeltaPhi(values[kPairPhi],values[kTPCRP+1])); | |
724 | for(Int_t ih=0; ih<6; ++ih) { | |
725 | // vn using Psi_n | |
726 | if(gUsedVars[kPairTPCFlowVn+ih]) | |
727 | values[kPairTPCFlowVn+ih] = TMath::Cos(DeltaPhi(values[kPairPhi],values[kTPCRP+ih])*(ih+1)); | |
728 | if(gUsedVars[kPairDeltaPhiTPCFlowVn+ih]) | |
729 | values[kPairDeltaPhiTPCFlowVn+ih] = DeltaPhi(values[kPairPhi], values[kTPCRP+ih]); | |
730 | } | |
731 | } | |
732 | ||
733 | ||
734 | //__________________________________________________________________ | |
735 | void DstCommonMacros::FillCorrelationInfo(AliCorrelationReducedPair* p, AliCorrelationReducedTrack* t, Float_t* values) { | |
736 | // | |
737 | // fill pair-track correlation information | |
738 | // | |
739 | if(gUsedVars[kDeltaPhi]) | |
740 | values[kDeltaPhi] = DeltaPhi(p->Phi(), t->Phi()); | |
741 | ||
742 | if(gUsedVars[kDeltaTheta]) | |
743 | values[kDeltaTheta] = p->Theta() - t->Theta(); | |
744 | ||
745 | if(gUsedVars[kDeltaEta]) values[kDeltaEta] = p->Eta() - t->Eta(); | |
746 | } | |
747 | ||
748 | ||
749 | //__________________________________________________________________ | |
750 | void DstCommonMacros::DoEventMixing(TList* list1, TList* list2, Float_t* values, Int_t type, const Char_t* histClass) { | |
751 | // | |
752 | // Do the event mixing | |
753 | // | |
754 | if(type==0) return; | |
755 | ||
756 | cout << "mixing ..." << endl; | |
757 | switch(type) { | |
758 | case -1: | |
759 | EventMixingPairTracks(list1, list2, values); // list1 contains pairs; list2 contains tracks | |
760 | break; | |
761 | case AliCorrelationReducedPair::kJpsiToEE: | |
762 | // type is needed to encode the type of resonance which is needed for the mass assumption of legs when calculating the invariant mass | |
763 | EventMixingResonanceLegs(list1, list2, values, type, histClass); // list1 contains positive legs; list2 contains negative legs | |
764 | break; | |
765 | default: | |
766 | break; | |
767 | } | |
768 | ||
769 | for(Int_t i=list1->GetEntries()-1; i>=0; --i) ((TList*)list1->At(i))->RemoveAll(); | |
770 | for(Int_t j=list2->GetEntries()-1; j>=0; --j) ((TList*)list2->At(j))->RemoveAll(); | |
771 | list1->Clear(); | |
772 | list2->Clear(); | |
773 | } | |
774 | ||
775 | ||
776 | //__________________________________________________________________ | |
777 | void DstCommonMacros::EventMixingPairTracks(TList* pairLists, TList* trackLists, Float_t* values) { | |
778 | // | |
779 | // Make event mixing for pair - track correlations | |
780 | // | |
781 | cout << "Mixing category " << gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data() << endl; | |
782 | Int_t entries = pairLists->GetEntries(); // we should have the same number of entries in both pair and track lists | |
783 | if(entries<2) return; | |
784 | ||
785 | TList* pairs = 0x0; | |
786 | TList* tracks = 0x0; | |
787 | AliCorrelationReducedPair* pair = 0x0; | |
788 | AliCorrelationReducedTrack* track = 0x0; | |
789 | ||
790 | TIter nextPairList(pairLists); | |
791 | for(Int_t ie1=0; ie1<entries; ++ie1) { | |
792 | pairs = (TList*)nextPairList(); | |
793 | ||
794 | TIter nextTrackList(trackLists); | |
795 | for(Int_t ie2=0; ie2<entries; ++ie2) { | |
796 | tracks = (TList*)nextTrackList(); | |
797 | if(ie1==ie2) continue; | |
798 | ||
799 | TIter nextPair(pairs); | |
800 | for(Int_t ip=0; ip<pairs->GetEntries(); ++ip) { | |
801 | pair = (AliCorrelationReducedPair*)nextPair(); | |
802 | FillPairInfo(pair, values); | |
803 | ||
804 | TIter nextTrack(tracks); | |
805 | Int_t leadingIdx = -1; | |
806 | Float_t leadingPt = 0.0; | |
807 | for(Int_t it=0; it<tracks->GetEntries(); ++it) { | |
808 | track = (AliCorrelationReducedTrack*)nextTrack(); | |
809 | FillTrackInfo(track, values); | |
810 | ||
811 | FillCorrelationInfo(pair, track, values); | |
812 | if(pair->PairType()==1) | |
813 | FillHistClass(Form("Correlation_ME_US%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
814 | if(pair->PairType()==0) { | |
815 | FillHistClass(Form("Correlation_ME_LS%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()), values); | |
816 | FillHistClass(Form("Correlation_ME_LSpp%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()), values); | |
817 | } | |
818 | if(pair->PairType()==2) { | |
819 | FillHistClass(Form("Correlation_ME_LS%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()), values); | |
820 | FillHistClass(Form("Correlation_ME_LSmm%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()), values); | |
821 | } | |
822 | if(track->Pt()>leadingPt) { | |
823 | leadingPt = track->Pt(); | |
824 | leadingIdx = it; | |
825 | } | |
826 | } // end loop over tracks | |
827 | if(leadingIdx!=-1) { | |
828 | track = (AliCorrelationReducedTrack*)tracks->At(leadingIdx); | |
829 | FillTrackInfo(track, values); | |
830 | FillCorrelationInfo(pair, track, values); | |
831 | if(pair->PairType()==1) | |
832 | FillHistClass(Form("Correlation_LeadingPt_ME_US%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
833 | if(pair->PairType()==0) { | |
834 | FillHistClass(Form("Correlation_LeadingPt_ME_LS%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
835 | FillHistClass(Form("Correlation_LeadingPt_ME_LSpp%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
836 | } | |
837 | if(pair->PairType()==2) { | |
838 | FillHistClass(Form("Correlation_LeadingPt_ME_LS%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
839 | FillHistClass(Form("Correlation_LeadingPt_ME_LSmm%s", gEMCategoryNames[TMath::Nint(values[kEventMixingId])].Data()),values); | |
840 | } | |
841 | } | |
842 | } // end loop over pairs | |
843 | } // end loop over second event | |
844 | } // end loop over first event | |
845 | } | |
846 | ||
847 | ||
848 | //__________________________________________________________________ | |
849 | void DstCommonMacros::EventMixingResonanceLegs(TList* posLists, TList* negLists, Float_t* values, Int_t type, const Char_t* histClass) { | |
850 | // | |
851 | // Do event mixing with the legs of a resonance to obtain the background | |
852 | // | |
853 | cout << "Mixing event class " << histClass << ", (cent/vtx): " << values[kCentVZERO] << "/" << values[kVtxZ] << endl; | |
854 | Int_t entries = posLists->GetEntries(); | |
855 | cout << "mixing positives: " << entries << endl; | |
856 | cout << "mixing negatives: " << negLists->GetEntries() << endl; | |
857 | if(entries<2) return; | |
858 | ||
859 | TList* positives1 = 0x0; // list of tracks in the first event | |
860 | //TList* negatives1 = 0x0; | |
861 | //TList* positives2 = 0x0; // list of tracks in the second event | |
862 | TList* negatives2 = 0x0; | |
863 | AliCorrelationReducedTrack* posTrack1 = 0x0; | |
864 | //AliCorrelationReducedTrack* negTrack1 = 0x0; | |
865 | //AliCorrelationReducedTrack* posTrack2 = 0x0; | |
866 | AliCorrelationReducedTrack* negTrack2 = 0x0; | |
867 | ||
868 | TIter nextPosList1(posLists); | |
869 | TIter nextNegList1(negLists); | |
870 | for(Int_t ie1=0; ie1<entries; ++ie1) { | |
871 | positives1 = (TList*)nextPosList1(); | |
872 | //negatives1 = (TList*)nextNegList1(); | |
873 | ||
874 | TIter nextPosList2(posLists); | |
875 | TIter nextNegList2(negLists); | |
876 | for(Int_t ie2=0; ie2<entries; ++ie2) { | |
877 | //positives2 = (TList*)nextPosList2(); | |
878 | negatives2 = (TList*)nextNegList2(); | |
879 | if(ie1==ie2) continue; // no SE mixing | |
880 | ||
881 | TIter nextPosLeg1(positives1); | |
882 | while((posTrack1=(AliCorrelationReducedTrack*)nextPosLeg1())) { | |
883 | /*TIter nextPosLeg2(positives2); | |
884 | while((posTrack2=(AliCorrelationReducedTrack*)nextPosLeg2())) { | |
885 | FillPairInfo(posTrack1, posTrack2, type, values); // ++ combinations | |
886 | FillHistClass(Form("%s_LSpp", histClass),values); | |
887 | } // end while over pos legs in event 2 | |
888 | */ | |
889 | TIter nextNegLeg2(negatives2); | |
890 | while((negTrack2=(AliCorrelationReducedTrack*)nextNegLeg2())) { | |
891 | FillPairInfo(posTrack1, negTrack2, type, values); // +- combinations | |
892 | if(IsPairSelectedEM(values)) | |
893 | FillHistClass(histClass, values); | |
894 | } // end while over neg legs in event 2 | |
895 | } // end while over pos legs in event 1 | |
896 | /*TIter nextNegLeg1(negatives1); | |
897 | while((negTrack1=(AliCorrelationReducedTrack*)nextNegLeg1())) { | |
898 | TIter nextNegLeg2(negatives2); | |
899 | while((negTrack2=(AliCorrelationReducedTrack*)nextNegLeg2())) { | |
900 | FillPairInfo(negTrack1, negTrack2, type, values); // -- combinations | |
901 | FillHistClass(Form("%s_LSmm", histClass),values); | |
902 | } // end while over neg legs in event 2 | |
903 | } // end while over neg legs in event 1 | |
904 | */ | |
905 | } // end for over event 2 | |
906 | } // end for over event 1 | |
907 | } | |
908 | ||
909 | ||
910 | ||
911 | ||
912 | //________________________________________________________________ | |
913 | Double_t DstCommonMacros::DeltaPhi(Double_t phi1, Double_t phi2) { | |
914 | // | |
915 | // compute the delta of two angles defined in the (-pi,+pi) interval | |
916 | // | |
917 | Double_t delta = phi1-phi2; | |
918 | if(delta>2.0*TMath::Pi()) delta -= 2.0*TMath::Pi(); | |
919 | if(delta<0.0) delta += 2.0*TMath::Pi(); | |
920 | /*Double_t delta = phi2; | |
921 | if(phi2<0.0) delta += 2.0*TMath::Pi(); | |
922 | delta = phi1-delta; | |
923 | if(delta>TMath::Pi()) delta = delta - 2.0*TMath::Pi(); | |
924 | if(delta<-1.*TMath::Pi()) delta = 2.0*TMath::Pi() + delta; | |
925 | */ | |
926 | return delta; | |
927 | } | |
928 | ||
929 | ||
930 | //__________________________________________________________________ | |
931 | void DstCommonMacros::FillHistClass(const Char_t* className, Float_t* values) { | |
932 | // | |
933 | // fill a class of histograms | |
934 | // | |
935 | THashList* hList = (THashList*)gHistLists->FindObject(className); | |
936 | if(!hList) { | |
937 | //cout << "Warning in FillHistClass(): Histogram class " << className << " not found" << endl; | |
938 | return; | |
939 | } | |
940 | ||
941 | TIter next(hList); | |
942 | TObject* h=0x0; | |
943 | while((h=next())) { | |
944 | UInt_t id = h->GetUniqueID(); | |
945 | UInt_t varX = id%kNVars; | |
946 | UInt_t varY = (id/kNVars)%kNVars; | |
947 | UInt_t varZ = (id/kNVars/kNVars)%kNVars; | |
948 | if(id<kNVars) { | |
949 | ((TH1F*)h)->Fill(values[varX]); | |
950 | } else if(id<kNVars*kNVars) { | |
951 | if(((TH1*)h)->GetDimension()==1) ((TProfile*)h)->Fill(values[varX],values[varY]); | |
952 | if(((TH1*)h)->GetDimension()==2) ((TH2F*)h)->Fill(values[varX],values[varY]); | |
953 | } else { | |
954 | if(((TH1*)h)->GetDimension()==2) ((TProfile2D*)h)->Fill(values[varX],values[varY],values[varZ]); | |
955 | if(((TH1*)h)->GetDimension()==3) ((TH3F*)h)->Fill(values[varX],values[varY],values[varZ]); | |
956 | }; | |
957 | } | |
958 | } | |
959 | ||
960 | ||
961 | //__________________________________________________________________ | |
962 | void DstCommonMacros::AddHistClass(const Char_t* histClass) { | |
963 | // | |
964 | // Add a new histogram list | |
965 | // | |
966 | if(!gHistLists) | |
967 | gHistLists = new TObjArray(); | |
968 | gHistLists->SetOwner(); | |
969 | gHistLists->SetName("histos"); | |
970 | ||
971 | if(gHistLists->FindObject(histClass)) { | |
972 | cout << "Warning in AddHistClass: Cannot add histogram class " << histClass | |
973 | << " because it already exists." << endl; | |
974 | return; | |
975 | } | |
976 | THashList* hList=new THashList; | |
977 | hList->SetOwner(kTRUE); | |
978 | hList->SetName(histClass); | |
979 | gHistLists->Add(hList); | |
980 | } | |
981 | ||
982 | ||
983 | //_________________________________________________________________ | |
984 | Int_t DstCommonMacros::ValidateHistogramName(THashList* hList, const Char_t* name) { | |
985 | // | |
986 | // check whether a histogram with this name already exist, and how many of them | |
987 | // | |
988 | for(Int_t i=0; i<hList->GetEntries(); ++i) { | |
989 | TString hname = hList->At(i)->GetName(); | |
990 | TObjArray* arr=hname.Tokenize("#"); | |
991 | TString nameRoot = arr->At(0)->GetName(); | |
992 | if(nameRoot.CompareTo(name)==0) { | |
993 | cout << "Warning in AddHistogram(): Histogram " << name << " already exists in this list (" << nameRoot.Data() << ")" << endl; | |
994 | return -1; | |
995 | } | |
996 | } | |
997 | Int_t nnames = 0; | |
998 | for(Int_t il=0; il<gHistLists->GetEntries(); ++il) { | |
999 | THashList* tlist = (THashList*)gHistLists->At(il); | |
1000 | for(Int_t ih=0; ih<tlist->GetEntries(); ++ih) { | |
1001 | TString hname = tlist->At(ih)->GetName(); | |
1002 | TObjArray* arr=hname.Tokenize("#"); | |
1003 | TString nameRoot = arr->At(0)->GetName(); | |
1004 | if(nameRoot.CompareTo(name)==0) ++nnames; | |
1005 | } | |
1006 | } | |
1007 | return nnames; | |
1008 | } | |
1009 | ||
1010 | ||
1011 | //_________________________________________________________________ | |
1012 | void DstCommonMacros::AddHistogram(const Char_t* histClass, | |
1013 | const Char_t* name, const Char_t* title, Bool_t isProfile, | |
1014 | Int_t nXbins, Double_t xmin, Double_t xmax, Int_t varX, | |
1015 | Int_t nYbins, Double_t ymin, Double_t ymax, Int_t varY, | |
1016 | Int_t nZbins, Double_t zmin, Double_t zmax, Int_t varZ, | |
1017 | const Char_t* xLabels, const Char_t* yLabels, const Char_t* zLabels) { | |
1018 | // | |
1019 | // add a histogram | |
1020 | // | |
1021 | THashList* hList = (THashList*)gHistLists->FindObject(histClass); | |
1022 | if(hList->FindObject(name)) { | |
1023 | cout << "Warning in AddHistogram(): Histogram " << name << " already exists" << endl; | |
1024 | return; | |
1025 | } | |
1026 | /*Int_t nnames = ValidateHistogramName(hList, name); | |
1027 | if(nnames<0) return; | |
1028 | TString hname = Form("%s#v%d", name, nnames); | |
1029 | cout << "Assigned name " << hname.Data() << endl;*/ | |
1030 | TString hname = name; | |
1031 | ||
1032 | Int_t dimension = 1; | |
1033 | if(varY!=kNothing) dimension = 2; | |
1034 | if(varZ!=kNothing) dimension = 3; | |
1035 | ||
1036 | TString titleStr(title); | |
1037 | TObjArray* arr=titleStr.Tokenize(";"); | |
1038 | ||
1039 | TH1* h=0x0; | |
1040 | switch(dimension) { | |
1041 | case 1: | |
1042 | h=new TH1F(hname.Data(),arr->At(0)->GetName(),nXbins,xmin,xmax); | |
1043 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX) << endl; | |
1044 | h->SetUniqueID(UInt_t(varX)); | |
1045 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1046 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1047 | gUsedVars[varX] = kTRUE; | |
1048 | hList->Add(h); | |
1049 | break; | |
1050 | case 2: | |
1051 | if(isProfile) | |
1052 | h=new TProfile(hname.Data(),arr->At(0)->GetName(),nXbins,xmin,xmax); | |
1053 | else | |
1054 | h=new TH2F(hname.Data(),arr->At(0)->GetName(),nXbins,xmin,xmax,nYbins,ymin,ymax); | |
1055 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX+kNVars*varY) << endl; | |
1056 | h->SetUniqueID(UInt_t(varX+kNVars*varY)); | |
1057 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1058 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1059 | if(arr->At(2)) h->GetYaxis()->SetTitle(arr->At(2)->GetName()); | |
1060 | if(yLabels[0]!='\0') MakeAxisLabels(h->GetYaxis(), yLabels); | |
1061 | gUsedVars[varX] = kTRUE; | |
1062 | gUsedVars[varY] = kTRUE; | |
1063 | hList->Add(h); | |
1064 | break; | |
1065 | case 3: | |
1066 | if(isProfile) | |
1067 | h=new TProfile2D(hname.Data(),arr->At(0)->GetName(),nXbins,xmin,xmax,nYbins,ymin,ymax); | |
1068 | else | |
1069 | h=new TH3F(hname.Data(),arr->At(0)->GetName(),nXbins,xmin,xmax,nYbins,ymin,ymax,nZbins,zmin,zmax); | |
1070 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX+kNVars*varY+kNVars*kNVars*varZ) << endl; | |
1071 | h->SetUniqueID(UInt_t(varX+kNVars*varY+kNVars*kNVars*varZ)); | |
1072 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1073 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1074 | if(arr->At(2)) h->GetYaxis()->SetTitle(arr->At(2)->GetName()); | |
1075 | if(yLabels[0]!='\0') MakeAxisLabels(h->GetYaxis(), yLabels); | |
1076 | if(arr->At(3)) h->GetZaxis()->SetTitle(arr->At(3)->GetName()); | |
1077 | if(zLabels[0]!='\0') MakeAxisLabels(h->GetZaxis(), zLabels); | |
1078 | gUsedVars[varX] = kTRUE; | |
1079 | gUsedVars[varY] = kTRUE; | |
1080 | gUsedVars[varZ] = kTRUE; | |
1081 | hList->Add(h); | |
1082 | break; | |
1083 | } | |
1084 | } | |
1085 | ||
1086 | //_________________________________________________________________ | |
1087 | void DstCommonMacros::AddHistogram(const Char_t* histClass, | |
1088 | const Char_t* name, const Char_t* title, Bool_t isProfile, | |
1089 | Int_t nXbins, Double_t* xbins, Int_t varX, | |
1090 | Int_t nYbins, Double_t* ybins, Int_t varY, | |
1091 | Int_t nZbins, Double_t* zbins, Int_t varZ, | |
1092 | const Char_t* xLabels, const Char_t* yLabels, const Char_t* zLabels) { | |
1093 | // | |
1094 | // add a histogram | |
1095 | // | |
1096 | THashList* hList = (THashList*)gHistLists->FindObject(histClass); | |
1097 | if(hList->FindObject(name)) { | |
1098 | cout << "Warning in AddHistogram(): Histogram " << name << " already exists" << endl; | |
1099 | return; | |
1100 | } | |
1101 | //Int_t nnames = ValidateHistogramName(hList, name); | |
1102 | //if(nnames<0) return; | |
1103 | //TString hname = Form("%s#v%d", name, nnames); | |
1104 | TString hname = name; | |
1105 | ||
1106 | Int_t dimension = 1; | |
1107 | if(varY!=kNothing) dimension = 2; | |
1108 | if(varZ!=kNothing) dimension = 3; | |
1109 | ||
1110 | TString titleStr(title); | |
1111 | TObjArray* arr=titleStr.Tokenize(";"); | |
1112 | ||
1113 | TH1* h=0x0; | |
1114 | switch(dimension) { | |
1115 | case 1: | |
1116 | h=new TH1F(hname.Data(),arr->At(0)->GetName(),nXbins,xbins); | |
1117 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX) << endl; | |
1118 | h->SetUniqueID(UInt_t(varX)); | |
1119 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1120 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1121 | gUsedVars[varX] = kTRUE; | |
1122 | hList->Add(h); | |
1123 | break; | |
1124 | case 2: | |
1125 | if(isProfile) | |
1126 | h=new TProfile(hname.Data(),arr->At(0)->GetName(),nXbins,xbins); | |
1127 | else | |
1128 | h=new TH2F(hname.Data(),arr->At(0)->GetName(),nXbins,xbins,nYbins,ybins); | |
1129 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX+kNVars*varY) << endl; | |
1130 | h->SetUniqueID(UInt_t(varX+kNVars*varY)); | |
1131 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1132 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1133 | if(arr->At(2)) h->GetYaxis()->SetTitle(arr->At(2)->GetName()); | |
1134 | if(yLabels[0]!='\0') MakeAxisLabels(h->GetYaxis(), yLabels); | |
1135 | gUsedVars[varX] = kTRUE; | |
1136 | gUsedVars[varY] = kTRUE; | |
1137 | hList->Add(h); | |
1138 | break; | |
1139 | case 3: | |
1140 | if(isProfile) | |
1141 | h=new TProfile2D(hname.Data(),arr->At(0)->GetName(),nXbins,xbins,nYbins,ybins); | |
1142 | else | |
1143 | h=new TH3F(hname.Data(),arr->At(0)->GetName(),nXbins,xbins,nYbins,ybins,nZbins,zbins); | |
1144 | //cout << "HISTOGRAM " << hname.Data() << ", ID: " << UInt_t(varX+kNVars*varY+kNVars*kNVars*varZ) << endl; | |
1145 | h->SetUniqueID(UInt_t(varX+kNVars*varY+kNVars*kNVars*varZ)); | |
1146 | if(arr->At(1)) h->GetXaxis()->SetTitle(arr->At(1)->GetName()); | |
1147 | if(xLabels[0]!='\0') MakeAxisLabels(h->GetXaxis(), xLabels); | |
1148 | if(arr->At(2)) h->GetYaxis()->SetTitle(arr->At(2)->GetName()); | |
1149 | if(yLabels[0]!='\0') MakeAxisLabels(h->GetYaxis(), yLabels); | |
1150 | if(arr->At(3)) h->GetZaxis()->SetTitle(arr->At(3)->GetName()); | |
1151 | if(zLabels[0]!='\0') MakeAxisLabels(h->GetZaxis(), zLabels); | |
1152 | gUsedVars[varX] = kTRUE; | |
1153 | gUsedVars[varY] = kTRUE; | |
1154 | gUsedVars[varZ] = kTRUE; | |
1155 | hList->Add(h); | |
1156 | break; | |
1157 | } | |
1158 | } | |
1159 | ||
1160 | ||
1161 | //____________________________________________________________________________________ | |
1162 | void DstCommonMacros::MakeAxisLabels(TAxis* ax, const Char_t* labels) { | |
1163 | // | |
1164 | // add bin labels to an axis | |
1165 | // | |
1166 | TString labelsStr(labels); | |
1167 | TObjArray* arr=labelsStr.Tokenize(";"); | |
1168 | for(Int_t ib=1; ib<=ax->GetNbins(); ++ib) { | |
1169 | if(ib>=arr->GetEntries()+1) break; | |
1170 | ax->SetBinLabel(ib, arr->At(ib-1)->GetName()); | |
1171 | } | |
1172 | } | |
1173 | ||
1174 | ||
1175 | //____________________________________________________________________________________ | |
1176 | void DstCommonMacros::InitFile(const Char_t* filename) { | |
1177 | // | |
1178 | // Open an existing ROOT file containing lists of histograms and initialize the global list pointer | |
1179 | // | |
1180 | //if(gHistFile) gHistFile->Close(); | |
1181 | TString histfilename=""; | |
1182 | if(gHistFile) histfilename = gHistFile->GetName(); | |
1183 | if(!histfilename.Contains(filename)) | |
1184 | gHistFile = new TFile(filename); // open file only if not already open | |
1185 | ||
1186 | if(!gHistFile) { | |
1187 | cout << "GlobalMacros.C::GetHistogram() : File " << filename << " not opened!!" << endl; | |
1188 | return; | |
1189 | } | |
1190 | if(gHistFile->IsZombie()) { | |
1191 | cout << "GlobalMacros.C::GetHistogram() : File " << filename << " not opened!!" << endl; | |
1192 | return; | |
1193 | } | |
1194 | TList* list1 = gHistFile->GetListOfKeys(); | |
1195 | TKey* key1 = (TKey*)list1->At(0); | |
1196 | gHistListsOld = (TDirectoryFile*)key1->ReadObj(); | |
1197 | } | |
1198 | ||
1199 | ||
1200 | //____________________________________________________________________________________ | |
1201 | void DstCommonMacros::CloseFile() { | |
1202 | // | |
1203 | // Close the opened file | |
1204 | // | |
1205 | gHistListsOld = 0x0; | |
1206 | if(gHistFile && gHistFile->IsOpen()) gHistFile->Close(); | |
1207 | } | |
1208 | ||
1209 | ||
1210 | //____________________________________________________________________________________ | |
1211 | TObject* DstCommonMacros::GetHistogram(const Char_t* listname, const Char_t* hname) { | |
1212 | // | |
1213 | // Retrieve a histogram from the list hlist | |
1214 | // | |
1215 | if(!gHistListsOld) { | |
1216 | cout << "GlobalMacros.C::GetHistogram() : The main list was not initialized." << endl; | |
1217 | cout << " A ROOT file must pe initialized first!!" << endl; | |
1218 | return 0x0; | |
1219 | } | |
1220 | TKey* listKey = gHistListsOld->FindKey(listname); | |
1221 | TDirectoryFile* hlist = (TDirectoryFile*)listKey->ReadObj(); | |
1222 | TKey* key = hlist->FindKey(hname); | |
1223 | return key->ReadObj(); | |
1224 | } | |
1225 | ||
1226 | ||
1227 | //_________________________________________________________________ | |
1228 | TChain* DstCommonMacros::GetChain(const Char_t* filename, Int_t howMany, Int_t offset, Long64_t& entries, | |
1229 | TChain* friendChain/*=0x0*/, const Char_t* friendChainFile/*=0x0*/) { | |
1230 | // | |
1231 | // read an ascii file containing a list of root files with reduced trees | |
1232 | // and build a TChain | |
1233 | // | |
1234 | cout << "Creating the data chain from " << filename << " ..." << flush; | |
1235 | TChain* chain = new TChain("DstTree"); | |
1236 | ifstream inBuf; | |
1237 | inBuf.open(filename); | |
1238 | Int_t index = 0; | |
1239 | while(inBuf.good()) { | |
1240 | Char_t str[512]; | |
1241 | inBuf.getline(str,512,'\n'); | |
1242 | ||
1243 | if(index<offset) {++index; continue;} | |
1244 | if(index>=offset+howMany) break; | |
1245 | ||
1246 | TString strstr = str; | |
1247 | if(!strstr.Contains(".root")) continue; | |
1248 | cout << endl << "Adding file " << str << endl; | |
1249 | chain->Add(str); | |
1250 | if(friendChain) { | |
1251 | TObjArray* arr = strstr.Tokenize("/"); | |
1252 | strstr.ReplaceAll(arr->At(arr->GetEntries()-1)->GetName(),friendChainFile); | |
1253 | friendChain->Add(strstr.Data()); | |
1254 | } | |
1255 | ++index; | |
1256 | } | |
1257 | inBuf.close(); | |
1258 | entries = chain->GetEntries(); | |
1259 | Long64_t entriesFriend = (friendChain ? friendChain->GetEntries() : 0); | |
1260 | cout << "DstCommonMacros::GetChain() Chain entries = " << entries << endl; | |
1261 | if(friendChain) | |
1262 | cout << "DstCommonMacros::GetChain() Friend chain entries = " << entriesFriend << endl; | |
1263 | if(friendChain && (entries!=entriesFriend)) { | |
1264 | cout << "DstCommonMacros::GetChain() The friend chain does not have the same number of entries as the main chain!!!" << endl; | |
1265 | cout << " Check it out and retry !!" << endl; | |
1266 | return 0x0; | |
1267 | } | |
1268 | cout << " done" << endl; | |
1269 | return chain; | |
1270 | } | |
1271 | ||
1272 | ||
1273 | //__________________________________________________________________ | |
1274 | void DstCommonMacros::WriteOutput(TFile* save) { | |
1275 | // | |
1276 | // Write the histogram lists in the output file | |
1277 | // | |
1278 | cout << "Writing the output to " << save->GetName() << " ... " << flush; | |
1279 | //TFile* save=new TFile(filename,"RECREATE"); | |
1280 | TDirectory* mainDir = save->mkdir(gHistLists->GetName()); | |
1281 | mainDir->cd(); | |
1282 | for(Int_t i=0; i<gHistLists->GetEntries(); ++i) { | |
1283 | THashList* list = (THashList*)gHistLists->At(i); | |
1284 | TDirectory* dir = mainDir->mkdir(list->GetName()); | |
1285 | dir->cd(); | |
1286 | list->Write(); | |
1287 | mainDir->cd(); | |
1288 | } | |
1289 | save->Close(); | |
1290 | cout << "done" << endl; | |
1291 | } | |
1292 | ||
1293 | ||
1294 | //__________________________________________________________________ | |
1295 | Bool_t DstCommonMacros::IsPairSelectedEM(Float_t* values) { | |
1296 | // | |
1297 | // pair selection on the pair resulting from the event mixing | |
1298 | // | |
1299 | if(values[kPairPt]<gkJpsiPtCut[0]) return kFALSE; | |
1300 | if(values[kPairPt]>gkJpsiPtCut[1]) return kFALSE; | |
1301 | return kTRUE; | |
1302 | } |