]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Add a task for some studies on nuclei
authorlramona <Ramona.Lea@cern.ch>
Fri, 6 Jun 2014 17:16:35 +0000 (19:16 +0200)
committerlramona <Ramona.Lea@cern.ch>
Fri, 6 Jun 2014 17:16:35 +0000 (19:16 +0200)
PWGLF/CMakelibPWGLFSTRANGENESS.pkg
PWGLF/PWGLFSTRANGENESSLinkDef.h
PWGLF/STRANGENESS/Hypernuclei/AddTaskNucleiv2.C [new file with mode: 0644]
PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.cxx [new file with mode: 0644]
PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.h [new file with mode: 0644]

index 9a874214976303d50614aa4791a1a7b67cd494fe..f2d42269ee108b2c0725bf853f14a084cc5f51bd 100644 (file)
@@ -65,7 +65,7 @@ set ( SRCS
   STRANGENESS/Hypernuclei/AliAnalysisTaskESDNuclExFilterMC.cxx
   STRANGENESS/Hypernuclei/AliAnalysisTaskReadNuclexAOD.cxx
   STRANGENESS/Hypernuclei/AliAnalysisTaskAntiHe4.cxx
+  STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.cxx
 
 )
 
index 9c0bca2045e1138217edecfadba01879d7f9ebb6..298103edaea10e8ade4240662b980c349722f7ae 100644 (file)
@@ -44,4 +44,5 @@
 #pragma link C++ class AliAnalysisTaskESDNuclExFilterMC+;
 #pragma link C++ class AliAnalysisTaskReadNuclexAOD+;
 #pragma link C++ class AliAnalysisTaskAntiHe4+;
+#pragma link C++ class AliAnalysisTaskNucleiv2+;
 #endif
