--- /dev/null
+#include "AliAnaTPCTrackBase.h"\r
+//\r
+// This class is ment as a base class for doing analysis of\r
+// reconstructed TPC tracks in the AliAnalysisTask framework.\r
+//\r
+// The method FillTrackHistograms should be overloaded by the users\r
+// class and used to make cuts on tracks\r
+//\r
+// Questions, comments, or suggestions can be send to Peter Christiansen (Lund)\r
+// \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 <AliESD.h>\r
+\r
+// STL includes\r
+#include <iostream>\r
+\r
+using namespace std;\r
+\r
+ClassImp(AliAnaTPCTrackBase)\r
+\r
+//________________________________________________________________________\r
+AliAnaTPCTrackBase::AliAnaTPCTrackBase() : \r
+ AliAnalysisTask(), \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
+AliAnaTPCTrackBase::AliAnaTPCTrackBase(const char *name) : \r
+ AliAnalysisTask(name, "AliAnaTPCTrackBase"), \r
+ fESD(0), fESDfriend(0), fListOfHists(0)\r
+{\r
+ //\r
+ // Normal constructor\r
+ //\r
+\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 AliAnaTPCTrackBase::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 AliAnaTPCTrackBase::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 AliAnaTPCTrackBase::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 << "AliAnaTPCTrackBase::Exec()" << endl;\r
+ \r
+ if(fESD==0 || fESDfriend==0) {\r
+ \r
+ cout << "AliAnaTPCTrackBase::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 << " 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
+ \r
+ hESDTracks->Fill(nESDTracks);\r
+ Int_t nGoodTracks = 0;\r
+\r
+ for(Int_t i = 0; i < nESDTracks; i++) {\r
+ \r
+ AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(i);\r
+ AliESDfriendTrack* friendTrack = (AliESDfriendTrack*) track->GetFriendTrack();\r
+ AliTPCseed* seed = 0;\r
+ \r
+ if(friendTrack) {\r
+ TObject *cobject = 0;\r
+ for (Int_t i = 0; ; i++){\r
+ cobject = friendTrack->GetCalibObject(i);\r
+ if (!cobject) break;\r
+ seed = dynamic_cast<AliTPCseed*>(cobject);\r
+ if (seed) break;\r
+ }\r
+ if (!seed && fDebug>1) Error("Exec", "No seed found!!!");\r
+ }\r
+ else if (fDebug>1) Error("Exec", "No friend track found!!!");\r
+\r
+ Int_t accepted = FillTrackHistograms(nESDTracks, track, friendTrack, seed);\r
+\r
+ if(accepted) {\r
+ if(fDebug>1)\r
+ cout << "Track " << i << " was accepted" << endl;\r
+ nGoodTracks++;\r
+ } else {\r
+\r
+ if(fDebug>1)\r
+ cout << "Track " << i << " was rejected" << endl;\r
+ }\r
+ }\r
+ \r
+ hGoodTracks->Fill(nGoodTracks);\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 AliAnaTPCTrackBase::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 AliAnaTPCTrackBase::Terminate(Option_t *) {\r
+ //\r
+ // Terminate loop\r
+ //\r
+ if(fDebug>3)\r
+ printf("AliAnaTPCTrackBase: Terminate() \n");\r
+}\r
--- /dev/null
+#ifndef ALIANATPCTRACKBASE_H\r
+#define ALIANATPCTRACKBASE_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
+\r
+class AliAnaTPCTrackBase : public AliAnalysisTask {\r
+ public:\r
+ AliAnaTPCTrackBase();\r
+ AliAnaTPCTrackBase(const char *name);\r
+ virtual ~AliAnaTPCTrackBase() {};\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
+ \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(AliAnaTPCTrackBase, 1); // Analysis task base class for TPC tracks and clusters\r
+};\r
+\r
+#endif\r
--- /dev/null
+#include "AliAnaTPCTrackCalib.h"\r
+//\r
+// This class is ment as an example of how to get access to the \r
+// clusters associated with reconstructed ESD tracks \r
+//\r
+//\r
+\r
+// ROOT includes\r
+#include <TChain.h>\r
+#include <TMath.h>\r
+\r
+// ALIROOT includes\r
+#include <AliTPCclusterMI.h>\r
+#include <AliTPCcalibTracksCuts.h>\r
+#include <AliTPCClusterParam.h>\r
+\r
+// STL includes\r
+#include <iostream>\r
+\r
+using namespace std;\r
+\r
+ClassImp(AliAnaTPCTrackCalib)\r
+ \r
+//________________________________________________________________________\r
+AliAnaTPCTrackCalib::AliAnaTPCTrackCalib() : \r
+ AliAnaTPCTrackBase(), fNtracks(0), fNClusters(0), fCalibTracks(0)\r
+{\r
+ //\r
+ // Default constructor (should not be used)\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliAnaTPCTrackCalib::AliAnaTPCTrackCalib(const char *name) : \r
+ AliAnaTPCTrackBase(name), fNtracks(0), fNClusters(0), fCalibTracks(0)\r
+{\r
+ //\r
+ // Normal constructor\r
+ //\r
+ printf("Normal constructor called with name %s \n", name); \r
+ // Input slot #1 works with a AliTPCCalibTracksCuts\r
+ DefineInput(1, AliTPCcalibTracksCuts::Class());\r
+ // Input slot #2 works with a AliTPCClusterParam\r
+ DefineInput(2, AliTPCClusterParam::Class());\r
+ \r
+ // Output slot #0 writes into a TList\r
+ // DefineOutput(0, TList::Class());\r
+ }\r
+\r
+//________________________________________________________________________\r
+void AliAnaTPCTrackCalib::CreateOutputObjects() \r
+{\r
+ //\r
+ // Connect the output objects\r
+ //\r
+ if(fDebug>0)\r
+ cout << "AliAnaTPCTrackCalib::CreateOutputObjects()" << endl;\r
+\r
+ AliAnaTPCTrackBase::CreateOutputObjects();\r
+ \r
+ // user code to go here\r
+ if (GetInputData(0)) printf("Input slo 0, Class_Name: %s\n", GetInputData(0)->Class_Name());\r
+ \r
+ fNtracks = new TH1I("ntracks","Number of tracks", 100, 0, 400);\r
+ fListOfHists->Add(fNtracks);\r
+ fNClusters = new TH1I("ncluster","Number of clusters",100, 0, 200);\r
+ fListOfHists->Add(fNClusters);\r
+ \r
+ AliTPCcalibTracksCuts *cuts = (AliTPCcalibTracksCuts*)GetInputData(1);\r
+ AliTPCClusterParam *clusterParam = (AliTPCClusterParam*)GetInputData(2);\r
+ if (!cuts) Error("CreateOutputObjects", "No CUTS found in input slot 1");\r
+ else {\r
+ printf("\nCuts found :-) \n");\r
+ cuts->Print();\r
+ }\r
+ if (!clusterParam) Error("CreateOutputObjects", "No CLUSTERPARAM found in input slot 2");\r
+ \r
+/* if ( !fCalibTracks ) {\r
+ OpenFile(0, "RECREATE");*/\r
+ \r
+ fCalibTracks = new AliTPCcalibTracks("calibTracks", "Resolution calibration object for tracks", clusterParam, cuts);\r
+ fListOfHists->Add(fCalibTracks);\r
+}\r
+\r
+\r
+//________________________________________________________________________\r
+Int_t AliAnaTPCTrackCalib::FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed) {\r
+ //\r
+ // This is the main method which rejects noise tracks and fills \r
+ // the histograms\r
+ //\r
+\r
+ if(!nTracks || !track || !friendTrack) {\r
+ if (fDebug > 1) AliWarning("WARNING: missing track information in AliAnaTPCTrackCalib");\r
+ return 0;\r
+ }\r
+ if(seed==0) {\r
+ if (fDebug > 1) AliWarning("WARNING: Missing seed in AliAnaTPCTrackCalib");\r
+ return 0;\r
+ }\r
+ \r
+ // calibration components to go here: \r
+ \r
+ if (seed) {\r
+ fNClusters->Fill(seed->GetNumberOfClusters());\r
+ fCalibTracks->Process(seed, track); // analysis is done in fCalibTracks\r
+ }\r
+ \r
+ return 1;\r
+} \r
+\r
--- /dev/null
+#ifndef ALIANATPCTRACKCALIB_H\r
+#define ALIANATPCTRACKCALIB_H\r
+\r
+// ROOT includes\r
+#include <TH1.h>\r
+#include <TH2.h>\r
+\r
+// AliRoot includes\r
+#include "AliAnaTPCTrackBase.h"\r
+\r
+#include <AliESDtrack.h>\r
+#include <AliESDfriendTrack.h>\r
+#include <AliTPCseed.h>\r
+#include <AliTPCROC.h>\r
+#include <AliTPCcalibTracks.h>\r
+\r
+class AliAnaTPCTrackCalib : public AliAnaTPCTrackBase {\r
+public:\r
+ AliAnaTPCTrackCalib();\r
+ AliAnaTPCTrackCalib(const char *name);\r
+ virtual ~AliAnaTPCTrackCalib() {};\r
+ \r
+ virtual void CreateOutputObjects();\r
+\r
+private:\r
+ virtual Int_t FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed);\r
+\r
+ TH1I *fNtracks; // number of Tracks\r
+ TH1I *fNClusters; // number of clusters on track\r
+ AliTPCcalibTracks *fCalibTracks; //Analysis object\r
+ \r
+ ClassDef(AliAnaTPCTrackCalib, 1); // Analysis task example for TPC tracks and clusters\r
+};\r
+\r
+#endif\r
#pragma link C++ class AliTPCSelectorESD+;
#pragma link C++ class AliTPCSelectorTracks+;
+#pragma link C++ class AliAnaTPCTrackBase+;
+#pragma link C++ class AliAnaTPCTrackCalib+;
#endif
SRCS = AliTPCcalibTracksCuts.cxx AliTPCcalibTracks.cxx AliTPCcalibTracksGain.cxx \
- AliTPCSelectorESD.cxx AliTPCSelectorTracks.cxx AliTPCCalPadRegion.cxx AliTPCFitPad.cxx
-
+ AliTPCSelectorESD.cxx AliTPCSelectorTracks.cxx AliTPCCalPadRegion.cxx AliTPCFitPad.cxx AliAnaTPCTrackBase.cxx AliAnaTPCTrackCalib.cxx
+
HDRS:= $(SRCS:.cxx=.h)
-EINCLUDE:=RAW TPC STEER
+EINCLUDE:=RAW TPC STEER ANALYSIS
DHDR= TPCcalibLinkDef.h