-/**************************************************************************\r
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
- * *\r
- * Author: The ALICE Off-line Project. *\r
- * Contributors are mentioned in the code where appropriate. *\r
- * *\r
- * Permission to use, copy, modify and distribute this software and its *\r
- * documentation strictly for non-commercial purposes is hereby granted *\r
- * without fee, provided that the above copyright notice appears in all *\r
- * copies and that both the copyright notice and this permission notice *\r
- * appear in the supporting documentation. The authors make no claims *\r
- * about the suitability of this software for any purpose. It is *\r
- * provided "as is" without express or implied warranty. *\r
- **************************************************************************/\r
-\r
-//==============================================================================\r
-// AliHMPIDAnalysysTask - Class representing a basic analysis tool of HMPID data\r
-// A set of histograms is created.\r
-//==============================================================================\r
-//\r
-// By means of AliHMPIDAnalysisTask.C macro it is possible to use this class\r
-// to perform the analysis on local data, on data on alien using local machine\r
-// and on CAF.\r
-\r
-#ifndef AliHMPIDAnalysisTASK_CXX\r
-#define AliHMPIDAnalysisTASK_CXX\r
-\r
-\r
-#include "TH1.h"\r
-#include "TH2.h"\r
-#include "TFile.h"\r
-#include "TCanvas.h"\r
-#include "TGraphErrors.h"\r
-#include "AliPIDResponse.h"\r
-#include "AliPID.h"\r
-#include "AliVEvent.h"\r
-#include "AliVParticle.h"\r
-#include "AliVTrack.h"\r
-#include "AliESDtrackCuts.h"\r
-#include "AliAnalysisFilter.h"\r
-#include "AliAnalysisManager.h"\r
-#include "AliESDInputHandler.h"\r
-#include "AliMCEventHandler.h"\r
-#include "AliMCEvent.h"\r
-#include "AliESDtrack.h"\r
-#include "AliPID.h"\r
-#include "AliLog.h"\r
-#include "AliHMPIDAnalysisTask.h"\r
-\r
-ClassImp(AliHMPIDAnalysisTask)\r
-\r
-//__________________________________________________________________________\r
-AliHMPIDAnalysisTask::AliHMPIDAnalysisTask() :\r
- fESD(0x0),fMC(0x0),fUseMC(kTRUE),\r
- fHmpHistList(0x0),\r
- fHmpNevents(0x0),\r
- fZvertex(0x0),\r
- fPIDResponse(0x0),\r
- fTrackCuts(0x0),\r
- fTrackFilter(0x0),\r
- fTree(0x0)\r
-{\r
- //\r
- //Default ctor\r
- //\r
- for (Int_t i=0; i<69; i++) fVar[i]=0;\r
-}\r
-\r
-//___________________________________________________________________________\r
-AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const Char_t* name) :\r
- AliAnalysisTaskSE(name),\r
- fESD(0x0), fMC(0x0), fUseMC(kTRUE),\r
- fHmpHistList(0x0),\r
- fHmpNevents(0x0),\r
- fZvertex(0x0),\r
- fPIDResponse(0x0),\r
- fTrackCuts(0x0),\r
- fTrackFilter(0x0),\r
- fTree(0x0)\r
-{\r
- //\r
- // Constructor. Initialization of Inputs and Outputs\r
- //\r
- for (Int_t i=0; i<69; i++) fVar[i]=0;\r
-\r
- DefineOutput(1,TList::Class());\r
- DefineOutput(2,TTree::Class());\r
-}\r
-\r
-//___________________________________________________________________________\r
-AliHMPIDAnalysisTask& AliHMPIDAnalysisTask::operator=(const AliHMPIDAnalysisTask& c)\r
-{\r
- //\r
- // Assignment operator\r
- //\r
- if (this!=&c) {\r
- AliAnalysisTaskSE::operator=(c);\r
- fESD = c.fESD;\r
- fMC = c.fMC;\r
- fUseMC = c.fUseMC;\r
- fHmpHistList = c.fHmpHistList;\r
- fHmpNevents = c.fHmpNevents;\r
- fZvertex = c.fZvertex;\r
- fPIDResponse = c.fPIDResponse;\r
- fTrackCuts = c.fTrackCuts;\r
- fTrackFilter = c.fTrackFilter;\r
- fTree = c.fTree;\r
- for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];\r
- }\r
- return *this;\r
-}\r
-\r
-//___________________________________________________________________________\r
-AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const AliHMPIDAnalysisTask& c) :\r
- AliAnalysisTaskSE(c),\r
- fESD(c.fESD),fMC(c.fMC),fUseMC(c.fUseMC),\r
- fHmpHistList(c.fHmpHistList),\r
- fHmpNevents(c.fHmpNevents),\r
- fZvertex(c.fZvertex),\r
- fPIDResponse(c.fPIDResponse), \r
- fTrackCuts(c.fTrackCuts),\r
- fTrackFilter(c.fTrackFilter),\r
- fTree(c.fTree)\r
-{\r
- //\r
- // Copy Constructor\r
- //\r
- for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];\r
-}\r
- \r
-//___________________________________________________________________________\r
-AliHMPIDAnalysisTask::~AliHMPIDAnalysisTask() {\r
- //\r
- //destructor\r
- //\r
- Info("~AliHMPIDAnalysisTask","Calling Destructor");\r
- if (fHmpHistList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHmpHistList;\r
-}\r
-\r
-//___________________________________________________________________________\r
-void AliHMPIDAnalysisTask::ConnectInputData(Option_t *)\r
-{\r
- // Connect ESD here\r
-\r
- AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
- if (!esdH) {\r
- AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));\r
- } else\r
- fESD = esdH->GetEvent();\r
- fPIDResponse = esdH->GetPIDResponse();\r
-\r
- if (fUseMC){\r
- // Connect MC\r
- AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());\r
- if (!mcH) {\r
- AliDebug(2,Form("ERROR: Could not get MCEventHandler"));\r
- fUseMC = kFALSE;\r
- } else\r
- fMC = mcH->MCEvent();\r
- if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent"));\r
- }\r
- \r
- fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard");\r
- fTrackCuts->SetAcceptKinkDaughters(kFALSE);\r
- fTrackCuts->SetMinNClustersTPC(80);\r
- fTrackCuts->SetMaxChi2PerClusterTPC(4);\r
- fTrackCuts->SetMaxDCAToVertexXY(3);\r
- fTrackCuts->SetMaxDCAToVertexZ(3);\r
- fTrackCuts->SetRequireTPCRefit(kTRUE);\r
- fTrackCuts->SetRequireITSRefit(kTRUE);\r
- fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);\r
- \r
- fTrackFilter = new AliAnalysisFilter("trackFilter");\r
- fTrackFilter->AddCuts(fTrackCuts); \r
- \r
-}\r
-//***************************************************************************************************************************************************************************\r
-void AliHMPIDAnalysisTask::UserExec(Option_t *)\r
-{\r
- \r
- fHmpNevents->Fill(0);\r
-\r
- const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();\r
- \r
- if(!vertex || !vertex->GetStatus() || vertex->GetNContributors()<1) {\r
- \r
- // SPD vertex\r
- vertex = fESD->GetPrimaryVertexSPD();\r
- if(!vertex) {\r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
- return;\r
- }\r
- if(!vertex->GetStatus()){\r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
- return;\r
- } \r
- if(vertex->GetNContributors()<1){\r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
- return;\r
- } \r
- }\r
- \r
- Double_t vtxPos[3] = {999, 999, 999};\r
- if(vertex) vertex->GetXYZ(vtxPos);\r
-\r
- fHmpNevents->Fill(1);\r
- \r
- fZvertex->Fill(vtxPos[2]);\r
- \r
- if(!fPIDResponse){\r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
- return;\r
- }\r
- \r
- Double_t probsHMP[5], probsTPC[5], probsTOF[5];\r
- Float_t nSigmasTOF[5], nSigmasTPC[5];\r
- \r
- AliESDtrack *track = 0;\r
-\r
- Double_t ktol = 0.001;\r
- Double_t r[3], rin[3], rout[3];\r
-\r
- //\r
- // Main loop function, executed on Event basis\r
- //\r
- for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {\r
-\r
- track = fESD->GetTrack(iTrack);\r
- if(!track) continue;\r
- \r
- //if(!fTrackFilter->IsSelected(track)) continue; \r
- //if(!track->GetStatus() || !AliESDtrack::kTOFout || !AliESDtrack::kTIME || track->GetTOFsignal()<12000 || track->GetTOFsignal()>200000 || track->GetIntegratedLength()<365) continue; \r
- \r
- track->GetXYZ(r);\r
- track->GetInnerXYZ(rin);\r
- track->GetOuterXYZ(rout);\r
-\r
- if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue;\r
- if(track->GetHMPIDcluIdx() < 0) continue;\r
-\r
- Int_t q, nph;\r
- Float_t x, y;\r
- Float_t xpc, ypc, th, ph;\r
- track->GetHMPIDmip(x,y,q,nph);\r
- track->GetHMPIDtrk(xpc,ypc,th,ph);\r
-\r
- Int_t ITSrefit = track->IsOn(AliESDtrack::kITSrefit);\r
- Int_t TPCrefit = track->IsOn(AliESDtrack::kTPCrefit);\r
- \r
- if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue;\r
-\r
- Double_t pHmp[3] = {0}, pHmp3 = 0;\r
- if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]);\r
-\r
- Float_t b[2];\r
- Float_t bCov[3];\r
- track->GetImpactParameters(b,bCov); \r
- \r
- track->GetHMPIDpid(probsHMP);\r
- fPIDResponse->ComputeTOFProbability(track,AliPID::kSPECIES,probsTOF);\r
- fPIDResponse->ComputeTPCProbability(track,AliPID::kSPECIES,probsTPC);\r
- \r
- for(Int_t ispecie=0; ispecie<AliPID::kSPECIES; ispecie++){\r
- nSigmasTOF[ispecie] = fPIDResponse->NumberOfSigmasTOF((AliVTrack*)track,(AliPID::EParticleType)ispecie);\r
- nSigmasTPC[ispecie] = fPIDResponse->NumberOfSigmasTPC((AliVTrack*)track,(AliPID::EParticleType)ispecie); \r
- }\r
- \r
- fVar[0] = track->GetHMPIDcluIdx()/1000000;\r
- fVar[1] = pHmp3;\r
- fVar[2] = (Float_t)track->P();\r
- fVar[3] = xpc;\r
- fVar[4] = ypc;\r
- fVar[5] = x;\r
- fVar[6] = y;\r
- fVar[7] = (Float_t)track->GetHMPIDsignal();\r
- fVar[8] = q;\r
- fVar[9] = th;\r
- fVar[10] = ph;\r
- fVar[11] = (Float_t)track->GetSign();\r
- fVar[12] = (Float_t)nph;\r
- fVar[13] = (Float_t)track->GetNcls(1);\r
- fVar[14] = (Float_t)probsHMP[0];\r
- fVar[15] = (Float_t)probsHMP[1];\r
- fVar[16] = (Float_t)probsHMP[2];\r
- fVar[17] = (Float_t)probsHMP[3];\r
- fVar[18] = (Float_t)probsHMP[4];\r
- fVar[19] = (Float_t)track->GetTOFsignal();\r
- fVar[20] = (Float_t)track->GetKinkIndex(0);\r
- fVar[21] = (Float_t)track->Xv();\r
- fVar[22] = (Float_t)track->Yv();\r
- fVar[23] = (Float_t)track->Zv();\r
- fVar[24] = (Float_t)track->GetTPCchi2();\r
- fVar[25] = b[0];\r
- fVar[26] = b[1];\r
- fVar[27] = track->GetHMPIDcluIdx()%1000000/1000;\r
- fVar[28] = vtxPos[0];\r
- fVar[29] = vtxPos[1];\r
- fVar[30] = vtxPos[2];\r
- fVar[31] = (Float_t)ITSrefit;\r
- fVar[32] = (Float_t)TPCrefit;\r
- fVar[33] = (Float_t)track->Eta();\r
- fVar[34] = (Float_t)r[0];\r
- fVar[35] = (Float_t)r[1];\r
- fVar[36] = (Float_t)r[2];\r
- fVar[37] = (Float_t)rout[0]; \r
- fVar[38] = (Float_t)rout[1];\r
- fVar[39] = (Float_t)rout[2];\r
- fVar[40] = (Float_t)pHmp[0];\r
- fVar[41] = (Float_t)pHmp[1];\r
- fVar[42] = (Float_t)pHmp[2];\r
- fVar[43] = (Float_t)track->Px();\r
- fVar[44] = (Float_t)track->Py();\r
- fVar[45] = (Float_t)track->Pz();\r
- fVar[46] = (Float_t)track->GetTPCClusterInfo(2,1);\r
- fVar[47] = (Float_t)track->GetTPCNclsF();\r
- fVar[48] = nSigmasTOF[0];\r
- fVar[49] = nSigmasTOF[1];\r
- fVar[50] = nSigmasTOF[2];\r
- fVar[51] = nSigmasTOF[3];\r
- fVar[52] = nSigmasTOF[4];\r
- fVar[53] = nSigmasTPC[0];\r
- fVar[54] = nSigmasTPC[1];\r
- fVar[55] = nSigmasTPC[2];\r
- fVar[56] = nSigmasTPC[3];\r
- fVar[57] = nSigmasTPC[4];\r
- fVar[58] = (Float_t)probsTOF[0];\r
- fVar[59] = (Float_t)probsTOF[1];\r
- fVar[60] = (Float_t)probsTOF[2];\r
- fVar[61] = (Float_t)probsTOF[3];\r
- fVar[62] = (Float_t)probsTOF[4];\r
- fVar[63] = (Float_t)probsTPC[0];\r
- fVar[64] = (Float_t)probsTPC[1];\r
- fVar[65] = (Float_t)probsTPC[2];\r
- fVar[66] = (Float_t)probsTPC[3];\r
- fVar[67] = (Float_t)probsTPC[4];\r
- fVar[68] = (Float_t)track->GetHMPIDchi2();\r
- \r
- fTree->Fill();\r
- \r
- }//track loop\r
-\r
- /* PostData(0) is taken care of by AliAnalysisTaskSE */\r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
-}\r
-//___________________________________________________________________________\r
-void AliHMPIDAnalysisTask::Terminate(Option_t*)\r
-{\r
- // The Terminate() function is the last function to be called during\r
- // a query. It always runs on the client, it can be used to present\r
- // the results graphically or save the results to file.\r
-\r
- Info("Terminate"," ");\r
-\r
- if (!fUseMC) return;\r
-\r
- fHmpHistList = dynamic_cast<TList*> (GetOutputData(1));\r
-\r
- if (!fHmpHistList) {\r
- AliError("Histogram List is not available");\r
- return;\r
- }\r
-\r
-\r
- AliAnalysisTaskSE::Terminate();\r
-\r
-}\r
-//___________________________________________________________________________\r
-void AliHMPIDAnalysisTask::UserCreateOutputObjects() {\r
- //\r
- //HERE ONE CAN CREATE OUTPUT OBJECTS\r
- //TO BE SET BEFORE THE EXECUTION OF THE TASK\r
- //\r
-\r
- //slot #1\r
-// OpenFile(1);\r
- fHmpHistList = new TList();\r
- fHmpHistList->SetOwner();\r
-\r
- fHmpNevents = new TH1F("fHmpNevents","Number of events",2,0,2);\r
- fHmpHistList->Add(fHmpNevents);\r
-\r
- fZvertex = new TH1F("fZvertex","Z primary vertex distribution",4000,-20,20);\r
- fHmpHistList->Add(fZvertex);\r
- \r
-// OpenFile(2);\r
- fTree = new TTree("Tree","Tree with data");\r
- fTree->Branch("Chamber",&fVar[0]);\r
- fTree->Branch("pHmp3",&fVar[1]);\r
- fTree->Branch("P",&fVar[2]);\r
- fTree->Branch("Xpc",&fVar[3]);\r
- fTree->Branch("Ypc",&fVar[4]);\r
- fTree->Branch("X",&fVar[5]);\r
- fTree->Branch("Y",&fVar[6]);\r
- fTree->Branch("HMPIDsignal",&fVar[7]);\r
- fTree->Branch("Charge",&fVar[8]);\r
- fTree->Branch("Theta",&fVar[9]);\r
- fTree->Branch("Phi",&fVar[10]);\r
- fTree->Branch("Sign",&fVar[11]);\r
- fTree->Branch("NumPhotons",&fVar[12]);\r
- fTree->Branch("NumTPCclust",&fVar[13]);\r
- fTree->Branch("ProbHMP0",&fVar[14]);\r
- fTree->Branch("ProbHMP1",&fVar[15]);\r
- fTree->Branch("ProbHMP2",&fVar[16]);\r
- fTree->Branch("ProbHMP3",&fVar[17]);\r
- fTree->Branch("ProbHMP4",&fVar[18]);\r
- fTree->Branch("TOFsignal",&fVar[19]);\r
- fTree->Branch("KinkIndex",&fVar[20]);\r
- fTree->Branch("Xv",&fVar[21]);\r
- fTree->Branch("Yv",&fVar[22]);\r
- fTree->Branch("Zv",&fVar[23]);\r
- fTree->Branch("TPCchi2",&fVar[24]);\r
- fTree->Branch("b0",&fVar[25]);\r
- fTree->Branch("b1",&fVar[26]);\r
- fTree->Branch("ClustSize",&fVar[27]);\r
- fTree->Branch("PrimVertexX",&fVar[28]);\r
- fTree->Branch("PrimVertexY",&fVar[29]);\r
- fTree->Branch("PrimVertexZ",&fVar[30]);\r
- fTree->Branch("ITSrefit",&fVar[31]);\r
- fTree->Branch("TPCrefit",&fVar[32]); \r
- fTree->Branch("Eta",&fVar[33]);\r
- fTree->Branch("xTrack",&fVar[34]);\r
- fTree->Branch("yTrack",&fVar[35]);\r
- fTree->Branch("zTrack",&fVar[36]);\r
- fTree->Branch("xOuterTrack",&fVar[37]);\r
- fTree->Branch("yOuterTrack",&fVar[38]);\r
- fTree->Branch("zOuterTrack",&fVar[39]);\r
- fTree->Branch("pHmpX",&fVar[40]);\r
- fTree->Branch("pHmpY",&fVar[41]);\r
- fTree->Branch("pHmpZ",&fVar[42]);\r
- fTree->Branch("Px",&fVar[43]);\r
- fTree->Branch("Py",&fVar[44]);\r
- fTree->Branch("Pz",&fVar[45]);\r
- fTree->Branch("nCrossedRowsTPC",&fVar[46]);\r
- fTree->Branch("findableClustTPC",&fVar[47]);\r
- fTree->Branch("NSigmasTOF0",&fVar[48]); \r
- fTree->Branch("NSigmasTOF1",&fVar[49]); \r
- fTree->Branch("NSigmasTOF2",&fVar[50]); \r
- fTree->Branch("NSigmasTOF3",&fVar[51]); \r
- fTree->Branch("NSigmasTOF4",&fVar[52]); \r
- fTree->Branch("NSigmasTPC0",&fVar[53]); \r
- fTree->Branch("NSigmasTPC1",&fVar[54]); \r
- fTree->Branch("NSigmasTPC2",&fVar[55]); \r
- fTree->Branch("NSigmasTPC3",&fVar[56]); \r
- fTree->Branch("NSigmasTPC4",&fVar[57]); \r
- fTree->Branch("ProbTOF0",&fVar[58]);\r
- fTree->Branch("ProbTOF1",&fVar[59]);\r
- fTree->Branch("ProbTOF2",&fVar[60]);\r
- fTree->Branch("ProbTOF3",&fVar[61]);\r
- fTree->Branch("ProbTOF4",&fVar[62]);\r
- fTree->Branch("ProbTPC0",&fVar[63]);\r
- fTree->Branch("ProbTPC1",&fVar[64]);\r
- fTree->Branch("ProbTPC2",&fVar[65]);\r
- fTree->Branch("ProbTPC3",&fVar[66]);\r
- fTree->Branch("ProbTPC4",&fVar[67]);\r
- fTree->Branch("HmpSigma",&fVar[68]);\r
- \r
- PostData(1,fHmpHistList);\r
- PostData(2,fTree);\r
-}\r
-\r
-//____________________________________________________________________________________________________________________________________\r
-Bool_t AliHMPIDAnalysisTask::Equal(Double_t x, Double_t y, Double_t tolerance)\r
-{\r
- return abs(x - y) <= tolerance ;\r
-}\r
- \r
-#endif\r
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * 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 notice 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. *
+ **************************************************************************/
+
+//==============================================================================
+// AliHMPIDAnalysysTask - Class representing a basic analysis tool of HMPID data
+// A set of histograms is created.
+//==============================================================================
+//
+// By means of AliHMPIDAnalysisTask.C macro it is possible to use this class
+// to perform the analysis on local data, on data on alien using local machine
+// and on CAF.
+
+#ifndef AliHMPIDAnalysisTASK_CXX
+#define AliHMPIDAnalysisTASK_CXX
+
+
+#include "TH1.h"
+#include "TH2.h"
+#include "TFile.h"
+#include "TCanvas.h"
+#include "TGraphErrors.h"
+#include "AliPIDResponse.h"
+#include "AliPID.h"
+#include "AliVEvent.h"
+#include "AliVParticle.h"
+#include "AliVTrack.h"
+#include "AliESDtrackCuts.h"
+#include "AliAnalysisFilter.h"
+#include "AliAnalysisManager.h"
+#include "AliESDInputHandler.h"
+#include "AliMCEventHandler.h"
+#include "AliMCEvent.h"
+#include "AliESDtrack.h"
+#include "AliPID.h"
+#include "AliLog.h"
+#include "AliHMPIDAnalysisTask.h"
+
+ClassImp(AliHMPIDAnalysisTask)
+
+//__________________________________________________________________________
+AliHMPIDAnalysisTask::AliHMPIDAnalysisTask() :
+ fESD(0x0),fMC(0x0),fUseMC(kTRUE),
+ fHmpHistList(0x0),
+ fHmpNevents(0x0),
+ fZvertex(0x0),
+ fPIDResponse(0x0),
+ fTrackCuts(0x0),
+ fTrackFilter(0x0),
+ fTree(0x0)
+{
+ //
+ //Default ctor
+ //
+ for (Int_t i=0; i<69; i++) fVar[i]=0;
+}
+
+//___________________________________________________________________________
+AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const Char_t* name) :
+ AliAnalysisTaskSE(name),
+ fESD(0x0), fMC(0x0), fUseMC(kTRUE),
+ fHmpHistList(0x0),
+ fHmpNevents(0x0),
+ fZvertex(0x0),
+ fPIDResponse(0x0),
+ fTrackCuts(0x0),
+ fTrackFilter(0x0),
+ fTree(0x0)
+{
+ //
+ // Constructor. Initialization of Inputs and Outputs
+ //
+ for (Int_t i=0; i<69; i++) fVar[i]=0;
+
+ DefineOutput(1,TList::Class());
+ DefineOutput(2,TTree::Class());
+}
+
+//___________________________________________________________________________
+AliHMPIDAnalysisTask& AliHMPIDAnalysisTask::operator=(const AliHMPIDAnalysisTask& c)
+{
+ //
+ // Assignment operator
+ //
+ if (this!=&c) {
+ AliAnalysisTaskSE::operator=(c);
+ fESD = c.fESD;
+ fMC = c.fMC;
+ fUseMC = c.fUseMC;
+ fHmpHistList = c.fHmpHistList;
+ fHmpNevents = c.fHmpNevents;
+ fZvertex = c.fZvertex;
+ fPIDResponse = c.fPIDResponse;
+ fTrackCuts = c.fTrackCuts;
+ fTrackFilter = c.fTrackFilter;
+ fTree = c.fTree;
+ for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
+ }
+ return *this;
+}
+
+//___________________________________________________________________________
+AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const AliHMPIDAnalysisTask& c) :
+ AliAnalysisTaskSE(c),
+ fESD(c.fESD),fMC(c.fMC),fUseMC(c.fUseMC),
+ fHmpHistList(c.fHmpHistList),
+ fHmpNevents(c.fHmpNevents),
+ fZvertex(c.fZvertex),
+ fPIDResponse(c.fPIDResponse),
+ fTrackCuts(c.fTrackCuts),
+ fTrackFilter(c.fTrackFilter),
+ fTree(c.fTree)
+{
+ //
+ // Copy Constructor
+ //
+ for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
+}
+
+//___________________________________________________________________________
+AliHMPIDAnalysisTask::~AliHMPIDAnalysisTask() {
+ //
+ //destructor
+ //
+ Info("~AliHMPIDAnalysisTask","Calling Destructor");
+ if (fHmpHistList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHmpHistList;
+}
+
+//___________________________________________________________________________
+void AliHMPIDAnalysisTask::ConnectInputData(Option_t *)
+{
+ // Connect ESD here
+
+ AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
+ if (!esdH) {
+ AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
+ } else
+ fESD = esdH->GetEvent();
+ fPIDResponse = esdH->GetPIDResponse();
+
+ if (fUseMC){
+ // Connect MC
+ AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+ if (!mcH) {
+ AliDebug(2,Form("ERROR: Could not get MCEventHandler"));
+ fUseMC = kFALSE;
+ } else
+ fMC = mcH->MCEvent();
+ if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent"));
+ }
+
+ fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard");
+ fTrackCuts->SetAcceptKinkDaughters(kFALSE);
+ fTrackCuts->SetMinNClustersTPC(80);
+ fTrackCuts->SetMaxChi2PerClusterTPC(4);
+ fTrackCuts->SetMaxDCAToVertexXY(3);
+ fTrackCuts->SetMaxDCAToVertexZ(3);
+ fTrackCuts->SetRequireTPCRefit(kTRUE);
+ fTrackCuts->SetRequireITSRefit(kTRUE);
+ fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+
+ fTrackFilter = new AliAnalysisFilter("trackFilter");
+ fTrackFilter->AddCuts(fTrackCuts);
+
+}
+//***************************************************************************************************************************************************************************
+void AliHMPIDAnalysisTask::UserExec(Option_t *)
+{
+
+ fHmpNevents->Fill(0);
+
+ const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
+
+ if(!vertex || !vertex->GetStatus() || vertex->GetNContributors()<1) {
+
+ // SPD vertex
+ vertex = fESD->GetPrimaryVertexSPD();
+ if(!vertex) {
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+ return;
+ }
+ if(!vertex->GetStatus()){
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+ return;
+ }
+ if(vertex->GetNContributors()<1){
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+ return;
+ }
+ }
+
+ Double_t vtxPos[3] = {999, 999, 999};
+ if(vertex) vertex->GetXYZ(vtxPos);
+
+ fHmpNevents->Fill(1);
+
+ fZvertex->Fill(vtxPos[2]);
+
+ if(!fPIDResponse){
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+ return;
+ }
+
+ Double_t probsHMP[5], probsTPC[5], probsTOF[5];
+ Float_t nSigmasTOF[5], nSigmasTPC[5];
+
+ AliESDtrack *track = 0;
+
+ Double_t ktol = 0.001;
+ Double_t r[3], rin[3], rout[3];
+
+ //
+ // Main loop function, executed on Event basis
+ //
+ for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {
+
+ track = fESD->GetTrack(iTrack);
+ if(!track) continue;
+
+ //if(!fTrackFilter->IsSelected(track)) continue;
+ //if(!track->GetStatus() || !AliESDtrack::kTOFout || !AliESDtrack::kTIME || track->GetTOFsignal()<12000 || track->GetTOFsignal()>200000 || track->GetIntegratedLength()<365) continue;
+
+ track->GetXYZ(r);
+ track->GetInnerXYZ(rin);
+ track->GetOuterXYZ(rout);
+
+ if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue;
+ if(track->GetHMPIDcluIdx() < 0) continue;
+
+ Int_t q, nph;
+ Float_t x, y;
+ Float_t xpc, ypc, th, ph;
+ track->GetHMPIDmip(x,y,q,nph);
+ track->GetHMPIDtrk(xpc,ypc,th,ph);
+
+ Int_t ITSrefit = track->IsOn(AliESDtrack::kITSrefit);
+ Int_t TPCrefit = track->IsOn(AliESDtrack::kTPCrefit);
+
+ if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue;
+
+ Double_t pHmp[3] = {0}, pHmp3 = 0;
+ if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]);
+
+ Float_t b[2];
+ Float_t bCov[3];
+ track->GetImpactParameters(b,bCov);
+
+ track->GetHMPIDpid(probsHMP);
+ fPIDResponse->ComputeTOFProbability(track,AliPID::kSPECIES,probsTOF);
+ fPIDResponse->ComputeTPCProbability(track,AliPID::kSPECIES,probsTPC);
+
+ for(Int_t ispecie=0; ispecie<AliPID::kSPECIES; ispecie++){
+ nSigmasTOF[ispecie] = fPIDResponse->NumberOfSigmasTOF((AliVTrack*)track,(AliPID::EParticleType)ispecie);
+ nSigmasTPC[ispecie] = fPIDResponse->NumberOfSigmasTPC((AliVTrack*)track,(AliPID::EParticleType)ispecie);
+ }
+
+ fVar[0] = track->GetHMPIDcluIdx()/1000000;
+ fVar[1] = pHmp3;
+ fVar[2] = (Float_t)track->P();
+ fVar[3] = xpc;
+ fVar[4] = ypc;
+ fVar[5] = x;
+ fVar[6] = y;
+ fVar[7] = (Float_t)track->GetHMPIDsignal();
+ fVar[8] = q;
+ fVar[9] = th;
+ fVar[10] = ph;
+ fVar[11] = (Float_t)track->GetSign();
+ fVar[12] = (Float_t)nph;
+ fVar[13] = (Float_t)track->GetNcls(1);
+ fVar[14] = (Float_t)probsHMP[0];
+ fVar[15] = (Float_t)probsHMP[1];
+ fVar[16] = (Float_t)probsHMP[2];
+ fVar[17] = (Float_t)probsHMP[3];
+ fVar[18] = (Float_t)probsHMP[4];
+ fVar[19] = (Float_t)track->GetTOFsignal();
+ fVar[20] = (Float_t)track->GetKinkIndex(0);
+ fVar[21] = (Float_t)track->Xv();
+ fVar[22] = (Float_t)track->Yv();
+ fVar[23] = (Float_t)track->Zv();
+ fVar[24] = (Float_t)track->GetTPCchi2();
+ fVar[25] = b[0];
+ fVar[26] = b[1];
+ fVar[27] = track->GetHMPIDcluIdx()%1000000/1000;
+ fVar[28] = vtxPos[0];
+ fVar[29] = vtxPos[1];
+ fVar[30] = vtxPos[2];
+ fVar[31] = (Float_t)ITSrefit;
+ fVar[32] = (Float_t)TPCrefit;
+ fVar[33] = (Float_t)track->Eta();
+ fVar[34] = (Float_t)r[0];
+ fVar[35] = (Float_t)r[1];
+ fVar[36] = (Float_t)r[2];
+ fVar[37] = (Float_t)rout[0];
+ fVar[38] = (Float_t)rout[1];
+ fVar[39] = (Float_t)rout[2];
+ fVar[40] = (Float_t)pHmp[0];
+ fVar[41] = (Float_t)pHmp[1];
+ fVar[42] = (Float_t)pHmp[2];
+ fVar[43] = (Float_t)track->Px();
+ fVar[44] = (Float_t)track->Py();
+ fVar[45] = (Float_t)track->Pz();
+ fVar[46] = (Float_t)track->GetTPCClusterInfo(2,1);
+ fVar[47] = (Float_t)track->GetTPCNclsF();
+ fVar[48] = nSigmasTOF[0];
+ fVar[49] = nSigmasTOF[1];
+ fVar[50] = nSigmasTOF[2];
+ fVar[51] = nSigmasTOF[3];
+ fVar[52] = nSigmasTOF[4];
+ fVar[53] = nSigmasTPC[0];
+ fVar[54] = nSigmasTPC[1];
+ fVar[55] = nSigmasTPC[2];
+ fVar[56] = nSigmasTPC[3];
+ fVar[57] = nSigmasTPC[4];
+ fVar[58] = (Float_t)probsTOF[0];
+ fVar[59] = (Float_t)probsTOF[1];
+ fVar[60] = (Float_t)probsTOF[2];
+ fVar[61] = (Float_t)probsTOF[3];
+ fVar[62] = (Float_t)probsTOF[4];
+ fVar[63] = (Float_t)probsTPC[0];
+ fVar[64] = (Float_t)probsTPC[1];
+ fVar[65] = (Float_t)probsTPC[2];
+ fVar[66] = (Float_t)probsTPC[3];
+ fVar[67] = (Float_t)probsTPC[4];
+ fVar[68] = (Float_t)track->GetHMPIDchi2();
+
+ fTree->Fill();
+
+ }//track loop
+
+ /* PostData(0) is taken care of by AliAnalysisTaskSE */
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+}
+//___________________________________________________________________________
+void AliHMPIDAnalysisTask::Terminate(Option_t*)
+{
+ // The Terminate() function is the last function to be called during
+ // a query. It always runs on the client, it can be used to present
+ // the results graphically or save the results to file.
+
+ Info("Terminate"," ");
+
+ if (!fUseMC) return;
+
+ fHmpHistList = dynamic_cast<TList*> (GetOutputData(1));
+
+ if (!fHmpHistList) {
+ AliError("Histogram List is not available");
+ return;
+ }
+
+
+ AliAnalysisTaskSE::Terminate();
+
+}
+//___________________________________________________________________________
+void AliHMPIDAnalysisTask::UserCreateOutputObjects() {
+ //
+ //HERE ONE CAN CREATE OUTPUT OBJECTS
+ //TO BE SET BEFORE THE EXECUTION OF THE TASK
+ //
+
+ //slot #1
+// OpenFile(1);
+ fHmpHistList = new TList();
+ fHmpHistList->SetOwner();
+
+ fHmpNevents = new TH1F("fHmpNevents","Number of events",2,0,2);
+ fHmpHistList->Add(fHmpNevents);
+
+ fZvertex = new TH1F("fZvertex","Z primary vertex distribution",4000,-20,20);
+ fHmpHistList->Add(fZvertex);
+
+// OpenFile(2);
+ fTree = new TTree("Tree","Tree with data");
+ fTree->Branch("Chamber",&fVar[0]);
+ fTree->Branch("pHmp3",&fVar[1]);
+ fTree->Branch("P",&fVar[2]);
+ fTree->Branch("Xpc",&fVar[3]);
+ fTree->Branch("Ypc",&fVar[4]);
+ fTree->Branch("X",&fVar[5]);
+ fTree->Branch("Y",&fVar[6]);
+ fTree->Branch("HMPIDsignal",&fVar[7]);
+ fTree->Branch("Charge",&fVar[8]);
+ fTree->Branch("Theta",&fVar[9]);
+ fTree->Branch("Phi",&fVar[10]);
+ fTree->Branch("Sign",&fVar[11]);
+ fTree->Branch("NumPhotons",&fVar[12]);
+ fTree->Branch("NumTPCclust",&fVar[13]);
+ fTree->Branch("ProbHMP0",&fVar[14]);
+ fTree->Branch("ProbHMP1",&fVar[15]);
+ fTree->Branch("ProbHMP2",&fVar[16]);
+ fTree->Branch("ProbHMP3",&fVar[17]);
+ fTree->Branch("ProbHMP4",&fVar[18]);
+ fTree->Branch("TOFsignal",&fVar[19]);
+ fTree->Branch("KinkIndex",&fVar[20]);
+ fTree->Branch("Xv",&fVar[21]);
+ fTree->Branch("Yv",&fVar[22]);
+ fTree->Branch("Zv",&fVar[23]);
+ fTree->Branch("TPCchi2",&fVar[24]);
+ fTree->Branch("b0",&fVar[25]);
+ fTree->Branch("b1",&fVar[26]);
+ fTree->Branch("ClustSize",&fVar[27]);
+ fTree->Branch("PrimVertexX",&fVar[28]);
+ fTree->Branch("PrimVertexY",&fVar[29]);
+ fTree->Branch("PrimVertexZ",&fVar[30]);
+ fTree->Branch("ITSrefit",&fVar[31]);
+ fTree->Branch("TPCrefit",&fVar[32]);
+ fTree->Branch("Eta",&fVar[33]);
+ fTree->Branch("xTrack",&fVar[34]);
+ fTree->Branch("yTrack",&fVar[35]);
+ fTree->Branch("zTrack",&fVar[36]);
+ fTree->Branch("xOuterTrack",&fVar[37]);
+ fTree->Branch("yOuterTrack",&fVar[38]);
+ fTree->Branch("zOuterTrack",&fVar[39]);
+ fTree->Branch("pHmpX",&fVar[40]);
+ fTree->Branch("pHmpY",&fVar[41]);
+ fTree->Branch("pHmpZ",&fVar[42]);
+ fTree->Branch("Px",&fVar[43]);
+ fTree->Branch("Py",&fVar[44]);
+ fTree->Branch("Pz",&fVar[45]);
+ fTree->Branch("nCrossedRowsTPC",&fVar[46]);
+ fTree->Branch("findableClustTPC",&fVar[47]);
+ fTree->Branch("NSigmasTOF0",&fVar[48]);
+ fTree->Branch("NSigmasTOF1",&fVar[49]);
+ fTree->Branch("NSigmasTOF2",&fVar[50]);
+ fTree->Branch("NSigmasTOF3",&fVar[51]);
+ fTree->Branch("NSigmasTOF4",&fVar[52]);
+ fTree->Branch("NSigmasTPC0",&fVar[53]);
+ fTree->Branch("NSigmasTPC1",&fVar[54]);
+ fTree->Branch("NSigmasTPC2",&fVar[55]);
+ fTree->Branch("NSigmasTPC3",&fVar[56]);
+ fTree->Branch("NSigmasTPC4",&fVar[57]);
+ fTree->Branch("ProbTOF0",&fVar[58]);
+ fTree->Branch("ProbTOF1",&fVar[59]);
+ fTree->Branch("ProbTOF2",&fVar[60]);
+ fTree->Branch("ProbTOF3",&fVar[61]);
+ fTree->Branch("ProbTOF4",&fVar[62]);
+ fTree->Branch("ProbTPC0",&fVar[63]);
+ fTree->Branch("ProbTPC1",&fVar[64]);
+ fTree->Branch("ProbTPC2",&fVar[65]);
+ fTree->Branch("ProbTPC3",&fVar[66]);
+ fTree->Branch("ProbTPC4",&fVar[67]);
+ fTree->Branch("HmpSigma",&fVar[68]);
+
+ PostData(1,fHmpHistList);
+ PostData(2,fTree);
+}
+
+//____________________________________________________________________________________________________________________________________
+Bool_t AliHMPIDAnalysisTask::Equal(Double_t x, Double_t y, Double_t tolerance)
+{
+ return abs(x - y) <= tolerance ;
+}
+
+#endif