]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/AliComparisonTask.cxx
Adding abstract class for comparison components
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonTask.cxx
CommitLineData
6d1c79ca 1//------------------------------------------------------------------------------\r
2// Implementation of the AliComparisonTask class. It compares properties of the \r
3// reconstructed and MC particle tracks under several conditions. \r
4// As the input it requires the TTree with AliRecInfo and AliMCInfo branches. \r
3baa4bfd 5// \r
6// The comparison output objects deriving from AliComparisonObject \r
7// (e.g. AliComparisonRes, AliComparisonEff, AliComparisonDEdxA, AliComparisonDCA ...) \r
8// are stored in the Output.root file.\r
6d1c79ca 9// \r
10// Author: J.Otwinowski 04/02/2008 \r
11//------------------------------------------------------------------------------\r
12\r
13#include "iostream"\r
14\r
15#include "TChain.h"\r
16#include "TTree.h"\r
17#include "TH1F.h"\r
18#include "TCanvas.h"\r
19#include "TList.h"\r
20#include "TFile.h"\r
21\r
22#include "AliAnalysisTask.h"\r
23#include "AliAnalysisManager.h"\r
24#include "AliESDEvent.h"\r
25#include "AliESDInputHandler.h"\r
26#include "AliESDVertex.h"\r
27#include "AliMagFMaps.h"\r
28#include "AliTracker.h"\r
29#include "AliGeomManager.h"\r
30\r
31#include "AliMCInfo.h"\r
32#include "AliESDRecInfo.h"\r
33#include "AliMCInfoCuts.h"\r
34#include "AliRecInfoCuts.h"\r
35#include "AliComparisonRes.h"\r
36#include "AliComparisonEff.h"\r
37#include "AliComparisonDEdx.h"\r
38#include "AliComparisonDCA.h"\r
3baa4bfd 39#include "AliComparisonObject.h"\r
6d1c79ca 40#include "AliComparisonTask.h"\r
41\r
42using namespace std;\r
43\r
44ClassImp(AliComparisonTask)\r
45\r
46Int_t AliComparisonTask::evtNumber = 0;\r
47\r
48//_____________________________________________________________________________\r
49AliComparisonTask::AliComparisonTask(const char *name) \r
50 : AliAnalysisTask(name, "")\r
51 , fTree(0)\r
52 , fInfoMC(0)\r
53 , fInfoRC(0)\r
6d1c79ca 54 , fOutput(0)\r
55 , fMagField(0)\r
56 , fMagFMap(0)\r
3baa4bfd 57 , pitList(0)\r
58 , fCompList(0)\r
6d1c79ca 59{\r
60 // Constructor\r
61\r
62 // Define input and output slots here\r
63 DefineInput(0, TChain::Class());\r
64 DefineOutput(0, TList::Class());\r
65\r
66 // set default mag. field\r
67 SetMagField();\r
68 \r
3baa4bfd 69 // create the list for comparison objects\r
70 fCompList = new TList;\r
6d1c79ca 71}\r
72\r
73//_____________________________________________________________________________\r
74AliComparisonTask::~AliComparisonTask()\r
75{\r
76 if(fOutput) delete fOutput; fOutput =0; \r
77 if(fMagFMap) delete fMagFMap; fMagFMap =0; \r
3baa4bfd 78 if(fCompList) delete fCompList; fCompList =0; \r
6d1c79ca 79}\r
80\r
81//_____________________________________________________________________________\r
82void AliComparisonTask::ConnectInputData(Option_t *) \r
83{\r
84 // Connect input data \r
85 // Called once\r
86\r
87 fTree = dynamic_cast<TTree*> (GetInputData(0));\r
88 if (!fTree) {\r
89 Printf("ERROR: Could not read chain from input slot 0");\r
90 } else {\r
91 fTree->SetBranchStatus("*",1);\r
92 }\r
93\r
94 if(fTree->GetBranch("MC") && fTree->GetBranch("RC")) {\r
95 fTree->GetBranch("MC")->SetAddress(&fInfoMC);\r
96 fTree->GetBranch("RC")->SetAddress(&fInfoRC);\r
97 } else {\r
98 Printf("ERROR: Could not get MC and RC branches");\r
99 }\r
100 \r
101 // set mag. field map \r
102 fMagFMap = new AliMagFMaps("Maps","Maps", 2, 1., 10., fMagField);\r
103 AliTracker::SetFieldMap(fMagFMap,kFALSE);\r
3baa4bfd 104}\r
105\r
106//_____________________________________________________________________________\r
107Bool_t AliComparisonTask::AddComparisonObject(AliComparisonObject *pObj) \r
108{\r
109 // add comparison object to the list\r
110 if(pObj == 0) {\r
111 Printf("ERROR: Could not add comparison object");\r
112 return kFALSE;\r
113 }\r
6d1c79ca 114\r
3baa4bfd 115 // add object to the list\r
116 fCompList->AddLast(pObj);\r
117 \r
118return kTRUE;\r
6d1c79ca 119}\r
120\r
121//_____________________________________________________________________________\r
122void AliComparisonTask::CreateOutputObjects()\r
123{\r
124 // Create histograms\r
125 // Called once\r
126\r
3baa4bfd 127 // create output list\r
6d1c79ca 128 fOutput = new TList;\r
129 fOutput->SetOwner();\r
3baa4bfd 130 pitList = fOutput->MakeIterator();\r
6d1c79ca 131\r
3baa4bfd 132 AliComparisonObject *pObj=0;\r
133 Int_t count=0;\r
6d1c79ca 134\r
3baa4bfd 135 // add comparison objects to the output\r
136 TIterator *pitCompList = fCompList->MakeIterator();\r
137 pitCompList->Reset();\r
138 while(( pObj = (AliComparisonObject *)pitCompList->Next()) != NULL) {\r
139 fOutput->Add(pObj);\r
140 count++;\r
141 }\r
142 Printf("CreateOutputObjects(): Number of output comparison objects: %d \n", count);\r
6d1c79ca 143}\r
144\r
145//_____________________________________________________________________________\r
146Bool_t AliComparisonTask::ReadEntry(Int_t evt) \r
147{\r
3baa4bfd 148// Read entry from the tree\r
6d1c79ca 149 Long64_t centry = fTree->LoadTree(evt);\r
150 if(centry < 0) return kFALSE;\r
151\r
152 if(fTree->GetBranch("MC") && fTree->GetBranch("RC")) {\r
153 fTree->GetBranch("MC")->SetAddress(&fInfoMC);\r
154 fTree->GetBranch("RC")->SetAddress(&fInfoRC);\r
155 } else {\r
156 Printf("ERROR: Could not get MC and RC branches");\r
157 return kFALSE;\r
158 }\r
159 fTree->GetEntry(evt);\r
160\r
161return kTRUE;\r
162}\r
163//_____________________________________________________________________________\r
164void AliComparisonTask::Exec(Option_t *) \r
165{\r
166 // Main loop\r
167 // Called for each event\r
168\r
3baa4bfd 169 AliComparisonObject *pObj=0;\r
170\r
6d1c79ca 171 if (!fInfoMC && !fInfoRC) {\r
172 Printf("ERROR: fInfoMC && fInfoRC not available");\r
173 return;\r
174 }\r
175\r
176 // Process comparison\r
177 Bool_t status = ReadEntry(evtNumber);\r
178 if(status == kTRUE) \r
179 {\r
3baa4bfd 180 pitList->Reset();\r
181 while(( pObj = (AliComparisonObject *)pitList->Next()) != NULL) {\r
182 pObj->Exec(fInfoMC,fInfoRC);\r
183 }\r
6d1c79ca 184 }\r
185\r
186 if( !( evtNumber % 10000) ) { \r
187 cout << evtNumber << endl;\r
188 }\r
189 evtNumber++;\r
190\r
191 // Post output data.\r
192 PostData(0, fOutput);\r
193}\r
194\r
195//_____________________________________________________________________________\r
196void AliComparisonTask::Terminate(Option_t *) \r
197{\r
198 // Called once at the end of the event loop\r
6d1c79ca 199 TFile *out = new TFile("Output.root","RECREATE");\r
200 out->cd();\r
201\r
202 fOutput = dynamic_cast<TList*> (GetOutputData(0));\r
203 if (!fOutput) {\r
204 Printf("ERROR: fOutput not available");\r
205 return;\r
206 }\r
207\r
6d1c79ca 208 fOutput->Write();\r
209 out->Close();\r
210}\r