]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Exploring task to collect some informations on nuclei in pp
authormcolocci <mcolocci@cern.ch>
Thu, 9 Oct 2014 15:35:40 +0000 (17:35 +0200)
committermcolocci <mcolocci@cern.ch>
Thu, 9 Oct 2014 15:35:40 +0000 (17:35 +0200)
PWGLF/CMakelibPWGLFspectra.pkg
PWGLF/PWGLFspectraLinkDef.h
PWGLF/SPECTRA/Nuclei/masses/AddTaskNucleiInfo.C [new file with mode: 0644]
PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.cxx [new file with mode: 0644]
PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.h [new file with mode: 0644]

index a46b32bae25457665a48c6119aa82a7f6ce1e857..e8fdb3e98f13ef0d1d84f4bdc1db11cf3a4c06e8 100644 (file)
@@ -70,6 +70,7 @@ set ( SRCS SPECTRA/ChargedHadrons/dNdPt/AlidNdPtAcceptanceCuts.cxx
        SPECTRA/Nuclei/B2/AliAnalysisTaskB2.cxx
        SPECTRA/Nuclei/B2/AliAnalysisTaskB2AOD.cxx
         SPECTRA/Nuclei/masses/AliAnalysisNucleiMass.cxx
+       SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.cxx
        SPECTRA/Nuclei/deuteronpA/AliAnalysisDeuteronpA.cxx
        SPECTRA/XtAnalysis/AliXtAnalysis.cxx
        SPECTRA/XtAnalysis/AliJXtHistos.cxx
index 43bda68d37dfb612e7a3e66a65da330e9c002812..634c77339c72f79fcef825aa0ea903911ee97d91 100644 (file)
@@ -47,6 +47,7 @@
 #pragma link C++ class AliAnalysisTaskB2+;
 #pragma link C++ class AliAnalysisTaskB2AOD+;
 #pragma link C++ class AliAnalysisNucleiMass+;
+#pragma link C++ class AliAnalysisNucleiInfo+;
 
 #pragma link C++ class AliAnalysisDeuteronpA+;
 
diff --git a/PWGLF/SPECTRA/Nuclei/masses/AddTaskNucleiInfo.C b/PWGLF/SPECTRA/Nuclei/masses/AddTaskNucleiInfo.C
new file mode 100644 (file)
index 0000000..816f766
--- /dev/null
@@ -0,0 +1,51 @@
+AliAnalysisTaskSE *AddTaskNucleiInfo(Bool_t kAOD=kTRUE, Int_t filterBit=16, Double_t EtaMin=-0.8, Double_t EtaMax=0.8, Double_t DCAxyCut=1000.0, Double_t DCAzCut=1000.0, Double_t fNsigmaTpcCut=2.0){
+
+  //get the current analysis manager
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  
+  if (!mgr) {
+    Error("No manager found in AddTaskVZERO. Why?");
+    return 0;
+  }
+  // currently don't accept AOD input
+  if (kAOD && !mgr->GetInputEventHandler()->InheritsFrom(AliAODInputHandler::Class())) { // check AOD
+    Error("AddTaskVZERO","This task works only with AOD input!");
+    return 0;
+  }
+  else if(1){ // check ESD
+
+  }
+
+  //========= Add tender to the ANALYSIS manager and set default storage =====
+  
+  char mytaskName[100];
+  snprintf(mytaskName,100,"AliAnalysisNucleiInfo");
+
+  AliAnalysisNucleiInfo *task = new AliAnalysisNucleiInfo(mytaskName);
+  task->SetFilterBit(filterBit);
+  task->SetEtaLimit(EtaMin,EtaMax);
+  task->SetDCACut(DCAxyCut,DCAzCut);
+  task->SetNsigmaTPCCut(fNsigmaTpcCut);
+  
+  mgr->AddTask(task);
+
+  //Attach input to my tasks
+  char name[1000];
+
+  snprintf(name,1000,"cchain1_FilterBit=%02i_EtaMin=%.1f_EtaMax=%.1f_DCAxyCUT=%.1f_DCAzCUT=%.1f_NsigTPCcut=%1.0f",filterBit,EtaMin,EtaMax,DCAxyCut,DCAzCut,fNsigmaTpcCut);
+
+  AliAnalysisDataContainer *cinput = mgr->CreateContainer(name,TChain::Class(),AliAnalysisManager::kInputContainer);
+  mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
+
+  // Attach output to my tasks
+  
+  snprintf(name,1000,"ResultsBmm_FilterBit=%02i_EtaMin=%.1f_EtaMax=%.1f_DCAxyCUT=%.1f_DCAzCUT=%.1f_NsigTPCcut=%1.0f",filterBit,EtaMin,EtaMax,DCAxyCut,DCAzCut,fNsigmaTpcCut);
+  AliAnalysisDataContainer *cOutputL= mgr->CreateContainer(name,TList::Class(), AliAnalysisManager::kOutputContainer, AliAnalysisManager::GetCommonFileName());
+  mgr->ConnectOutput(task, 1, cOutputL);
+
+  snprintf(name,1000,"ResultsBpp_FilterBit=%02i_EtaMin=%.1f_EtaMax=%.1f_DCAxyCUT=%.1f_DCAzCUT=%.1f_NsigTPCcut=%1.0f",filterBit,EtaMin,EtaMax,DCAxyCut,DCAzCut,fNsigmaTpcCut);
+  AliAnalysisDataContainer *cOutputL2= mgr->CreateContainer(name,TList::Class(), AliAnalysisManager::kOutputContainer, AliAnalysisManager::GetCommonFileName());
+  mgr->ConnectOutput(task, 2, cOutputL2);
+
+  return task;
+}
diff --git a/PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.cxx b/PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.cxx
new file mode 100644 (file)
index 0000000..cc03b18
--- /dev/null
@@ -0,0 +1,467 @@
+#include "AliAnalysisNucleiInfo.h"
+
+// ROOT includes
+#include <TMath.h>
+#include "TChain.h"
+
+// AliRoot includes
+#include "AliInputEventHandler.h"
+#include "AliAODEvent.h"
+#include "AliESDEvent.h"
+#include "AliVEvent.h"
+#include "AliAODTrack.h"
+#include "AliAODPid.h"
+#include "AliCentrality.h"
+#include "TH2F.h"
+#include "TH2D.h"
+#include "TH1F.h"
+#include "TF1.h"
+#include "TF2.h"
+#include "TGraph.h"
+#include "TProfile.h"
+#include "AliESDtrackCuts.h"
+#include "AliAnalysisManager.h"
+#include "TFile.h"
+
+ClassImp(AliAnalysisNucleiInfo)
+
+//_____________________________________________________________________________
+AliAnalysisNucleiInfo::AliAnalysisNucleiInfo():
+  AliAnalysisTaskSE(),
+  FilterBit(16),                                
+  EtaLimit(),                           
+  DCAxyCut(1000.),                               
+  DCAzCut(1000.),                                
+  NsigmaTpcCut(2.0),
+  iBconf(0),                           
+  kTOF(0),
+//iTriggerSel(-99),
+  fAOD(NULL), 
+  fESD(NULL),
+  fEvent(NULL),
+  fPIDResponse(NULL)
+{
+  EtaLimit[0]=-99.0;
+  EtaLimit[1]=99.0;
+  
+  fList[0]=new TList();
+  fList[0]->SetName("results");
+  
+  fList[1]=new TList();
+  fList[1]->SetName("results2");
+}
+//______________________________________________________________________________
+AliAnalysisNucleiInfo::AliAnalysisNucleiInfo(const char *name):
+  AliAnalysisTaskSE(name),
+  FilterBit(16),                                
+  EtaLimit(),                           
+  DCAxyCut(1000.),                               
+  DCAzCut(1000.),                                
+  NsigmaTpcCut(2.0),                           
+  iBconf(0),                                  
+  kTOF(0),
+  //iTriggerSel(-99),
+  fAOD(NULL), 
+  fESD(NULL),
+  fEvent(NULL),
+  fPIDResponse(NULL)
+{
+
+  EtaLimit[0]=-99.0;
+  EtaLimit[1]=99.0;
+
+  fList[0]=new TList();
+  DefineOutput(1, TList::Class());
+  fList[0]->SetName("results");
+  
+  fList[1]=new TList();
+  DefineOutput(2, TList::Class());
+  fList[1]->SetName("results2");
+}
+//_____________________________________________________________________________
+AliAnalysisNucleiInfo::~AliAnalysisNucleiInfo()
+{
+  if(fList[0]) delete fList[0];
+  if(fList[1]) delete fList[1];
+}
+//______________________________________________________________________________
+void AliAnalysisNucleiInfo::UserCreateOutputObjects()
+{
+  Char_t namePart[nPart][30];
+  snprintf(namePart[0],30,"e");
+  snprintf(namePart[1],30,"mu");
+  snprintf(namePart[2],30,"pi");
+  snprintf(namePart[3],30,"K");
+  snprintf(namePart[4],30,"p");
+  snprintf(namePart[5],30,"d");
+  snprintf(namePart[6],30,"t");
+  snprintf(namePart[7],30,"He3");
+  snprintf(namePart[8],30,"He4");
+  
+  Char_t name[nSpec][30];
+  snprintf(name[0],20,"e_plus");
+  snprintf(name[1],20,"mu_plus");
+  snprintf(name[2],20,"pi_plus");
+  snprintf(name[3],20,"K_plus");
+  snprintf(name[4],20,"p");
+  snprintf(name[5],20,"d");
+  snprintf(name[6],20,"t");
+  snprintf(name[7],20,"He3");
+  snprintf(name[8],20,"He4");
+  snprintf(name[9],20,"e_minus");
+  snprintf(name[10],20,"mu_plus");
+  snprintf(name[11],20,"pi_plus");
+  snprintf(name[12],20,"K_plus");
+  snprintf(name[13],20,"p_bar");
+  snprintf(name[14],20,"d_bar");
+  snprintf(name[15],20,"t_bar");
+  snprintf(name[16],20,"He3_bar");
+  snprintf(name[17],20,"He4_bar");
+  
+  Int_t hbins[2];
+
+  for(Int_t iB=0;iB<nBconf;iB++) {
+    
+    htemp[iB] = new TH1F("htemp","htemp (avoid the problem with the empty list...);B field",20,-10,10);
+
+    //htriggerbits[iB] = new TH1I("htriggerbits","htriggerbits; bits",10,-5,5);
+    htriggerbits[iB][0] = new TH1I("htriggerbits_0","trigger mask; bits",45,-5,40);
+    htriggerbits[iB][1] = new TH1I("htriggerbits_1","trigger bits (exclusive); bits",45,-5,40);
+    
+    hZvertex[iB][0] = new TH1F("hZvertex_Selected","Vertex distribution of selected events;z vertex (cm)",240,-30,30);
+    hZvertex[iB][1] = new TH1F("hZvertex_Analyzed","Vertex distribution of analyzed events;z vertex (cm)",240,-30,30);
+    
+    hEta[iB] = new TH1F("hEta_Analyzed","|#eta| distribution after the track cuts;#eta",200,-1.0,1.0);
+    
+    hPhi[iB] = new TH1F("hPhi_Analyzed","#phi distribution after the track cuts;#phi (rad.)",90,0,6.3);//Each TRD supermodule is divided for 5 (DeltaPhi(TRD)=0.35 theoretical)
+    
+    //hbins[0]=500; hbins[1]=2000;
+    hbins[0]=500; hbins[1]=2000;//hbins[0]=100; hbins[1]=500
+    fdEdxVSp[iB][0] = new TH2F("fdEdxVSp_pos","dE/dx vs p (positive charge); p_{TPC}/z (GeV/c); dE/dx_{TPC} (a.u.)",hbins[0],0,10,hbins[1],0,1000);
+    fdEdxVSp[iB][1] = new TH2F("fdEdxVSp_neg","dE/dx vs p (negative charge); p_{TPC}/z (GeV/c); dE/dx_{TPC} (a.u.)",hbins[0],0,10,hbins[1],0,1000);
+
+    Char_t name_hDeDxExp[nPart][200];
+    Char_t title_hDeDxExp[nPart][200];
+    for(Int_t i=0;i<nPart;i++) {
+      snprintf(name_hDeDxExp[i],200,"hDeDxExp_%s",namePart[i]);
+      snprintf(title_hDeDxExp[i],200,"Expected dE/dx of %s in the TPC;p_{TPC}/z (GeV/c);dE/dx_{TPC} (a.u.)",namePart[i]);
+      hDeDxExp[iB][i] = new TProfile(name_hDeDxExp[i],title_hDeDxExp[i],200,0,10,0,1000,"");//,500,0,5,0,1000,""); toram
+    }
+
+    Char_t name_fNsigmaTpc[nSpec][200];
+    Char_t title_fNsigmaTpc[nSpec][200];
+    hbins[0]=200; hbins[1]=200;
+    for(Int_t i=0;i<nSpec;i++) {
+      snprintf(name_fNsigmaTpc[i],200,"NsigmaTpc_%s",name[i]);
+      snprintf(title_fNsigmaTpc[i],200,"NsigmaTpc_%s;p_{TPC}/z (GeV/c);n_{#sigma_{TPC}}^{%s}",name[i],name[i]);
+      fNsigmaTpc[iB][i] = new TH2F(name_fNsigmaTpc[i],title_fNsigmaTpc[i],hbins[0],0,10,hbins[1],-10,10);
+    }
+    
+    hbins[0]=500; hbins[1]=520;//hbins[0]=200; hbins[1]=260;
+    fBetaTofVSp[iB][0] = new TH2F("fBetaTofVSp_pos","#beta_{TOF} vs p/z (positive charge);p(GeV/c);#beta_{TOF}",hbins[0],0,10,hbins[1],0.4,1.05);
+    fBetaTofVSp[iB][1] = new TH2F("fBetaTofVSp_neg","#beta_{TOF} vs p/z (negative charge);p(GeV/c);#beta_{TOF}",hbins[0],0,10,hbins[1],0.4,1.05);
+    
+    Char_t name_hBetaExp[nPart][200];
+    Char_t title_hBetaExp[nPart][200];
+    for(Int_t i=0;i<nPart;i++) {
+      snprintf(name_hBetaExp[i],200,"hBetaTofVsP_Exp_%s",namePart[i]);
+      snprintf(title_hBetaExp[i],200,"Expected #beta_{TOF} vs p/z of %s;p/z (GeV/c); #beta_{TOF}",namePart[i]);
+      hBetaExp[iB][i] = new TProfile(name_hBetaExp[i],title_hBetaExp[i],200,0,10,0.4,1.05,"");
+    }
+    
+    Char_t name_fNsigmaTof[nSpec][200];
+    Char_t title_fNsigmaTof[nSpec][200];    
+    hbins[0]=200; hbins[1]=200;
+    for(Int_t i=0;i<nSpec;i++) {
+      snprintf(name_fNsigmaTof[i],200,"NsigmaTof_%s",name[i]);
+      snprintf(title_fNsigmaTof[i],200,"NsigmaTof_%s;p_{T}/z (GeV/c);n_{#sigma_{TOF}}^{%s}",name[i],name[i]);
+      fNsigmaTof[iB][i] = new TH2F(name_fNsigmaTof[i],title_fNsigmaTof[i],hbins[0],0,10,hbins[1],-10,10);
+    }
+
+    Char_t name_fTofMinusExp[2][nSpec][200];
+    Char_t title_fTofMinusExp[2][nSpec][200];    
+    hbins[0]=200; hbins[1]=2000;
+    
+    for(Int_t i=0;i<nSpec;i++) {
+      snprintf(name_fTofMinusExp[0][i],200,"TofMinusExp_%s",name[i]);
+      snprintf(title_fTofMinusExp[0][i],200,"TofMinusExp_%s;p_{T}/z (GeV/c);tof-t_{exp}^{%s} (ps)",name[i],name[i]);
+      
+      snprintf(name_fTofMinusExp[1][i],200,"TofMinusExpWtpc_%s",name[i]);
+      snprintf(title_fTofMinusExp[1][i],200,"TofMinusExpWtpc_%s (with a 2#sigma TPC cut);p_{T}/z (GeV/c);tof-t_{exp}^{%s} (ps)",name[i],name[i]);
+    }
+    for(Int_t it=0;it<2;it++) {
+      for(Int_t i=0;i<nSpec;i++) {
+       fTofMinusExp[iB][it][i] = new TH2F(name_fTofMinusExp[it][i],title_fTofMinusExp[it][i],hbins[0],0,10,hbins[1],-20000,20000);
+      }
+    }
+
+    Char_t name_h2DCAap[18][200];
+    Char_t title_h2DCAap[18][200];
+    
+    for(Int_t iS=0;iS<nSpec;iS++) {
+      snprintf(name_h2DCAap[iS],200,"h2DCAap_%s",name[iS]);
+      snprintf(title_h2DCAap[iS],200,"h2DCA_%s in for p_{T}/z<1.5GeV/c;DCA_{xy} (cm);DCA_{z} (cm)",name[iS]);
+      if(iS==5 || iS==5+9) h2DCAap[iB][iS] = new TH2F(name_h2DCAap[iS],title_h2DCAap[iS],1750,-3.5,3.5,1750,-3.5,3.5);
+      else h2DCAap[iB][iS] = new TH2F(name_h2DCAap[iS],title_h2DCAap[iS],1,-3.5,3.5,1,-3.5,3.5);
+    }
+    
+    fList[iB]->Add(htemp[iB]);
+    for(Int_t i=0;i<2;i++) fList[iB]->Add(htriggerbits[iB][i]);
+    for(Int_t i=0;i<2;i++) fList[iB]->Add(hZvertex[iB][i]);
+    fList[iB]->Add(hEta[iB]);
+    fList[iB]->Add(hPhi[iB]);
+    for(Int_t i=0;i<2;i++) fList[iB]->Add(fdEdxVSp[iB][i]);
+    for(Int_t i=0;i<nPart;i++) {
+      fList[iB]->Add(hDeDxExp[iB][i]);
+    }    
+    for(Int_t i=0;i<nSpec;i++) {
+      fList[iB]->Add(fNsigmaTpc[iB][i]);
+    }
+    for(Int_t i=0;i<2;i++) fList[iB]->Add(fBetaTofVSp[iB][i]);
+    for(Int_t i=0;i<nPart;i++) {
+      fList[iB]->Add(hBetaExp[iB][i]);
+    }
+    for(Int_t i=0;i<nSpec;i++) {
+      fList[iB]->Add(fNsigmaTof[iB][i]);
+    }  
+    for(Int_t i=0;i<nSpec;i++) {
+      fList[iB]->Add(fTofMinusExp[iB][0][i]);
+    } 
+    for(Int_t i=0;i<nSpec;i++) {
+      fList[iB]->Add(fTofMinusExp[iB][1][i]);
+    } 
+    for(Int_t iS=0;iS<nSpec;iS++) {
+      if(iS==5 || iS==5+9) fList[iB]->Add(h2DCAap[iB][iS]);
+    }
+    
+    // Post output data.
+    PostData(1, fList[0]);
+    PostData(2, fList[1]);
+        
+  }//end iB loop
+}
+//______________________________________________________________________________
+void AliAnalysisNucleiInfo::UserExec(Option_t *) 
+{
+  // Main loop
+  // Called for each event
+  
+  fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
+  fESD = dynamic_cast<AliESDEvent*>(InputEvent());
+  if(!fAOD && !fESD){
+    Printf("%s:%d AODEvent and ESDEvent not found in Input Manager",(char*)__FILE__,__LINE__);
+    return;
+  }
+  
+  if(fESD) fEvent = fESD;
+  else fEvent = fAOD;
+
+  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
+  fPIDResponse=inputHandler->GetPIDResponse();
+  
+  //--------------------------Magnetic field polarity--------------------
+  Double_t fBfield=fEvent->GetMagneticField();
+  if(fBfield<0.0) iBconf=0;//B--
+  else iBconf=1;//B++
+  for(Int_t i=0;i<nBconf;i++) htemp[i]->Fill(fBfield);
+    
+  //-------------------------zVertex determination of event----------------
+  Double_t zvtx = 9999.9;
+  const AliVVertex* vtxEVENT = fEvent->GetPrimaryVertex();
+  if(vtxEVENT->GetNContributors()>0) zvtx = vtxEVENT->GetZ();
+  
+  hZvertex[iBconf][0]->Fill(zvtx);
+  
+  //---------------------------EVENT CUTS-----------------------------
+  if(TMath::Abs(zvtx) < 10.0){
+
+    //TRIGGER SELECTION
+    Int_t iTrigger=-2;
+
+    if(inputHandler->IsEventSelected() & AliVEvent::kMB) iTrigger = 0;
+    if(inputHandler->IsEventSelected() & AliVEvent::kCentral) iTrigger = 16;
+    if(inputHandler->IsEventSelected() & AliVEvent::kSemiCentral) iTrigger = 17;
+    //if((((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()) & AliVEvent::kAny) iTrigger = 35;
+    
+    if(iTriggerSel!=-99) {//if a dedicated trigger is required
+      if(iTrigger!=iTriggerSel) return;
+    }
+    
+    for(Int_t i=0;i<32;i++) {
+      Int_t bit=(1<<i);
+      if(inputHandler->IsEventSelected() & bit) htriggerbits[iBconf][0]->Fill(i);
+    }
+    if(inputHandler->IsEventSelected() & AliVEvent::kAny) htriggerbits[iBconf][0]->Fill(35);
+    if(inputHandler->IsEventSelected() & AliVEvent::kAnyINT) htriggerbits[iBconf][0]->Fill(36);
+    
+    htriggerbits[iBconf][1]->Fill(iTrigger);
+    
+    hZvertex[iBconf][1]->Fill(zvtx);
+    
+    Int_t nTracks = fEvent->GetNumberOfTracks();
+    
+    //----------------------loop on the TRACKS-----------------------------
+    for(Int_t iT = 0; iT < nTracks; iT++) { 
+      AliVTrack* track = (AliVTrack *) fEvent->GetTrack(iT);
+      
+      if (!track){
+       continue;
+      }
+      
+     //For the geometrical cuts
+      Double_t eta = track->Eta();
+      
+      Bool_t trkFlag = 0;
+      trkFlag = ((AliAODTrack *) track)->TestFilterBit(FilterBit);
+      //TestFilterBit(16) -- Standard Cuts with very loose DCA: GetStandardITSTPCTrackCuts2011(kFALSE) && SetMaxDCAToVertexXY(2.4) && SetMaxDCAToVertexZ(3.2) && SetDCaToVertex2D(kTRUE)
+      //TestFilterBit(32) (STARDARD) -- Standard Cuts with very tight DCA cut ( 7sigma^primaries: 7*(0.0015+0.0050/pt^1.1) ) : GetStandardITSTPCTrackCuts2011(). 
+      
+      //-------------------------------------start TRACK CUTS--------------------------------
+      if ((track->Pt() < 0.2) || (eta<EtaLimit[0]) || (eta>EtaLimit[1]) || !trkFlag)
+       continue;
+        
+       //Vertex determination
+      Double_t b[2] = {-99., -99.};
+      Double_t bCov[3] = {-99., -99., -99.};
+      if (!track->PropagateToDCA(fEvent->GetPrimaryVertex(), fEvent->GetMagneticField(), 100., b, bCov))
+       continue;
+      
+      Double_t DCAxy = b[0];
+      Double_t DCAz = b[1];
+      
+      //Cut on the DCAxy
+      Bool_t isDCAxyCut=kFALSE;
+      if(TMath::Abs(DCAxy)<DCAxyCut) isDCAxyCut=kTRUE;
+      
+      //Cut on the DCAz
+      Bool_t isDCAzCut=kFALSE;
+      if(TMath::Abs(DCAz)<DCAzCut) isDCAzCut=kTRUE;
+
+      if (!isDCAxyCut || !isDCAzCut)
+       continue;
+
+      //-------------------------------------end TRACK CUTS----------------------------------
+     
+      //-------------------------------------Track info--------------------------------------
+      Double_t phi= track->Phi();
+      Double_t charge = (Double_t)track->Charge();
+      Double_t p = track->P();
+      Double_t pt = track->Pt();
+      Double_t dedx = track->GetTPCsignal();
+      Double_t pTPC = track->GetTPCmomentum();
+      Double_t tof  = track->GetTOFsignal()-fPIDResponse->GetTOFResponse().GetStartTime(p);
+      Double_t beta = 0.0;
+      //Double_t M2 = 999.9;
+      //Double_t Z2 = 999.9;
+      
+      kTOF = (track->GetStatus() & AliVTrack::kTOFout) && (track->GetStatus() & AliVTrack::kTIME);
+      
+      //-----------------------------TPC info------------------------------
+      Double_t nsigmaTPC[nPart];
+      Double_t expdedx[nPart];
+      
+      Int_t stdFlagPid[9] = {1,2,4,8,16,32,64,128,256};//e,mu,pi,K,p,d,t,He3,He4
+      Int_t FlagPid = 0;
+      
+      for(Int_t iS=0;iS<9;iS++){
+       nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS);
+       //TPC identification:
+       if(TMath::Abs(nsigmaTPC[iS])<NsigmaTpcCut) {
+         FlagPid += ((Int_t)TMath::Power(2,iS));
+       }
+      }
+      
+      hEta[iBconf]->Fill(eta);
+      hPhi[iBconf]->Fill(phi);
+      
+      //More TPC info:
+      for(Int_t iS=0;iS<9;iS++){
+       expdedx[iS] = fPIDResponse->GetTPCResponse().GetExpectedSignal(track, (AliPID::EParticleType) iS, AliTPCPIDResponse::kdEdxDefault, kTRUE);
+       hDeDxExp[iBconf][iS]->Fill(pTPC,expdedx[iS]);
+       nsigmaTPC[iS] = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType) iS);
+       //fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]);
+       if(charge>0) {//positive particle
+         fNsigmaTpc[iBconf][iS]->Fill(pTPC,nsigmaTPC[iS]);
+       }
+       else {//negative particle
+         fNsigmaTpc[iBconf][iS+nPart]->Fill(pTPC,nsigmaTPC[iS]);
+       }
+      }
+          
+      if(charge>0) fdEdxVSp[iBconf][0]->Fill(pTPC,dedx);
+      else fdEdxVSp[iBconf][1]->Fill(pTPC,dedx);
+      
+      //ITS info
+      for(Int_t iS=0;iS<9;iS++){
+       if(FlagPid & stdFlagPid[iS]) {
+         if(pt<1.5) {
+           if(charge>0) {
+             h2DCAap[iBconf][iS]->Fill(DCAxy,DCAz);
+             h2DCAap[iBconf][iS]->Fill(-DCAxy,-DCAz);
+           }
+           else {
+             h2DCAap[iBconf][iS+nPart]->Fill(DCAxy,DCAz);
+             h2DCAap[iBconf][iS+nPart]->Fill(-DCAxy,-DCAz);
+           }
+         }
+       }
+      }
+      
+      //-----------------------------TOF info------------------------------
+      
+      Double_t massOverZ[9] = {0.000511,0.105658,0.139570,0.493677,0.938272,1.875612859,2.808921005,1.404195741,1.863689620};
+
+      //----------------------------------------kTOF available-----------------------------
+           
+      if(kTOF) {
+       
+       Double_t exptimes[9];
+       track->GetIntegratedTimes(exptimes);
+       //Integrated times of the Nuclei:
+       for(Int_t iN=5;iN<9;iN++) {
+         exptimes[iN] = exptimes[4]*exptimes[4]*(massOverZ[iN]*massOverZ[iN]/p/p+1)/(massOverZ[4]*massOverZ[4]/p/p+1);
+         exptimes[iN] = TMath::Sqrt(exptimes[iN]);
+       }  
+       
+       beta=exptimes[0];
+       beta=beta/tof;//beta = L/tof/c = t_e/tof
+       
+       Double_t nsigmaTOF[9];
+       for(Int_t iS=0;iS<9;iS++){
+         nsigmaTOF[iS] = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType) iS);
+         if(charge>0) {
+           hBetaExp[iBconf][iS]->Fill(p,exptimes[0]/exptimes[iS]);
+           fNsigmaTof[iBconf][iS]->Fill(pt,nsigmaTOF[iS]);
+         }
+         else {
+           hBetaExp[iBconf][iS+nPart]->Fill(p,exptimes[0]/exptimes[iS]);
+           fNsigmaTof[iBconf][iS+nPart]->Fill(pt,nsigmaTOF[iS]);
+         }
+       }
+       
+       if(charge>0) fBetaTofVSp[iBconf][0]->Fill(p,beta);
+       else fBetaTofVSp[iBconf][1]->Fill(p,beta);
+       
+       for(Int_t iS=0;iS<9;iS++){
+         if(charge>0) {
+           fTofMinusExp[iBconf][0][iS]->Fill(pt,tof-exptimes[iS]);
+           if(FlagPid & stdFlagPid[iS]) fTofMinusExp[iBconf][1][iS]->Fill(pt,tof-exptimes[iS]);
+         }
+         else {
+           fTofMinusExp[iBconf][0][iS+nPart]->Fill(pt,tof-exptimes[iS]);
+           if(FlagPid & stdFlagPid[iS]) fTofMinusExp[iBconf][1][iS+nPart]->Fill(pt,tof-exptimes[iS]);
+         }
+       }
+
+      }//end kTOF available
+    }//end track loop
+  }//end loop on the events
+}
+
+//_____________________________________________________________________________
+void AliAnalysisNucleiInfo::Terminate(Option_t *)
+{ 
+  // Terminate loop
+  Printf("Terminate()");
+}
diff --git a/PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.h b/PWGLF/SPECTRA/Nuclei/masses/AliAnalysisNucleiInfo.h
new file mode 100644 (file)
index 0000000..cd1be3b
--- /dev/null
@@ -0,0 +1,97 @@
+#ifndef ALIANALYSISNUCLEIINFO_H
+#define ALIANALYSISNUCLEIINFO_H
+
+// ROOT includes
+#include <TList.h>
+
+// AliRoot includes
+#include <AliAnalysisTaskSE.h>
+#include <AliPIDResponse.h>
+
+class AliAODEvent;
+class AliESDEvent;
+class AliVEvent;
+class TH2F;
+class TH2D;
+class TH1F;
+class TF1;
+class TF2;
+class TH2D;
+class TGraph;
+class AliESDtrackCuts;
+class TProfile;
+class TFile;
+class TObject;
+
+class AliAnalysisNucleiInfo : public AliAnalysisTaskSE {
+ public:
+  AliAnalysisNucleiInfo();
+  AliAnalysisNucleiInfo(const char *name);
+  
+  virtual ~AliAnalysisNucleiInfo();
+  
+  virtual void   UserCreateOutputObjects();
+  virtual void   UserExec(Option_t *option);
+  virtual void   Terminate(Option_t *);
+
+
+  //Cuts on the tracks
+  void SetFilterBit(Int_t TestFilterBit=16) {FilterBit=TestFilterBit;}
+  //Geometrical cuts
+  void SetEtaLimit(Double_t etaMin=-0.8, Double_t etaMax=0.8) {EtaLimit[0]=etaMin;EtaLimit[1]=etaMax;}
+  void SetDCACut(Double_t DCAxyCUT=1000.0, Double_t DCAzCUT=1000.0) {DCAxyCut=DCAxyCUT; DCAzCut=DCAzCUT;}
+  //Other cuts 
+  void SetNsigmaTPCCut(Double_t nSigmaTpcCut=2) {NsigmaTpcCut=nSigmaTpcCut;}
+  
+ private:
+  AliAnalysisNucleiInfo(const AliAnalysisNucleiInfo &old); 
+  AliAnalysisNucleiInfo& operator=(const AliAnalysisNucleiInfo &source);
+    
+  static const Int_t nBconf=2;                     // Number of Magnetic field configuration (B++ and B--)
+  static const Int_t nPart=9;                      // Number of particle type: e,mu,pi,K...
+  static const Int_t nSpec=18;                     // Number of particle species: particles: e+,e-,mu+,mu-,...
+    
+  //Variables settings with public methods:
+  Int_t FilterBit;                                 // Filter Bit to be used
+  Double_t EtaLimit[2];                            // Eta windows in analysis
+  Double_t DCAxyCut;                               // Cut on DCA-xy
+  Double_t DCAzCut;                                // Cut on DCA-z
+  Double_t NsigmaTpcCut;                           // number of sigma Tpc Cut
+  
+  //other:
+  Int_t iBconf;                                   //! If Magnetic Field configuration is down or up
+  Bool_t kTOF;                                    //! kTOFout and kTIME required
+  
+  static const Int_t iTriggerSel=0;             // -99->no trigger required ; 0-> if kMB ; 16-> if kCentral ; 17-> if kSemiCentral ; -2 -> No MB, No Central and No SemiCentral  
+
+  AliAODEvent* fAOD;                              //! AOD object
+  AliESDEvent* fESD;                              //! ESD object
+  AliVEvent* fEvent;                              //! general object
+  AliPIDResponse *fPIDResponse;                   //! pointer to PID response
+  TList *fList[nBconf];                           //! lists for slot
+  
+  TH1I *htriggerbits[nBconf][2];                  //! Trigger bits distribution
+  TH1F *htemp[nBconf];                            //! Temp. plot: avoid a problem with the merge of the output when a TList is empty (of the opposite magnetic field configuration)
+  TH1F *hZvertex[nBconf][2];                      //! z-vertex distribution before and after the cuts on the event
+  
+  TH1F *hEta[nBconf];                             //! Eta distribution of the tracks
+  TH1F *hPhi[nBconf];                             //! Phi particle distribution
+  
+  //TPC info:
+  TH2F *fdEdxVSp[nBconf][2];                      //! dedx vs pTpc
+  TProfile *hDeDxExp[nBconf][9];                  //! TPC spline used
+  TH2F *fNsigmaTpc[nBconf][18];                   //! NsigmaTPC vs. pTpc
+  
+  //TOF info:
+  TH2F *fBetaTofVSp[nBconf][2];                   //! beta vs pVtx
+  TProfile *hBetaExp[nBconf][9];                  //! TOF expected beta
+  TH2F *fNsigmaTof[nBconf][18];                   //! NsigmaTOF vs. pT
+  TH2F *fTofMinusExp[nBconf][2][18];              //! tof-t_exp w/o tpc
+  
+  //ITS info:
+  TH2F *h2DCAap[nBconf][18];                      //! DCAxy vs DCAz with NsigmaTpcCut for each particle species
+  
+  ClassDef(AliAnalysisNucleiInfo, 1);
+};
+
+#endif