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
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
10 // Author: J.Otwinowski 04/02/2008
\r
11 //------------------------------------------------------------------------------
\r
18 #include "TCanvas.h"
\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
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
39 #include "AliComparisonObject.h"
\r
40 #include "AliComparisonTask.h"
\r
42 using namespace std;
\r
44 ClassImp(AliComparisonTask)
\r
46 Int_t AliComparisonTask::evtNumber = 0;
\r
48 //_____________________________________________________________________________
\r
49 AliComparisonTask::AliComparisonTask(const char *name)
\r
50 : AliAnalysisTask(name, "")
\r
62 // Define input and output slots here
\r
63 DefineInput(0, TChain::Class());
\r
64 DefineOutput(0, TList::Class());
\r
66 // set default mag. field
\r
69 // create the list for comparison objects
\r
70 fCompList = new TList;
\r
73 //_____________________________________________________________________________
\r
74 AliComparisonTask::~AliComparisonTask()
\r
76 if(fOutput) delete fOutput; fOutput =0;
\r
77 if(fMagFMap) delete fMagFMap; fMagFMap =0;
\r
78 if(fCompList) delete fCompList; fCompList =0;
\r
81 //_____________________________________________________________________________
\r
82 void AliComparisonTask::ConnectInputData(Option_t *)
\r
84 // Connect input data
\r
87 fTree = dynamic_cast<TTree*> (GetInputData(0));
\r
89 Printf("ERROR: Could not read chain from input slot 0");
\r
91 fTree->SetBranchStatus("*",1);
\r
94 if(fTree->GetBranch("MC") && fTree->GetBranch("RC")) {
\r
95 fTree->GetBranch("MC")->SetAddress(&fInfoMC);
\r
96 fTree->GetBranch("RC")->SetAddress(&fInfoRC);
\r
98 Printf("ERROR: Could not get MC and RC branches");
\r
101 // set mag. field map
\r
102 fMagFMap = new AliMagFMaps("Maps","Maps", 2, 1., 10., fMagField);
\r
103 AliTracker::SetFieldMap(fMagFMap,kFALSE);
\r
106 //_____________________________________________________________________________
\r
107 Bool_t AliComparisonTask::AddComparisonObject(AliComparisonObject *pObj)
\r
109 // add comparison object to the list
\r
111 Printf("ERROR: Could not add comparison object");
\r
115 // add object to the list
\r
116 fCompList->AddLast(pObj);
\r
121 //_____________________________________________________________________________
\r
122 void AliComparisonTask::CreateOutputObjects()
\r
124 // Create histograms
\r
127 // create output list
\r
128 fOutput = new TList;
\r
129 fOutput->SetOwner();
\r
130 pitList = fOutput->MakeIterator();
\r
132 AliComparisonObject *pObj=0;
\r
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
142 Printf("CreateOutputObjects(): Number of output comparison objects: %d \n", count);
\r
145 //_____________________________________________________________________________
\r
146 Bool_t AliComparisonTask::ReadEntry(Int_t evt)
\r
148 // Read entry from the tree
\r
149 Long64_t centry = fTree->LoadTree(evt);
\r
150 if(centry < 0) return kFALSE;
\r
152 if(fTree->GetBranch("MC") && fTree->GetBranch("RC")) {
\r
153 fTree->GetBranch("MC")->SetAddress(&fInfoMC);
\r
154 fTree->GetBranch("RC")->SetAddress(&fInfoRC);
\r
156 Printf("ERROR: Could not get MC and RC branches");
\r
159 fTree->GetEntry(evt);
\r
163 //_____________________________________________________________________________
\r
164 void AliComparisonTask::Exec(Option_t *)
\r
167 // Called for each event
\r
169 AliComparisonObject *pObj=0;
\r
171 if (!fInfoMC && !fInfoRC) {
\r
172 Printf("ERROR: fInfoMC && fInfoRC not available");
\r
176 // Process comparison
\r
177 Bool_t status = ReadEntry(evtNumber);
\r
178 if(status == kTRUE)
\r
181 while(( pObj = (AliComparisonObject *)pitList->Next()) != NULL) {
\r
182 pObj->Exec(fInfoMC,fInfoRC);
\r
186 if( !( evtNumber % 10000) ) {
\r
187 cout << evtNumber << endl;
\r
191 // Post output data.
\r
192 PostData(0, fOutput);
\r
195 //_____________________________________________________________________________
\r
196 void AliComparisonTask::Terminate(Option_t *)
\r
198 // Called once at the end of the event loop
\r
199 TFile *out = new TFile("Output.root","RECREATE");
\r
202 fOutput = dynamic_cast<TList*> (GetOutputData(0));
\r
204 Printf("ERROR: fOutput not available");
\r