]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGDQ/dielectron/AliReducedEvent.cxx
including switch to set on/off iso-track core removal, cleaning and bug fix
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliReducedEvent.cxx
CommitLineData
240ed454 1/*
2***********************************************************
3 Implementation of reduced ESD information classes for
4 quick analysis.
5 Contact: i.c.arsene@gsi.de, i.c.arsene@cern.ch
6 2012/06/21
7 *********************************************************
8*/
9
10#ifndef ALIREDUCEDEVENT_H
11#include "AliReducedEvent.h"
12#endif
13
14#include <TMath.h>
15#include <TClonesArray.h>
6ab32c51 16#include <TClass.h>
240ed454 17
18ClassImp(AliReducedTrack)
19ClassImp(AliReducedPair)
6ab32c51 20ClassImp(AliReducedFMD)
240ed454 21ClassImp(AliReducedEvent)
22ClassImp(AliReducedEventFriend)
23ClassImp(AliReducedCaloCluster)
24
25TClonesArray* AliReducedEvent::fgTracks = 0;
26TClonesArray* AliReducedEvent::fgCandidates = 0;
27TClonesArray* AliReducedEvent::fgCaloClusters = 0;
6ab32c51 28TClonesArray* AliReducedEvent::fgFMD1 = 0;
29TClonesArray* AliReducedEvent::fgFMD2I = 0;
30TClonesArray* AliReducedEvent::fgFMD2O = 0;
31TClonesArray* AliReducedEvent::fgFMD3I = 0;
32TClonesArray* AliReducedEvent::fgFMD3O = 0;
240ed454 33
34//_______________________________________________________________________________
35AliReducedTrack::AliReducedTrack() :
36 fTrackId(-1),
37 fStatus(0),
38 fGlobalPhi(0.0),
39 fGlobalPt(0.0),
40 fGlobalEta(0.0),
41 fTPCPhi(0.0),
42 fTPCPt(0.0),
43 fTPCEta(0.0),
44 fMomentumInner(0.0),
45 fDCA(),
6ab32c51 46 fTrackLength(0.0),
240ed454 47 fITSclusterMap(0),
48 fITSsignal(0.0),
f6e67fe7 49 fITSnSig(),
6ab32c51 50 fITSchi2(0.0),
240ed454 51 fTPCNcls(0),
52 fTPCCrossedRows(0),
53 fTPCNclsF(0),
54 fTPCNclsIter1(0),
55 fTPCClusterMap(0),
56 fTPCsignal(0),
6ab32c51 57 fTPCsignalN(0),
240ed454 58 fTPCnSig(),
6ab32c51 59 fTPCchi2(0.0),
240ed454 60 fTOFbeta(0.0),
61 fTOFnSig(),
6ab32c51 62 fTOFdeltaBC(0),
240ed454 63 fTRDntracklets(),
64 fTRDpid(),
6ab32c51 65 fTRDpidLQ2D(),
240ed454 66 fCaloClusterId(-999),
67 fBayesPID(),
f6e67fe7 68 fFlags(0),
69 fMoreFlags(0)
240ed454 70{
71 //
72 // Constructor
73 //
74 fDCA[0] = 0.0; fDCA[1]=0.0;
f6e67fe7 75 for(Int_t i=0; i<4; ++i) {fTPCnSig[i]=-999.; fTOFnSig[i]=-999.; fITSnSig[i]=-999.;}
240ed454 76 for(Int_t i=0; i<3; ++i) {fBayesPID[i]=-999.;}
77 fTRDpid[0]=-999.; fTRDpid[1]=-999.;
6ab32c51 78 fTRDpidLQ2D[0] = -999.; fTRDpidLQ2D[1] = -999.;
240ed454 79}
80
81
82//_______________________________________________________________________________
83AliReducedTrack::~AliReducedTrack()
84{
85 //
86 // De-Constructor
87 //
88}
89
90
91//_______________________________________________________________________________
92AliReducedPair::AliReducedPair() :
93 fCandidateId(-1),
94 fPairType(-1),
95 fLegIds(),
96 fMass(),
97 fPhi(0.0),
98 fPt(0.0),
99 fEta(0.0),
100 fLxy(0.0),
101 fLxyErr(0.0),
f6e67fe7 102 fPointingAngle(0.0),
2ed1b6ff 103 fChisquare(0.0),
240ed454 104 fMCid(0)
105{
106 //
107 // Constructor
108 //
109 fLegIds[0] = -1; fLegIds[1] = -1;
f6e67fe7 110 fMass[0]=-999.; fMass[1]=-999.; fMass[2]=-999.; fMass[3]=-999.;
240ed454 111}
112
113
114//_______________________________________________________________________________
115AliReducedPair::AliReducedPair(const AliReducedPair &c) :
116 TObject(c),
117 fCandidateId(c.CandidateId()),
118 fPairType(c.PairType()),
119 fLegIds(),
120 fMass(),
121 fPhi(c.Phi()),
122 fPt(c.Pt()),
123 fEta(c.Eta()),
124 fLxy(c.Lxy()),
125 fLxyErr(c.LxyErr()),
f6e67fe7 126 fPointingAngle(c.PointingAngle()),
2ed1b6ff 127 fChisquare(c.Chi2()),
240ed454 128 fMCid(c.MCid())
129{
130 //
131 // copy constructor
132 //
133 fLegIds[0] = c.LegId(0);
134 fLegIds[1] = c.LegId(1);
f6e67fe7 135 fMass[0] = c.Mass(0); fMass[1] = c.Mass(1); fMass[2] = c.Mass(2); fMass[3] = c.Mass(3);
240ed454 136}
137
138
139//_______________________________________________________________________________
140AliReducedPair::~AliReducedPair() {
141 //
142 // destructor
143 //
144}
145
6ab32c51 146
147//_______________________________________________________________________________
148AliReducedFMD::AliReducedFMD() :
149 fMultiplicity(0),
150 //fEta(0.0),
151 fId(0)
152{
153 AliReducedFMD::Class()->IgnoreTObjectStreamer();
154 //
155 // Constructor
156 //
157}
158
159
160//_______________________________________________________________________________
161AliReducedFMD::~AliReducedFMD()
162{
163 //
164 // De-Constructor
165 //
166}
167
168
240ed454 169//____________________________________________________________________________
170AliReducedEvent::AliReducedEvent() :
171 TObject(),
6ab32c51 172 fEventTag(0),
173 fEventNumberInFile(0),
174 fL0TriggerInputs(0),
175 fL1TriggerInputs(0),
176 fL2TriggerInputs(0),
240ed454 177 fRunNo(0),
178 fBC(0),
2ed1b6ff 179 fTimeStamp(0),
180 fEventType(0),
240ed454 181 fTriggerMask(0),
182 fIsPhysicsSelection(kTRUE),
6ab32c51 183 fIsSPDPileup(kFALSE),
184 fIsSPDPileupMultBins(kFALSE),
185 fIRIntClosestIntMap(),
186 fIsFMDReduced(kTRUE),
240ed454 187 fVtx(),
188 fNVtxContributors(0),
189 fVtxTPC(),
190 fNVtxTPCContributors(0),
2ed1b6ff 191 fNpileupSPD(0),
192 fNpileupTracks(0),
193 fNPMDtracks(0),
194 fNTRDtracks(0),
195 fNTRDtracklets(0),
240ed454 196 fCentrality(),
197 fCentQuality(0),
198 fNV0candidates(),
199 fNDielectronCandidates(0),
200 fNtracks(),
201 fSPDntracklets(0),
202 fVZEROMult(),
203 fZDCnEnergy(),
6ab32c51 204 fZDCpEnergy(),
205 fT0amplitude(),
206 fT0TOF(),
207 fT0TOFbest(),
208 fT0zVertex(0),
209 fT0start(0),
210 fT0pileup(kFALSE),
211 fT0sattelite(kFALSE),
240ed454 212 fTracks(0x0),
213 fCandidates(0x0),
6ab32c51 214 fNFMDchannels(),
215 fFMDtotalMult(),
216 fFMD1(0x0),
217 fFMD2I(0x0),
218 fFMD2O(0x0),
219 fFMD3I(0x0),
220 fFMD3O(0x0),
240ed454 221 fNCaloClusters(0),
222 fCaloClusters(0x0)
240ed454 223{
224 //
225 // Constructor
226 //
6ab32c51 227 for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
240ed454 228 for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
229 for(Int_t i=0; i<4; ++i) fCentrality[i]=-1.;
230 fNV0candidates[0]=0; fNV0candidates[1]=0;
231 fNtracks[0]=0; fNtracks[1]=0;
6ab32c51 232 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
2ed1b6ff 233 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
240ed454 234 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
6ab32c51 235 for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
236 for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
237 for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
238 for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
239 for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
240 for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
241 for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
240ed454 242}
243
244
245//____________________________________________________________________________
246AliReducedEvent::AliReducedEvent(const Char_t* /*name*/) :
247 TObject(),
6ab32c51 248 fEventTag(0),
249 fEventNumberInFile(0),
250 fL0TriggerInputs(0),
251 fL1TriggerInputs(0),
252 fL2TriggerInputs(0),
240ed454 253 fRunNo(0),
254 fBC(0),
2ed1b6ff 255 fTimeStamp(0),
256 fEventType(0),
240ed454 257 fTriggerMask(0),
258 fIsPhysicsSelection(kTRUE),
6ab32c51 259 fIsSPDPileup(kFALSE),
260 fIsSPDPileupMultBins(kFALSE),
261 fIRIntClosestIntMap(),
262 fIsFMDReduced(kTRUE),
240ed454 263 fVtx(),
264 fNVtxContributors(0),
265 fVtxTPC(),
266 fNVtxTPCContributors(0),
2ed1b6ff 267 fNpileupSPD(0),
268 fNpileupTracks(0),
269 fNPMDtracks(0),
270 fNTRDtracks(0),
271 fNTRDtracklets(0),
240ed454 272 fCentrality(),
273 fCentQuality(0),
274 fNV0candidates(),
275 fNDielectronCandidates(0),
276 fNtracks(),
277 fSPDntracklets(0),
278 fVZEROMult(),
279 fZDCnEnergy(),
6ab32c51 280 fZDCpEnergy(),
281 fT0amplitude(),
282 fT0TOF(),
283 fT0TOFbest(),
284 fT0zVertex(0),
285 fT0start(0),
286 fT0pileup(kFALSE),
287 fT0sattelite(kFALSE),
240ed454 288 fTracks(0x0),
289 fCandidates(0x0),
6ab32c51 290 fNFMDchannels(),
291 fFMDtotalMult(),
292 fFMD1(0x0),
293 fFMD2I(0x0),
294 fFMD2O(0x0),
295 fFMD3I(0x0),
296 fFMD3O(0x0),
240ed454 297 fNCaloClusters(0),
298 fCaloClusters(0x0)
299//fFMDMult()
300{
301 //
302 // Constructor
303 //
6ab32c51 304 for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
240ed454 305 for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
306 for(Int_t i=0; i<4; ++i) fCentrality[i]=-1.;
307 fNV0candidates[0]=0; fNV0candidates[1]=0;
308 fNtracks[0]=0; fNtracks[1]=0;
6ab32c51 309 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
2ed1b6ff 310 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
240ed454 311 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
6ab32c51 312 for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
313 for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
314 for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
315 for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
316 for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
317 for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
318 for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
240ed454 319
320 if(!fgTracks) fgTracks = new TClonesArray("AliReducedTrack", 100000);
321 fTracks = fgTracks;
322 if(!fgCandidates) fgCandidates = new TClonesArray("AliReducedPair", 100000);
323 fCandidates = fgCandidates;
324 if(!fgCaloClusters) fgCaloClusters = new TClonesArray("AliReducedCaloCluster", 50000);
325 fCaloClusters = fgCaloClusters;
6ab32c51 326 if(!fgFMD1) fgFMD1 = new TClonesArray("AliReducedFMD", 10240);
327 fFMD1 = fgFMD1;
328 if(!fgFMD2I) fgFMD2I = new TClonesArray("AliReducedFMD", 10240);
329 fFMD2I = fgFMD2I;
330 if(!fgFMD2O) fgFMD2O = new TClonesArray("AliReducedFMD", 10240);
331 fFMD2O = fgFMD2O;
332 if(!fgFMD3I) fgFMD3I = new TClonesArray("AliReducedFMD", 10240);
333 fFMD3I = fgFMD3I;
334 if(!fgFMD3O) fgFMD3O = new TClonesArray("AliReducedFMD", 10240);
335 fFMD3O = fgFMD3O;
240ed454 336}
337
338
339//____________________________________________________________________________
340AliReducedEvent::~AliReducedEvent()
341{
342 //
343 // De-Constructor
344 //
b3e5a366 345 //ClearEvent();
240ed454 346}
347
348
349//____________________________________________________________________________
350Float_t AliReducedEvent::MultVZEROA() const
351{
352 //
353 // Total VZERO multiplicity in A side
354 //
355 Float_t mult=0.0;
356 for(Int_t i=32;i<64;++i)
357 mult += fVZEROMult[i];
358 return mult;
359}
360
361
362//____________________________________________________________________________
363Float_t AliReducedEvent::MultVZEROC() const
364{
365 //
366 // Total VZERO multiplicity in C side
367 //
368 Float_t mult=0.0;
369 for(Int_t i=0;i<32;++i)
370 mult += fVZEROMult[i];
371 return mult;
372}
373
374
375//____________________________________________________________________________
376Float_t AliReducedEvent::MultVZERO() const
377{
378 //
379 // Total VZERO multiplicity
380 //
381 return MultVZEROA()+MultVZEROC();
382}
383
384
385//____________________________________________________________________________
386Float_t AliReducedEvent::MultRingVZEROA(Int_t ring) const
387{
388 //
389 // VZERO multiplicity in a given ring on A side
390 //
391 if(ring<0 || ring>3) return -1.0;
392
393 Float_t mult=0.0;
394 for(Int_t i=32+8*ring; i<32+8*(ring+1); ++i)
395 mult += fVZEROMult[i];
396 return mult;
397}
398
399
400//____________________________________________________________________________
401Float_t AliReducedEvent::MultRingVZEROC(Int_t ring) const
402{
403 //
404 // VZERO multiplicity in a given ring on C side
405 //
406 if(ring<0 || ring>3) return -1.0;
407
408 Float_t mult=0.0;
409 for(Int_t i=8*ring; i<8*(ring+1); ++i)
410 mult += fVZEROMult[i];
411 return mult;
412}
413
6ab32c51 414//____________________________________________________________________________
415Float_t AliReducedEvent::AmplitudeTZEROA() const
416{
417 //
418 // Total TZERO multiplicity in A side
419 //
420 Float_t mult=0.0;
421 for(Int_t i=12;i<24;++i)
422 mult += fT0amplitude[i];
423 return mult;
424}
425
426
427//____________________________________________________________________________
428Float_t AliReducedEvent::AmplitudeTZEROC() const
429{
430 //
431 // Total TZERO multiplicity in C side
432 //
433 Float_t mult=0.0;
434 for(Int_t i=0;i<12;++i)
435 mult += fT0amplitude[i];
436 return mult;
437}
438
439
440//____________________________________________________________________________
441Float_t AliReducedEvent::AmplitudeTZERO() const
442{
443 //
444 // Total TZERO multiplicity
445 //
446 return AmplitudeTZEROA()+AmplitudeTZEROC();
447}
448
449
450
451//____________________________________________________________________________
452Float_t AliReducedEvent::EnergyZDCA() const
453{
454 //
455 // Total ZDC energy in A side
456 //
457 Float_t energy=0.0;
458 for(Int_t i=6;i<10;++i){
459 if(fZDCnEnergy[i]>0.) {
460 Float_t zdcNenergyAlpha = TMath::Power(fZDCnEnergy[i], gZdcNalpha);
461 energy += zdcNenergyAlpha;}
462 }
463 return energy;
464}
465
466
467//____________________________________________________________________________
468Float_t AliReducedEvent::EnergyZDCC() const
469{
470 //
471 // Total ZDC energy in C side
472 //
473 Float_t energy=0.0;
474 for(Int_t i=1;i<5;++i){
475 if(fZDCnEnergy[i]>0.) {
476 Float_t zdcNenergyAlpha = TMath::Power(fZDCnEnergy[i], gZdcNalpha);
477 energy += zdcNenergyAlpha;}
478 }
479 return energy;
480}
481
482
483//____________________________________________________________________________
484Float_t AliReducedEvent::EnergyZDC() const
485{
486 //
487 // Total ZDC energy
488 //
489 return EnergyZDCA()+EnergyZDCC();
490}
491
492
493//____________________________________________________________________________
494Float_t AliReducedEvent::EnergyZDCn(Int_t ch) const
495{
496 //
497 // Total ZDC energy in channel
498 //
499 Float_t energy=0;
500 if(ch<0 || ch>9) return -999.;
501 if(fZDCnEnergy[ch]>0.) {
502 energy = TMath::Power(fZDCnEnergy[ch], gZdcNalpha);
503 }
504 return energy;
505
506}
507
508
240ed454 509//_____________________________________________________________________________
510void AliReducedEvent::ClearEvent() {
511 //
512 // clear the event
513 //
32cd78f7 514 if(fTracks) fTracks->Clear("C");
515 if(fCandidates) fCandidates->Clear("C");
516 if(fCaloClusters) fCaloClusters->Clear("C");
6ab32c51 517 if(fFMD1) fFMD1->Clear("C");
518 if(fFMD2I) fFMD2I->Clear("C");
519 if(fFMD2O) fFMD2O->Clear("C");
520 if(fFMD3I) fFMD3I->Clear("C");
521 if(fFMD3O) fFMD3O->Clear("C");
522 fEventTag = 0;
523 fEventNumberInFile = -999;
524 fL0TriggerInputs=0;
525 fL1TriggerInputs=0;
526 fL2TriggerInputs=0;
527 fIRIntClosestIntMap[0] = 0; fIRIntClosestIntMap[1] = 0;
240ed454 528 fRunNo = 0;
529 fBC = 0;
2ed1b6ff 530 fTimeStamp = 0;
531 fEventType = 0;
240ed454 532 fTriggerMask = 0;
533 fIsPhysicsSelection = kTRUE;
2ed1b6ff 534 fIsSPDPileup = kFALSE;
6ab32c51 535 fIsSPDPileupMultBins = kFALSE;
536 fIsFMDReduced = kTRUE;
537 fNVtxContributors = 0;
538 fNVtxTPCContributors = 0;
240ed454 539 fCentQuality = 0;
6ab32c51 540 for(Int_t i=0;i<4;++i) fCentrality[i] = -1.0;
240ed454 541 fNV0candidates[0] = 0; fNV0candidates[1] = 0;
2ed1b6ff 542 fNpileupSPD=0;
543 fNpileupTracks=0;
544 fNPMDtracks=0;
545 fNTRDtracks=0;
546 fNTRDtracklets=0;
240ed454 547 fNDielectronCandidates = 0;
548 fNtracks[0] = 0; fNtracks[1] = 0;
6ab32c51 549 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i] = 0;
2ed1b6ff 550 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i] = 0;
6ab32c51 551 for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
240ed454 552 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
6ab32c51 553 for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
554 for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
555 for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
556 for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
557 for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
558 fT0pileup = kFALSE;
559 fT0zVertex = -999.;
560 fT0start = -999.;
561 fT0sattelite = kFALSE;
562 for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
563 for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
240ed454 564}
565
566
567//_______________________________________________________________________________
568AliReducedEventFriend::AliReducedEventFriend() :
569 fQvector(),
570 fEventPlaneStatus()
571{
572 //
573 // default constructor
574 //
575 for(Int_t idet=0; idet<kNdetectors; ++idet) {
576 for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
577 fEventPlaneStatus[idet][ih] = 0;
578 for(Int_t ic=0; ic<2; ++ic)
579 fQvector[idet][ih][ic] = 0.0;
580 }
581 }
582}
583
584
585//____________________________________________________________________________
586AliReducedEventFriend::~AliReducedEventFriend()
587{
588 //
589 // De-Constructor
590 //
591 ClearEvent();
592}
593
594
595//_____________________________________________________________________________
596void AliReducedEventFriend::ClearEvent() {
597 //
598 // clear the event
599 //
600 for(Int_t idet=0; idet<kNdetectors; ++idet) {
601 for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
602 fEventPlaneStatus[idet][ih] = 0;
603 for(Int_t ic=0; ic<2; ++ic)
604 fQvector[idet][ih][ic] = 0.0;
605 }
606 }
607}
608
609
610//____________________________________________________________________________
611void AliReducedEventFriend::CopyEvent(const AliReducedEventFriend* event) {
612 //
613 // copy information from another event to this one
614 //
615 for(Int_t idet=0; idet<kNdetectors; ++idet) {
616 for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
617 fQvector[idet][ih][0] = event->Qx(idet, ih+1);
618 fQvector[idet][ih][1] = event->Qy(idet, ih+1);
619 fEventPlaneStatus[idet][ih] = event->GetEventPlaneStatus(idet, ih+1);
620 }
621 }
622}
623
624
625//_____________________________________________________________________________
626AliReducedCaloCluster::AliReducedCaloCluster() :
627 fType(kUndefined),
628 fEnergy(-999.),
629 fTrackDx(-999.),
0c09cae4 630 fTrackDz(-999.),
631 fM20(-999.),
632 fM02(-999.),
633 fDispersion(-999.)
240ed454 634{
635 //
636 // default constructor
637 //
638}
639
640
641//_____________________________________________________________________________
642AliReducedCaloCluster::~AliReducedCaloCluster()
643{
644 //
645 // destructor
646 //
647}
648
649
650//_______________________________________________________________________________
651void AliReducedEvent::GetQvector(Double_t Qvec[][2], Int_t det,
f6e67fe7 652 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
653 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
240ed454 654 //
655 // Get the event plane for a specified detector
656 //
657 if(det==AliReducedEventFriend::kTPC ||
658 det==AliReducedEventFriend::kTPCptWeights ||
659 det==AliReducedEventFriend::kTPCpos ||
660 det==AliReducedEventFriend::kTPCneg) {
661 GetTPCQvector(Qvec, det, etaMin, etaMax, IsTrackSelected);
662 return;
663 }
664 if(det==AliReducedEventFriend::kVZEROA ||
665 det==AliReducedEventFriend::kVZEROC) {
666 GetVZEROQvector(Qvec, det);
667 return;
668 }
669 if(det==AliReducedEventFriend::kZDCA ||
670 det==AliReducedEventFriend::kZDCC) {
671 GetZDCQvector(Qvec, det);
672 return;
673 }
674 if(det==AliReducedEventFriend::kFMD) {
675 //TODO implementation
676 return;
677 }
678 return;
679}
680
681
682//_________________________________________________________________
683Int_t AliReducedEvent::GetTPCQvector(Double_t Qvec[][2], Int_t det,
f6e67fe7 684 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
685 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
240ed454 686 //
687 // Construct the event plane using tracks in the barrel
688 //
689 if(!(det==AliReducedEventFriend::kTPC ||
690 det==AliReducedEventFriend::kTPCpos ||
691 det==AliReducedEventFriend::kTPCneg))
692 return 0;
693 Int_t nUsedTracks = 0;
694 Short_t charge = 0;
695 AliReducedTrack* track=0x0;
696 Double_t weight=0.0; Double_t absWeight = 0.0; Double_t x=0.0; Double_t y=0.0;
697 TIter nextTrack(fTracks);
698 while((track=static_cast<AliReducedTrack*>(nextTrack()))) {
699 if(track->Eta()<etaMin) continue;
700 if(track->Eta()>etaMax) continue;
701 charge = track->Charge();
702 if(det==AliReducedEventFriend::kTPCpos && charge<0) continue;
703 if(det==AliReducedEventFriend::kTPCneg && charge>0) continue;
704
705 if(IsTrackSelected && !IsTrackSelected(track)) continue;
706 absWeight = 1.0;
707 if(det==AliReducedEventFriend::kTPCptWeights) {
708 absWeight = track->Pt();
709 if(absWeight>2.0) absWeight = 2.0; // pt is the weight used for the event plane
710 }
711 weight = absWeight;
f6e67fe7 712
240ed454 713 ++nUsedTracks;
714 x = TMath::Cos(track->Phi());
715 y = TMath::Sin(track->Phi());
716 // 1st harmonic
717 Qvec[0][0] += weight*x;
718 Qvec[0][1] += weight*y;
719 // 2nd harmonic
720 Qvec[1][0] += absWeight*(2.0*TMath::Power(x,2.0)-1);
721 Qvec[1][1] += absWeight*(2.0*x*y);
722 // 3rd harmonic
723 Qvec[2][0] += weight*(4.0*TMath::Power(x,3.0)-3.0*x);
724 Qvec[2][1] += weight*(3.0*y-4.0*TMath::Power(y,3.0));
725 // 4th harmonic
726 Qvec[3][0] += absWeight*(1.0-8.0*TMath::Power(x*y,2.0));
727 Qvec[3][1] += absWeight*(4.0*x*y-8.0*x*TMath::Power(y,3.0));
728 // 5th harmonic
729 Qvec[4][0] += weight*(16.0*TMath::Power(x,5.0)-20.0*TMath::Power(x, 3.0)+5.0*x);
730 Qvec[4][1] += weight*(16.0*TMath::Power(y,5.0)-20.0*TMath::Power(y, 3.0)+5.0*y);
731 // 6th harmonic
732 Qvec[5][0] += absWeight*(32.0*TMath::Power(x,6.0)-48.0*TMath::Power(x, 4.0)+18.0*TMath::Power(x, 2.0)-1.0);
733 Qvec[5][1] += absWeight*(x*y*(32.0*TMath::Power(y,4.0)-32.0*TMath::Power(y, 2.0)+6.0));
734 }
735 return nUsedTracks;
736}
737
738
739//____________________________________________________________________________
740void AliReducedEvent::SubtractParticleFromQvector(
741 AliReducedTrack* particle, Double_t Qvec[][2], Int_t det,
f6e67fe7 742 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
240ed454 743 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
744 //
745 // subtract a particle from the event Q-vector
746 //
747 Float_t eta = particle->Eta();
748 if(eta<etaMin) return;
749 if(eta>etaMax) return;
f6e67fe7 750
240ed454 751 Float_t charge = particle->Charge();
752 if(det==AliReducedEventFriend::kTPCpos && charge<0) return;
753 if(det==AliReducedEventFriend::kTPCneg && charge>0) return;
754
755 if(IsTrackSelected && !IsTrackSelected(particle)) return;
756
757 Double_t weight=0.0; Double_t absWeight = 0.0;
758 if(det==AliReducedEventFriend::kTPCptWeights) {
759 absWeight = particle->Pt();
760 if(absWeight>2.0) absWeight = 2.0;
761 }
762 weight = absWeight;
88204efa 763 // if(eta<0.0) weight *= -1.0;
240ed454 764
765 Float_t x = TMath::Cos(particle->Phi());
766 Float_t y = TMath::Sin(particle->Phi());
767
768 // 1st harmonic
769 Qvec[0][0] -= weight*x;
770 Qvec[0][1] -= weight*y;
771 // 2nd harmonic
772 Qvec[1][0] -= absWeight*(2.0*TMath::Power(x,2.0)-1);
773 Qvec[1][1] -= absWeight*(2.0*x*y);
774 // 3rd harmonic
775 Qvec[2][0] -= weight*(4.0*TMath::Power(x,3.0)-3.0*x);
776 Qvec[2][1] -= weight*(3.0*y-4.0*TMath::Power(y,3.0));
777 // 4th harmonic
778 Qvec[3][0] -= absWeight*(1.0-8.0*TMath::Power(x*y,2.0));
779 Qvec[3][1] -= absWeight*(4.0*x*y-8.0*x*TMath::Power(y,3.0));
780 // 5th harmonic
781 Qvec[4][0] -= weight*(16.0*TMath::Power(x,5.0)-20.0*TMath::Power(x, 3.0)+5.0*x);
782 Qvec[4][1] -= weight*(16.0*TMath::Power(y,5.0)-20.0*TMath::Power(y, 3.0)+5.0*y);
783 // 6th harmonic
784 Qvec[5][0] -= absWeight*(32.0*TMath::Power(x,6.0)-48.0*TMath::Power(x, 4.0)+18.0*TMath::Power(x, 2.0)-1.0);
785 Qvec[5][1] -= absWeight*(x*y*(32.0*TMath::Power(y,4.0)-32.0*TMath::Power(y, 2.0)+6.0));
786
787 return;
788}
789
790
791//_________________________________________________________________
792void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det) {
793 //
794 // Get the reaction plane from the VZERO detector for a given harmonic
795 //
796 GetVZEROQvector(Qvec, det, fVZEROMult);
797}
798
799
800//_________________________________________________________________
801void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det, Float_t* vzeroMult) {
802 //
803 // Get the reaction plane from the VZERO detector for a given harmonic
804 //
805 // Q{x,y} = SUM_i mult(i) * {cos(n*phi_i), sin(n*phi_i)}
806 // phi_i - phi angle of the VZERO sector i
807 // Each sector covers 45 degrees(8 sectors per ring). Middle of sector 0 is at 45/2
808 // channel 0: 22.5
809 // 1: 22.5+45
810 // 2: 22.5+45*2
811 // ...
812 // at the next ring continues the same
813 // channel 8: 22.5
814 // channel 9: 22.5 + 45
815 //
816 if(!(det==AliReducedEventFriend::kVZEROA ||
817 det==AliReducedEventFriend::kVZEROC))
818 return;
819
820 const Double_t kX[8] = {0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268, 0.38268, 0.92388}; // cosines of the angles of the VZERO sectors (8 per ring)
821 const Double_t kY[8] = {0.38268, 0.92388, 0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268}; // sines -- " --
822 Int_t phi;
823
824 for(Int_t iChannel=0; iChannel<64; ++iChannel) {
825 if(iChannel<32 && det==AliReducedEventFriend::kVZEROA) continue;
826 if(iChannel>=32 && det==AliReducedEventFriend::kVZEROC) continue;
827 phi=iChannel%8;
828 // 1st harmonic
829 Qvec[0][0] += vzeroMult[iChannel]*kX[phi];
830 Qvec[0][1] += vzeroMult[iChannel]*kY[phi];
831 // 2nd harmonic
832 Qvec[1][0] += vzeroMult[iChannel]*(2.0*TMath::Power(kX[phi],2.0)-1);
833 Qvec[1][1] += vzeroMult[iChannel]*(2.0*kX[phi]*kY[phi]);
834 // 3rd harmonic
835 Qvec[2][0] += vzeroMult[iChannel]*(4.0*TMath::Power(kX[phi],3.0)-3.0*kX[phi]);
836 Qvec[2][1] += vzeroMult[iChannel]*(3.0*kY[phi]-4.0*TMath::Power(kY[phi],3.0));
837 // 4th harmonic
838 Qvec[3][0] += vzeroMult[iChannel]*(1.0-8.0*TMath::Power(kX[phi]*kY[phi],2.0));
839 Qvec[3][1] += vzeroMult[iChannel]*(4.0*kX[phi]*kY[phi]-8.0*kX[phi]*TMath::Power(kY[phi],3.0));
840 // 5th harmonic
841 Qvec[4][0] += vzeroMult[iChannel]*(16.0*TMath::Power(kX[phi],5.0)-20.0*TMath::Power(kX[phi], 3.0)+5.0*kX[phi]);
842 Qvec[4][1] += vzeroMult[iChannel]*(16.0*TMath::Power(kY[phi],5.0)-20.0*TMath::Power(kY[phi], 3.0)+5.0*kY[phi]);
843 // 6th harmonic
844 Qvec[5][0] += vzeroMult[iChannel]*(32.0*TMath::Power(kX[phi],6.0)-48.0*TMath::Power(kX[phi], 4.0)+18.0*TMath::Power(kX[phi], 2.0)-1.0);
845 Qvec[5][1] += vzeroMult[iChannel]*(kX[phi]*kY[phi]*(32.0*TMath::Power(kY[phi],4.0)-32.0*TMath::Power(kY[phi], 2.0)+6.0));
846 } // end loop over channels
847}
848
849
850//_________________________________________________________________
851void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det) const {
6ab32c51 852 //
853 // Get the reaction plane from the ZDC detector for a given harmonic
854 //
855 GetZDCQvector(Qvec, det, fZDCnEnergy);
856}
857
858
859//_________________________________________________________________
860void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det, const Float_t* zdcEnergy) const {
240ed454 861 //
862 // Construct the event plane using the ZDC
863 // ZDC has 2 side (A and C) with 4 calorimeters on each side
864 // The XY position of each calorimeter is specified by the
865 // zdcNTowerCenters_x and zdcNTowerCenters_y arrays
6ab32c51 866 if(!(det==AliReducedEventFriend::kZDCA ||
867 det==AliReducedEventFriend::kZDCC ))
868 return;
869
870
871 //Int_t minTower,maxTower;
872 //Float_t totalEnergy = 0.0;
873
240ed454 874 const Float_t zdcTowerCenter = 1.75;
240ed454 875
6ab32c51 876
877 Float_t zdcNTowerCentersX[4] = {0.0};
878 Float_t zdcNTowerCentersY[4] = {0.0};
879
880
881 if(det==AliReducedEventFriend::kZDCA){
882 zdcNTowerCentersX[0] = zdcTowerCenter; zdcNTowerCentersX[1] =-zdcTowerCenter;
883 zdcNTowerCentersX[2] = zdcTowerCenter; zdcNTowerCentersX[3] =-zdcTowerCenter;
884 }
885
886 if(det==AliReducedEventFriend::kZDCC){
887 zdcNTowerCentersX[0] = -zdcTowerCenter; zdcNTowerCentersX[1] = zdcTowerCenter;
888 zdcNTowerCentersX[2] = -zdcTowerCenter; zdcNTowerCentersX[3] = zdcTowerCenter;
889 }
890
891 zdcNTowerCentersY[0] = -zdcTowerCenter; zdcNTowerCentersY[1] =-zdcTowerCenter;
892 zdcNTowerCentersY[2] = zdcTowerCenter; zdcNTowerCentersY[3] = zdcTowerCenter;
893
894
895 for(Int_t ih=0; ih<6; ih++) {Qvec[ih][0] = 0.0; Qvec[ih][1] = 0.0;} // harmonic Q-vector
240ed454 896 Float_t zdcNCentroidSum = 0;
240ed454 897
6ab32c51 898 for(Int_t iTow=(det==AliReducedEventFriend::kZDCA ? 6 : 1); iTow<(det==AliReducedEventFriend::kZDCA ? 10 : 5); ++iTow) {
899 //if(fZDCnEnergy[i+(det==AliReducedEventFriend::kZDCA ? 4 : 0)]>0.0) {
900 // 1st harmonic
901 Qvec[0][0] += zdcEnergy[iTow]*zdcNTowerCentersX[(iTow-1)%5];
902 Qvec[0][1] += zdcEnergy[iTow]*zdcNTowerCentersY[(iTow-1)%5];
903 // 2nd harmonic
904 Qvec[1][0] += zdcEnergy[iTow]*(2.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],2.0)-1);
905 Qvec[1][1] += zdcEnergy[iTow]*(2.0*zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5]);
906 // 3rd harmonic
907 Qvec[2][0] += zdcEnergy[iTow]*(4.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],3.0)-3.0*zdcNTowerCentersX[(iTow-1)%5]);
908 Qvec[2][1] += zdcEnergy[iTow]*(3.0*zdcNTowerCentersY[(iTow-1)%5]-4.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5],3.0));
909 // 4th harmonic
910 Qvec[3][0] += zdcEnergy[iTow]*(1.0-8.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5],2.0));
911 Qvec[3][1] += zdcEnergy[iTow]*(4.0*zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5]-8.0*zdcNTowerCentersX[(iTow-1)%5]*TMath::Power(zdcNTowerCentersY[(iTow-1)%5],3.0));
912 // 5th harmonic
913 Qvec[4][0] += zdcEnergy[iTow]*(16.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],5.0)-20.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5], 3.0)+5.0*zdcNTowerCentersX[(iTow-1)%5]);
914 Qvec[4][1] += zdcEnergy[iTow]*(16.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5],5.0)-20.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5], 3.0)+5.0*zdcNTowerCentersY[(iTow-1)%5]);
915 // 6th harmonic
916 Qvec[5][0] += zdcEnergy[iTow]*(32.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],6.0)-48.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5], 4.0)+18.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5], 2.0)-1.0);
917 Qvec[5][1] += zdcEnergy[iTow]*(zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5]*(32.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5],4.0)-32.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5], 2.0)+6.0));
918
919 zdcNCentroidSum += zdcEnergy[iTow];
920
921 if(zdcNCentroidSum>0.0) {
922 Qvec[0][0] /= zdcNCentroidSum;
923 Qvec[0][1] /= zdcNCentroidSum;
924 Qvec[1][0] /= zdcNCentroidSum;
925 Qvec[1][1] /= zdcNCentroidSum;
926 Qvec[2][0] /= zdcNCentroidSum;
927 Qvec[2][1] /= zdcNCentroidSum;
928 Qvec[3][0] /= zdcNCentroidSum;
929 Qvec[3][1] /= zdcNCentroidSum;
930 Qvec[4][0] /= zdcNCentroidSum;
931 Qvec[4][1] /= zdcNCentroidSum;
932 Qvec[5][0] /= zdcNCentroidSum;
933 Qvec[5][1] /= zdcNCentroidSum;
240ed454 934 }
935 } // end loop over channels
6ab32c51 936 return;
240ed454 937}