diff --git a/PWGLF/STRANGENESS/Hypernuclei/AddTaskNucleiv2.C b/PWGLF/STRANGENESS/Hypernuclei/AddTaskNucleiv2.C
new file mode 100644 (file)
index 0000000..11c1c17
--- /dev/null
@@ -0,0 +1,38 @@
+AliAnalysisTask *AddTaskNucleiv2(TString name="name",TString eventtype="REAL"){
+
+  //get the current analysis manager
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  if (!mgr) {
+    Error("AddTask_Helium3Pi", "No analysis manager found.");
+    return 0;
+  }
+  
+  //========= Add task to the ANALYSIS manager =====
+
+  AliAnalysisTaskNucleiv2 *task = new   AliAnalysisTaskNucleiv2(name,eventtype);
+  task->SetDataType(eventtype);
+  mgr->AddTask(task);
+  
+  //================================================
+  //              data containers
+  //================================================
+  //            find input container
+
+  AliAnalysisDataContainer *cinput   = mgr->GetCommonInputContainer();
+  
+  TString outputFileName = AliAnalysisManager::GetCommonFileName();
+  //AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("Helium3Pi_tree", TTree::Class(), AliAnalysisManager::kOutputContainer, "AnalysisResults.root");  
+  //AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("Helium3Pi_tree", TTree::Class(), AliAnalysisManager::kOutputContainer, "AnalysisResults.root");  
+
+  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("clisthist", TList::Class(), AliAnalysisManager::kOutputContainer, outputFileName);
+  AliAnalysisDataContainer *coutput2 = mgr->CreateContainer("treeNuclei", TTree::Class(),AliAnalysisManager::kOutputContainer, outputFileName);
+  AliAnalysisDataContainer *coutput3 = mgr->CreateContainer("treeMC" , TTree::Class(),AliAnalysisManager::kOutputContainer   , outputFileName);
+
+    //           connect containers
+  mgr->ConnectInput  (task,  0, cinput );
+  mgr->ConnectOutput (task,  1, coutput1);
+  mgr->ConnectOutput (task,  2, coutput2);
+  mgr->ConnectOutput (task,  3, coutput3);
+
+  return task;
+}
diff --git a/PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.cxx b/PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.cxx
new file mode 100644 (file)
index 0000000..91f0b75
--- /dev/null
@@ -0,0 +1,915 @@
+/**************************************************************************
+ * Contributors are not mentioned at all.                                 *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright noticxse appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+//-----------------------------------------------------------------
+//                 AliAnalysisTaskNucleiv2 class
+//-----------------------------------------------------------------
+
+class TTree;
+class TParticle;
+class TVector3;
+
+#include "AliAnalysisManager.h"
+#include <AliMCEventHandler.h>
+#include <AliMCEvent.h>
+#include <AliStack.h>
+
+class AliESDVertex;
+class AliAODVertex;
+class AliESDv0;
+class AliAODv0; 
+class AliCascadeVertexer;
+
+#include <iostream>
+
+#include "TList.h"
+#include "TH1.h"
+#include "TH2.h"
+#include "TH3.h"
+#include "TNtuple.h"
+#include "TGraph.h"
+#include "TF1.h"
+#include "TCanvas.h"
+#include "TMath.h"
+#include "TChain.h"
+#include "Riostream.h"
+#include "AliLog.h"
+#include "AliCascadeVertexer.h"
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+#include "AliExternalTrackParam.h"
+#include "AliAODEvent.h"
+#include "AliInputEventHandler.h"
+#include "AliESDcascade.h"
+#include "AliAODcascade.h"
+#include "AliAnalysisTaskNucleiv2.h"
+#include "AliESDtrackCuts.h"
+#include "AliCentrality.h"
+
+ClassImp(AliAnalysisTaskNucleiv2)
+    
+//________________________________________________________________________
+AliAnalysisTaskNucleiv2::AliAnalysisTaskNucleiv2() 
+: AliAnalysisTaskSE(), 
+  fAnalysisType("ESD"), 
+  fCollidingSystems(0), 
+  fDataType("REAL"),
+  fListHistCascade(0), 
+  fHistEventMultiplicity(0), 
+  fHistTrackMultiplicity(0),
+  fHistTrackMultiplicityCentral(0),    
+  fHistTrackMultiplicitySemiCentral(0),
+  fHistTrackMultiplicityMB(0),
+  fhBB(0),
+  fhBBDeu(0),
+  fhPtDeu(0),
+  fhTOF(0),
+  fhMassTOF(0),
+  hRPangleTPCvsCentrality(0),
+  hPlaneResoTPCvsCentrality(0),
+  hRPangleVZEROvsCentrality(0),
+  hPlaneResoVZEROvsCentrality(0),
+  fESDtrackCuts(0),
+  fPIDResponse(0),
+  fNtuple1(0),
+  tCentrality(0),
+  tTPCMomentum(0),      
+  tdEdx(0),             
+  tEta(0),              
+  tITSclustermap(0),    
+  tCharge(0),           
+  tPtCorr(0),           
+  tPhi(0),              
+  trpangleTPC(0),       
+  tPDGCode(0),          
+  tPDGCodeMum(0),       
+  tIsPrimaryTr(0),
+  fNtuple2(0) ,
+  tCentralityMC(0),
+  tPDGCodeMC(0),
+  tPDGCodeMumMC(0),
+  tIsPrimary(0),
+  tEtaMC(0),
+  tPtMC(0),
+  tYMC(0)
+{
+  // Dummy Constructor 
+  fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
+  //
+  Initialize();
+}
+
+//________________________________________________________________________
+AliAnalysisTaskNucleiv2::AliAnalysisTaskNucleiv2(const char *name,const char *datatype) 
+  : AliAnalysisTaskSE(name), 
+    fAnalysisType("ESD"), 
+    fCollidingSystems(0), 
+    fDataType(datatype),
+    fListHistCascade(0), 
+    fHistEventMultiplicity(0), 
+    fHistTrackMultiplicity(0),
+    fHistTrackMultiplicityCentral(0),    
+    fHistTrackMultiplicitySemiCentral(0),
+    fHistTrackMultiplicityMB(0),
+    fhBB(0),
+    fhBBDeu(0),
+    fhPtDeu(0),
+    fhTOF(0),
+    fhMassTOF(0),
+    hRPangleTPCvsCentrality(0),
+    hPlaneResoTPCvsCentrality(0),
+    hRPangleVZEROvsCentrality(0),
+    hPlaneResoVZEROvsCentrality(0),
+    fESDtrackCuts(0),
+    fPIDResponse(0),
+    fNtuple1(0),
+    tCentrality(0),
+    tTPCMomentum(0),      
+    tdEdx(0),             
+    tEta(0),              
+    tITSclustermap(0),    
+    tCharge(0),           
+    tPtCorr(0),           
+    tPhi(0),              
+    trpangleTPC(0),       
+    tPDGCode(0),          
+    tPDGCodeMum(0),       
+    tIsPrimaryTr(0),
+    fNtuple2(0) ,
+    tCentralityMC(0),
+    tPDGCodeMC(0),
+    tPDGCodeMumMC(0),
+    tIsPrimary(0),
+    tEtaMC(0),
+    tPtMC(0),
+    tYMC(0)
+    
+{
+  // Define input and output slots here
+  // Input slot #0 works with a TChain
+  //DefineInput(0, TChain::Class());
+  // Output slot #0 writes into a TList container (Cascade)
+
+  //
+  // create track cuts
+  //
+  fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
+  //
+  Initialize();
+
+  DefineInput(0, TChain::Class());
+  
+  DefineOutput(1, TList::Class());
+  DefineOutput(2, TTree::Class());
+  DefineOutput(3, TTree::Class());
+
+}
+
+void AliAnalysisTaskNucleiv2::Initialize()
+{
+  //
+  // updating parameters in case of changes
+  //
+  fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE,kTRUE);
+  fESDtrackCuts->SetMaxDCAToVertexXY(3);
+  fESDtrackCuts->SetMaxDCAToVertexZ(2);
+  fESDtrackCuts->SetEtaRange(-0.8,0.8);
+  //
+  //
+  //  Printf("Initizialize\n");
+}
+
+//________________________________________________________________________
+Float_t AliAnalysisTaskNucleiv2::GetPhi0Pi(Float_t phi){
+  // Sets the phi angle in the range 0-pi
+  Float_t result=phi;
+  while(result<0){
+    result=result+TMath::Pi();
+  }
+  while(result>TMath::Pi()){
+    result=result-TMath::Pi();
+  }
+   return result;
+}
+
+
+//==================DEFINITION OF OUTPUT OBJECTS==============================
+
+void AliAnalysisTaskNucleiv2::UserCreateOutputObjects()
+{
+  fListHistCascade = new TList();
+  fListHistCascade->SetOwner();  // IMPORTANT!
+
+  if(! fHistEventMultiplicity ){
+
+    fHistEventMultiplicity   = new TH1F( "fHistEventMultiplicity" , "Nb of Events" , 12 , -0.5,11.5);
+
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(1,"All Events");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(2,"Events w/PV");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(3,"Events w/|Vz|<10cm");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(4,"Central Events");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(5,"Semi-Central Events");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(6,"MB Events");
+    //from HF
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(7,"nEventsAnal");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(8,"nEvSelected");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(9,"nCandidatesSelected");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(10,"out of pt bounds");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(11,"mismatch lab");
+    fHistEventMultiplicity->GetXaxis()->SetBinLabel(12,"non valid TPC EP");
+    fListHistCascade->Add(fHistEventMultiplicity);
+  }
+
+  if(! fHistTrackMultiplicity ){
+    fHistTrackMultiplicity  = new TH2F( "fHistTrackMultiplicity", "Nb of Tracks MB Events |Vz| < 10", 25000,0, 25000,105,-0.5,104.5);
+    fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
+    fHistTrackMultiplicity->GetYaxis()->SetTitle("Percentile");
+    fListHistCascade->Add(fHistTrackMultiplicity);
+  } 
+
+  if(! fHistTrackMultiplicityCentral ){
+    fHistTrackMultiplicityCentral  = new TH2F( "fHistTrackMultiplicityCentral", "Nb of Tracks MB Events |Vz| < 10", 25000,0, 25000,105,-0.5,104.5);
+    fHistTrackMultiplicityCentral->GetXaxis()->SetTitle("Number of tracks");
+    fHistTrackMultiplicityCentral->GetYaxis()->SetTitle("Percentile");
+    fListHistCascade->Add(fHistTrackMultiplicityCentral);
+  } 
+  if(! fHistTrackMultiplicitySemiCentral ){
+    fHistTrackMultiplicitySemiCentral  = new TH2F( "fHistTrackMultiplicitySemiCentral", "Nb of Tracks MB Events |Vz| < 10", 25000,0, 25000,105,-0.5,104.5);
+    fHistTrackMultiplicitySemiCentral->GetXaxis()->SetTitle("Number of tracks");
+    fHistTrackMultiplicitySemiCentral->GetYaxis()->SetTitle("Percentile");
+    fListHistCascade->Add(fHistTrackMultiplicitySemiCentral);
+  } 
+  if(! fHistTrackMultiplicityMB ){
+    fHistTrackMultiplicityMB  = new TH2F( "fHistTrackMultiplicityMB", "Nb of Tracks MB Events |Vz| < 10", 25000,0, 25000,105,-0.5,104.5);
+    fHistTrackMultiplicityMB->GetXaxis()->SetTitle("Number of tracks");
+    fHistTrackMultiplicityMB->GetYaxis()->SetTitle("Percentile");
+    fListHistCascade->Add(fHistTrackMultiplicityMB);
+  } 
+  if(! fhBB ){
+    fhBB = new TH2F( "fhBB" , "BetheBlochTPC" , 240,-6,6,1000,0,1000);
+    fListHistCascade->Add(fhBB);
+  }
+  
+  if(! fhBBDeu ){
+    fhBBDeu = new TH2F( "fhBBDeu" , "BetheBlochTPC - Deuteron" , 240,-6,6,1000,0,1000);
+    fListHistCascade->Add(fhBBDeu);
+  }
+  if(!fhPtDeu  ){
+    fhPtDeu = new TH2F( "fhPtDeu" , "pt corretto vs pt track - Deuteron" , 120,0,6,120,0,6);
+    fListHistCascade->Add(fhPtDeu);
+  }
+
+  if(! fhTOF ){
+    fhTOF = new TH2F( "fhTOF" , "Scatter Plot TOF" , 240,-6,6,1000,0,1.2);
+    fListHistCascade->Add(fhTOF);
+  }
+  if(! fhMassTOF){
+    fhMassTOF=new TH1F ("fhMassTOF","Particle Mass - TOF", 300,-5 ,5);
+    fListHistCascade->Add(fhMassTOF);
+  }
+  
+  if(!hRPangleTPCvsCentrality){
+    hRPangleTPCvsCentrality     = new TH2F("hRPangleTPCvsCentrality"    ,"hRPangleTPCvsCentrality"    ,100,0,TMath::Pi(),210,-0.5,105.5);
+    fListHistCascade->Add(hRPangleTPCvsCentrality);
+  }
+  if(!hPlaneResoTPCvsCentrality){
+    hPlaneResoTPCvsCentrality   = new TH2F("hPlaneResoTPCvsCentrality"  ,"hPlaneResoTPCvsCentrality"  ,500,-1,1,210,-0.5,105.5);
+    fListHistCascade->Add(hPlaneResoTPCvsCentrality);
+  }
+  if(!hRPangleVZEROvsCentrality){
+    hRPangleVZEROvsCentrality   = new TH2F("hRPangleVZEROvsCentrality"  ,"hRPangleVZEROvsCentrality"  ,100,0,TMath::Pi(),210,-0.5,105.5);
+    fListHistCascade->Add(hRPangleVZEROvsCentrality);
+  }
+  if(!hPlaneResoVZEROvsCentrality){
+    hPlaneResoVZEROvsCentrality = new TH2F("hPlaneResoVZEROvsCentrality","hPlaneResoVZEROvsCentrality",500,-1,1,210,-0.5,105.5);
+    fListHistCascade->Add(hPlaneResoVZEROvsCentrality);
+  }
+
+
+
+  if(! fNtuple1 ) {
+
+    fNtuple1 = new TTree("fNtuple1","fNtuple1");
+    fNtuple1->Branch("tEventNumber"  ,&tEventNumber  ,"tEventNumber[7]/D");
+    fNtuple1->Branch("tCentrality"   ,&tCentrality   ,"tCentrality/D"    );
+    fNtuple1->Branch("tVertexCoord"  ,&tVertexCoord  ,"tVertexCoord[3]/D");
+    fNtuple1->Branch("tPIDITS"       ,&tPIDITS       ,"tPIDITS[9]/D"     );
+    fNtuple1->Branch("tPIDTPC"       ,&tPIDTPC       ,"tPIDTPC[9]/D"     );
+    fNtuple1->Branch("tPIDTOF"       ,&tPIDTOF       ,"tPIDTOF[9]/D"     );
+    fNtuple1->Branch("tPulls"        ,&tPulls        ,"tPulls[2]/D"   );
+    fNtuple1->Branch("tMomentum"     ,&tMomentum     ,"tMomentum[3]/D"   );
+    fNtuple1->Branch("tTPCMomentum"  ,&tTPCMomentum  ,"tTPCMomentum/D"   );
+    fNtuple1->Branch("tdEdx"        ,&tdEdx         ,"tdEdx/D"          );
+    fNtuple1->Branch("tEta"         ,&tEta          ,"tEta/D"           );
+    fNtuple1->Branch("tDCA"         ,&tDCA          ,"tDCA[2]/D"        );
+    fNtuple1->Branch("tTracksTPC"    ,&tTracksTPC    ,"tTracksTPC[2]/D"  );
+    fNtuple1->Branch("tITSclustermap",&tITSclustermap,"tITSclustermap"   );
+    fNtuple1->Branch("tITSsample"    ,&tITSsample    ,"tITSsample[4]/D"  );
+    fNtuple1->Branch("tisTOF[2]"     ,&tisTOF       ,"tisTOF[2]/I"      );
+    fNtuple1->Branch("tTOFtrack"     ,&tTOFtrack     ,"tTOFtrack[3]/D"   );
+    fNtuple1->Branch("tCharge"       ,&tCharge       ,"tCharge/I"        );
+    fNtuple1->Branch("tPtCorr"       ,&tPtCorr       ,"tPtCorr/D"        );
+    fNtuple1->Branch("tPhi"          ,&tPhi          ,"tPhi/D"           );
+    fNtuple1->Branch("trpangleTPC"   ,&trpangleTPC   ,"trpangleTPC/D"    );
+    fNtuple1->Branch("trpangleVZERO" ,&trpangleVZERO ,"trpangleVZERO[3]/D"  );
+    if(fDataType == "SIM"){
+      fNtuple1->Branch("tPDGCode"      ,&tPDGCode      ,"tPDGCode/D"       );
+      fNtuple1->Branch("tPDGCodeMum"   ,&tPDGCode      ,"tPDGCodeMum/D"    );
+      fNtuple1->Branch("tIsPrimaryTr"  ,&tIsPrimaryTr  ,"tIsPrimaryTr/D"   );
+      fNtuple1->Branch("tIsSecondaryTr",&tIsSecondaryTr,"tIsSecondaryTr[2]/D" );
+    }
+     
+  }
+
+
+  
+  
+  if(fDataType == "SIM"){
+  
+    if(! fNtuple2 ) {
+      
+      fNtuple2 = new TTree("fNtuple2","fNtuple2");
+      
+      fNtuple2->Branch("tEventNumberMC"  ,&tEventNumberMC  ,"tEventNumberMC[6]/D");
+      fNtuple2->Branch("tCentralityMC"   ,&tCentralityMC   ,"tCentralityMC/D"    );
+      fNtuple2->Branch("tVertexCoordMC"  ,&tVertexCoordMC  ,"tVertexCoordMC[3]/D");
+      fNtuple2->Branch("tMomentumMC"     ,&tMomentumMC     ,"tMomentumMC[3]/D"   );
+      fNtuple2->Branch("tPDGCodeMC"      ,&tPDGCodeMC      ,"tPDGCodeMC/D"       );
+      fNtuple2->Branch("tPDGCodeMumMC"   ,&tPDGCodeMC      ,"tPDGCodeMumMC/D"    );
+      fNtuple2->Branch("tIsPrimary"      ,&tIsPrimary      ,"tIsPrimary/D"       );
+      fNtuple2->Branch("tIsSecondary"    ,&tIsSecondary    ,"tIsSecondary[2]/D"     );
+      fNtuple2->Branch("tEtaMC"          ,&tEtaMC         ,"tEtaMC/D"         );
+      fNtuple2->Branch("tPtMC"           ,&tPtMC          ,"tPtMC/D"          );
+      fNtuple2->Branch("tYMC"            ,&tYMC                   ,"tYMC/D"           );
+
+    } 
+    
+  }
+
+  PostData(1,  fListHistCascade);
+  PostData(2,  fNtuple1);
+  PostData(3,  fNtuple2);
+}// end UserCreateOutputObjects
+
+
+//====================== USER EXEC ========================
+
+void AliAnalysisTaskNucleiv2::UserExec(Option_t *) 
+{
+  // Main loop
+  // Called for EACH event
+  //  cout<<"AliAnalysisTaskNucleiv2 Starting UserExec"<<endl;
+
+  Info("AliAnalysisTaskNucleiv2","Starting UserExec");  
+  
+  AliVEvent *event = InputEvent();
+  if (!event) { Printf("ERROR: Could not retrieve event"); return; }
+  
+  AliStack *stack = 0;
+  if(fDataType == "SIM"){
+    
+    AliMCEvent *mcEvent = MCEvent();
+    if (!mcEvent) { 
+      Printf("ERROR: Could not retrieve MC event"); 
+      return; 
+    }
+    Printf("MC particles: %d", mcEvent->GetNumberOfTracks());
+    stack = mcEvent->Stack();
+    if( !stack ) { 
+      Printf( "Stack not available"); 
+      return; 
+    }
+  }
+  
+  // create pointer to event
+  
+  AliESDEvent* lESDevent = dynamic_cast<AliESDEvent*>(event);
+  if (!lESDevent) {
+    AliError("Cannot get the ESD event");
+    return;
+  }  
+
+  fHistEventMultiplicity->Fill(1);
+  fHistEventMultiplicity->Fill(7);
+  
+  //_____________________________________________________
+  //   Centrality  
+  
+  AliCentrality *centrality = lESDevent->GetCentrality();
+  Float_t percentile=centrality->GetCentralityPercentile("V0M");
+
+  Int_t TrackNumber = lESDevent->GetNumberOfTracks();
+  fHistTrackMultiplicity->Fill(TrackNumber,percentile); //tracce per evento
+  
+  //______________________________________________________
+  // PID
+  
+  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
+  fPIDResponse=inputHandler->GetPIDResponse(); 
+  
+  //=================================================================
+  
+  //!*********************!//
+  //!  Define variables   !//
+  //!*********************!//
+  
+  Double_t evNumber     = 0.;
+  Double_t runNumber    = 0.;
+  Double_t BCNumber     = 0.;
+  Double_t OrbitNumber  = 0.;
+  Double_t PeriodNumber = 0.;
+
+  
+  Double_t ITSsample[4];
+  for(Int_t i=0;i<4;i++)ITSsample[i]=0;
+  
+  Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
+  Float_t impactXY=-999., impactZ=-999.;
+  Double_t pinTPC=0.,poutTPC=0.,TPCSignal=0.;
+  
+  ULong_t  status=0;
+  Bool_t   isTPC=kFALSE;
+
+    
+  // Primary vertex cut
+  
+  const AliESDVertex *vtx = lESDevent->GetPrimaryVertexTracks();
+  
+  if(vtx->GetNContributors()<1) {
+    
+    // SPD vertex cut
+    vtx = lESDevent->GetPrimaryVertexSPD();
+    
+    if(vtx->GetNContributors()<1) {
+      Info("AliAnalysisTaskHelium3Pi","No good vertex, skip event");
+      return; // NO GOOD VERTEX, SKIP EVENT 
+    }
+  }
+  
+  fHistEventMultiplicity->Fill(2); // analyzed events with PV
+  
+  xPrimaryVertex=vtx->GetXv();
+  yPrimaryVertex=vtx->GetYv();
+  zPrimaryVertex=vtx->GetZv();  
+
+  if(TMath::Abs(zPrimaryVertex)>10) return;
+  fHistEventMultiplicity->Fill(3);
+
+  Bool_t isSelectedCentral     = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
+  Bool_t isSelectedSemiCentral = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
+  Bool_t isSelectedMB          = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
+  
+  fHistTrackMultiplicity->Fill(TrackNumber,percentile); 
+  
+  Int_t eventtype = -999;
+  
+  //  cout<<"ET 1: "<<eventtype<<endl;
+
+  if(fDataType == "REAL"){
+   
+    if(isSelectedCentral){
+      if(percentile<0)return;
+      if(percentile>=7.5)return;
+      fHistEventMultiplicity->Fill(4);
+      fHistTrackMultiplicityCentral->Fill(TrackNumber,percentile); 
+      eventtype =1;
+    }
+    
+    if(isSelectedSemiCentral){
+      if(percentile<15)return;
+      if(percentile>=50)return;
+      fHistEventMultiplicity->Fill(5);
+      fHistTrackMultiplicitySemiCentral->Fill(TrackNumber,percentile); 
+      eventtype =2;
+    }
+    
+    if(isSelectedMB){
+      if(percentile<0)return;
+      if(percentile>=80)return;
+      fHistEventMultiplicity->Fill(6);
+      fHistTrackMultiplicityMB->Fill(TrackNumber,percentile); 
+      eventtype =3;
+    }
+    
+    //    cout<<"ET 2: "<<eventtype<<endl;
+    
+    if(eventtype!=1 && eventtype!=2 && eventtype!=3 )return;
+  }
+  
+  if(fDataType == "SIM"){
+    cout<<"Take SIM event"<<endl;
+    eventtype = -999;
+    //cout<<"ET MC: "<<eventtype<<endl;
+    if(eventtype!=-999)return;
+      
+  }
+  
+  evNumber    = lESDevent->GetEventNumberInFile();
+  runNumber   = lESDevent->GetRunNumber(); 
+  BCNumber    = lESDevent->GetBunchCrossNumber();
+  OrbitNumber = lESDevent->GetOrbitNumber();
+  PeriodNumber= lESDevent->GetPeriodNumber();
+  
+  AliEventplane *pl=lESDevent->GetEventplane();
+  
+  if(fDataType == "REAL"){
+    
+    if(!pl ){
+      AliError("AliAnalysisTaskSENucleiv2::UserExec:no eventplane! v2 analysis without eventplane not possible!\n");
+      fHistEventMultiplicity->Fill(12);
+    }
+  }
+  
+  //Event plane
+  
+  Double_t rpangleTPC    =0;
+  Double_t rpangleVZERO  =0;
+  Double_t rpangleeventA =0;
+
+  Double_t rpangleeventBTPC =0;
+  Double_t rpangleeventATPC =0;
+  Double_t deltaPsiTPC      =0;
+  Double_t planeresoTPC     =0;
+
+  Double_t rpangleeventCVZERO =0;
+  Double_t rpangleeventBVZERO =0;
+  Double_t deltaPsiVZERO      =0;
+  Double_t planeresoVZERO     =0;
+
+  //For candidate removal from TPC EP
+
+  TVector2 *qsub1=0x0;
+  TVector2 *qsub2=0x0;
+
+  rpangleTPC   = pl->GetEventplane("Q");
+  
+  if(fDataType == "REAL"){
+    if(rpangleTPC<0){
+      fHistEventMultiplicity->Fill(11);
+      return;
+    }
+  }
+  
+  //TPC resolution --> Half or full it depends on the arguments od the add task
+  
+  rpangleeventA = rpangleTPC;
+  hRPangleTPCvsCentrality->Fill(rpangleTPC,percentile);
+
+  qsub1 = pl->GetQsub1();
+  qsub2 = pl->GetQsub2();
+
+  if(fDataType == "REAL"){  
+    if(!qsub1 || !qsub2){
+      AliError("AliAnalysisTaskSENucleiv2::UserExec:no qsub1 or qsub2!\n");
+      return;
+    }
+    //TPC event Plane
+    
+    rpangleeventATPC = qsub1->Phi()/2.;
+    rpangleeventBTPC = qsub2->Phi()/2.;
+    
+    deltaPsiTPC =rpangleeventATPC-rpangleeventBTPC;
+    
+    if(TMath::Abs(deltaPsiTPC)>TMath::Pi()/2.){
+      if(deltaPsiTPC>0.) deltaPsiTPC-=TMath::Pi();
+      else deltaPsiTPC +=TMath::Pi();
+    } // difference of subevents reaction plane angle cannot be bigger than phi/2
+    
+    planeresoTPC = TMath::Cos(2.*deltaPsiTPC); // reaction plane resolution
+    
+    hPlaneResoTPCvsCentrality->Fill(planeresoTPC,percentile);
+  
+    //VZERO event plane : Use events with eta>0 
+  
+    rpangleVZERO = GetPhi0Pi(pl->GetEventplane("V0",lESDevent,2));
+    hRPangleVZEROvsCentrality->Fill(rpangleVZERO,percentile);
+
+    rpangleeventCVZERO=rpangleVZERO;
+    rpangleeventBVZERO=GetPhi0Pi(pl->GetEventplane("V0A",lESDevent,2));
+    rpangleeventCVZERO=GetPhi0Pi(pl->GetEventplane("V0C",lESDevent,2));
+
+    deltaPsiVZERO =rpangleeventATPC-rpangleeventBVZERO;
+
+    if(TMath::Abs(deltaPsiVZERO)>TMath::Pi()/2.){
+      if(deltaPsiVZERO>0.) deltaPsiVZERO-=TMath::Pi();
+      else deltaPsiVZERO +=TMath::Pi();
+    } // difference of subevents reaction plane angle cannot be bigger than phi/2
+  
+    planeresoVZERO = TMath::Cos(2.*deltaPsiVZERO);
+
+    hPlaneResoVZEROvsCentrality->Fill(planeresoVZERO,percentile);
+
+    if(TMath::Abs(rpangleTPC-rpangleVZERO)>10)return;
+  
+    trpangleTPC      = rpangleTPC;
+    trpangleVZERO[0] = rpangleVZERO;
+    trpangleVZERO[1] = rpangleeventBVZERO;
+    trpangleVZERO[2] = rpangleeventCVZERO;
+  }
+  // cout<<"rpangle TPC: "<<rpangleTPC<<endl;
+  
+  Int_t isTOF=0;
+  Int_t isoutTPC=0;
+  //  cout<<"TRack number MC "<<TrackNumber<<endl;
+  for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
+    
+    AliESDtrack *esdtrack=lESDevent->GetTrack(j);
+    if (!fESDtrackCuts->AcceptTrack(esdtrack)) continue;
+  
+    status  = (ULong_t)esdtrack->GetStatus();
+    
+    isTPC    = (((status) & AliESDtrack::kTPCin)   != 0);
+    isTOF    = ((((status) & AliESDtrack::kTOFout) != 0) && (((status) & AliESDtrack::kTIME) != 0));
+    isoutTPC = (((status) & AliESDtrack::kTPCout)  != 0);
+    
+    TPCSignal=esdtrack->GetTPCsignal(); 
+
+    if (TPCSignal<10)continue;
+    if (TPCSignal>1000)continue;
+    if (!isTPC)continue;
+      
+    if(!esdtrack->GetTPCInnerParam())continue;
+    AliExternalTrackParam trackIn(*esdtrack->GetInnerParam()); 
+    pinTPC= trackIn.GetP(); 
+
+    fhBB->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
+
+    if(isTOF){
+      if(!esdtrack->GetOuterParam())continue;    
+      AliExternalTrackParam trackOut(*esdtrack->GetOuterParam()); 
+      poutTPC = trackOut.GetP();  
+      fhTOF->Fill(poutTPC*esdtrack->GetSign(),(esdtrack->GetIntegratedLength()/esdtrack->GetTOFsignal())/2.99792458e-2);
+    
+    }
+
+    Int_t   fIdxInt[200]; //dummy array
+    Int_t   nClustersTPC = esdtrack->GetTPCclusters(fIdxInt);
+    Float_t chi2PerClusterTPC = esdtrack->GetTPCchi2()/(Float_t)(nClustersTPC);
+
+    esdtrack->GetImpactParameters(impactXY, impactZ);
+
+    Float_t deutExp  = -999;
+    Float_t hel3Exp  = -999;
+  
+    if(fDataType == "REAL"){
+      deutExp  = AliExternalTrackParam::BetheBlochAleph(pinTPC/(0.938*2),1.45802,27.4992,4.00313e-15,2.48485,8.31768);
+      hel3Exp = 4*AliExternalTrackParam::BetheBlochAleph(2*pinTPC/(0.938*3),1.74962,27.4992,4.00313e-15,2.42485,8.31768);
+    }
+
+    if(fDataType == "SIM"){
+      Double_t parMC[5] = {1.17329, 27.4992, 4.00313e-15, 2.1204316, 4.1373729}; // NEW!!!
+      deutExp = AliExternalTrackParam::BetheBlochAleph(pinTPC/(0.938*2),parMC[0],parMC[1],parMC[2],parMC[3],parMC[4]);
+      hel3Exp = 4*AliExternalTrackParam::BetheBlochAleph(2*pinTPC/(0.938*3),parMC[0],parMC[1],parMC[2],parMC[3],parMC[4]);
+    }
+    
+    Double_t pullTPC = (TPCSignal - deutExp)/(0.07*deutExp);
+    Double_t pullTPChel3 = (TPCSignal - hel3Exp)/(0.07*hel3Exp);
+  
+    tPulls[0] = pullTPC;
+    tPulls[1] = pullTPChel3;
+
+    //Fill the tree
+
+    tEventNumber[0] = evNumber    ;
+    tEventNumber[1] = runNumber   ;
+    tEventNumber[2] = BCNumber    ;
+    tEventNumber[3] = OrbitNumber ;
+    tEventNumber[4] = PeriodNumber;
+    tEventNumber[5] = TrackNumber;
+    tEventNumber[6] = eventtype ;
+
+    tCentrality = percentile;
+        
+    tVertexCoord[0] = xPrimaryVertex;
+    tVertexCoord[1] = yPrimaryVertex;
+    tVertexCoord[2] = zPrimaryVertex;
+
+    // bbtheo = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 7);
+
+    tPIDITS[0] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 0);
+    tPIDITS[1] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 1);
+    tPIDITS[2] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 2);
+    tPIDITS[3] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 3);
+    tPIDITS[4] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 4);
+    tPIDITS[5] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 5);
+    tPIDITS[6] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 6);
+    tPIDITS[7] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 7);
+    tPIDITS[8] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 8);
+
+    tPIDTPC[0] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 0);
+    tPIDTPC[1] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 1);
+    tPIDTPC[2] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 2);
+    tPIDTPC[3] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 3);
+    tPIDTPC[4] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 4);
+    tPIDTPC[5] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 5);
+    tPIDTPC[6] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 6);
+    tPIDTPC[7] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 7);
+    tPIDTPC[8] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)1,esdtrack,(AliPID::EParticleType) 8);
+
+    tPIDTOF[0] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 0);
+    tPIDTOF[1] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 1);
+    tPIDTOF[2] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 2);
+    tPIDTOF[3] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 3);
+    tPIDTOF[4] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 4);
+    tPIDTOF[5] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 5);
+    tPIDTOF[6] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 6);
+    tPIDTOF[7] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 7);
+    tPIDTOF[8] = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)3,esdtrack,(AliPID::EParticleType) 8);
+
+    tMomentum[0] = esdtrack->Px();
+    tMomentum[1] = esdtrack->Py();
+    tMomentum[2] = esdtrack->Pz();
+    
+    tTPCMomentum = pinTPC;
+    tEta         = esdtrack->Eta();
+    tdEdx        = TPCSignal;
+    tDCA[0]      = impactXY;
+    tDCA[1]      = impactZ;
+
+    // if(nClustersTPC<80)
+    //   cout<<"!!!!! TPC cls: "<<nClustersTPC<<endl;
+
+    tTracksTPC[0] = chi2PerClusterTPC;
+    tTracksTPC[1] = nClustersTPC;
+
+    tITSclustermap = esdtrack->GetITSClusterMap();
+    esdtrack->GetITSdEdxSamples(ITSsample);
+    tITSsample[0] = ITSsample[0];
+    tITSsample[1] = ITSsample[1];
+    tITSsample[2] = ITSsample[2];
+    tITSsample[3] = ITSsample[3];
+
+    tisTOF[0] = isTOF;
+    tisTOF[1] = isoutTPC;
+    Double_t p = esdtrack->P();
+    Double_t tof = esdtrack->GetTOFsignal()-fPIDResponse->GetTOFResponse().GetStartTime(p);
+
+    tTOFtrack[0] = poutTPC;
+    tTOFtrack[1] = tof;    //esdtrack->GetTOFsignal();         //ps = Time
+    tTOFtrack[2] = esdtrack->GetIntegratedLength(); //cm
+    
+    tCharge =  esdtrack->Charge();
+    tPhi    =  esdtrack->Phi();
+
+    //Corrected momentum from Alexander
+
+    Double_t pT = esdtrack->Pt()/(1 - 0.333303/TMath::Power(esdtrack->Pt() + 0.651111, 5.27268));
+    tPtCorr = pT;
+
+    if(fDataType == "REAL"){
+      if(pinTPC < 3. && TMath::Abs(pullTPC) < 3){
+       fNtuple1->Fill();
+       fhBBDeu->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
+      }
+      
+      if(pinTPC < 10. && TMath::Abs(pullTPChel3) < 3){
+       fNtuple1->Fill();
+       fhBBDeu->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
+      }
+      
+      if(TMath::Abs(pullTPC)<3){
+       
+       fhPtDeu->Fill(esdtrack->Pt(),pT);
+       
+       if(tTOFtrack[1] > 0){
+         Double_t beta = tTOFtrack[2]/(tTOFtrack[1] * 2.99792457999999984e-02);
+         Float_t gamma = 1/TMath::Sqrt(1 - beta*beta);
+         fhMassTOF->Fill(poutTPC/TMath::Sqrt(gamma*gamma - 1) - 1.8756);
+       }
+      }
+    }
+        
+    if(fDataType == "SIM"){
+      
+      Int_t  label = TMath::Abs(esdtrack->GetLabel());
+      TParticle * part = stack->Particle(label);
+      Int_t PDGCode=part->GetPdgCode();
+
+      Int_t motherPDG=0;
+      
+      Int_t mumid = part->GetFirstMother();
+      if(mumid>-1){
+       TParticle *mother=(TParticle*)stack->Particle(mumid);
+       motherPDG = mother->GetPdgCode();
+      }
+      
+      if( PDGCode == 1000010020 || PDGCode == -1000010020 || PDGCode == 1000020030 || PDGCode == -1000020030){
+       
+       tPDGCode=PDGCode;
+       tPDGCodeMum = motherPDG;
+
+       tIsPrimaryTr      = stack->IsPhysicalPrimary(label);
+       tIsSecondaryTr[0] = stack->IsSecondaryFromMaterial(label);
+       tIsSecondaryTr[1] = stack->IsSecondaryFromWeakDecay(label);
+
+       fNtuple1->Fill();
+       fhPtDeu->Fill(esdtrack->Pt(),pT);
+       
+       if(tTOFtrack[1] > 0){
+         Double_t beta = tTOFtrack[2]/(tTOFtrack[1] * 2.99792457999999984e-02);
+         Float_t gamma = 1/TMath::Sqrt(1 - beta*beta);
+         fhMassTOF->Fill(poutTPC/TMath::Sqrt(gamma*gamma - 1) - 1.8756);
+       }
+      }
+    }
+
+  }   //track
+  
+  //==END RECONSTRUCTION==
+  
+
+  // MC truth
+
+  if(fDataType == "SIM"){
+    
+    for (Int_t iMC=0; iMC<stack->GetNtrack(); iMC++){
+      const TParticle *tparticle = stack->Particle(iMC);
+      Long_t PDGCode = tparticle->GetPdgCode();
+      
+      Double_t eta = tparticle->Eta();
+      Double_t pt  = tparticle->Pt();
+      Double_t rap = tparticle->Y();
+      
+      //check which particle it is 
+      
+      Float_t codemoth = 0;
+      
+      Int_t indexMoth=tparticle->GetFirstMother();
+      
+      if(indexMoth>=0){
+       TParticle* moth = stack->Particle(indexMoth);
+       codemoth = TMath::Abs(moth->GetPdgCode());
+      }
+       
+      //d, 3He
+      
+      if( PDGCode == 1000010020 || PDGCode == -1000010020 || PDGCode == 1000020030 || PDGCode == -1000020030){
+       
+       tEventNumberMC[0] = evNumber    ;
+       tEventNumberMC[1] = runNumber   ;
+       tEventNumberMC[2] = BCNumber    ;
+       tEventNumberMC[3] = OrbitNumber ;
+       tEventNumberMC[4] = PeriodNumber;
+       tEventNumberMC[5] = TrackNumber;
+         
+       tCentralityMC = percentile;
+       
+       tVertexCoordMC[0] = xPrimaryVertex;
+       tVertexCoordMC[1] = yPrimaryVertex;
+       tVertexCoordMC[2] = zPrimaryVertex;
+       
+       tVertexCoordMC[0] = tparticle->Px();
+       tVertexCoordMC[1] = tparticle->Py();
+       tVertexCoordMC[2] = tparticle->Pz();
+       
+       tPDGCodeMC = PDGCode;
+       tPDGCodeMumMC = codemoth;
+       tEtaMC = eta;
+       
+       tPtMC = pt;
+       tYMC  = rap;
+
+       tIsPrimary      = stack->IsPhysicalPrimary(iMC);
+       tIsSecondary[0] = stack->IsSecondaryFromMaterial(iMC);
+       tIsSecondary[1] = stack->IsSecondaryFromWeakDecay(iMC);
+
+       
+       fNtuple2->Fill();
+      }
+    }
+    
+   
+    
+  }
+  PostData(1, fListHistCascade);
+  PostData(2,  fNtuple1);
+  PostData(3,  fNtuple2);
+} //end userexec
+
+
+//________________________________________________________________________
+
+void AliAnalysisTaskNucleiv2::Terminate(Option_t *) 
+{
+  // Draw result to the screen
+  // Called once at the end of the query
+}
+
diff --git a/PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.h b/PWGLF/STRANGENESS/Hypernuclei/AliAnalysisTaskNucleiv2.h
new file mode 100644 (file)
index 0000000..e7c5df5
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef ALIANALYSISTASKOVERPROTON_H
+#define ALIANALYSISTASKOVERPROTON_H
+
+/*  See cxx source for full Copyright notice */
+
+//-----------------------------------------------------------------
+//                 AliAnalysisTaskNucleiv2 class
+//-----------------------------------------------------------------
+
+class TList;
+class TH1F;
+class TH2F;
+class TH3F;
+class TNtuple;
+class AliESDcascade;
+//class AliCascadeVertexer; 
+#include <AliPIDResponse.h>
+#include "TString.h"
+#include "AliESDtrackCuts.h"
+#include "AliAnalysisTaskSE.h"
+
+class AliAnalysisTaskNucleiv2 : public AliAnalysisTaskSE {
+ public:
+  //  AliAnalysisTaskNucleiv2(const char *datatype);
+  AliAnalysisTaskNucleiv2();
+  AliAnalysisTaskNucleiv2(const char *name,const char *datatype);
+  virtual ~AliAnalysisTaskNucleiv2() {}
+  
+  virtual void  UserCreateOutputObjects();
+  virtual void  UserExec(Option_t *option);
+  virtual void  Terminate(Option_t *);
+  
+  void SetCollidingSystems(Short_t collidingSystems = 0)     {fCollidingSystems = collidingSystems;}
+  void SetAnalysisType    (const char* analysisType = "ESD") {fAnalysisType = analysisType;}
+  void SetDataType    (const char* dataType = "REAL") {fDataType = dataType;}
+  //  void SetDataType    (const char* dataTypeS = datatype) {fDataType = dataTypeS;}
+  // void SetDataType    (const char* dataType) {fDataType = dataType;}
+  //Double_t BetheBloch(Double_t bg,Double_t Charge,Bool_t optMC);
+  //  Double_t BetheBloch(Double_t bg,Double_t Charge,Bool_t isPbPb);
+  //  Bool_t IsTrackAccepted(AliESDtrack * const track);
+  Float_t GetPhi0Pi(Float_t phi);
+  void    Initialize();
+ private:
+  
+  TString fAnalysisType;             //! "ESD" or "AOD" analysis type  
+  
+  Short_t fCollidingSystems;         //! 0 = pp collisions or 1 = AA collisions
+  TString fDataType;                 //! "REAL" or "SIM" data type     
+  TList        *fListHistCascade;                 //! List of Cascade histograms
+  TH1F  *fHistEventMultiplicity;           //! event multiplicity
+  TH2F  *fHistTrackMultiplicity;           //! track multiplicity
+  TH2F  *fHistTrackMultiplicityCentral;    //! track multiplicity
+  TH2F  *fHistTrackMultiplicitySemiCentral;//! track multiplicity
+  TH2F  *fHistTrackMultiplicityMB;         //! track multiplicity
+  TH2F  *fhBB;                             //! ScatterPlot Total
+  TH2F  *fhBBDeu;                          //! ScatterPlot Total
+  TH2F  *fhPtDeu;                          //! correctet vs non correcter d pt
+  TH2F  *fhTOF;                            //! ScatterPlot Total TOF
+  TH1F  *fhMassTOF;                        //! Mass Distribution TOF
+
+  TH2F *hRPangleTPCvsCentrality;           //RESOLUTION Histrograms
+  TH2F *hPlaneResoTPCvsCentrality;
+  TH2F *hRPangleVZEROvsCentrality;
+  TH2F *hPlaneResoVZEROvsCentrality;
+
+  AliESDtrackCuts * fESDtrackCuts; 
+  AliPIDResponse *fPIDResponse;   //! pointer to PID response
+
+  //_______________________________________________________________________
+
+  TTree *fNtuple1;                //! Some Information on the tracks
+    
+  Double_t tEventNumber[7];       //ev number; run number; Bunch Cross - Orbit -  Period Number; #tracks; event type
+  Double_t tCentrality ;
+  Double_t tVertexCoord[3];
+  
+  //TRACKS
+  Double_t tPIDITS[9];            //n-signas different particle species ITS
+  Double_t tPIDTPC[9];            //n-signas different particle species TPC
+  Double_t tPIDTOF[9];            //n-signas different particle species TOF
+  Double_t tPulls[3];          //Pulls
+  Double_t tMomentum[3];          //pxpypz of the tracks
+  Double_t tTPCMomentum;          //momentum at theh TPC inner wall
+  Double_t tdEdx;                 //dEdx of the tracks
+  Double_t tEta;                  //eta of the tracks
+  Double_t tDCA[2];               //dcaXY and dcaZ of the track
+  Double_t tTracksTPC[2];         //chi^2 and #TPCcluster
+  Double_t tITSclustermap;        //ITS cluster map
+  Double_t tITSsample[4];         //ITS samples 
+  Int_t    tisTOF[2];             //isTOF, isOuterTPCwall   
+  Double_t tTOFtrack[3];          //poutTPC,timeTOF,trackLenghtTOF;
+  Int_t    tCharge;               //Charge of the Track
+  Double_t tPtCorr;               //Corrected Momentum 
+  Double_t tPhi;                  //Phi 
+  Double_t trpangleTPC;           //rpangleTPC
+  Double_t trpangleVZERO[3];      //rpangleVZERO: V0M, V0A, V0C
+  
+  Double_t tPDGCode;              //PDG code ptc
+  Double_t tPDGCodeMum;           //PDG code mother ptc
+  Double_t tIsPrimaryTr;
+  Double_t tIsSecondaryTr[2];     //from material ; from weak deacy 
+  
+  //_______________________________________________________________________
+  
+  TTree *fNtuple2;                  //! MC tree
+
+  Double_t tEventNumberMC[6];       //ev number; run number; Bunch Cross - Orbit -  Period Number; #tracks
+  Double_t tCentralityMC;
+  Double_t tVertexCoordMC[3];
+  Double_t tMomentumMC[3];          //pxpypz of the tracks
+
+  Double_t tPDGCodeMC      ;
+  Double_t tPDGCodeMumMC   ;
+  Double_t tIsPrimary      ;
+  Double_t tIsSecondary[2] ;      //from material ; from weak deacy 
+  Double_t tEtaMC          ;
+  Double_t tPtMC           ;
+  Double_t tYMC            ;
+
+  //_______________________________________________________________________
+  AliAnalysisTaskNucleiv2(const AliAnalysisTaskNucleiv2&);            // not implemented
+  AliAnalysisTaskNucleiv2& operator=(const AliAnalysisTaskNucleiv2&); // not implemented
+  
+  ClassDef(AliAnalysisTaskNucleiv2, 0);
+};
+
+#endif