#ifndef ALIREDUCEDEVENT_H
#include "AliReducedEvent.h"
#endif
#include <TMath.h>
#include <TClonesArray.h>
#include <TClass.h>
ClassImp(AliReducedTrack)
ClassImp(AliReducedPair)
ClassImp(AliReducedFMD)
ClassImp(AliReducedEvent)
ClassImp(AliReducedEventFriend)
ClassImp(AliReducedCaloCluster)
TClonesArray* AliReducedEvent::fgTracks = 0;
TClonesArray* AliReducedEvent::fgCandidates = 0;
TClonesArray* AliReducedEvent::fgCaloClusters = 0;
TClonesArray* AliReducedEvent::fgFMD1 = 0;
TClonesArray* AliReducedEvent::fgFMD2I = 0;
TClonesArray* AliReducedEvent::fgFMD2O = 0;
TClonesArray* AliReducedEvent::fgFMD3I = 0;
TClonesArray* AliReducedEvent::fgFMD3O = 0;
AliReducedTrack::AliReducedTrack() :
fTrackId(-1),
fStatus(0),
fGlobalPhi(0.0),
fGlobalPt(0.0),
fGlobalEta(0.0),
fTPCPhi(0.0),
fTPCPt(0.0),
fTPCEta(0.0),
fMomentumInner(0.0),
fDCA(),
fTrackLength(0.0),
fITSclusterMap(0),
fITSsignal(0.0),
fITSnSig(),
fITSchi2(0.0),
fTPCNcls(0),
fTPCCrossedRows(0),
fTPCNclsF(0),
fTPCNclsIter1(0),
fTPCClusterMap(0),
fTPCsignal(0),
fTPCsignalN(0),
fTPCnSig(),
fTPCchi2(0.0),
fTOFbeta(0.0),
fTOFnSig(),
fTOFdeltaBC(0),
fTRDntracklets(),
fTRDpid(),
fTRDpidLQ2D(),
fCaloClusterId(-999),
fBayesPID(),
fFlags(0),
fMoreFlags(0)
{
fDCA[0] = 0.0; fDCA[1]=0.0;
for(Int_t i=0; i<4; ++i) {fTPCnSig[i]=-999.; fTOFnSig[i]=-999.; fITSnSig[i]=-999.;}
for(Int_t i=0; i<3; ++i) {fBayesPID[i]=-999.;}
fTRDpid[0]=-999.; fTRDpid[1]=-999.;
fTRDpidLQ2D[0] = -999.; fTRDpidLQ2D[1] = -999.;
}
AliReducedTrack::~AliReducedTrack()
{
}
AliReducedPair::AliReducedPair() :
fCandidateId(-1),
fPairType(-1),
fLegIds(),
fMass(),
fPhi(0.0),
fPt(0.0),
fEta(0.0),
fLxy(0.0),
fLxyErr(0.0),
fPointingAngle(0.0),
fChisquare(0.0),
fMCid(0)
{
fLegIds[0] = -1; fLegIds[1] = -1;
fMass[0]=-999.; fMass[1]=-999.; fMass[2]=-999.; fMass[3]=-999.;
}
AliReducedPair::AliReducedPair(const AliReducedPair &c) :
TObject(c),
fCandidateId(c.CandidateId()),
fPairType(c.PairType()),
fLegIds(),
fMass(),
fPhi(c.Phi()),
fPt(c.Pt()),
fEta(c.Eta()),
fLxy(c.Lxy()),
fLxyErr(c.LxyErr()),
fPointingAngle(c.PointingAngle()),
fChisquare(c.Chi2()),
fMCid(c.MCid())
{
fLegIds[0] = c.LegId(0);
fLegIds[1] = c.LegId(1);
fMass[0] = c.Mass(0); fMass[1] = c.Mass(1); fMass[2] = c.Mass(2); fMass[3] = c.Mass(3);
}
AliReducedPair::~AliReducedPair() {
}
AliReducedFMD::AliReducedFMD() :
fMultiplicity(0),
fId(0)
{
AliReducedFMD::Class()->IgnoreTObjectStreamer();
}
AliReducedFMD::~AliReducedFMD()
{
}
AliReducedEvent::AliReducedEvent() :
TObject(),
fEventTag(0),
fEventNumberInFile(0),
fL0TriggerInputs(0),
fL1TriggerInputs(0),
fL2TriggerInputs(0),
fRunNo(0),
fBC(0),
fTimeStamp(0),
fEventType(0),
fTriggerMask(0),
fIsPhysicsSelection(kTRUE),
fIsSPDPileup(kFALSE),
fIsSPDPileupMultBins(kFALSE),
fIRIntClosestIntMap(),
fIsFMDReduced(kTRUE),
fVtx(),
fNVtxContributors(0),
fVtxTPC(),
fNVtxTPCContributors(0),
fNpileupSPD(0),
fNpileupTracks(0),
fNPMDtracks(0),
fNTRDtracks(0),
fNTRDtracklets(0),
fCentrality(),
fCentQuality(0),
fNV0candidates(),
fNDielectronCandidates(0),
fNtracks(),
fSPDntracklets(0),
fVZEROMult(),
fZDCnEnergy(),
fZDCpEnergy(),
fT0amplitude(),
fT0TOF(),
fT0TOFbest(),
fT0zVertex(0),
fT0start(0),
fT0pileup(kFALSE),
fT0sattelite(kFALSE),
fTracks(0x0),
fCandidates(0x0),
fNFMDchannels(),
fFMDtotalMult(),
fFMD1(0x0),
fFMD2I(0x0),
fFMD2O(0x0),
fFMD3I(0x0),
fFMD3O(0x0),
fNCaloClusters(0),
fCaloClusters(0x0)
{
for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
for(Int_t i=0; i<4; ++i) fCentrality[i]=-1.;
fNV0candidates[0]=0; fNV0candidates[1]=0;
fNtracks[0]=0; fNtracks[1]=0;
for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
}
AliReducedEvent::AliReducedEvent(const Char_t* ) :
TObject(),
fEventTag(0),
fEventNumberInFile(0),
fL0TriggerInputs(0),
fL1TriggerInputs(0),
fL2TriggerInputs(0),
fRunNo(0),
fBC(0),
fTimeStamp(0),
fEventType(0),
fTriggerMask(0),
fIsPhysicsSelection(kTRUE),
fIsSPDPileup(kFALSE),
fIsSPDPileupMultBins(kFALSE),
fIRIntClosestIntMap(),
fIsFMDReduced(kTRUE),
fVtx(),
fNVtxContributors(0),
fVtxTPC(),
fNVtxTPCContributors(0),
fNpileupSPD(0),
fNpileupTracks(0),
fNPMDtracks(0),
fNTRDtracks(0),
fNTRDtracklets(0),
fCentrality(),
fCentQuality(0),
fNV0candidates(),
fNDielectronCandidates(0),
fNtracks(),
fSPDntracklets(0),
fVZEROMult(),
fZDCnEnergy(),
fZDCpEnergy(),
fT0amplitude(),
fT0TOF(),
fT0TOFbest(),
fT0zVertex(0),
fT0start(0),
fT0pileup(kFALSE),
fT0sattelite(kFALSE),
fTracks(0x0),
fCandidates(0x0),
fNFMDchannels(),
fFMDtotalMult(),
fFMD1(0x0),
fFMD2I(0x0),
fFMD2O(0x0),
fFMD3I(0x0),
fFMD3O(0x0),
fNCaloClusters(0),
fCaloClusters(0x0)
{
for(Int_t i=0; i<2; ++i) fIRIntClosestIntMap[i] = 0;
for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
for(Int_t i=0; i<4; ++i) fCentrality[i]=-1.;
fNV0candidates[0]=0; fNV0candidates[1]=0;
fNtracks[0]=0; fNtracks[1]=0;
for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i]=0;
for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i]=0;
for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
if(!fgTracks) fgTracks = new TClonesArray("AliReducedTrack", 100000);
fTracks = fgTracks;
if(!fgCandidates) fgCandidates = new TClonesArray("AliReducedPair", 100000);
fCandidates = fgCandidates;
if(!fgCaloClusters) fgCaloClusters = new TClonesArray("AliReducedCaloCluster", 50000);
fCaloClusters = fgCaloClusters;
if(!fgFMD1) fgFMD1 = new TClonesArray("AliReducedFMD", 10240);
fFMD1 = fgFMD1;
if(!fgFMD2I) fgFMD2I = new TClonesArray("AliReducedFMD", 10240);
fFMD2I = fgFMD2I;
if(!fgFMD2O) fgFMD2O = new TClonesArray("AliReducedFMD", 10240);
fFMD2O = fgFMD2O;
if(!fgFMD3I) fgFMD3I = new TClonesArray("AliReducedFMD", 10240);
fFMD3I = fgFMD3I;
if(!fgFMD3O) fgFMD3O = new TClonesArray("AliReducedFMD", 10240);
fFMD3O = fgFMD3O;
}
AliReducedEvent::~AliReducedEvent()
{
}
Float_t AliReducedEvent::MultVZEROA() const
{
Float_t mult=0.0;
for(Int_t i=32;i<64;++i)
mult += fVZEROMult[i];
return mult;
}
Float_t AliReducedEvent::MultVZEROC() const
{
Float_t mult=0.0;
for(Int_t i=0;i<32;++i)
mult += fVZEROMult[i];
return mult;
}
Float_t AliReducedEvent::MultVZERO() const
{
return MultVZEROA()+MultVZEROC();
}
Float_t AliReducedEvent::MultRingVZEROA(Int_t ring) const
{
if(ring<0 || ring>3) return -1.0;
Float_t mult=0.0;
for(Int_t i=32+8*ring; i<32+8*(ring+1); ++i)
mult += fVZEROMult[i];
return mult;
}
Float_t AliReducedEvent::MultRingVZEROC(Int_t ring) const
{
if(ring<0 || ring>3) return -1.0;
Float_t mult=0.0;
for(Int_t i=8*ring; i<8*(ring+1); ++i)
mult += fVZEROMult[i];
return mult;
}
Float_t AliReducedEvent::AmplitudeTZEROA() const
{
Float_t mult=0.0;
for(Int_t i=12;i<24;++i)
mult += fT0amplitude[i];
return mult;
}
Float_t AliReducedEvent::AmplitudeTZEROC() const
{
Float_t mult=0.0;
for(Int_t i=0;i<12;++i)
mult += fT0amplitude[i];
return mult;
}
Float_t AliReducedEvent::AmplitudeTZERO() const
{
return AmplitudeTZEROA()+AmplitudeTZEROC();
}
Float_t AliReducedEvent::EnergyZDCA() const
{
Float_t energy=0.0;
for(Int_t i=6;i<10;++i){
if(fZDCnEnergy[i]>0.) {
Float_t zdcNenergyAlpha = TMath::Power(fZDCnEnergy[i], gZdcNalpha);
energy += zdcNenergyAlpha;}
}
return energy;
}
Float_t AliReducedEvent::EnergyZDCC() const
{
Float_t energy=0.0;
for(Int_t i=1;i<5;++i){
if(fZDCnEnergy[i]>0.) {
Float_t zdcNenergyAlpha = TMath::Power(fZDCnEnergy[i], gZdcNalpha);
energy += zdcNenergyAlpha;}
}
return energy;
}
Float_t AliReducedEvent::EnergyZDC() const
{
return EnergyZDCA()+EnergyZDCC();
}
Float_t AliReducedEvent::EnergyZDCn(Int_t ch) const
{
Float_t energy=0;
if(ch<0 || ch>9) return -999.;
if(fZDCnEnergy[ch]>0.) {
energy = TMath::Power(fZDCnEnergy[ch], gZdcNalpha);
}
return energy;
}
void AliReducedEvent::ClearEvent() {
if(fTracks) fTracks->Clear("C");
if(fCandidates) fCandidates->Clear("C");
if(fCaloClusters) fCaloClusters->Clear("C");
if(fFMD1) fFMD1->Clear("C");
if(fFMD2I) fFMD2I->Clear("C");
if(fFMD2O) fFMD2O->Clear("C");
if(fFMD3I) fFMD3I->Clear("C");
if(fFMD3O) fFMD3O->Clear("C");
fEventTag = 0;
fEventNumberInFile = -999;
fL0TriggerInputs=0;
fL1TriggerInputs=0;
fL2TriggerInputs=0;
fIRIntClosestIntMap[0] = 0; fIRIntClosestIntMap[1] = 0;
fRunNo = 0;
fBC = 0;
fTimeStamp = 0;
fEventType = 0;
fTriggerMask = 0;
fIsPhysicsSelection = kTRUE;
fIsSPDPileup = kFALSE;
fIsSPDPileupMultBins = kFALSE;
fIsFMDReduced = kTRUE;
fNVtxContributors = 0;
fNVtxTPCContributors = 0;
fCentQuality = 0;
for(Int_t i=0;i<4;++i) fCentrality[i] = -1.0;
fNV0candidates[0] = 0; fNV0candidates[1] = 0;
fNpileupSPD=0;
fNpileupTracks=0;
fNPMDtracks=0;
fNTRDtracks=0;
fNTRDtracklets=0;
fNDielectronCandidates = 0;
fNtracks[0] = 0; fNtracks[1] = 0;
for(Int_t i=0; i<32; ++i) fSPDntrackletsEta[i] = 0;
for(Int_t i=0; i<32; ++i) fNtracksPerTrackingFlag[i] = 0;
for(Int_t i=0; i<3; ++i) {fVtx[i]=-999.; fVtxTPC[i]=-999.;}
for(Int_t i=0; i<64; ++i) fVZEROMult[i] = 0.0;
for(Int_t i=0; i<10; ++i) fZDCnEnergy[i]=0.0;
for(Int_t i=0; i<10; ++i) fZDCpEnergy[i]=0.0;
for(Int_t i=0; i<26; ++i) fT0amplitude[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOF[i]=0.0;
for(Int_t i=0; i<3; ++i) fT0TOFbest[i]=0.0;
fT0pileup = kFALSE;
fT0zVertex = -999.;
fT0start = -999.;
fT0sattelite = kFALSE;
for(Int_t i=0; i<5; ++i) fNFMDchannels[i]=0.0;
for(Int_t i=0; i<5; ++i) fFMDtotalMult[i]=0.0;
}
AliReducedEventFriend::AliReducedEventFriend() :
fQvector(),
fEventPlaneStatus()
{
for(Int_t idet=0; idet<kNdetectors; ++idet) {
for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
fEventPlaneStatus[idet][ih] = 0;
for(Int_t ic=0; ic<2; ++ic)
fQvector[idet][ih][ic] = 0.0;
}
}
}
AliReducedEventFriend::~AliReducedEventFriend()
{
ClearEvent();
}
void AliReducedEventFriend::ClearEvent() {
for(Int_t idet=0; idet<kNdetectors; ++idet) {
for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
fEventPlaneStatus[idet][ih] = 0;
for(Int_t ic=0; ic<2; ++ic)
fQvector[idet][ih][ic] = 0.0;
}
}
}
void AliReducedEventFriend::CopyEvent(const AliReducedEventFriend* event) {
for(Int_t idet=0; idet<kNdetectors; ++idet) {
for(Int_t ih=0; ih<fgkNMaxHarmonics; ++ih) {
fQvector[idet][ih][0] = event->Qx(idet, ih+1);
fQvector[idet][ih][1] = event->Qy(idet, ih+1);
fEventPlaneStatus[idet][ih] = event->GetEventPlaneStatus(idet, ih+1);
}
}
}
AliReducedCaloCluster::AliReducedCaloCluster() :
fType(kUndefined),
fEnergy(-999.),
fTrackDx(-999.),
fTrackDz(-999.),
fM20(-999.),
fM02(-999.),
fDispersion(-999.)
{
}
AliReducedCaloCluster::~AliReducedCaloCluster()
{
}
void AliReducedEvent::GetQvector(Double_t Qvec[][2], Int_t det,
Float_t etaMin, Float_t etaMax,
Bool_t (*IsTrackSelected)(AliReducedTrack*)) {
if(det==AliReducedEventFriend::kTPC ||
det==AliReducedEventFriend::kTPCptWeights ||
det==AliReducedEventFriend::kTPCpos ||
det==AliReducedEventFriend::kTPCneg) {
GetTPCQvector(Qvec, det, etaMin, etaMax, IsTrackSelected);
return;
}
if(det==AliReducedEventFriend::kVZEROA ||
det==AliReducedEventFriend::kVZEROC) {
GetVZEROQvector(Qvec, det);
return;
}
if(det==AliReducedEventFriend::kZDCA ||
det==AliReducedEventFriend::kZDCC) {
GetZDCQvector(Qvec, det);
return;
}
if(det==AliReducedEventFriend::kFMD) {
return;
}
return;
}
Int_t AliReducedEvent::GetTPCQvector(Double_t Qvec[][2], Int_t det,
Float_t etaMin, Float_t etaMax,
Bool_t (*IsTrackSelected)(AliReducedTrack*)) {
if(!(det==AliReducedEventFriend::kTPC ||
det==AliReducedEventFriend::kTPCpos ||
det==AliReducedEventFriend::kTPCneg))
return 0;
Int_t nUsedTracks = 0;
Short_t charge = 0;
AliReducedTrack* track=0x0;
Double_t weight=0.0; Double_t absWeight = 0.0; Double_t x=0.0; Double_t y=0.0;
TIter nextTrack(fTracks);
while((track=static_cast<AliReducedTrack*>(nextTrack()))) {
if(track->Eta()<etaMin) continue;
if(track->Eta()>etaMax) continue;
charge = track->Charge();
if(det==AliReducedEventFriend::kTPCpos && charge<0) continue;
if(det==AliReducedEventFriend::kTPCneg && charge>0) continue;
if(IsTrackSelected && !IsTrackSelected(track)) continue;
absWeight = 1.0;
if(det==AliReducedEventFriend::kTPCptWeights) {
absWeight = track->Pt();
if(absWeight>2.0) absWeight = 2.0;
}
weight = absWeight;
++nUsedTracks;
x = TMath::Cos(track->Phi());
y = TMath::Sin(track->Phi());
Qvec[0][0] += weight*x;
Qvec[0][1] += weight*y;
Qvec[1][0] += absWeight*(2.0*TMath::Power(x,2.0)-1);
Qvec[1][1] += absWeight*(2.0*x*y);
Qvec[2][0] += weight*(4.0*TMath::Power(x,3.0)-3.0*x);
Qvec[2][1] += weight*(3.0*y-4.0*TMath::Power(y,3.0));
Qvec[3][0] += absWeight*(1.0-8.0*TMath::Power(x*y,2.0));
Qvec[3][1] += absWeight*(4.0*x*y-8.0*x*TMath::Power(y,3.0));
Qvec[4][0] += weight*(16.0*TMath::Power(x,5.0)-20.0*TMath::Power(x, 3.0)+5.0*x);
Qvec[4][1] += weight*(16.0*TMath::Power(y,5.0)-20.0*TMath::Power(y, 3.0)+5.0*y);
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);
Qvec[5][1] += absWeight*(x*y*(32.0*TMath::Power(y,4.0)-32.0*TMath::Power(y, 2.0)+6.0));
}
return nUsedTracks;
}
void AliReducedEvent::SubtractParticleFromQvector(
AliReducedTrack* particle, Double_t Qvec[][2], Int_t det,
Float_t etaMin, Float_t etaMax,
Bool_t (*IsTrackSelected)(AliReducedTrack*)) {
Float_t eta = particle->Eta();
if(eta<etaMin) return;
if(eta>etaMax) return;
Float_t charge = particle->Charge();
if(det==AliReducedEventFriend::kTPCpos && charge<0) return;
if(det==AliReducedEventFriend::kTPCneg && charge>0) return;
if(IsTrackSelected && !IsTrackSelected(particle)) return;
Double_t weight=0.0; Double_t absWeight = 0.0;
if(det==AliReducedEventFriend::kTPCptWeights) {
absWeight = particle->Pt();
if(absWeight>2.0) absWeight = 2.0;
}
weight = absWeight;
Float_t x = TMath::Cos(particle->Phi());
Float_t y = TMath::Sin(particle->Phi());
Qvec[0][0] -= weight*x;
Qvec[0][1] -= weight*y;
Qvec[1][0] -= absWeight*(2.0*TMath::Power(x,2.0)-1);
Qvec[1][1] -= absWeight*(2.0*x*y);
Qvec[2][0] -= weight*(4.0*TMath::Power(x,3.0)-3.0*x);
Qvec[2][1] -= weight*(3.0*y-4.0*TMath::Power(y,3.0));
Qvec[3][0] -= absWeight*(1.0-8.0*TMath::Power(x*y,2.0));
Qvec[3][1] -= absWeight*(4.0*x*y-8.0*x*TMath::Power(y,3.0));
Qvec[4][0] -= weight*(16.0*TMath::Power(x,5.0)-20.0*TMath::Power(x, 3.0)+5.0*x);
Qvec[4][1] -= weight*(16.0*TMath::Power(y,5.0)-20.0*TMath::Power(y, 3.0)+5.0*y);
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);
Qvec[5][1] -= absWeight*(x*y*(32.0*TMath::Power(y,4.0)-32.0*TMath::Power(y, 2.0)+6.0));
return;
}
void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det) {
GetVZEROQvector(Qvec, det, fVZEROMult);
}
void AliReducedEvent::GetVZEROQvector(Double_t Qvec[][2], Int_t det, Float_t* vzeroMult) {
if(!(det==AliReducedEventFriend::kVZEROA ||
det==AliReducedEventFriend::kVZEROC))
return;
const Double_t kX[8] = {0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268, 0.38268, 0.92388};
const Double_t kY[8] = {0.38268, 0.92388, 0.92388, 0.38268, -0.38268, -0.92388, -0.92388, -0.38268};
Int_t phi;
for(Int_t iChannel=0; iChannel<64; ++iChannel) {
if(iChannel<32 && det==AliReducedEventFriend::kVZEROA) continue;
if(iChannel>=32 && det==AliReducedEventFriend::kVZEROC) continue;
phi=iChannel%8;
Qvec[0][0] += vzeroMult[iChannel]*kX[phi];
Qvec[0][1] += vzeroMult[iChannel]*kY[phi];
Qvec[1][0] += vzeroMult[iChannel]*(2.0*TMath::Power(kX[phi],2.0)-1);
Qvec[1][1] += vzeroMult[iChannel]*(2.0*kX[phi]*kY[phi]);
Qvec[2][0] += vzeroMult[iChannel]*(4.0*TMath::Power(kX[phi],3.0)-3.0*kX[phi]);
Qvec[2][1] += vzeroMult[iChannel]*(3.0*kY[phi]-4.0*TMath::Power(kY[phi],3.0));
Qvec[3][0] += vzeroMult[iChannel]*(1.0-8.0*TMath::Power(kX[phi]*kY[phi],2.0));
Qvec[3][1] += vzeroMult[iChannel]*(4.0*kX[phi]*kY[phi]-8.0*kX[phi]*TMath::Power(kY[phi],3.0));
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]);
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]);
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);
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));
}
}
void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det) const {
GetZDCQvector(Qvec, det, fZDCnEnergy);
}
void AliReducedEvent::GetZDCQvector(Double_t Qvec[][2], Int_t det, const Float_t* zdcEnergy) const {
if(!(det==AliReducedEventFriend::kZDCA ||
det==AliReducedEventFriend::kZDCC ))
return;
const Float_t zdcTowerCenter = 1.75;
Float_t zdcNTowerCentersX[4] = {0.0};
Float_t zdcNTowerCentersY[4] = {0.0};
if(det==AliReducedEventFriend::kZDCA){
zdcNTowerCentersX[0] = zdcTowerCenter; zdcNTowerCentersX[1] =-zdcTowerCenter;
zdcNTowerCentersX[2] = zdcTowerCenter; zdcNTowerCentersX[3] =-zdcTowerCenter;
}
if(det==AliReducedEventFriend::kZDCC){
zdcNTowerCentersX[0] = -zdcTowerCenter; zdcNTowerCentersX[1] = zdcTowerCenter;
zdcNTowerCentersX[2] = -zdcTowerCenter; zdcNTowerCentersX[3] = zdcTowerCenter;
}
zdcNTowerCentersY[0] = -zdcTowerCenter; zdcNTowerCentersY[1] =-zdcTowerCenter;
zdcNTowerCentersY[2] = zdcTowerCenter; zdcNTowerCentersY[3] = zdcTowerCenter;
for(Int_t ih=0; ih<6; ih++) {Qvec[ih][0] = 0.0; Qvec[ih][1] = 0.0;}
Float_t zdcNCentroidSum = 0;
for(Int_t iTow=(det==AliReducedEventFriend::kZDCA ? 6 : 1); iTow<(det==AliReducedEventFriend::kZDCA ? 10 : 5); ++iTow) {
Qvec[0][0] += zdcEnergy[iTow]*zdcNTowerCentersX[(iTow-1)%5];
Qvec[0][1] += zdcEnergy[iTow]*zdcNTowerCentersY[(iTow-1)%5];
Qvec[1][0] += zdcEnergy[iTow]*(2.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],2.0)-1);
Qvec[1][1] += zdcEnergy[iTow]*(2.0*zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5]);
Qvec[2][0] += zdcEnergy[iTow]*(4.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5],3.0)-3.0*zdcNTowerCentersX[(iTow-1)%5]);
Qvec[2][1] += zdcEnergy[iTow]*(3.0*zdcNTowerCentersY[(iTow-1)%5]-4.0*TMath::Power(zdcNTowerCentersY[(iTow-1)%5],3.0));
Qvec[3][0] += zdcEnergy[iTow]*(1.0-8.0*TMath::Power(zdcNTowerCentersX[(iTow-1)%5]*zdcNTowerCentersY[(iTow-1)%5],2.0));
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));
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]);
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]);
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);
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));
zdcNCentroidSum += zdcEnergy[iTow];
if(zdcNCentroidSum>0.0) {
Qvec[0][0] /= zdcNCentroidSum;
Qvec[0][1] /= zdcNCentroidSum;
Qvec[1][0] /= zdcNCentroidSum;
Qvec[1][1] /= zdcNCentroidSum;
Qvec[2][0] /= zdcNCentroidSum;
Qvec[2][1] /= zdcNCentroidSum;
Qvec[3][0] /= zdcNCentroidSum;
Qvec[3][1] /= zdcNCentroidSum;
Qvec[4][0] /= zdcNCentroidSum;
Qvec[4][1] /= zdcNCentroidSum;
Qvec[5][0] /= zdcNCentroidSum;
Qvec[5][1] /= zdcNCentroidSum;
}
}
return;
}