]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
add histograms to study EOverP and dEdx, add NLM cut
authorgconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 31 May 2013 11:45:49 +0000 (11:45 +0000)
committergconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 31 May 2013 11:45:49 +0000 (11:45 +0000)
PWGGA/CaloTrackCorrelations/AliAnaElectron.cxx
PWGGA/CaloTrackCorrelations/AliAnaElectron.h

index ed6a3b8511186a1f203acab2e27e7cf35d83a894..8604f45758e16f101a20b7284a7435c7f4e5d3e4 100755 (executable)
@@ -53,7 +53,8 @@ AliAnaElectron::AliAnaElectron() :
     AliAnaCaloTrackCorrBaseClass(),       fCalorimeter(""), 
     fMinDist(0.),                         fMinDist2(0.),                         fMinDist3(0.), 
     fTimeCutMin(-1),                      fTimeCutMax(999999),         
-    fNCellsCut(0),                        fFillSSHistograms(kFALSE),             fFillOnlySimpleSSHisto(1),        
+    fNCellsCut(0),                        fNLMCutMin(-1),                        fNLMCutMax(10),
+    fFillSSHistograms(kFALSE),             fFillOnlySimpleSSHisto(1),
     fFillWeightHistograms(kFALSE),        fNOriginHistograms(8), 
     fdEdxMin(0.),                         fdEdxMax (200.), 
     fEOverPMin(0),                        fEOverPMax (2),
@@ -61,6 +62,10 @@ AliAnaElectron::AliAnaElectron() :
     // Histograms
     fhdEdxvsE(0),                         fhdEdxvsP(0),                 
     fhEOverPvsE(0),                       fhEOverPvsP(0),
+    fhdEdxvsECutM02(0),                   fhdEdxvsPCutM02(0),
+    fhEOverPvsECutM02(0),                 fhEOverPvsPCutM02(0),
+    fhdEdxvsECutEOverP(0),                fhdEdxvsPCutEOverP(0),
+    fhEOverPvsECutM02CutdEdx(0),          fhEOverPvsPCutM02CutdEdx(0),
     // Weight studies
     fhECellClusterRatio(0),               fhECellClusterLogRatio(0),                 
     fhEMaxCellClusterRatio(0),            fhEMaxCellClusterLogRatio(0),    
@@ -77,8 +82,9 @@ AliAnaElectron::AliAnaElectron() :
   //default ctor
   for(Int_t index = 0; index < 2; index++)
   {
-    fhNCellsE [index] = 0;    
-    fhTimeE   [index] = 0;  
+    fhNCellsE [index] = 0;
+    fhNLME    [index] = 0;
+    fhTimeE   [index] = 0;
     fhMaxCellDiffClusterE[index] = 0;
     fhE       [index] = 0;    
     fhPt      [index] = 0;                        
@@ -116,7 +122,11 @@ AliAnaElectron::AliAnaElectron() :
       fhMCPhi    [index][i] = 0;
       fhMCEta    [index][i] = 0;
       fhMCDeltaE [index][i] = 0;                
-      fhMC2E     [index][i] = 0;              
+      fhMC2E     [index][i] = 0;
+      fhMCdEdxvsE       [i] = 0;
+      fhMCdEdxvsP       [i] = 0;
+      fhMCEOverPvsE     [i] = 0;
+      fhMCEOverPvsP     [i] = 0;
     }
     
     for(Int_t i = 0; i < 6; i++)
@@ -148,7 +158,7 @@ AliAnaElectron::AliAnaElectron() :
 }
 
 //____________________________________________________________________________
