2 ***********************************************************
3 Implementation of reduced ESD information classes for
5 Contact: i.c.arsene@gsi.de, i.c.arsene@cern.ch
7 *********************************************************
10 #ifndef ALIREDUCEDEVENT_H
11 #include "AliReducedEvent.h"
15 #include <TClonesArray.h>
18 ClassImp(AliReducedTrack)
19 ClassImp(AliReducedPair)
20 ClassImp(AliReducedFMD)
21 ClassImp(AliReducedEvent)
22 ClassImp(AliReducedEventFriend)
23 ClassImp(AliReducedCaloCluster)
25 TClonesArray* AliReducedEvent::fgTracks = 0;
26 TClonesArray* AliReducedEvent::fgCandidates = 0;
27 TClonesArray* AliReducedEvent::fgCaloClusters = 0;
28 TClonesArray* AliReducedEvent::fgFMD1 = 0;
29 TClonesArray* AliReducedEvent::fgFMD2I = 0;
30 TClonesArray* AliReducedEvent::fgFMD2O = 0;
31 TClonesArray* AliReducedEvent::fgFMD3I = 0;
32 TClonesArray* AliReducedEvent::fgFMD3O = 0;
34 //_______________________________________________________________________________
35 AliReducedTrack::AliReducedTrack() :
74 fDCA[0] = 0.0; fDCA[1]=0.0;
75 for(Int_t i=0; i<4; ++i) {fTPCnSig[i]=-999.; fTOFnSig[i]=-999.; fITSnSig[i]=-999.;}
76 for(Int_t i=0; i<3; ++i) {fBayesPID[i]=-999.;}
77 fTRDpid[0]=-999.; fTRDpid[1]=-999.;
78 fTRDpidLQ2D[0] = -999.; fTRDpidLQ2D[1] = -999.;
82 //_______________________________________________________________________________
83 AliReducedTrack::~AliReducedTrack()
91 //_______________________________________________________________________________
92 AliReducedPair::AliReducedPair() :
109 fLegIds[0] = -1; fLegIds[1] = -1;
110 fMass[0]=-999.; fMass[1]=-999.; fMass[2]=-999.; fMass[3]=-999.;
114 //_______________________________________________________________________________
115 AliReducedPair::AliReducedPair(const AliReducedPair &c) :
117 fCandidateId(c.CandidateId()),
118 fPairType(c.PairType()),
126 fPointingAngle(c.PointingAngle()),
127 fChisquare(c.Chi2()),
133 fLegIds[0] = c.LegId(0);
134 fLegIds[1] = c.LegId(1);
135 fMass[0] = c.Mass(0); fMass[1] = c.Mass(1); fMass[2] = c.Mass(2); fMass[3] = c.Mass(3);
139 //_______________________________________________________________________________
140 AliReducedPair::~AliReducedPair() {
147 //_______________________________________________________________________________
148 AliReducedFMD::AliReducedFMD() :
153 AliReducedFMD::Class()->IgnoreTObjectStreamer();
160 //_______________________________________________________________________________
161 AliReducedFMD::~AliReducedFMD()
169 //____________________________________________________________________________
170 AliReducedEvent::AliReducedEvent() :
173 fEventNumberInFile(0),
182 fIsPhysicsSelection(kTRUE),
183 fIsSPDPileup(kFALSE),
184 fIsSPDPileupMultBins(kFALSE),
185 fIRIntClosestIntMap(),
186 fIsFMDReduced(kTRUE),
188 fNVtxContributors(0),
190 fNVtxTPCContributors(0),
199 fNDielectronCandidates(0),
211 fT0sattelite(kFALSE),
227 for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
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;
232 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
233 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
234 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
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;
245 //____________________________________________________________________________
246 AliReducedEvent::AliReducedEvent(const Char_t* /*name*/) :
249 fEventNumberInFile(0),
258 fIsPhysicsSelection(kTRUE),
259 fIsSPDPileup(kFALSE),
260 fIsSPDPileupMultBins(kFALSE),
261 fIRIntClosestIntMap(),
262 fIsFMDReduced(kTRUE),
264 fNVtxContributors(0),
266 fNVtxTPCContributors(0),
275 fNDielectronCandidates(0),
287 fT0sattelite(kFALSE),
304 for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
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;
309 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
310 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
311 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
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;
320 if(!fgTracks) fgTracks = new TClonesArray("AliReducedTrack", 100000);
322 if(!fgCandidates) fgCandidates = new TClonesArray("AliReducedPair", 100000);
323 fCandidates = fgCandidates;
324 if(!fgCaloClusters) fgCaloClusters = new TClonesArray("AliReducedCaloCluster", 50000);
325 fCaloClusters = fgCaloClusters;
326 if(!fgFMD1) fgFMD1 = new TClonesArray("AliReducedFMD", 10240);
328 if(!fgFMD2I) fgFMD2I = new TClonesArray("AliReducedFMD", 10240);
330 if(!fgFMD2O) fgFMD2O = new TClonesArray("AliReducedFMD", 10240);
332 if(!fgFMD3I) fgFMD3I = new TClonesArray("AliReducedFMD", 10240);
334 if(!fgFMD3O) fgFMD3O = new TClonesArray("AliReducedFMD", 10240);
339 //____________________________________________________________________________
340 AliReducedEvent::~AliReducedEvent()
349 //____________________________________________________________________________
350 Float_t AliReducedEvent::MultVZEROA() const
353 // Total VZERO multiplicity in A side
356 for(Int_t i=32;i<64;++i)
357 mult += fVZEROMult[i];
362 //____________________________________________________________________________
363 Float_t AliReducedEvent::MultVZEROC() const
366 // Total VZERO multiplicity in C side
369 for(Int_t i=0;i<32;++i)
370 mult += fVZEROMult[i];
375 //____________________________________________________________________________
376 Float_t AliReducedEvent::MultVZERO() const
379 // Total VZERO multiplicity
381 return MultVZEROA()+MultVZEROC();
385 //____________________________________________________________________________
386 Float_t AliReducedEvent::MultRingVZEROA(Int_t ring) const
389 // VZERO multiplicity in a given ring on A side
391 if(ring<0 || ring>3) return -1.0;
394 for(Int_t i=32+8*ring; i<32+8*(ring+1); ++i)
395 mult += fVZEROMult[i];
400 //____________________________________________________________________________
401 Float_t AliReducedEvent::MultRingVZEROC(Int_t ring) const
404 // VZERO multiplicity in a given ring on C side
406 if(ring<0 || ring>3) return -1.0;
409 for(Int_t i=8*ring; i<8*(ring+1); ++i)
410 mult += fVZEROMult[i];
414 //____________________________________________________________________________
415 Float_t AliReducedEvent::AmplitudeTZEROA() const
418 // Total TZERO multiplicity in A side
421 for(Int_t i=12;i<24;++i)
422 mult += fT0amplitude[i];
427 //____________________________________________________________________________
428 Float_t AliReducedEvent::AmplitudeTZEROC() const
431 // Total TZERO multiplicity in C side
434 for(Int_t i=0;i<12;++i)
435 mult += fT0amplitude[i];
440 //____________________________________________________________________________
441 Float_t AliReducedEvent::AmplitudeTZERO() const
444 // Total TZERO multiplicity
446 return AmplitudeTZEROA()+AmplitudeTZEROC();
451 //____________________________________________________________________________
452 Float_t AliReducedEvent::EnergyZDCA() const
455 // Total ZDC energy in A side
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;}
467 //____________________________________________________________________________
468 Float_t AliReducedEvent::EnergyZDCC() const
471 // Total ZDC energy in C side
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;}
483 //____________________________________________________________________________
484 Float_t AliReducedEvent::EnergyZDC() const
489 return EnergyZDCA()+EnergyZDCC();
493 //____________________________________________________________________________
494 Float_t AliReducedEvent::EnergyZDCn(Int_t ch) const
497 // Total ZDC energy in channel
500 if(ch<0 || ch>9) return -999.;
501 if(fZDCnEnergy[ch]>0.) {
502 energy = TMath::Power(fZDCnEnergy[ch], gZdcNalpha);
509 //_____________________________________________________________________________
510 void AliReducedEvent::ClearEvent() {
514 if(fTracks) fTracks->Clear("C");
515 if(fCandidates) fCandidates->Clear("C");
516 if(fCaloClusters) fCaloClusters->Clear("C");
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");
523 fEventNumberInFile = -999;
527 fIRIntClosestIntMap[0] = 0; fIRIntClosestIntMap[1] = 0;
533 fIsPhysicsSelection = kTRUE;
534 fIsSPDPileup = kFALSE;
535 fIsSPDPileupMultBins = kFALSE;
536 fIsFMDReduced = kTRUE;
537 fNVtxContributors = 0;
538 fNVtxTPCContributors = 0;
540 for(Int_t i=0;i<4;++i) fCentrality[i] = -1.0;
541 fNV0candidates[0] = 0; fNV0candidates[1] = 0;
547 fNDielectronCandidates = 0;
548 fNtracks[0] = 0; fNtracks[1] = 0;
549 for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i] = 0;
550 for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i] = 0;
551 for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
552 for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
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;
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;
567 //_______________________________________________________________________________
568 AliReducedEventFriend::AliReducedEventFriend() :
573 // default constructor
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;
585 //____________________________________________________________________________
586 AliReducedEventFriend::~AliReducedEventFriend()
595 //_____________________________________________________________________________
596 void AliReducedEventFriend::ClearEvent() {
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;
610 //____________________________________________________________________________
611 void AliReducedEventFriend::CopyEvent(const AliReducedEventFriend* event) {
613 // copy information from another event to this one
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);
625 //_____________________________________________________________________________
626 AliReducedCaloCluster::AliReducedCaloCluster() :
636 // default constructor
641 //_____________________________________________________________________________
642 AliReducedCaloCluster::~AliReducedCaloCluster()
650 //_______________________________________________________________________________
651 void AliReducedEvent::GetQvector(Double_t Qvec[][2], Int_t det,
652 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
653 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
655 // Get the event plane for a specified detector
657 if(det==AliReducedEventFriend::kTPC ||
658 det==AliReducedEventFriend::kTPCptWeights ||
659 det==AliReducedEventFriend::kTPCpos ||
660 det==AliReducedEventFriend::kTPCneg) {
661 GetTPCQvector(Qvec, det, etaMin, etaMax, IsTrackSelected);
664 if(det==AliReducedEventFriend::kVZEROA ||
665 det==AliReducedEventFriend::kVZEROC) {
666 GetVZEROQvector(Qvec, det);
669 if(det==AliReducedEventFriend::kZDCA ||
670 det==AliReducedEventFriend::kZDCC) {
671 GetZDCQvector(Qvec, det);
674 if(det==AliReducedEventFriend::kFMD) {
675 //TODO implementation
682 //_________________________________________________________________
683 Int_t AliReducedEvent::GetTPCQvector(Double_t Qvec[][2], Int_t det,
684 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
685 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
687 // Construct the event plane using tracks in the barrel
689 if(!(det==AliReducedEventFriend::kTPC ||
690 det==AliReducedEventFriend::kTPCpos ||
691 det==AliReducedEventFriend::kTPCneg))
693 Int_t nUsedTracks = 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;
705 if(IsTrackSelected && !IsTrackSelected(track)) continue;
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
714 x = TMath::Cos(track->Phi());
715 y = TMath::Sin(track->Phi());
717 Qvec[0][0] += weight*x;
718 Qvec[0][1] += weight*y;
720 Qvec[1][0] += absWeight*(2.0*TMath::Power(x,2.0)-1);
721 Qvec[1][1] += absWeight*(2.0*x*y);
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));
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));
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);
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));
739 //____________________________________________________________________________
740 void AliReducedEvent::SubtractParticleFromQvector(
741 AliReducedTrack* particle, Double_t Qvec[][2], Int_t det,
742 Float_t etaMin/*=-0.8*/, Float_t etaMax/*=+0.8*/,
743 Bool_t (*IsTrackSelected)(AliReducedTrack*)/*=NULL*/) {
745 // subtract a particle from the event Q-vector
747 Float_t eta = particle->Eta();
748 if(eta<etaMin) return;
749 if(eta>etaMax) return;
751 Float_t charge = particle->Charge();
752 if(det==AliReducedEventFriend::kTPCpos && charge<0) return;
753 if(det==AliReducedEventFriend::kTPCneg && charge>0) return;
755 if(IsTrackSelected && !IsTrackSelected(particle)) return;
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;
763 // if(eta<0.0) weight *= -1.0;
765 Float_t x = TMath::Cos(particle->Phi());
766 Float_t y = TMath::Sin(particle->Phi());
769 Qvec[0][0] -= weight*x;
770 Qvec[0][1] -= weight*y;
772 Qvec[1][0] -= absWeight*(2.0*TMath::Power(x,2.0)-1);
773 Qvec[1][1] -= absWeight*(2.0*x*y);
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));
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));
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);
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));
791 //_________________________________________________________________
792 void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det) {
794 // Get the reaction plane from the VZERO detector for a given harmonic
796 GetVZEROQvector(Qvec, det, fVZEROMult);
800 //_________________________________________________________________
801 void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det, Float_t* vzeroMult) {
803 // Get the reaction plane from the VZERO detector for a given harmonic
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
812 // at the next ring continues the same
814 // channel 9: 22.5 + 45
816 if(!(det==AliReducedEventFriend::kVZEROA ||
817 det==AliReducedEventFriend::kVZEROC))
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 -- " --
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;
829 Qvec[0][0] += vzeroMult[iChannel]*kX[phi];
830 Qvec[0][1] += vzeroMult[iChannel]*kY[phi];
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]);
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));
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));
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]);
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
850 //_________________________________________________________________
851 void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det) const {
853 // Get the reaction plane from the ZDC detector for a given harmonic
855 GetZDCQvector(Qvec, det, fZDCnEnergy);
859 //_________________________________________________________________
860 void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det, const Float_t* zdcEnergy) const {
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
866 if(!(det==AliReducedEventFriend::kZDCA ||
867 det==AliReducedEventFriend::kZDCC ))
871 //Int_t minTower,maxTower;
872 //Float_t totalEnergy = 0.0;
874 const Float_t zdcTowerCenter = 1.75;
877 Float_t zdcNTowerCentersX[4] = {0.0};
878 Float_t zdcNTowerCentersY[4] = {0.0};
881 if(det==AliReducedEventFriend::kZDCA){
882 zdcNTowerCentersX[0] = zdcTowerCenter; zdcNTowerCentersX[1] =-zdcTowerCenter;
883 zdcNTowerCentersX[2] = zdcTowerCenter; zdcNTowerCentersX[3] =-zdcTowerCenter;
886 if(det==AliReducedEventFriend::kZDCC){
887 zdcNTowerCentersX[0] = -zdcTowerCenter; zdcNTowerCentersX[1] = zdcTowerCenter;
888 zdcNTowerCentersX[2] = -zdcTowerCenter; zdcNTowerCentersX[3] = zdcTowerCenter;
891 zdcNTowerCentersY[0] = -zdcTowerCenter; zdcNTowerCentersY[1] =-zdcTowerCenter;
892 zdcNTowerCentersY[2] = zdcTowerCenter; zdcNTowerCentersY[3] = zdcTowerCenter;
895 for(Int_t ih=0; ih<6; ih++) {Qvec[ih][0] = 0.0; Qvec[ih][1] = 0.0;} // harmonic Q-vector
896 Float_t zdcNCentroidSum = 0;
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) {
901 Qvec[0][0] += zdcEnergy[iTow]*zdcNTowerCentersX[(iTow-1)%5];
902 Qvec[0][1] += zdcEnergy[iTow]*zdcNTowerCentersY[(iTow-1)%5];
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]);
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));
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));
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]);
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));
919 zdcNCentroidSum += zdcEnergy[iTow];
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;
935 } // end loop over channels