#include "AliMCEventHandler.h"
#include "AliVParticle.h"
#include "AliCFContainer.h"
+#include "AliEventplane.h"
#include "AliESDEvent.h"
#include "AliESDInputHandler.h"
// event QA
fnTracksVertex(1), // QA tracks pointing to principal vertex (= 3 default)
fZVertex(7.),
+fAcceptOnlyMuEvents(kFALSE),
fCentralityMethod("V0M"),
// track cuts
fTrackEtaCut(0.8),
fTrackEtaCutMin(-1.),
+fTrackPhiCutEvPlMin(0.),
+fTrackPhiCutEvPlMax(0.),
fOnlyOneEtaSide(0),
fPtMin(0.5),
fDCAXYCut(0),
fParticleSpeciesTrigger(-1),
fParticleSpeciesAssociated(-1),
fCheckMotherPDG(kTRUE),
+fTrackletDphiCut(9999999.),
fSelectCharge(0),
fTriggerSelectCharge(0),
fAssociatedSelectCharge(0),
fCustomBinning(),
fPtOrder(kTRUE),
fTriggersFromDetector(0),
+fAssociatedFromDetector(0),
fMCUseUncheckedCentrality(kFALSE),
fFillpT(kFALSE)
{
fAnalyseUE->DefineESDCuts(fFilterBit);
fAnalyseUE->SetEventSelection(fSelectBit);
fAnalyseUE->SetHelperPID(fHelperPID);
+ if(fTrackPhiCutEvPlMax > 0.0001)
+ fAnalyseUE->SetParticlePhiCutEventPlane(fTrackPhiCutEvPlMin,fTrackPhiCutEvPlMax);
if ((fParticleSpeciesTrigger != -1 || fParticleSpeciesAssociated != -1) && !fHelperPID)
AliFatal("HelperPID object should be set in the steering macro");
fListOfHistos->Add(new TH2F("V0AMult", "V0A multiplicity;V0A multiplicity;V0A multiplicity (scaled)", 1000, -.5, 999.5, 1000, -.5, 999.5));
fListOfHistos->Add(new TH2F("V0AMultCorrelation", "V0A multiplicity;V0A multiplicity;SPD tracklets", 1000, -.5, 999.5, 1000, -.5, 999.5));
}
- if (fTriggersFromDetector == 1 || fTriggersFromDetector == 2)
+ if (fTriggersFromDetector == 1 || fTriggersFromDetector == 2 || fAssociatedFromDetector == 1 || fAssociatedFromDetector == 2)
fListOfHistos->Add(new TH1F("V0SingleCells", "V0 single cell multiplicity;multiplicity;events", 100, -0.5, 99.5));
+ if (fTriggersFromDetector == 3 || fAssociatedFromDetector == 3)
+ fListOfHistos->Add(new TH1F("DphiTrklets", "tracklets Dphi;#Delta#phi,trklets (mrad);entries", 100, -100, 100));
PostData(0,fListOfHistos);
TTree *settingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
settingsTree->Branch("fnTracksVertex", &fnTracksVertex,"nTracksVertex/I");
settingsTree->Branch("fZVertex", &fZVertex,"ZVertex/D");
+ settingsTree->Branch("fAcceptOnlyMuEvents", &fAcceptOnlyMuEvents,"AcceptOnlyMuEvents/O");
//settingsTree->Branch("fCentralityMethod", fCentralityMethod.Data(),"CentralityMethod/C");
settingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
settingsTree->Branch("fTrackEtaCutMin", &fTrackEtaCutMin, "TrackEtaCutMin/D");
+ settingsTree->Branch("fTrackPhiCutEvPlMin", &fTrackPhiCutEvPlMin, "TrackPhiCutEvPlMin/D");
+ settingsTree->Branch("fTrackPhiCutEvPlMax", &fTrackPhiCutEvPlMax, "TrackPhiCutEvPlMax/D");
settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
settingsTree->Branch("fWeightPerEvent", &fWeightPerEvent,"WeightPerEvent/O");
settingsTree->Branch("fPtOrder", &fPtOrder,"PtOrder/O");
settingsTree->Branch("fTriggersFromDetector", &fTriggersFromDetector,"TriggersFromDetector/I");
+ settingsTree->Branch("fAssociatedFromDetector", &fAssociatedFromDetector,"AssociatedFromDetector/I");
settingsTree->Branch("fMCUseUncheckedCentrality", &fMCUseUncheckedCentrality,"MCUseUncheckedCentrality/O");
settingsTree->Branch("fTwoTrackEfficiencyCut", &fTwoTrackEfficiencyCut,"TwoTrackEfficiencyCut/D");
settingsTree->Branch("fTwoTrackCutMinRadius", &fTwoTrackCutMinRadius,"TwoTrackCutMinRadius/D");
if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex))
return;
-
- Float_t zVtx = 0;
+
+ Float_t zVtx = 0;
if (fAOD)
zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
else
if (fFillOnlyStep0)
zVtx = 0;
+ // Event selection based on number of number of MC particles
+ if (fRejectZeroTrackEvents && tracksMC->GetEntriesFast() == 0)
+ {
+ AliInfo(Form("Rejecting event due to kinematic selection: %f %d", centrality, tracksMC->GetEntriesFast()));
+ fHistos->FillEvent(centrality, AliUEHist::kCFStepAnaTopology);
+ if (tracksMC != tracksCorrelateMC)
+ delete tracksCorrelateMC;
+ delete tracksMC;
+ return;
+ }
+
// (MC-true all particles)
// STEP 0
fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepAll, tracksMC, tracksCorrelateMC, weight);
return;
}
+ // Reject events without a muon in the muon arm ************************************************
+ if(fAcceptOnlyMuEvents && !IsMuEvent())return;
+
// Vertex selection *************************************************
if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
return;
TObjArray* tracks = 0;
-
- if (fTriggersFromDetector == 0)
- tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
- else if (fTriggersFromDetector == 1 || fTriggersFromDetector == 2)
- {
- tracks = new TObjArray;
- tracks->SetOwner(kTRUE);
-
- AliVVZERO* vZero = inputEvent->GetVZEROData();
-
- const Int_t vZeroStart = (fTriggersFromDetector == 1) ? 32 : 0;
-
- TH1F* singleCells = (TH1F*) fListOfHistos->FindObject("V0SingleCells");
- for (Int_t i=vZeroStart; i<vZeroStart+32; i++)
- {
- Float_t weight = vZero->GetMultiplicity(i);
- singleCells->Fill(weight);
-
- // rough estimate of multiplicity
- for (Int_t j=0; j<TMath::Nint(weight); j++)
- {
- AliDPhiBasicParticle* particle = new AliDPhiBasicParticle((AliVVZERO::GetVZEROEtaMax(i) + AliVVZERO::GetVZEROEtaMin(i)) / 2, AliVVZERO::GetVZEROAvgPhi(i), 1.1, 0); // fit pT = 1.1 and charge = 0
- particle->SetUniqueID(-1); // not needed here
-
- tracks->Add(particle);
- }
- }
+
+ Double_t evtPlanePhi = -999.; //A value outside [-pi/2,pi/2] will be ignored
+ if(fTrackPhiCutEvPlMax > 0.0001) {
+ AliEventplane* evtPlane = inputEvent->GetEventplane();
+ Double_t qx = 0; Double_t qy = 0;
+ if(evtPlane) evtPlanePhi = evtPlane->CalculateVZEROEventPlane(inputEvent, 10, 2, qx, qy);
+ //Reject event if the plane is not available
+ else return;
}
+
+ if (fTriggersFromDetector == 0)
+ tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE, kTRUE, evtPlanePhi);
+ else if (fTriggersFromDetector <= 4)
+ tracks=GetParticlesFromDetector(inputEvent,fTriggersFromDetector);
else
AliFatal(Form("Invalid setting for fTriggersFromDetector: %d", fTriggersFromDetector));
-
+
//Printf("Accepted %d tracks", tracks->GetEntries());
// check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
// correlate particles with...
TObjArray* tracksCorrelate = 0;
- if (fParticleSpeciesAssociated != fParticleSpeciesTrigger || fTriggersFromDetector > 0)
- tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
+ if(fAssociatedFromDetector==0){
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger || fTriggersFromDetector > 0 || fTrackPhiCutEvPlMax > 0.0001)
+ tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
+ }
+ else if (fAssociatedFromDetector <= 4){
+ if(fAssociatedFromDetector != fTriggersFromDetector)
+ tracksCorrelate = GetParticlesFromDetector(inputEvent,fAssociatedFromDetector);
+ }
+ else
+ AliFatal(Form("Invalid setting for fAssociatedFromDetector: %d", fAssociatedFromDetector));
// reference multiplicity
Int_t referenceMultiplicity = -1;
part->SetPhi(newAngle);
}
}
-
\ No newline at end of file
+
+//____________________________________________________________________
+TObjArray* AliAnalysisTaskPhiCorrelations::GetParticlesFromDetector(AliVEvent* inputEvent, Int_t idet)
+{
+ //1 = VZERO_A; 2 = VZERO_C; 3 = SPD tracklets
+ TObjArray* obj = new TObjArray;
+ obj->SetOwner(kTRUE);
+
+ if (idet == 1 || idet == 2)
+ {
+ AliVVZERO* vZero = inputEvent->GetVZEROData();
+
+ const Int_t vZeroStart = (idet == 1) ? 32 : 0;
+
+ TH1F* singleCells = (TH1F*) fListOfHistos->FindObject("V0SingleCells");
+ for (Int_t i=vZeroStart; i<vZeroStart+32; i++)
+ {
+ Float_t weight = vZero->GetMultiplicity(i);
+ singleCells->Fill(weight);
+
+ // rough estimate of multiplicity
+ for (Int_t j=0; j<TMath::Nint(weight); j++)
+ {
+ AliDPhiBasicParticle* particle = new AliDPhiBasicParticle((AliVVZERO::GetVZEROEtaMax(i) + AliVVZERO::GetVZEROEtaMin(i)) / 2, AliVVZERO::GetVZEROAvgPhi(i), 1.1, 0); // fit pT = 1.1 and charge = 0
+ particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + j + i * 1000);
+
+ obj->Add(particle);
+ }
+ }
+ }
+ else if (idet == 3)
+ {
+ if(!fAOD)
+ AliFatal("Tracklets only available on AOD");
+ AliAODTracklets* trklets=(AliAODTracklets*)fAOD->GetTracklets();
+ if(!trklets)
+ AliFatal("AliAODTracklets not found");
+ for(Int_t itrklets=0;itrklets<trklets->GetNumberOfTracklets();itrklets++)
+ {
+ Float_t eta=-TMath::Log(TMath::Tan(trklets->GetTheta(itrklets)/2));
+ if(TMath::Abs(eta)>fTrackEtaCut)continue;
+ Float_t pT=1000*TMath::Abs(trklets->GetDeltaPhi(itrklets));//in mrad
+ if(pT>fTrackletDphiCut)continue;
+ TH1F* DphiTrklets = (TH1F*)fListOfHistos->FindObject("DphiTrklets");
+ DphiTrklets->Fill(1000*trklets->GetDeltaPhi(itrklets)); //in mrad
+ Float_t phi=trklets->GetPhi(itrklets);
+ phi+=trklets->GetDeltaPhi(itrklets)*39./34.; //correction dphi*39./34. (Dphi in rad)
+ if (phi<0) phi+=TMath::TwoPi();
+ if (phi>TMath::TwoPi()) phi-=TMath::TwoPi();
+
+ AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,phi, pT, 0); // pT = TMath::Abs(trklets->GetDeltaPhi(itrklets)) in mrad and charge = 0
+ particle->SetUniqueID(fAnalyseUE->GetEventCounter()* 100000 + itrklets);
+
+ obj->Add(particle);
+ }
+ }
+ else if (idet == 4)
+ {
+ if(!fAOD)
+ AliFatal("Muon selection only implemented on AOD");//FIXME to be implemented also for ESDs as in AliAnalyseLeadingTrackUE::GetAcceptedPArticles
+ for (Int_t iTrack = 0; iTrack < fAOD->GetNTracks(); iTrack++) {
+ AliAODTrack* track = fAOD->GetTrack(iTrack);
+ if (!track->IsMuonTrack()) continue;
+ //Float_t dca = track->DCA();
+ //Float_t chi2 = track->Chi2perNDF();
+ Float_t rabs = track->GetRAtAbsorberEnd();
+ Float_t eta = track->Eta();
+ Int_t matching = track->GetMatchTrigger();
+ if (rabs < 17.6 || rabs > 89.5) continue;
+ if (eta < -4 || eta > -2.5) continue;
+ if (matching < 2) continue;
+
+ AliDPhiBasicParticle* particle = new AliDPhiBasicParticle(eta,track->Phi(), track->Pt(), track->Charge());
+ particle->SetUniqueID(fAnalyseUE->GetEventCounter() * 100000 + iTrack);
+
+ obj->Add(particle);
+ }
+ }
+ else
+ AliFatal(Form("GetParticlesFromDetector: Invalid idet value: %d", idet));
+
+ return obj;
+}
+
+//____________________________________________________________________
+Bool_t AliAnalysisTaskPhiCorrelations::IsMuEvent(){
+
+ if(!fAOD)
+ AliFatal("Muon selection only implemented on AOD");//FIXME to be implemented also for ESDs as in AliAnalyseLeadingTrackUE::GetAcceptedPArticles
+ for (Int_t iTrack = 0; iTrack < fAOD->GetNTracks(); iTrack++) {
+ AliAODTrack* track = fAOD->GetTrack(iTrack);
+ if (!track->IsMuonTrack()) continue;
+ //Float_t dca = track->DCA();
+ //Float_t chi2 = track->Chi2perNDF();
+ Float_t rabs = track->GetRAtAbsorberEnd();
+ Float_t eta = track->Eta();
+ Int_t matching = track->GetMatchTrigger();
+ if (rabs < 17.6 || rabs > 89.5) continue;
+ if (eta < -4 || eta > -2.5) continue;
+ if (matching < 2) continue;
+ return kTRUE;
+ }
+ return kFALSE;
+
+}