TENDER becomes Tender
[u/mrichter/AliRoot.git] / PWGPP / TPC / macros / AddTaskPerformanceTPCdEdxQA.C
1 ///////////////////////////////////////////////////////////////////////////////
2 // Macro to setup AliPerformanceTask for 
3 // TPC performance QA to run on PWGPP QA train. 
4 //
5 // Input: ESDs, ESDfriends (optional), Kinematics (optional), TrackRefs (optional)
6 // ESD and MC input handlers must be attached to AliAnalysisManager
7 // to run default configuration. 
8 //
9 // By default 1 performance components are added to 
10 // the task: 
11 // 0. AliPerformanceTPC (TPC cluster and track and event information)
12 // 1. AliPerformanceMatch (TPC and ITS/TRD matching and TPC eff w.r.t ITS)
13 // 2. AliPerformanceMatch (TPC and ITS/TRD matching and TPC eff w.r.t TPC)
14 // 3. AliPerformancedEdx (TPC dEdx information)
15 // 4. AliPerformanceRes (TPC track resolution w.r.t MC at DCA)
16 // 5. AliPerformanceEff (TPC track reconstruction efficiency, MC primaries)
17 // 6. AliPerformanceMatch (Comparison of TPC constrain and global tracking)
18 //
19 // Usage on the analysis train (default configuration):
20 // gSystem->Load("libANALYSIS");
21 // gSystem->Load("libANALYSISalice");
22 // gSystem->Load("libTPCcalib.so");
23 // gSystem->Load("libTender.so");
24 // gSystem->Load("libPWGPP.so");
25 //
26 // gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
27 // AliPerformanceTask *tpcQA = AddTaskPerformanceTPCdEdxQA("kFALSE","kTRUE","kFALSE","triggerClass",kFALSE); 
28 // 
29 // Output:
30 // TPC.Performance.root file with TPC performance components is created.
31 //
32 // Each of the components contains THnSparse generic histograms which 
33 // have to be analysed (post-analysis) by using Analyse() function. 
34 // Each component contains such function.
35 //
36 //30.09.2010 -  J.Otwinowski@gsi.de
37 //22.09.2011 -  jochen@thaeder.de - Updated
38 ///////////////////////////////////////////////////////////////////////////////
39
40 //____________________________________________
41 AliPerformanceTask* AddTaskPerformanceTPCdEdxQA(Bool_t bUseMCInfo=kFALSE, Bool_t bUseESDfriend=kTRUE, 
42                                                 Bool_t highMult = kFALSE, const char *triggerClass=0, 
43                                                 Bool_t bUseHLT = kFALSE, Bool_t bUseTOF = kFALSE, Bool_t bTPCOnly = kFALSE,
44                                                 Bool_t bDoEffTpcSec = kFALSE)
45 {
46   Char_t *taskName[] = {"TPC", "HLT"};
47   Int_t idx = 0;
48   if (bUseHLT) idx = 1;
49   
50   //
51   // Add AliPerformanceTask with TPC performance components
52   //
53   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
54   if(!mgr) { 
55     Error("AddTaskPerformanceTPCdEdxQA","AliAnalysisManager not set!");
56     return NULL;
57   }
58   
59   TString type = mgr->GetInputEventHandler()->GetDataType();
60   if (!type.Contains("ESD")) {
61     Error("AddTaskPerformanceTPCdEdxQA", "ESD input handler needed!");
62     return NULL;
63   }
64   
65   AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler();
66   if (!mcH && bUseMCInfo) {
67     Error("AddTaskPerformanceTPCdEdxQA", "MC input handler needed!");
68     return NULL;
69   }
70
71   //
72   // Add HLT Event
73   //
74   if (bUseHLT) {
75     AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler());
76     esdH->SetReadHLT();
77   }
78
79   //
80   // Create task
81   //
82   AliPerformanceTask *task = new AliPerformanceTask("PerformanceQA",Form("%s Performance",taskName[idx]));
83   if (!task) {
84     Error("AddTaskPerformanceTPCdEdxQA", Form("%s performance task cannot be created!",taskName[idx]));
85     return NULL;
86   }
87   task->SetUseMCInfo(bUseMCInfo);
88   task->SetUseESDfriend(bUseESDfriend);
89   //  task->SetUseTerminate(kFALSE);
90   task->SetUseHLT(bUseHLT);
91
92   //
93   // Add task to analysis manager
94   //
95   mgr->AddTask(task);
96
97   //
98   // Create TPC-ESD track reconstruction cuts
99   // MB tracks
100   //
101   AliRecInfoCuts *pRecInfoCutsTPC = new AliRecInfoCuts(); 
102   if(pRecInfoCutsTPC) {
103     pRecInfoCutsTPC->SetMaxDCAToVertexXY(3.0);
104     pRecInfoCutsTPC->SetMaxDCAToVertexZ(3.0);
105     pRecInfoCutsTPC->SetRequireSigmaToVertex(kFALSE);
106     pRecInfoCutsTPC->SetRequireTPCRefit(kFALSE);
107     pRecInfoCutsTPC->SetAcceptKinkDaughters(kFALSE);
108     pRecInfoCutsTPC->SetMinNClustersTPC(70);
109     pRecInfoCutsTPC->SetMaxChi2PerClusterTPC(4.);
110     pRecInfoCutsTPC->SetDCAToVertex2D(kTRUE);
111
112     pRecInfoCutsTPC->SetHistogramsOn(kFALSE); 
113   } 
114   else {
115     Error("AddTaskPerformanceTPCdEdxQA", "AliRecInfoCutsTPC cannot be created!");
116     return NULL;
117   }
118
119   //
120   // Create TPC-MC track reconstruction cuts
121   //
122   AliMCInfoCuts  *pMCInfoCuts = new AliMCInfoCuts();
123   if(pMCInfoCuts) {
124     pMCInfoCuts->SetMinTrackLength(70);
125   } 
126   else {
127     Error("AddTaskPerformanceTPCdEdxQA", "AliMCInfoCuts cannot be created!");
128     return NULL;
129   }
130
131   //
132   // Create performance objects for TPC and set cuts 
133   //
134   enum { kTPC = 0, kTPCITS, kConstrained, kTPCInner, kTPCOuter, kTPCSec };
135
136   //
137   // TPC performance
138   //
139   AliPerformanceTPC *pCompTPC0 = new AliPerformanceTPC("AliPerformanceTPC","AliPerformanceTPC",kTPC,kFALSE,-1,highMult); 
140   if(!pCompTPC0) {
141     Error("AddTaskPerformanceTPCdEdxQA", "Cannot create AliPerformanceTPC");
142   }
143   pCompTPC0->SetAliRecInfoCuts(pRecInfoCutsTPC);
144   pCompTPC0->SetAliMCInfoCuts(pMCInfoCuts);
145   //  pCompTPC0->SetUseTrackVertex(kFALSE);
146   pCompTPC0->SetUseTrackVertex(kTRUE);
147   pCompTPC0->SetUseHLT(bUseHLT);
148   pCompTPC0->SetUseTOFBunchCrossing(bUseTOF);
149   
150   //
151   // TPC ITS match
152   //
153   AliPerformanceMatch *pCompMatch1 = new AliPerformanceMatch("AliPerformanceMatchTPCITS","AliPerformanceMatchTPCITS",0,kFALSE); 
154   if(!pCompMatch1) {
155     Error("AddTaskPerformanceTPCdEdxQA", "Cannot create AliPerformanceMatchTPCITS");
156   }
157   pCompMatch1->SetAliRecInfoCuts(pRecInfoCutsTPC);
158   pCompMatch1->SetAliMCInfoCuts(pMCInfoCuts);
159   pCompMatch1->SetUseTOFBunchCrossing(bUseTOF);
160
161
162   //
163   // ITS TPC match
164   //
165   AliPerformanceMatch *pCompMatch2 = new AliPerformanceMatch("AliPerformanceMatchITSTPC","AliPerformanceMatchITSTPC",1,kFALSE); 
166   if(!pCompMatch2) {
167     Error("AddTaskPerformanceTPCdEdxQA", "Cannot create AliPerformanceMatchITSTPC");  }
168   pCompMatch2->SetAliRecInfoCuts(pRecInfoCutsTPC);
169   pCompMatch2->SetAliMCInfoCuts(pMCInfoCuts);
170   pCompMatch2->SetUseTOFBunchCrossing(bUseTOF);
171
172   //
173   // dEdx
174   //
175   AliPerformanceDEdx *pCompDEdx3 = new AliPerformanceDEdx("AliPerformanceDEdxTPCInner","AliPerformanceDEdxTPCInner",kTPCInner,kFALSE); 
176   if(!pCompDEdx3) {
177     Error("AddTaskPerformanceTPCdEdxQA", "Cannot create AliPerformanceDEdxTPCInner");
178   }
179   pCompDEdx3->SetAliRecInfoCuts(pRecInfoCutsTPC);
180   pCompDEdx3->SetAliMCInfoCuts(pMCInfoCuts);
181   //pCompDEdx3->SetUseTrackVertex(kFALSE);
182   pCompDEdx3->SetUseTrackVertex(kTRUE);
183
184   //
185   // Resolution ------------------------------------------------------------------------------------
186   //
187
188   AliPerformanceRes *pCompRes4 = new AliPerformanceRes("AliPerformanceRes",
189                                                        "AliPerformanceRes", bTPCOnly == kTRUE ? kTPCInner : kTPC,kFALSE); 
190   if(!pCompRes4) {
191     Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceRes");
192   }
193
194
195   pCompRes4->SetAliRecInfoCuts(pRecInfoCutsTPC);
196   pCompRes4->SetAliMCInfoCuts(pMCInfoCuts);
197   pCompRes4->SetUseTrackVertex(bTPCOnly == kTRUE ? kFALSE : kTRUE);
198
199   //
200   // Efficiency ------------------------------------------------------------------------------------
201   //
202
203   AliPerformanceEff *pCompEff5 = new AliPerformanceEff("AliPerformanceEff",
204                                                        "AliPerformanceEff",kTPC,kFALSE); 
205   if(!pCompEff5) {
206     Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceEff");
207   }
208
209   pCompEff5->SetAliRecInfoCuts(pRecInfoCutsTPC);
210   pCompEff5->SetAliMCInfoCuts(pMCInfoCuts);
211   pCompEff5->SetUseTrackVertex(bTPCOnly == kTRUE ? kFALSE : kTRUE);
212
213   AliPerformanceEff *pCompEff5Sec;
214   if (bDoEffTpcSec)
215   {
216           pCompEff5Sec = new AliPerformanceEff("AliPerformanceEffSec",
217                                                        "AliPerformanceEffSec",kTPCSec,kFALSE); 
218           if(!pCompEff5Sec) {
219                   Error("AddTaskPerformanceTPC", "Cannot create AliPerformanceEff");
220           }
221
222           pCompEff5Sec->SetAliRecInfoCuts(pRecInfoCutsTPC);
223           pCompEff5Sec->SetAliMCInfoCuts(pMCInfoCuts);
224           pCompEff5Sec->SetUseTrackVertex(bTPCOnly == kTRUE ? kFALSE : kTRUE);
225   }
226
227   //
228   // TPC Constrain to vertex
229   //
230   AliPerformanceMatch *pCompConstrain6 = new AliPerformanceMatch("AliPerformanceMatchTPCConstrain","AliPerformanceMatchTPCConstrain",2,kFALSE); 
231   if(!pCompConstrain6) {
232     Error("AddTaskPerformanceTPCdEdxQA", "Cannot create AliPerformanceMatchTPCConstrain");  }
233   pCompConstrain6->SetAliRecInfoCuts(pRecInfoCutsTPC);
234   pCompConstrain6->SetAliMCInfoCuts(pMCInfoCuts);
235   pCompConstrain6->SetUseTOFBunchCrossing(bUseTOF);
236
237
238
239   //
240   // Add components to the performance task
241   //
242   if(!bUseMCInfo) { 
243     pCompTPC0->SetTriggerClass(triggerClass);
244     pCompMatch1->SetTriggerClass(triggerClass);
245     pCompMatch2->SetTriggerClass(triggerClass);
246     pCompDEdx3->SetTriggerClass(triggerClass);
247     pCompConstrain6->SetTriggerClass(triggerClass);
248   }
249   task->AddPerformanceObject( pCompTPC0 );
250   task->AddPerformanceObject( pCompMatch1 );
251   task->AddPerformanceObject( pCompMatch2 );
252   task->AddPerformanceObject( pCompDEdx3 );
253   task->AddPerformanceObject( pCompConstrain6 );
254   if(bUseMCInfo)   {
255       task->AddPerformanceObject( pCompRes4 );
256       task->AddPerformanceObject( pCompEff5 );
257           if (bDoEffTpcSec) task->AddPerformanceObject( pCompEff5Sec );
258   }
259
260   //
261   // Create containers for input
262   //
263   mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
264
265   //
266   // Create containers for output
267   //
268    
269   AliAnalysisDataContainer *coutput = mgr->CreateContainer(Form("%sQA", taskName[idx]), TList::Class(), 
270                                                            AliAnalysisManager::kOutputContainer, 
271                                                            Form("%s:%s_%s", mgr->GetCommonFileName(), taskName[idx],task->GetName()));
272
273
274   AliAnalysisDataContainer *coutput2  = mgr->CreateContainer(Form("%sQASummary", taskName[idx]), TTree::Class(), 
275                                                              AliAnalysisManager::kParamContainer, 
276                                                              Form("trending.root:Summary%sQA", taskName[idx])); 
277   
278   mgr->ConnectOutput(task, 1, coutput);
279   mgr->ConnectOutput(task, 0, coutput2);
280
281 return task;  
282 }