]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGCF/Correlations/DPhi/AliAnalysisTaskPhiCorrelations.cxx
Merge branch 'TPCdev' of https://git.cern.ch/reps/AliRoot into TPCdev
[u/mrichter/AliRoot.git] / PWGCF / Correlations / DPhi / AliAnalysisTaskPhiCorrelations.cxx
index 22579083087b00ab64700233cbe1f110d554eae7..c52ea2f6b22b3e76d3e742f8d7d70c798f50ade4 100644 (file)
@@ -41,6 +41,7 @@
 #include "AliMCEventHandler.h"
 #include "AliVParticle.h"
 #include "AliCFContainer.h"
+#include "AliEventplane.h"
 
 #include "AliESDEvent.h"
 #include "AliESDInputHandler.h"
@@ -125,10 +126,13 @@ fListOfHistos(0x0),
 // 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),
@@ -142,6 +146,7 @@ fUseChargeHadrons(kFALSE),
 fParticleSpeciesTrigger(-1),
 fParticleSpeciesAssociated(-1),
 fCheckMotherPDG(kTRUE),
+fTrackletDphiCut(9999999.),
 fSelectCharge(0),
 fTriggerSelectCharge(0),
 fAssociatedSelectCharge(0),
@@ -161,6 +166,7 @@ fWeightPerEvent(kFALSE),
 fCustomBinning(),
 fPtOrder(kTRUE),
 fTriggersFromDetector(0),
+fAssociatedFromDetector(0),
 fMCUseUncheckedCentrality(kFALSE),
 fFillpT(kFALSE)
 {
@@ -244,6 +250,8 @@ void  AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
   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");
 
@@ -334,8 +342,10 @@ void  AliAnalysisTaskPhiCorrelations::CreateOutputObjects()
     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);
   
@@ -412,9 +422,12 @@ void  AliAnalysisTaskPhiCorrelations::AddSettingsTree()
   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");
@@ -448,6 +461,7 @@ void  AliAnalysisTaskPhiCorrelations::AddSettingsTree()
   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");
@@ -550,8 +564,8 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
     
   if (!fAnalyseUE->VertexSelection(vertexSupplier, 0, fZVertex)) 
     return;
-  
-  Float_t zVtx = 0;
+    
+    Float_t zVtx = 0;
   if (fAOD)
     zVtx = ((AliAODMCHeader*) vertexSupplier)->GetVtxZ();
   else
@@ -656,6 +670,17 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
   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);
@@ -1126,6 +1151,9 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
     return;
   }
   
+  // Reject events without a muon in the muon arm ************************************************
+  if(fAcceptOnlyMuEvents && !IsMuEvent())return;
+  
   // Vertex selection *************************************************
   if(!fAnalyseUE->VertexSelection(inputEvent, fnTracksVertex, fZVertex)) return;
   
@@ -1145,37 +1173,23 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
     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)
@@ -1222,8 +1236,16 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
   
   // 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;
@@ -1467,4 +1489,108 @@ void AliAnalysisTaskPhiCorrelations::ShiftTracks(TObjArray* tracks, Double_t ang
     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;
+  
+}