-/**************************************************************************\r
- * Copyright(c) 1998-2009, 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
-// AliAnalysisTaskContMC class\r
-//-----------------------------------------------------------------\r
-\r
-#include "TChain.h"\r
-#include "TTree.h"\r
-#include "TLegend.h"\r
-#include "TH1F.h"\r
-#include "TH2F.h"\r
-#include "TH3F.h"\r
-#include "TCanvas.h"\r
-#include "AliAnalysisTask.h"\r
-#include "AliAnalysisManager.h"\r
-#include "AliVTrack.h"\r
-#include "AliAODMCParticle.h"\r
-#include "AliVParticle.h"\r
-#include "AliAODEvent.h"\r
-#include "AliAODInputHandler.h"\r
-#include "AliAnalysisTaskContMC.h"\r
-#include "AliAnalysisTaskESDfilter.h"\r
-#include "AliAnalysisDataContainer.h"\r
-#include "AliHelperPID.h"\r
-#include "AliCentrality.h"\r
-#include "TProof.h"\r
-#include "AliPID.h"\r
-#include "AliVEvent.h"\r
-#include "AliPIDResponse.h"\r
-#include "AliStack.h"\r
-#include <TMCProcess.h>\r
-\r
-#include <iostream>\r
-\r
-using namespace std;\r
-\r
-ClassImp(AliAnalysisTaskContMC) \r
-\r
-//________________________________________________________________________\r
-AliAnalysisTaskContMC::AliAnalysisTaskContMC(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fNSigmaPID(0), fIsMC(0), fOutput(0), fHistID(0)\r
-{\r
- // Default constructor\r
- \r
-\r
- DefineInput(0, TChain::Class());\r
- //DefineOutput(1, AliHelperPID::Class());\r
- DefineOutput(1, TList::Class());\r
- \r
-}\r
-//________________________________________________________________________\r
-//________________________________________________________________________\r
-void AliAnalysisTaskContMC::UserCreateOutputObjects()\r
-{\r
- Printf("\n\n\n\n\n\n In CreateOutput Object:");\r
- \r
- //create output objects\r
- Printf("NSigma: %.1f",fNSigmaPID->GetNSigmaCut());\r
- Printf("IsMC: %d",fNSigmaPID->GetisMC());\r
- fOutput = new TList();\r
- fOutput->SetOwner();\r
- fOutput->SetName("list");\r
- \r
- fHistID = new TH3F("fHistID","fHistID",6,-1.5,4.5,4,-1.5,2.5,38,0.2,4);\r
- fOutput->Add(fHistID);\r
- \r
- if(!fNSigmaPID)AliFatal("PID object should be set in the steering macro");\r
- fOutput->Add(fNSigmaPID);\r
- \r
- //PostData(1, fNSigmaPID );\r
- PostData(1, fOutput );\r
- \r
-}\r
-\r
-//________________________________________________________________________\r
-void AliAnalysisTaskContMC::UserExec(Option_t *)\r
-{\r
- const Int_t npart=4;\r
- const Int_t pdgcode[npart+2]={-1,211,321,2212,11,13};\r
- const Int_t partid[npart+2]={-1,0,1,2,3,4};\r
- // main event loop\r
- fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);\r
- if (!fAOD) {\r
- AliWarning("ERROR: AliAODEvent not available \n");\r
- return;\r
- }\r
- \r
- if (strcmp(fAOD->ClassName(), "AliAODEvent"))\r
- {\r
- AliFatal("Not processing AODs");\r
- }\r
- //MC Loop\r
- TClonesArray *arrayMC = 0;\r
- Printf("fIsMC: %d",fIsMC);\r
- if (fIsMC)\r
- {\r
- arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());\r
- if (!arrayMC) {\r
- AliFatal("Error: MC particles branch not found!\n");\r
- }\r
- }\r
- Double_t centrality = 0;\r
-\r
- AliCentrality *centralityObj = fAOD->GetHeader()->GetCentralityP();\r
- if (centralityObj)\r
- {\r
- centrality = centralityObj->GetCentralityPercentileUnchecked("V0M");\r
- AliInfo(Form("Centrality is %f", centrality));\r
- }\r
- else\r
- {\r
- Printf("WARNING: Centrality object is 0");\r
- centrality = -1;\r
- }\r
- if (centrality < 0)\r
- return;\r
- \r
-\r
- //vertex selection\r
- Int_t nVertex = ((AliAODEvent*)fAOD)->GetNumberOfVertices();\r
- if( nVertex > 0 ) { \r
- AliAODVertex* vertex = (AliAODVertex*)((AliAODEvent*)fAOD)->GetPrimaryVertex();\r
- //Int_t nTracksPrim = vertex->GetNContributors();\r
- Double_t zVertex = vertex->GetZ();\r
- //10 cm cut\r
- if(TMath::Abs(zVertex)>10) return;\r
- //AliInfo(Form(" Vertex in = %f with %d particles by %s data ...",zVertex,nTracksPrim,vertex->GetName()));\r
- // Reject TPC only vertex\r
- TString name(vertex->GetName());\r
- if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return;\r
- } \r
-\r
- //Int_t count=0; \r
- //track loop\r
- for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {\r
- AliAODTrack* track = fAOD->GetTrack(iTracks);\r
- if(!(track->TestFilterBit(32)))continue;\r
- if (TMath::Abs(track->Eta()) > .8 || track->Pt() < .2) continue;\r
- \r
- Int_t pdg=-999;\r
- Int_t isph=-999;\r
- if (fIsMC && arrayMC) {\r
- AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));\r
- if (!partMC) { \r
- AliError("Cannot get MC particle");\r
- continue; \r
- }\r
- pdg=TMath::Abs(partMC->GetPdgCode());\r
- isph=partMC->IsPhysicalPrimary();\r
- }\r
- if(!isph)continue;\r
- //step 1, TOF Matching\r
- UInt_t status;\r
- status=track->GetStatus();\r
- if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)continue;\r
- \r
- //step 2, combined PID\r
- Int_t IDTPCTOF=fNSigmaPID->GetParticleSpecies(track,1);\r
- if(IDTPCTOF==999)IDTPCTOF=-1;\r
- Int_t IDMC=-1;\r
- for(Int_t ipart=0;ipart<npart+2;ipart++)if(TMath::Abs(pdg)==pdgcode[ipart])IDMC=partid[ipart]; \r
- fHistID->Fill(IDMC,IDTPCTOF,track->Pt());\r
- } // end loop on tracks\r
- \r
- PostData(1,fOutput);\r
- \r
-}\r
-\r
-//_________________________________________________________________\r
-void AliAnalysisTaskContMC::Terminate(Option_t *)\r
-{\r
- // Terminate analysis\r
- //\r
- fOutput = dynamic_cast<TList*>(GetOutputData(1));\r
- if (!fOutput) {\r
- printf("ERROR: fOutput not available\n");\r
- return;\r
- } \r
- fHistID = dynamic_cast<TH3F*>(fOutput->FindObject("fHistID"));\r
- fNSigmaPID = dynamic_cast<AliHelperPID*>(fOutput->FindObject("fNSigmaPID"));\r
-}\r
+/**************************************************************************
+ * Copyright(c) 1998-2009, 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. *
+ **************************************************************************/
+
+//-----------------------------------------------------------------
+// AliAnalysisTaskContMC class
+//-----------------------------------------------------------------
+
+#include "TChain.h"
+#include "TTree.h"
+#include "TLegend.h"
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TH3F.h"
+#include "TCanvas.h"
+#include "AliAnalysisTask.h"
+#include "AliAnalysisManager.h"
+#include "AliVTrack.h"
+#include "AliAODMCParticle.h"
+#include "AliVParticle.h"
+#include "AliAODEvent.h"
+#include "AliAODInputHandler.h"
+#include "AliAnalysisTaskContMC.h"
+#include "AliAnalysisTaskESDfilter.h"
+#include "AliAnalysisDataContainer.h"
+#include "AliHelperPID.h"
+#include "AliCentrality.h"
+#include "TProof.h"
+#include "AliPID.h"
+#include "AliVEvent.h"
+#include "AliPIDResponse.h"
+#include "AliStack.h"
+#include <TMCProcess.h>
+
+#include <iostream>
+
+using namespace std;
+
+ClassImp(AliAnalysisTaskContMC)
+
+//________________________________________________________________________
+AliAnalysisTaskContMC::AliAnalysisTaskContMC(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fNSigmaPID(0), fIsMC(0), fOutput(0), fHistID(0)
+{
+ // Default constructor
+
+
+ DefineInput(0, TChain::Class());
+ //DefineOutput(1, AliHelperPID::Class());
+ DefineOutput(1, TList::Class());
+
+}
+//________________________________________________________________________
+//________________________________________________________________________
+void AliAnalysisTaskContMC::UserCreateOutputObjects()
+{
+ Printf("\n\n\n\n\n\n In CreateOutput Object:");
+
+ //create output objects
+ Printf("NSigma: %.1f",fNSigmaPID->GetNSigmaCut());
+ Printf("IsMC: %d",fNSigmaPID->GetisMC());
+ fOutput = new TList();
+ fOutput->SetOwner();
+ fOutput->SetName("list");
+
+ fHistID = new TH3F("fHistID","fHistID",6,-1.5,4.5,4,-1.5,2.5,38,0.2,4);
+ fOutput->Add(fHistID);
+
+ if(!fNSigmaPID)AliFatal("PID object should be set in the steering macro");
+ fOutput->Add(fNSigmaPID);
+
+ //PostData(1, fNSigmaPID );
+ PostData(1, fOutput );
+
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskContMC::UserExec(Option_t *)
+{
+ const Int_t npart=4;
+ const Int_t pdgcode[npart+2]={-1,211,321,2212,11,13};
+ const Int_t partid[npart+2]={-1,0,1,2,3,4};
+ // main event loop
+ fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
+ if (!fAOD) {
+ AliWarning("ERROR: AliAODEvent not available \n");
+ return;
+ }
+
+ if (strcmp(fAOD->ClassName(), "AliAODEvent"))
+ {
+ AliFatal("Not processing AODs");
+ }
+ //MC Loop
+ TClonesArray *arrayMC = 0;
+ Printf("fIsMC: %d",fIsMC);
+ if (fIsMC)
+ {
+ arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
+ if (!arrayMC) {
+ AliFatal("Error: MC particles branch not found!\n");
+ }
+ }
+ Double_t centrality = 0;
+
+ AliCentrality *centralityObj = fAOD->GetHeader()->GetCentralityP();
+ if (centralityObj)
+ {
+ centrality = centralityObj->GetCentralityPercentileUnchecked("V0M");
+ AliInfo(Form("Centrality is %f", centrality));
+ }
+ else
+ {
+ Printf("WARNING: Centrality object is 0");
+ centrality = -1;
+ }
+ if (centrality < 0)
+ return;
+
+
+ //vertex selection
+ Int_t nVertex = ((AliAODEvent*)fAOD)->GetNumberOfVertices();
+ if( nVertex > 0 ) {
+ AliAODVertex* vertex = (AliAODVertex*)((AliAODEvent*)fAOD)->GetPrimaryVertex();
+ //Int_t nTracksPrim = vertex->GetNContributors();
+ Double_t zVertex = vertex->GetZ();
+ //10 cm cut
+ if(TMath::Abs(zVertex)>10) return;
+ //AliInfo(Form(" Vertex in = %f with %d particles by %s data ...",zVertex,nTracksPrim,vertex->GetName()));
+ // Reject TPC only vertex
+ TString name(vertex->GetName());
+ if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return;
+ }
+
+ //Int_t count=0;
+ //track loop
+ for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
+ AliAODTrack* track = fAOD->GetTrack(iTracks);
+ if(!(track->TestFilterBit(32)))continue;
+ if (TMath::Abs(track->Eta()) > .8 || track->Pt() < .2) continue;
+
+ Int_t pdg=-999;
+ Int_t isph=-999;
+ if (fIsMC && arrayMC) {
+ AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
+ if (!partMC) {
+ AliError("Cannot get MC particle");
+ continue;
+ }
+ pdg=TMath::Abs(partMC->GetPdgCode());
+ isph=partMC->IsPhysicalPrimary();
+ }
+ if(!isph)continue;
+ //step 1, TOF Matching
+ UInt_t status;
+ status=track->GetStatus();
+ if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)continue;
+
+ //step 2, combined PID
+ Int_t IDTPCTOF=fNSigmaPID->GetParticleSpecies(track,1);
+ if(IDTPCTOF==999)IDTPCTOF=-1;
+ Int_t IDMC=-1;
+ for(Int_t ipart=0;ipart<npart+2;ipart++)if(TMath::Abs(pdg)==pdgcode[ipart])IDMC=partid[ipart];
+ fHistID->Fill(IDMC,IDTPCTOF,track->Pt());
+ } // end loop on tracks
+
+ PostData(1,fOutput);
+
+}
+
+//_________________________________________________________________
+void AliAnalysisTaskContMC::Terminate(Option_t *)
+{
+ // Terminate analysis
+ //
+ fOutput = dynamic_cast<TList*>(GetOutputData(1));
+ if (!fOutput) {
+ printf("ERROR: fOutput not available\n");
+ return;
+ }
+ fHistID = dynamic_cast<TH3F*>(fOutput->FindObject("fHistID"));
+ fNSigmaPID = dynamic_cast<AliHelperPID*>(fOutput->FindObject("fNSigmaPID"));
+}