]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/EMCALJetTasks/AliHadCorrTask.cxx
cleanup.
[u/mrichter/AliRoot.git] / PWGGA / EMCALJetTasks / AliHadCorrTask.cxx
index c0fab350c8eb08d521fb83f7c8d88dfe581baafb..e7f426a656322edd17ad926cbbe47ccacf1b4fb0 100644 (file)
 // $Id$
+//
+// Hadronic correction task.
+//
+//
 
-#include "AliHadCorrTask.h"
+#include <TChain.h>
 #include <TClonesArray.h>
+#include <TH1F.h>
+#include <TH2F.h>
+#include <TList.h>
+#include <TLorentzVector.h>
 #include <TParticle.h>
-#include "AliEmcalJet.h"
+#include "AliAODCaloCluster.h"
+#include "AliAODEvent.h"
 #include "AliAnalysisManager.h"
+#include "AliCentrality.h"
+#include "AliESDCaloCluster.h"
 #include "AliESDtrack.h"
 #include "AliFJWrapper.h"
-#include "AliESDCaloCluster.h"
-#include "TList.h"
-#include "TH1F.h"
-#include "TH2F.h"
-#include "TChain.h"
-#include <TLorentzVector.h>
-#include <AliCentrality.h>
 #include "AliPicoTrack.h"
+#include "AliVEventHandler.h"
+#include "AliHadCorrTask.h"
 
 ClassImp(AliHadCorrTask)
 
 //________________________________________________________________________
-AliHadCorrTask::AliHadCorrTask(const char *name) : 
+AliHadCorrTask::AliHadCorrTask() : 
   AliAnalysisTaskSE("AliHadCorrTask"),
-  fTracksName("Tracks"),
-  fCaloName("CaloClusters"),
+  fTracksName(),
+  fCaloName(),
+  fOutCaloName(),
+  fHadCorr(0),
   fMinPt(0.15),
+  fOutClusters(0),
   fOutputList(0),
-  fHistEbefore(0),
-  fHistEafter(0),
   fHistNclusvsCent(0),
   fHistNclusMatchvsCent(0),
