Adding analysis task involving for TPC calibration
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 22 Jan 2008 15:37:00 +0000 (15:37 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 22 Jan 2008 15:37:00 +0000 (15:37 +0000)
(Marian, Peter Christiansen, Lars Bozyk)

TPC/AliAnaTPCTrackBase.cxx [new file with mode: 0644]
TPC/AliAnaTPCTrackBase.h [new file with mode: 0644]
TPC/AliAnaTPCTrackCalib.cxx [new file with mode: 0644]
TPC/AliAnaTPCTrackCalib.h [new file with mode: 0644]
TPC/TPCcalibLinkDef.h
TPC/libTPCcalib.pkg

diff --git a/TPC/AliAnaTPCTrackBase.cxx b/TPC/AliAnaTPCTrackBase.cxx
new file mode 100644 (file)
index 0000000..d17a4ec
--- /dev/null
@@ -0,0 +1,206 @@
+#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
diff --git a/TPC/AliAnaTPCTrackBase.h b/TPC/AliAnaTPCTrackBase.h
new file mode 100644 (file)
index 0000000..61f3abc
--- /dev/null
@@ -0,0 +1,47 @@
+#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
diff --git a/TPC/AliAnaTPCTrackCalib.cxx b/TPC/AliAnaTPCTrackCalib.cxx
new file mode 100644 (file)
index 0000000..70bd5ec
--- /dev/null
@@ -0,0 +1,111 @@
+#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
diff --git a/TPC/AliAnaTPCTrackCalib.h b/TPC/AliAnaTPCTrackCalib.h
new file mode 100644 (file)
index 0000000..1899599
--- /dev/null
@@ -0,0 +1,35 @@
+#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
index f78fcfe514285ba923fa8466b7a6485c425840bd..589ad415379ed4309d6d8236d96ce16fcd507164 100644 (file)
@@ -18,6 +18,8 @@
 
 #pragma link C++ class  AliTPCSelectorESD+;
 #pragma link C++ class  AliTPCSelectorTracks+;
+#pragma link C++ class  AliAnaTPCTrackBase+;
+#pragma link C++ class  AliAnaTPCTrackCalib+;
 
 
 #endif
index ac2d42b20f263b596c1702e7b1592bb046d71018..3a423cf75d8b687100dc93a08873ba4154c00005 100644 (file)
@@ -1,11 +1,11 @@
 
 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