-Bool_t  AliAnaElectron::ClusterSelected(AliVCluster* calo, TLorentzVector mom
+Bool_t  AliAnaElectron::ClusterSelected(AliVCluster* calo, TLorentzVector mom, Int_t nMaxima)
 {
   //Select clusters if they pass different cuts
   if(GetDebug() > 2) 
@@ -187,6 +197,11 @@ Bool_t  AliAnaElectron::ClusterSelected(AliVCluster* calo, TLorentzVector mom)
   }
   else if(GetDebug() > 2)  printf(" Track-matching cut passed \n");
   
+  //...........................................
+  // skip clusters with too many maxima
+  if(nMaxima < fNLMCutMin || nMaxima > fNLMCutMax) return kFALSE ;
+  if(GetDebug() > 2) printf(" \t Cluster %d pass NLM %d of out of range \n",calo->GetID(), nMaxima);
+  
   //.......................................
   //Check Distance to Bad channel, set bit.
   Double_t distBad=calo->GetDistanceToBadChannel() ; //Distance to bad channel
@@ -451,7 +466,7 @@ TObjString *  AliAnaElectron::GetAnalysisCuts()
   parList += GetCaloPID()->GetPIDParametersList() ;
   
   //Get parameters set in FiducialCut class (not available yet)
-  //parlist += GetFidCut()->GetFidCutParametersList() 
+  //parlist += GetFidCut()->GetFidCutParametersList()
   
   return new TObjString(parList) ;
 }
@@ -473,7 +488,18 @@ TList *  AliAnaElectron::GetCreateOutputObjects()
   Int_t nPoverEbins = GetHistogramRanges()->GetHistoPOverEBins();       Float_t pOverEmax = GetHistogramRanges()->GetHistoPOverEMax();       Float_t pOverEmin = GetHistogramRanges()->GetHistoPOverEMin();
   Int_t tbins       = GetHistogramRanges()->GetHistoTimeBins() ;        Float_t tmax      = GetHistogramRanges()->GetHistoTimeMax();         Float_t tmin      = GetHistogramRanges()->GetHistoTimeMin();
 