-  fOutCaloName("CaloClustersOut"),
-  fOutClusters(0)
+  fHistEbefore(0),
+  fHistEafter(0),
+  fHistEoPCent(0),
+  fHistNMatchCent(0)
 {
+  // Default constructor.
 
-  for(Int_t i=0; i<4; i++){
-    fHistMatchEtaPhi[i]=0x0;
-    fHistMatchEvsP[i]=0x0;
-    fHistMatchdRvsEP[i]=0x0;
+  for(Int_t i=0; i<4; ++i) {
+    fHistMatchEvsP[i]   = 0;
+    fHistMatchdRvsEP[i] = 0;
+    for(Int_t j=0; j<5; ++j) 
+      fHistMatchEtaPhi[i][j] = 0;
   }
+}
 
+//________________________________________________________________________
+AliHadCorrTask::AliHadCorrTask(const char *name) : 
+  AliAnalysisTaskSE(name),
+  fTracksName("Tracks"),
+  fCaloName("CaloClusters"),
+  fOutCaloName("CaloClustersCorr"),
+  fHadCorr(0),
+  fMinPt(0.15),
+  fOutClusters(0),
+  fOutputList(0),
+  fHistNclusvsCent(0),
+  fHistNclusMatchvsCent(0),
+  fHistEbefore(0),
+  fHistEafter(0),
+  fHistEoPCent(0),
+  fHistNMatchCent(0)
+{
   // Standard constructor.
-  cout << "Constructor for HadCorrTask " << name <<endl;
-  if (!name)
-    return;
 
-  SetName(name);
+  for(Int_t i=0; i<4; ++i) {
+    fHistMatchEvsP[i]   = 0;
+    fHistMatchdRvsEP[i] = 0;
+    for(Int_t j=0; j<5; ++j) 
+      fHistMatchEtaPhi[i][j] = 0;
+  }
+
   fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.";
 
   DefineInput(0,TChain::Class());
   DefineOutput(1,TList::Class());
 }
 
-AliHadCorrTask::AliHadCorrTask() : 
-  AliAnalysisTaskSE("AliHadCorrTask"),
-  fTracksName("Tracks"),
-  fCaloName("CaloClusters"),
-  fOutClusters(0)
+//________________________________________________________________________
+AliHadCorrTask::~AliHadCorrTask()
 {
-  // Standard constructor.
-
-  fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.";
+  // Destructor
 }
 
+//________________________________________________________________________
+Int_t AliHadCorrTask::GetCentBin(Double_t cent) const
+{
+  // Get centrality bin.
+
+  Int_t centbin = -1;
+  if (cent>=0 && cent<10) 
+    centbin=0;
+  else if (cent>=10 && cent<30) 
+    centbin=1;
+  else if (cent>=30 && cent<50) 
+    centbin=2;
+  else if (cent>=50 && cent<=100) 
+    centbin=3;
+
+  return centbin;
+}
 
 //________________________________________________________________________
-AliHadCorrTask::~AliHadCorrTask()
+Int_t AliHadCorrTask::GetMomBin(Double_t p) const
 {
-  // Destructor
+  // Get momenum bin.
+
+  Int_t pbin=-1;
+  if (p>=0 && p<0.5) 
+    pbin=0;
+  else if (p>=0.5 && p<2.) 
+    pbin=1;
+  else if (p>=2. && p<3.) 
+    pbin=2;
+  else if (p>=3. && p<5.) 
+    pbin=3;
+  else if (p>=5.) 
+    pbin=4;
+
+  return pbin;
 }
 
 //________________________________________________________________________
 void AliHadCorrTask::UserCreateOutputObjects()
 {
+  // Create my user objects.
 
-  fOutClusters = new TClonesArray("AliESDCaloCluster");
+  AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!handler) {
+    AliError("Input handler not available!");
+    return;
+  }
+  if (handler->InheritsFrom("AliESDInputHandler")) {
+    fOutClusters = new TClonesArray("AliESDCaloCluster");
+  } else if (handler->InheritsFrom("AliAODInputHandler")) {
+    fOutClusters = new TClonesArray("AliAODCaloCluster");
+  } else {
+    AliError("Input handler not recognized!");
+    return;
+  }
   fOutClusters->SetName(fOutCaloName);
  
   OpenFile(1);
   fOutputList = new TList();
   fOutputList->SetOwner();
 
-  char name[200];
-
-  for(int icent=0; icent<4; icent++){
-    sprintf(name,"fHistMatchEtaPhi_%i",icent);
-    fHistMatchEtaPhi[icent] = new TH2F(name,name,400,-0.2,0.2,1600,-0.8,0.8);
-    sprintf(name,"fHistMatchEvsP_%i",icent);
-    fHistMatchEvsP[icent]=new TH2F(name,name,400,0.,200.,1000,0.,10.);
-    sprintf(name,"fHistMatchdRvsEP_%i",icent);
-    fHistMatchdRvsEP[icent]=new TH2F(name,name,1000,0.,1.,1000,0.,10.);
+  for(Int_t icent=0; icent<4; ++icent) {
+    for(Int_t ipt=0; ipt<5; ++ipt){
+      TString name(Form("fHistMatchEtaPhi_%i_%i",icent,ipt));
+      fHistMatchEtaPhi[icent][ipt] = new TH2F(name, name, 400, -0.2, 0.2, 1600, -0.8, 0.8);
+      fOutputList->Add(fHistMatchEtaPhi[icent][ipt]);
+    }
 
-    
-  fOutputList->Add(fHistMatchEtaPhi[icent]);
-  fOutputList->Add(fHistMatchEvsP[icent]);
-  fOutputList->Add(fHistMatchdRvsEP[icent]);
+    TString name(Form("fHistMatchEvsP_%i",icent));
+    fHistMatchEvsP[icent] = new TH2F(name, name, 400, 0., 200., 1000, 0., 10.);
+    fOutputList->Add(fHistMatchEvsP[icent]);
 
+    name = Form("fHistMatchdRvsEP_%i",icent);
+    fHistMatchdRvsEP[icent] = new TH2F(name, name, 1000, 0., 1., 1000, 0., 10.);
+    fOutputList->Add(fHistMatchdRvsEP[icent]);
   }
-  fHistNclusvsCent=new TH1F("Nclusvscent","NclusVsCent",100,0,100);
-  fHistNclusMatchvsCent=new TH1F("NclusMatchvscent","NclusMatchVsCent",100,0,100);
-  fHistEbefore=new TH1F("Ebefore","Ebefore",100,0,100);
-  fHistEafter=new TH1F("Eafter","Eafter",100,0,100);
 
+  fHistNclusvsCent      = new TH1F("Nclusvscent",      "NclusVsCent",      100, 0, 100);
+  fHistNclusMatchvsCent = new TH1F("NclusMatchvscent", "NclusMatchVsCent", 100, 0, 100);
+  fHistEbefore          = new TH1F("Ebefore",          "Ebefore",          100, 0, 100);
+  fHistEafter           = new TH1F("Eafter",           "Eafter",           100, 0, 100);
+  fHistEoPCent          = new TH2F("EoPCent",          "EoPCent",          100, 0, 100, 1000, 0,   10);
+  fHistNMatchCent       = new TH2F("NMatchesCent",     "NMatchesCent",     100, 0, 100, 101, -0.5, 100.5);
   fOutputList->Add(fHistNclusMatchvsCent);
   fOutputList->Add(fHistNclusvsCent);
   fOutputList->Add(fHistEbefore);
   fOutputList->Add(fHistEafter);
+  fOutputList->Add(fHistEoPCent);
+  fOutputList->Add(fHistNMatchCent);
 
   PostData(1, fOutputList);
 }
@@ -112,135 +187,181 @@ void AliHadCorrTask::UserCreateOutputObjects()
 //________________________________________________________________________
 void AliHadCorrTask::UserExec(Option_t *) 
 {
+  // Execute per event.
 
+  // post output in event if not yet present
   if (!(InputEvent()->FindListObject(fOutCaloName)))
     InputEvent()->AddObject(fOutClusters);
-  else fOutClusters->Delete();
+  
+  // delete output
+  fOutClusters->Delete();
 
+  // esd or aod mode
+  Bool_t esdMode = kTRUE;
+  if (dynamic_cast<AliAODEvent*>(InputEvent()))
+      esdMode = kFALSE;
 
+  // optimization in case autobranch loading is off
   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
-  TClonesArray *tracks = 0;
-  TClonesArray *clus   = 0;
-  TList *l = InputEvent()->GetList();
+  if (fCaloName == "CaloClusters")
+    am->LoadBranch("CaloClusters");
+  if (fTracksName == "Tracks")
+    am->LoadBranch("Tracks");
 
-  AliCentrality *centrality = 0;
-  centrality = dynamic_cast<AliCentrality*>(l->FindObject("Centrality"));
-  Float_t fCent=-1; 
-  if(centrality)
-    fCent = centrality->GetCentralityPercentile("V0M");
+  // get centrality 
+  Float_t cent = -1; 
+  AliCentrality *centrality = InputEvent()->GetCentrality() ;
+  if (centrality)
+    cent = centrality->GetCentralityPercentile("V0M");
   else
-    fCent=99;//probably pp data
-
-  if(fCent<0) return;
+    cent=99; // probably pp data
+  if (cent<0) {
+    AliError(Form("Centrality negative: %f", cent));
+    return;
+  }
+  Int_t centbin = GetCentBin(cent);
 
-  if (fTracksName == "Tracks")
-    am->LoadBranch("Tracks");
+  // get input collections
+  TClonesArray *tracks = 0;
+  TClonesArray *clus   = 0;
+  TList *l = InputEvent()->GetList();
   tracks = dynamic_cast<TClonesArray*>(l->FindObject(fTracksName));
   if (!tracks) {
     AliError(Form("Pointer to tracks %s == 0", fTracksName.Data() ));
     return;
   }
-  const Int_t Ntrks = tracks->GetEntries();
-  
-  if (fCaloName == "CaloClusters")
-    am->LoadBranch("CaloClusters");
   clus = dynamic_cast<TClonesArray*>(l->FindObject(fCaloName));
   if (!clus) {
     AliError(Form("Pointer to clus %s == 0", fCaloName.Data() ));
     return;
   }
 
-  Int_t centbin=-1;
-  if(fCent>=0 && fCent<10) centbin=0;
-  else if(fCent>=10 && fCent<30) centbin=1;
-  else if(fCent>=30 && fCent<50) centbin=2;
-  else if(fCent>=50 && fCent<100) centbin=3;
-  if (clus) {
-    Double_t vertex[3] = {0, 0, 0};
-    InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
-    const Int_t Nclus = clus->GetEntries();
-    for (Int_t iClus = 0, iN = 0, clusCount=0; iClus < Nclus; ++iClus) {
-      AliVCluster *c = dynamic_cast<AliVCluster*>(clus->At(iClus));
-      if (!c)
+  // get primary vertex
+  Double_t vertex[3] = {0, 0, 0};
+  InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
+
+  // loop over clusters and tracks
+  const Int_t Nclus = clus->GetEntries();
+  const Int_t Ntrks = tracks->GetEntries();
+  for (Int_t iClus = 0, clusCount=0; iClus < Nclus; ++iClus) {
+    AliVCluster *c = dynamic_cast<AliVCluster*>(clus->At(iClus));
+    if (!c)
+      continue;
+    if (!c->IsEMCAL())
+      continue;
+
+    // make primary particle out of cluster
+    TLorentzVector nPart;
+    c->GetMomentum(nPart, vertex);
+
+    Double_t etclus = nPart.Pt();
+    if (etclus<fMinPt) 
+      continue;
+
+    Double_t energyclus = nPart.P();
+
+    // reset cluster/track matching
+    c->SetEmcCpvDistance(-1);
+    c->SetTrackDistance(999,999);
+
+    // run cluster-track matching
+    Int_t    imin       = -1;
+    Double_t dEtaMin    = 1e9;
+    Double_t dPhiMin    = 1e9;
+    Double_t dRmin      = TMath::Sqrt(dEtaMin*dEtaMin+dPhiMin*dPhiMin);
+    Double_t totalTrkP  = 0.0; // count total track momentum
+    Int_t    Nmatches   = 0;   // count total number of matches
+    for (Int_t t = 0; t<Ntrks; ++t) {
+      AliVTrack *track = dynamic_cast<AliVTrack*>(tracks->At(t));
+      if (!track)
+        continue;
+      if (!track->IsEMCAL())
         continue;
-      if (!c->IsEMCAL())
+      if (track->Pt()<fMinPt)
         continue;
-      TLorentzVector nPart;
-
-      c->SetEmcCpvDistance(-1);
-      c->SetTrackDistance(999,999);
-      Double_t dEtaMin  = 1e9;
-      Double_t dPhiMin  = 1e9;
-      Int_t    imin     = -1;
-      for(Int_t t = 0; t<Ntrks; ++t) {
-        AliVTrack *track = dynamic_cast<AliVTrack*>(tracks->At(t));
-        Double_t etadiff=999;
-        Double_t phidiff=999;
-        AliPicoTrack::GetEtaPhiDiff(track,c,phidiff,etadiff);
-        Double_t dR = TMath::Sqrt(etadiff*etadiff+phidiff*phidiff);
-        Double_t dRmin = TMath::Sqrt(dEtaMin*dEtaMin+dPhiMin*dPhiMin);
-        if(dR > 25) 
-          continue;
-       if(dR<dRmin){
-          dEtaMin = etadiff;
-          dPhiMin = phidiff;
-          imin = t;
+
+      Double_t etadiff=999;
+      Double_t phidiff=999;
+      AliPicoTrack::GetEtaPhiDiff(track,c,phidiff,etadiff);
+      Double_t dR = TMath::Sqrt(etadiff*etadiff+phidiff*phidiff);
+      if(dR<dRmin){
+        dEtaMin = etadiff;
+        dPhiMin = phidiff;
+        dRmin = dR;
+        imin = t;
+      }
+      if (fHadCorr>1) {
+        Double_t mom = track->P();
+        Int_t mombin = GetMomBin(mom);
+        if (mombin>-1) {
+          fHistMatchEtaPhi[centbin][mombin]->Fill(etadiff,phidiff);
+          fHistMatchdRvsEP[centbin]->Fill(dR,energyclus/mom);
         }
       }
-      c->SetEmcCpvDistance(imin);
-      c->SetTrackDistance(dPhiMin, dEtaMin);
-      c->GetMomentum(nPart, vertex);
-      Double_t energy = nPart.P();
-      if(energy<fMinPt) continue;
-      if (imin>=0) {
-       Double_t dPhiMin = c->GetTrackDx();
-       Double_t dEtaMin = c->GetTrackDz();
-       fHistMatchEtaPhi[centbin]->Fill(dEtaMin,dPhiMin);
+      if (TMath::Abs(phidiff)<0.05 && TMath::Abs(etadiff)<0.025) { // pp cuts!!!
+        ++Nmatches;
+        totalTrkP += track->P();
       }
+    }
 
-      fHistNclusvsCent->Fill(fCent);
-    
-      if (fHadCorr>0) {
-       if (imin>=0) {
-         Double_t dPhiMin = c->GetTrackDx();
-         Double_t dEtaMin = c->GetTrackDz();
-         Double_t dR=TMath::Sqrt(dEtaMin*dEtaMin+dPhiMin*dPhiMin);
-             
-         AliVTrack *t = dynamic_cast<AliVTrack*>(tracks->At(imin));
-         if (t) {
-           if (t->Pt()<fMinPt)
-             continue;
-           if (t->P()>0) fHistMatchEvsP[centbin]->Fill(energy,energy/t->P());
-           if (t->P()>0) fHistMatchdRvsEP[centbin]->Fill(dR,energy/t->P());
-           fHistEbefore->Fill(fCent,energy);
-           if (dPhiMin<0.05 && dEtaMin<0.025) { // pp cuts!!!
-              energy -= fHadCorr*t->P();
-             fHistNclusMatchvsCent->Fill(fCent);
-           }
-           if (energy<0)
-             continue;
-         }
-       }
-       fHistEafter->Fill(fCent,energy);
-
-      }//end had correction if
-      if (energy>0){//Output new corrected clusters
-       AliESDCaloCluster *oc = new ((*fOutClusters)[clusCount]) AliESDCaloCluster(*(dynamic_cast<AliESDCaloCluster*>(c)));
-       oc->SetE(energy);
-       clusCount++;
+    // store closest track
+    c->SetEmcCpvDistance(imin);
+    c->SetTrackDistance(dPhiMin, dEtaMin);
+
+    fHistNclusvsCent->Fill(cent);
+    fHistEbefore->Fill(cent,energyclus);
+    fHistNMatchCent->Fill(cent,Nmatches);
+    if(Nmatches>0) 
+      fHistNclusMatchvsCent->Fill(cent);
+
+    // apply correction / subtraction
+    if (fHadCorr>0) {
+      // to subtract only the closest track set fHadCor to a %
+      // to subtract all tracks within the cut set fHadCor to %+1
+      if (fHadCorr>1) {
+        if (totalTrkP>0) {
+          Double_t EoP = energyclus/totalTrkP;
+          fHistEoPCent->Fill(cent,EoP);
+          fHistMatchEvsP[centbin]->Fill(energyclus,EoP);
+        }
+        energyclus -= (fHadCorr-1)*totalTrkP;
+      } else if (imin>=0) {
+        AliVTrack *t = dynamic_cast<AliVTrack*>(tracks->At(imin));
+        if (t) {
+          Double_t mom = t->P();
+          Int_t mombin = GetMomBin(mom);
+          fHistMatchEtaPhi[centbin][mombin]->Fill(dEtaMin,dPhiMin);
+          if (mom>0){
+            fHistMatchEvsP[centbin]->Fill(energyclus,energyclus/mom);
+            fHistEoPCent->Fill(cent,energyclus/mom);
+            fHistMatchdRvsEP[centbin]->Fill(dRmin,energyclus/mom);
+          }
+          if (TMath::Abs(dPhiMin)<0.05 && TMath::Abs(dEtaMin)<0.025) { // pp cuts!!!
+            energyclus -= fHadCorr*t->P();
+          }
+        }
       }
     }
-
-
+    if (energyclus<0) 
+      energyclus = 0;
+    fHistEafter->Fill(cent,energyclus);
+
+    if (energyclus>0) { // create corrected cluster
+      AliVCluster *oc;
+      if (esdMode) {
+        oc = new ((*fOutClusters)[clusCount]) AliESDCaloCluster(*(dynamic_cast<AliESDCaloCluster*>(c)));
+      } else {
+        oc = new ((*fOutClusters)[clusCount]) AliAODCaloCluster(*(dynamic_cast<AliAODCaloCluster*>(c)));
+      }
+      oc->SetE(energyclus);
+      ++clusCount;
+    }
   }
 }
 
 //________________________________________________________________________
 void AliHadCorrTask::Terminate(Option_t *) 
 {
-
+  // Nothing to be done.
 }
 
-//________________________________________________________________________