--- /dev/null
+//\r
+// This class is the task for connecting together \r
+// MC information and the RC information \r
+//\r
+// The task is a wrapper over two components\r
+// AliGenInfoMaker\r
+// AliESDRecInfoMaker.h\r
+\r
+// ROOT includes\r
+#include <TChain.h>\r
+#include <TMath.h>\r
+\r
+// ALIROOT includes\r
+#include <AliAnalysisManager.h>\r
+#include <AliESDInputHandler.h>\r
+#include "AliStack.h"\r
+#include "AliMCEvent.h"\r
+#include "AliMCEventHandler.h"\r
+\r
+#include <AliESD.h>\r
+#include "AliGenInfoTask.h"\r
+#include "AliGenInfoMaker.h"\r
+#include "AliHelix.h"\r
+\r
+// STL includes\r
+#include <iostream>\r
+\r
+using namespace std;\r
+\r
+ClassImp(AliGenInfoTask)\r
+\r
+//________________________________________________________________________\r
+AliGenInfoTask::AliGenInfoTask() : \r
+ AliAnalysisTask(), fGenMaker(0),\r
+ fESD(0), fESDfriend(0), fListOfHists(0)\r
+{\r
+ //\r
+ // Default constructor (should not be used)\r
+ //\r
+ fDebug = 0;\r
+ SetMaxTracks();\r
+}\r
+\r
+//________________________________________________________________________\r
+AliGenInfoTask::AliGenInfoTask(const char *name) : \r
+ AliAnalysisTask(name, "AliGenInfoTask"), \r
+ fGenMaker(0),\r
+ fESD(0), \r
+ fESDfriend(0), \r
+ fListOfHists(0)\r
+{\r
+ //\r
+ // Normal constructor\r
+ //\r
+ fGenMaker = new AliGenInfoMaker;\r
+ fGenMaker->SetIO();\r
+ // Input slot #0 works with a TChain\r
+ DefineInput(0, TChain::Class());\r
+ // Output slot #0 writes into a TList\r
+ DefineOutput(0, TList::Class());\r
+ \r
+ fDebug = 0;\r
+ SetMaxTracks();\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliGenInfoTask::ConnectInputData(Option_t *) \r
+{\r
+ //\r
+ // Connect the input data\r
+ //\r
+ if(fDebug>3)\r
+ cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;\r
+\r
+ AliESDInputHandler* esdH = (AliESDInputHandler*) \r
+ ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());\r
+ fESD = esdH->GetEvent();\r
+\r
+ if(fESD==0) {\r
+ \r
+ cout << endl << "WARNING: NO ESD event found" << endl << endl;\r
+ } else {\r
+\r
+ fESDfriend = \r
+ (AliESDfriend*)fESD->FindListObject("AliESDfriend"); \r
+ \r
+ if(fESDfriend==0) {\r
+ \r
+ cout << endl << "WARNING: NO ESD friend found" << endl << endl;\r
+ }\r
+ }\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliGenInfoTask::CreateOutputObjects() \r
+{\r
+ //\r
+ // Connect the output objects\r
+ //\r
+ if(fDebug>3)\r
+ cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;\r
+ \r
+// OpenFile(0);\r
+// fListOfHists = new TList();\r
+ \r
+// hESDTracks = \r
+// new TH1F("hESDTracks", \r
+// "Number of ESD tracks per event; N ESD tracks; Counts", \r
+// TMath::Min(fMaxTracks, 100), 0, fMaxTracks);\r
+// fListOfHists->Add(hESDTracks);\r
+\r
+// hGoodTracks = \r
+// new TH1F("hGoodTracks", \r
+// "Number of Good tracks per event; N good tracks; Counts", \r
+// TMath::Min(fMaxTracks, 100), 0, fMaxTracks);\r
+// fListOfHists->Add(hGoodTracks);\r
+}\r
+\r
+\r
+//________________________________________________________________________\r
+void AliGenInfoTask::Exec(Option_t *) {\r
+ //\r
+ // Execute analysis for current event \r
+ // For the moment I require that mcTruth is there! I am afraid to\r
+ // get out of sync if it is missing for some events since I use the\r
+ // number of MC events for normalisation\r
+ //\r
+\r
+ if(fDebug>3)\r
+ cout << "AliGenInfoTask::Exec()" << endl;\r
+\r
+ if (fESD) {\r
+ AliHelix::SetBz(fESD->GetMagneticField());\r
+ }\r
+ \r
+ // Monte carlo info\r
+ AliMCEventHandler* mcinfo = (AliMCEventHandler*) (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); \r
+ // If MC has been connected \r
+ \r
+ if (!mcinfo){\r
+ cout << "Not MC info\n" << endl;\r
+ }\r
+ fGenMaker->ProcessEvent(mcinfo);\r
+\r
+\r
+\r
+ if(fESD==0 || fESDfriend==0) {\r
+ \r
+ cout << "AliGenInfoTask::Exec(): WARNING: fESD=" << fESD \r
+ << ", fESDfriend=" << fESDfriend << endl;\r
+ // Post final data. It will be written to a file with option "RECREATE"\r
+ PostData(0, fListOfHists);\r
+ return;\r
+ }\r
+ \r
+ fESD->SetESDfriend(fESDfriend);\r
+ const Int_t nESDTracks = fESD->GetNumberOfTracks();\r
+ \r
+ if(fDebug>0){\r
+ cout << " AliGenIfoTask::Exec() Number of ESD tracks: " << nESDTracks << endl;\r
+ }\r
+ if ( nESDTracks != fESDfriend->GetNumberOfTracks() ) {\r
+ AliWarning("Number of Tracks differs from Number of Friend-Tracks!");\r
+ printf("Number of tracks: %i, number of friend tracks: %i \n", nESDTracks, fESDfriend->GetNumberOfTracks());\r
+ return;\r
+ }\r
+// // Post final data. It will be written to a file with option "RECREATE"\r
+ PostData(0, fListOfHists);\r
+} \r
+\r
+//________________________________________________________________________\r
+Int_t AliGenInfoTask::FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed) {\r
+ //\r
+ // This method should be overloaded and used to make cuts on tracks\r
+ // and fill histograms. \r
+ // return 0 if track was rejected, 1 if accepted\r
+ //\r
+\r
+ if(nTracks && track && friendTrack && seed)\r
+ return 1;\r
+ else\r
+ return 0;\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliGenInfoTask::Terminate(Option_t *) {\r
+ //\r
+ // Terminate loop\r
+ //\r
+ if(fDebug>3)\r
+ printf("AliGenInfoTask: Terminate() \n"); \r
+ fGenMaker->CloseOutputFile();\r
+}\r
--- /dev/null
+#ifndef ALIGENINFOTASK_H\r
+#define ALIGENINFOTASK_H\r
+\r
+// ROOT includes\r
+#include <TList.h>\r
+#include <TH1.h>\r
+#include <TH2.h>\r
+\r
+// AliRoot includes\r
+#include <AliAnalysisTask.h>\r
+#include <AliESDEvent.h>\r
+#include <AliESDfriend.h>\r
+#include <AliESDtrack.h>\r
+#include <AliESDfriendTrack.h>\r
+#include <AliTPCseed.h>\r
+class AliGenInfoMaker;\r
+\r
+class AliGenInfoTask : public AliAnalysisTask {\r
+ public:\r
+ AliGenInfoTask();\r
+ AliGenInfoTask(const char *name);\r
+ virtual ~AliGenInfoTask() {};\r
+ \r
+ virtual void ConnectInputData(Option_t *);\r
+ virtual void CreateOutputObjects();\r
+ virtual void Exec(Option_t *option);\r
+ virtual void Terminate(Option_t *);\r
+ virtual void SetDebugLevel(Int_t level) {fDebug = level;}\r
+ virtual void SetMaxTracks(Int_t max=10) {fMaxTracks = max;}\r
+ \r
+ protected:\r
+ virtual Int_t FillTrackHistograms(Int_t nTracks, AliESDtrack* track, \r
+ AliESDfriendTrack* friendTrack, \r
+ AliTPCseed* seed);\r
+ AliGenInfoMaker *fGenMaker; // gen Maker\r
+ Int_t fDebug; // Debug flag\r
+ AliESDEvent* fESD; //! ESD\r
+ AliESDfriend* fESDfriend; //! ESD friend\r
+ TList* fListOfHists; //! Output list of histograms\r
+ \r
+ Int_t fMaxTracks; // Max tracks in histogram\r
+ TH1F* hESDTracks; //! N ESD tracks\r
+ TH1F* hGoodTracks; //! GOOD tracks\r
+\r
+ ClassDef(AliGenInfoTask, 1); // Analysis task base class for TPC tracks and clusters\r
+};\r
+\r
+#endif\r