-  fhdEdxvsE  = new TH2F ("hdEdxvsE","matched track <dE/dx> vs cluster E ", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax); 
+  
+  // MC labels, titles, for originator particles
+  TString ptypess[] = { "#gamma","hadron?","#pi^{0}","#eta","#gamma->e^{#pm}","e^{#pm}"} ;
+  TString pnamess[] = { "Photon","Hadron" ,"Pi0"    ,"Eta" ,"Conversion"     ,"Electron"} ;
+  TString ptype[] = { "#gamma", "#gamma_{#pi decay}","#gamma_{other decay}", "#pi^{0}","#eta",
+    "e^{#pm}","#gamma->e^{#pm}","hadron?","Anti-N","Anti-P"                    } ;
+  
+  TString pname[] = { "Photon","PhotonPi0Decay","PhotonOtherDecay","Pi0","Eta","Electron",
+    "Conversion", "Hadron", "AntiNeutron","AntiProton"                        } ;
+
+  
+  fhdEdxvsE  = new TH2F ("hdEdxvsE","matched track <dE/dx> vs cluster E ", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
   fhdEdxvsE->SetXTitle("E (GeV)");
   fhdEdxvsE->SetYTitle("<dE/dx>");
   outputContainer->Add(fhdEdxvsE);  
@@ -494,6 +520,83 @@ TList *  AliAnaElectron::GetCreateOutputObjects()
   outputContainer->Add(fhEOverPvsP);  
   
   
+  fhdEdxvsECutM02  = new TH2F ("hdEdxvsECutM02","matched track <dE/dx> vs cluster E, mild #lambda_{0}^{2} cut", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+  fhdEdxvsECutM02->SetXTitle("E (GeV)");
+  fhdEdxvsECutM02->SetYTitle("<dE/dx>");
+  outputContainer->Add(fhdEdxvsECutM02);
+  
+  fhdEdxvsPCutM02  = new TH2F ("hdEdxvsPCutM02","matched track <dE/dx> vs track P, mild #lambda_{0}^{2} cut", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+  fhdEdxvsPCutM02->SetXTitle("P (GeV/c)");
+  fhdEdxvsPCutM02->SetYTitle("<dE/dx>");
+  outputContainer->Add(fhdEdxvsPCutM02);
+  
+  fhEOverPvsECutM02  = new TH2F ("hEOverPvsECutM02","matched track E/p vs cluster E, mild #lambda_{0}^{2} cut", nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+  fhEOverPvsECutM02->SetXTitle("E (GeV)");
+  fhEOverPvsECutM02->SetYTitle("E/p");
+  outputContainer->Add(fhEOverPvsECutM02);
+  
+  fhEOverPvsPCutM02  = new TH2F ("hEOverPvsPCutM02","matched track E/p vs track P, mild #lambda_{0}^{2} cut", nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+  fhEOverPvsPCutM02->SetXTitle("P (GeV/c)");
+  fhEOverPvsPCutM02->SetYTitle("E/p");
+  outputContainer->Add(fhEOverPvsPCutM02);
+
+  
+  fhdEdxvsECutEOverP  = new TH2F ("hdEdxvsECutEOverP","matched track <dE/dx> vs cluster E, cut on E/p", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+  fhdEdxvsECutEOverP->SetXTitle("E (GeV)");
+  fhdEdxvsECutEOverP->SetYTitle("<dE/dx>");
+  outputContainer->Add(fhdEdxvsECutEOverP);
+  
+  fhdEdxvsPCutEOverP  = new TH2F ("hdEdxvsPCutEOverP","matched track <dE/dx> vs track P, cut on E/p", nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+  fhdEdxvsPCutEOverP->SetXTitle("P (GeV/c)");
+  fhdEdxvsPCutEOverP->SetYTitle("<dE/dx>");
+  outputContainer->Add(fhdEdxvsPCutEOverP);
+  
+  fhEOverPvsECutM02CutdEdx  = new TH2F ("hEOverPvsECutM02CutdEdx","matched track E/p vs cluster E, dEdx cut, mild #lambda_{0}^{2} cut", nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+  fhEOverPvsECutM02CutdEdx->SetXTitle("E (GeV)");
+  fhEOverPvsECutM02CutdEdx->SetYTitle("E/p");
+  outputContainer->Add(fhEOverPvsECutM02CutdEdx);
+  
+  fhEOverPvsPCutM02CutdEdx  = new TH2F ("hEOverPvsPCutM02CutdEdx","matched track E/p vs track P, dEdx cut, mild #lambda_{0}^{2} cut ", nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+  fhEOverPvsPCutM02CutdEdx->SetXTitle("P (GeV/c)");
+  fhEOverPvsPCutM02CutdEdx->SetYTitle("E/p");
+  outputContainer->Add(fhEOverPvsPCutM02CutdEdx);
+
+  if(IsDataMC())
+  {
+    for(Int_t i = 0; i < fNOriginHistograms; i++)
+    {
+      fhMCdEdxvsE[i]  = new TH2F(Form("hdEdxvsE_MC%s",pname[i].Data()),
+                                     Form("matched track <dE/dx> vs cluster E from %s : E ",ptype[i].Data()),
+                                     nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+      fhMCdEdxvsE[i]->SetXTitle("E (GeV)");
+      fhMCdEdxvsE[i]->SetYTitle("<dE/dx>");
+      outputContainer->Add(fhMCdEdxvsE[i]) ;
+      
+      fhMCdEdxvsP[i]  = new TH2F(Form("hdEdxvsP_MC%s",pname[i].Data()),
+                                 Form("matched track <dE/dx> vs track P from %s : E ",ptype[i].Data()),
+                                 nptbins,ptmin,ptmax,ndedxbins, dedxmin, dedxmax);
+      fhMCdEdxvsP[i]->SetXTitle("E (GeV)");
+      fhMCdEdxvsP[i]->SetYTitle("<dE/dx>");
+      outputContainer->Add(fhMCdEdxvsP[i]) ;
+
+      
+      fhMCEOverPvsE[i]  = new TH2F(Form("hEOverPvsE_MC%s",pname[i].Data()),
+                                 Form("matched track E/p vs cluster E from %s : E ",ptype[i].Data()),
+                                 nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+      fhMCEOverPvsE[i]->SetXTitle("E (GeV)");
+      fhMCEOverPvsE[i]->SetYTitle("<dE/dx>");
+      outputContainer->Add(fhMCEOverPvsE[i]) ;
+      
+      fhMCEOverPvsP[i]  = new TH2F(Form("hEOverPvsP_MC%s",pname[i].Data()),
+                                 Form("matched track E/pvs track P from %s : E ",ptype[i].Data()),
+                                 nptbins,ptmin,ptmax,nPoverEbins,pOverEmin,pOverEmax);
+      fhMCEOverPvsP[i]->SetXTitle("E (GeV)");
+      fhMCEOverPvsP[i]->SetYTitle("<dE/dx>");
+      outputContainer->Add(fhMCEOverPvsP[i]) ;
+      
+    }
+  }
+  
   TString pidParticle[] = {"Electron","ChargedHadron"} ;
   
   if(fFillWeightHistograms)
@@ -705,11 +808,6 @@ TList *  AliAnaElectron::GetCreateOutputObjects()
     {
       if(fFillSSHistograms)
       {
-        
-        TString ptypess[] = { "#gamma","hadron?","#pi^{0}","#eta","#gamma->e^{#pm}","e^{#pm}"} ; 
-        
-        TString pnamess[] = { "Photon","Hadron","Pi0","Eta","Conversion","Electron"} ;
-        
         for(Int_t i = 0; i < 6; i++)
         { 
           fhMCELambda0[pidIndex][i]  = new TH2F(Form("h%sELambda0_MC%s",pidParticle[pidIndex].Data(),pnamess[i].Data()),
@@ -770,6 +868,13 @@ TList *  AliAnaElectron::GetCreateOutputObjects()
     fhNCellsE[pidIndex]->SetYTitle("# of cells in cluster");
     outputContainer->Add(fhNCellsE[pidIndex]);  
     
+    fhNLME[pidIndex]  = new TH2F (Form("h%sNLME",pidParticle[pidIndex].Data()),
+                                     Form("NLM in %s cluster vs E ",pidParticle[pidIndex].Data()),
+                                     nptbins,ptmin,ptmax, 10,0,10);
+    fhNLME[pidIndex]->SetXTitle("E (GeV)");
+    fhNLME[pidIndex]->SetYTitle("# of cells in cluster");
+    outputContainer->Add(fhNLME[pidIndex]);
+    
     fhTimeE[pidIndex] = new TH2F(Form("h%sTimeE",pidParticle[pidIndex].Data()),
                                  Form("Time in %s cluster vs E ",pidParticle[pidIndex].Data())
                                  ,nptbins,ptmin,ptmax, tbins,tmin,tmax);
@@ -830,13 +935,7 @@ TList *  AliAnaElectron::GetCreateOutputObjects()
     
     
     if(IsDataMC())
-    {
-      TString ptype[] = { "#gamma", "#gamma_{#pi decay}","#gamma_{other decay}", "#pi^{0}","#eta",
-        "e^{#pm}","#gamma->e^{#pm}","hadron?","Anti-N","Anti-P"                    } ; 
-      
-      TString pname[] = { "Photon","PhotonPi0Decay","PhotonOtherDecay","Pi0","Eta","Electron",
-        "Conversion", "Hadron", "AntiNeutron","AntiProton"                        } ;
-      
+    {      
       for(Int_t i = 0; i < fNOriginHistograms; i++)
       { 
         fhMCE[pidIndex][i]  = new TH1F(Form("h%sE_MC%s",pidParticle[pidIndex].Data(),pname[i].Data()),
@@ -1061,7 +1160,12 @@ void  AliAnaElectron::MakeAnalysisFillAOD()
     //--------------------------------------
     // Cluster selection
     //--------------------------------------
-    if(!ClusterSelected(calo,mom)) continue;
+    AliVCaloCells* cells    = 0;
+    if(fCalorimeter == "EMCAL") cells = GetEMCALCells();
+    else                        cells = GetPHOSCells();
+    
+    Int_t nMaxima = GetCaloUtils()->GetNumberOfLocalMaxima(calo, cells); // NLM
+    if(!ClusterSelected(calo,mom,nMaxima)) continue;
     
     //----------------------------
     //Create AOD for analysis
@@ -1084,45 +1188,56 @@ void  AliAnaElectron::MakeAnalysisFillAOD()
     else                         aodpart.SetDistToBad(0) ;
     //printf("DistBad %f Bit %d\n",distBad, aodpart.DistToBad());
     
-    //--------------------------------------------------------------------------------------
-    //Play with the MC stack if available
-    //--------------------------------------------------------------------------------------
-    
-    //Check origin of the candidates
-    if(IsDataMC())
-    {
-      aodpart.SetTag(GetMCAnalysisUtils()->CheckOrigin(calo->GetLabels(),calo->GetNLabels(),GetReader()));
-      
-      if(GetDebug() > 0)
-        printf("AliAnaElectron::MakeAnalysisFillAOD() - Origin of candidate, bit map %d\n",aodpart.GetTag());
-    }//Work with stack also   
-    
-    
     //-------------------------------------
     //PID selection via dEdx
     //-------------------------------------
     
     AliVTrack *track = GetCaloUtils()->GetMatchedTrack(calo, GetReader()->GetInputEvent());
 
-    if(!track) {
+    if(!track)
+    {
       printf("AliAnaElectron::MakeAnalysisFillAOD() - Null track");
       continue;
     }
     
+    //printf("track dedx %f, p %f, cluster E %f\n",track->GetTPCsignal(),track->P(),calo->E());
     Float_t dEdx = track->GetTPCsignal();
+    Float_t eOverp = calo->E()/track->P();
+    
     fhdEdxvsE->Fill(calo->E(), dEdx);
     fhdEdxvsP->Fill(track->P(),dEdx);
     
+    if( eOverp < fEOverPMax && eOverp > fEOverPMin)
+    {
+      fhdEdxvsECutEOverP  ->Fill(calo->E(), dEdx);
+      fhdEdxvsPCutEOverP  ->Fill(track->P(),dEdx);
+    }
+    
+    //Apply a mild cut on the cluster SS and check the value of dEdX and EOverP
+    Float_t m02 = calo->GetM02();
+    if(m02 > 0.1 && m02 < 0.4)
+    {
+      fhdEdxvsECutM02  ->Fill(calo->E(), dEdx);
+      fhdEdxvsPCutM02  ->Fill(track->P(),dEdx);
+      fhEOverPvsECutM02->Fill(calo->E(),  eOverp);
+      fhEOverPvsPCutM02->Fill(track->P(), eOverp);
+    }
+    
     Int_t pid  = AliCaloPID::kChargedHadron;
     
-    if( dEdx < fdEdxMax && dEdx > fdEdxMin) {
-      
-      Float_t eOverp = calo->E()/track->P();
+    if( dEdx < fdEdxMax && dEdx > fdEdxMin)
+    {
       fhEOverPvsE->Fill(calo->E(),  eOverp);
       fhEOverPvsP->Fill(track->P(), eOverp);
       
-      if( eOverp < fEOverPMax && eOverp > fEOverPMin) {
-        
+      if(m02 > 0.1 && m02 < 0.4)
+      {
+        fhEOverPvsECutM02CutdEdx->Fill(calo->E(),  eOverp);
+        fhEOverPvsPCutM02CutdEdx->Fill(track->P(), eOverp);
+      }
+      
+      if( eOverp < fEOverPMax && eOverp > fEOverPMin)
+      {
         pid  = AliCaloPID::kElectron;
       } //E/p
       
@@ -1132,13 +1247,101 @@ void  AliAnaElectron::MakeAnalysisFillAOD()
     
     Int_t pidIndex = 0;// Electron
     if(pid == AliCaloPID::kChargedHadron) pidIndex = 1;
+  
+    //--------------------------------------------------------------------------------------
+    //Play with the MC stack if available
+    //--------------------------------------------------------------------------------------
+    
+    //Check origin of the candidates
+    if(IsDataMC())
+    {
+      Int_t tag = GetMCAnalysisUtils()->CheckOrigin(calo->GetLabels(),calo->GetNLabels(),GetReader());
+      aodpart.SetTag(tag);
+      
+      if(GetDebug() > 0)
+        printf("AliAnaElectron::MakeAnalysisFillAOD() - Origin of candidate, bit map %d\n",aodpart.GetTag());
+         
+      if( GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCPhoton) && fhMCE[pidIndex][kmcPhoton])
+      {
+        fhMCdEdxvsE  [kmcPhoton]->Fill(calo ->E(), dEdx);
+        fhMCdEdxvsP  [kmcPhoton]->Fill(track->P(), dEdx);
+        fhMCEOverPvsE[kmcPhoton]->Fill(calo ->E(), eOverp);
+        fhMCEOverPvsP[kmcPhoton]->Fill(track->P(), eOverp);
+        
+        if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCConversion) && fhMCE[pidIndex][kmcConversion])
+        {
+          fhMCdEdxvsE  [kmcConversion]->Fill(calo ->E(), dEdx);
+          fhMCdEdxvsP  [kmcConversion]->Fill(track->P(), dEdx);
+          fhMCEOverPvsE[kmcConversion]->Fill(calo ->E(), eOverp);
+          fhMCEOverPvsP[kmcConversion]->Fill(track->P(), eOverp);
+        }
+        else if( GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCPi0Decay) &&
+                !GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCPi0) && fhMCE[pidIndex][kmcPi0Decay])
+        {
+          fhMCdEdxvsE  [kmcPi0Decay]->Fill(calo ->E(), dEdx);
+          fhMCdEdxvsP  [kmcPi0Decay]->Fill(track->P(), dEdx);
+          fhMCEOverPvsE[kmcPi0Decay]->Fill(calo ->E(), eOverp);
+          fhMCEOverPvsP[kmcPi0Decay]->Fill(track->P(), eOverp);
+        }
+        else if( (GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEtaDecay) ||
+                  GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCOtherDecay) ) && fhMCE[pidIndex][kmcOtherDecay])
+        {
+          fhMCdEdxvsE  [kmcOtherDecay]->Fill(calo ->E(), dEdx);
+          fhMCdEdxvsP  [kmcOtherDecay]->Fill(track->P(), dEdx);
+          fhMCEOverPvsE[kmcOtherDecay]->Fill(calo ->E(), eOverp);
+          fhMCEOverPvsP[kmcOtherDecay]->Fill(track->P(), eOverp);
+        }
+        else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCPi0) && fhMCE  [pidIndex][kmcPi0])
+        {
+          fhMCdEdxvsE  [kmcPi0]->Fill(calo ->E(), dEdx);
+          fhMCdEdxvsP  [kmcPi0]->Fill(track->P(), dEdx);
+          fhMCEOverPvsE[kmcPi0]->Fill(calo ->E(), eOverp);
+          fhMCEOverPvsP[kmcPi0]->Fill(track->P(), eOverp);
+        }
+        else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCEta) && fhMCE[pidIndex][kmcEta])
+        {
+          fhMCdEdxvsE  [kmcEta]->Fill(calo ->E(), dEdx);
+          fhMCdEdxvsP  [kmcEta]->Fill(track->P(), dEdx);
+          fhMCEOverPvsE[kmcEta]->Fill(calo ->E(), eOverp);
+          fhMCEOverPvsP[kmcEta]->Fill(track->P(), eOverp);
+        }
+      }
+      else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCAntiNeutron) && fhMCE[pidIndex][kmcAntiNeutron])
+      {
+        fhMCdEdxvsE  [kmcAntiNeutron]->Fill(calo ->E(), dEdx);
+        fhMCdEdxvsP  [kmcAntiNeutron]->Fill(track->P(), dEdx);
+        fhMCEOverPvsE[kmcAntiNeutron]->Fill(calo ->E(), eOverp);
+        fhMCEOverPvsP[kmcAntiNeutron]->Fill(track->P(), eOverp);
+      }
+      else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCAntiProton) && fhMCE[pidIndex][kmcAntiProton])
+      {
+        fhMCdEdxvsE  [kmcAntiProton]->Fill(calo ->E(), dEdx);
+        fhMCdEdxvsP  [kmcAntiProton]->Fill(track->P(), dEdx);
+        fhMCEOverPvsE[kmcAntiProton]->Fill(calo ->E(), eOverp);
+        fhMCEOverPvsP[kmcAntiProton]->Fill(track->P(), eOverp);
+      }
+      else if(GetMCAnalysisUtils()->CheckTagBit(tag,AliMCAnalysisUtils::kMCElectron) && fhMCE[pidIndex][kmcElectron])
+      {
+        fhMCdEdxvsE  [kmcElectron]->Fill(calo ->E(), dEdx);
+        fhMCdEdxvsP  [kmcElectron]->Fill(track->P(), dEdx);
+        fhMCEOverPvsE[kmcElectron]->Fill(calo ->E(), eOverp);
+        fhMCEOverPvsP[kmcElectron]->Fill(track->P(), eOverp);
+      }
+      else if( fhMCE[pidIndex][kmcOther])
+      {
+        fhMCdEdxvsE  [kmcOther]->Fill(calo ->E(), dEdx);
+        fhMCdEdxvsP  [kmcOther]->Fill(track->P(), dEdx);
+        fhMCEOverPvsE[kmcOther]->Fill(calo ->E(), eOverp);
+        fhMCEOverPvsP[kmcOther]->Fill(track->P(), eOverp);
+      }
+    }// set MC tag and fill Histograms with MC
     
     //---------------------------------
     //Fill some shower shape histograms
     //---------------------------------
 
     FillShowerShapeHistograms(calo,aodpart.GetTag(),pid);
-    
+  
     if(pid == AliCaloPID::kElectron)
       WeightHistograms(calo);
     
@@ -1166,14 +1369,11 @@ void  AliAnaElectron::MakeAnalysisFillAOD()
     //FIXME, this to MakeAnalysisFillHistograms ...
     Int_t absID             = 0; 
     Float_t maxCellFraction = 0;
-    AliVCaloCells* cells    = 0;
-    
-    if(fCalorimeter == "EMCAL") cells = GetEMCALCells();
-    else                        cells = GetPHOSCells();
     
     absID = GetCaloUtils()->GetMaxEnergyCell(cells, calo,maxCellFraction);
     fhMaxCellDiffClusterE[pidIndex]->Fill(aodpart.E(),maxCellFraction);
     fhNCellsE[pidIndex]            ->Fill(aodpart.E(),calo->GetNCells());
+    fhNLME[pidIndex]               ->Fill(aodpart.E(),nMaxima);
     fhTimeE[pidIndex]              ->Fill(aodpart.E(),calo->GetTOF()*1.e9);
 
     //Add AOD with electron/hadron object to aod branch
index c7bced46b605023a38dad6bbf14aa857e2c51d49..fd013fbd807e696309d3aa4a3273d60780210f38 100755 (executable)
@@ -56,7 +56,7 @@ class AliAnaElectron : public AliAnaCaloTrackCorrBaseClass {
   
   // Analysis methods
   
-  Bool_t       ClusterSelected(AliVCluster* cl, TLorentzVector mom) ;
+  Bool_t       ClusterSelected(AliVCluster* cl, TLorentzVector mom, Int_t nMaxima) ;
   
   void         FillShowerShapeHistograms( AliVCluster* cluster, const Int_t mcTag , const Int_t pidTag) ;
   
@@ -94,7 +94,12 @@ class AliAnaElectron : public AliAnaCaloTrackCorrBaseClass {
        
   void         SetNCellCut(Int_t n)                   { fNCellsCut = n             ; }
   Double_t     GetNCellCut()                    const { return fNCellsCut          ; }
-    
+  
+  void         SetNLMCut(Int_t min, Int_t max)        { fNLMCutMin = min;
+                                                        fNLMCutMax = max                ; }
+  Int_t        GetNLMCutMin()                   const { return fNLMCutMin               ; }
+  Int_t        GetNLMCutMax()                   const { return fNLMCutMax               ; }
+  
   void         FillNOriginHistograms(Int_t n)         { fNOriginHistograms = n ; 
                                                         if(n > 10) fNOriginHistograms = 10; }
 
@@ -124,8 +129,10 @@ class AliAnaElectron : public AliAnaCaloTrackCorrBaseClass {
   Double_t fTimeCutMin  ;                      // Remove clusters/cells with time smaller than this value, in ns
   Double_t fTimeCutMax  ;                      // Remove clusters/cells with time larger than this value, in ns
   Int_t    fNCellsCut ;                        // Accept for the analysis clusters with more than fNCellsCut cells
+  Int_t    fNLMCutMin  ;                       // Remove clusters/cells with number of local maxima smaller than this value
+  Int_t    fNLMCutMax  ;                       // Remove clusters/cells with number of local maxima larger than this value
   Bool_t   fFillSSHistograms ;                 // Fill shower shape histograms
-  Bool_t   fFillOnlySimpleSSHisto;   // Fill selected cluster histograms, selected SS histograms
+  Bool_t   fFillOnlySimpleSSHisto;             // Fill selected cluster histograms, selected SS histograms
   Bool_t   fFillWeightHistograms ;             // Fill weigth histograms
   Int_t    fNOriginHistograms;                 // Fill only NOriginHistograms of the 14 defined types
 
@@ -136,13 +143,29 @@ class AliAnaElectron : public AliAnaCaloTrackCorrBaseClass {
 
   Int_t    fAODParticle;                       // Select the type of particle to put in AODs for other analysis
   
-  //Histograms 
+  //Histograms
   TH2F * fhdEdxvsE;                            //! matched track dEdx vs cluster E 
   TH2F * fhdEdxvsP;                            //! matched track dEdx vs track P
   TH2F * fhEOverPvsE;                          //! matched track E cluster over P track vs cluster E, after dEdx cut 
   TH2F * fhEOverPvsP;                          //! matched track E cluster over P track vs track P, after dEdx cut 
 
-  TH2F * fhNCellsE[2];                         //! number of cells in cluster vs E 
+  TH2F * fhdEdxvsECutM02;                      //! matched track dEdx vs cluster E, mild M02 cut
+  TH2F * fhdEdxvsPCutM02;                      //! matched track dEdx vs track P, mild M02 cut
+  TH2F * fhEOverPvsECutM02;                    //! matched track E cluster over P track vs cluster E, after dEdx cut, mild M02 cut
+  TH2F * fhEOverPvsPCutM02;                    //! matched track E cluster over P track vs track P, after dEdx cut, mild M02 cut
+  
+  TH2F * fhdEdxvsECutEOverP;                   //! matched track dEdx vs cluster E , cut on EOverP
+  TH2F * fhdEdxvsPCutEOverP;                   //! matched track dEdx vs track P, cut on EOverP
+  TH2F * fhEOverPvsECutM02CutdEdx;             //! matched track E cluster over P track vs cluster E, after dEdx cut and mild M02 cut
+  TH2F * fhEOverPvsPCutM02CutdEdx;             //! matched track E cluster over P track vs track P, after dEdx cut and mild M02 cut
+
+  TH2F * fhMCdEdxvsE[10];                       //! matched track dEdx vs cluster E, coming from MC particle
+  TH2F * fhMCdEdxvsP[10];                       //! matched track dEdx vs track P, coming from MC particle
+  TH2F * fhMCEOverPvsE[10];                     //! matched track E cluster over P track vs cluster E, after dEdx cut, coming from MC particle
+  TH2F * fhMCEOverPvsP[10];                     //! matched track E cluster over P track vs track P, after dEdx cut, coming from MC particle
+  
+  TH2F * fhNCellsE[2];                         //! number of cells in cluster vs E
+  TH2F * fhNLME[2];                            //! number of local maxima in cluster vs E
   TH2F * fhMaxCellDiffClusterE[2];             //! Fraction of energy carried by cell with maximum energy
   TH2F * fhTimeE[2];                           //! E vs Time of selected cluster 
 
@@ -224,7 +247,7 @@ class AliAnaElectron : public AliAnaCaloTrackCorrBaseClass {
   AliAnaElectron(              const AliAnaElectron & el) ; // cpy ctor  
   AliAnaElectron & operator = (const AliAnaElectron & el) ; // cpy assignment
   
-  ClassDef(AliAnaElectron,4)
+  ClassDef(AliAnaElectron,5)
 
 } ;