]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/AliAnalysisTaskProtonsQA.cxx
removed external class
[u/mrichter/AliRoot.git] / PWG2 / AliAnalysisTaskProtonsQA.cxx
CommitLineData
7b59a00b 1#include "TChain.h"
2#include "TTree.h"
3#include "TString.h"
4#include "TList.h"
5#include "TH2F.h"
6#include "TH1I.h"
7#include "TF1.h"
8#include "TCanvas.h"
9#include "TLorentzVector.h"
10
11#include "AliAnalysisTask.h"
12#include "AliAnalysisManager.h"
13
75decd62 14#include "AliGenEventHeader.h"
7b59a00b 15#include "AliESDEvent.h"
16#include "AliESDInputHandler.h"
17#include "AliMCEventHandler.h"
18#include "AliMCEvent.h"
19#include "AliStack.h"
5429dd65 20#include "AliVertexerTracks.h"
21#include "AliESDVertex.h"
7b59a00b 22
5ae0977e 23#include "AliProtonQAAnalysis.h"
7b59a00b 24#include "AliAnalysisTaskProtonsQA.h"
25
26// Analysis task used for the QA of the (anti)proton analysis
27// Author: Panos Cristakoglou
28
29ClassImp(AliAnalysisTaskProtonsQA)
5429dd65 30
7b59a00b 31//________________________________________________________________________
32AliAnalysisTaskProtonsQA::AliAnalysisTaskProtonsQA()
33 : AliAnalysisTask(), fESD(0), fMC(0),
5661e210 34 fList0(0), fList1(0), fList2(0), fList3(0),
35 fList4(0), fList5(0), fList6(0), fList7(0),
5429dd65 36 fProtonQAAnalysis(0),
37 fTriggerMode(kMB2), fProtonAnalysisMode(kTPC),
38 fVxMax(0), fVyMax(0), fVzMax(0) {
39 //Dummy constructor
7b59a00b 40}
41
42//________________________________________________________________________
43AliAnalysisTaskProtonsQA::AliAnalysisTaskProtonsQA(const char *name)
5429dd65 44 : AliAnalysisTask(name, ""), fESD(0), fMC(0),
75decd62 45 fList0(0), fList1(0), fList2(0), fList3(0),
5661e210 46 fList4(0), fList5(0), fList6(0), fList7(0),
5429dd65 47 fProtonQAAnalysis(0),
48 fTriggerMode(kMB2), fProtonAnalysisMode(kTPC),
49 fVxMax(0), fVyMax(0), fVzMax(0) {
7b59a00b 50 // Constructor
5429dd65 51
7b59a00b 52 // Define input and output slots here
53 // Input slot #0 works with a TChain
54 DefineInput(0, TChain::Class());
55 // Output slot #0 writes into a TList container
56 DefineOutput(0, TList::Class());
d4733690 57 DefineOutput(1, TList::Class());
58 DefineOutput(2, TList::Class());
5b8133c7 59 DefineOutput(3, TList::Class());
60 DefineOutput(4, TList::Class());
9c0b9f24 61 DefineOutput(5, TList::Class());
75decd62 62 DefineOutput(6, TList::Class());
5661e210 63 DefineOutput(7, TList::Class());
7b59a00b 64}
65
66//________________________________________________________________________
67void AliAnalysisTaskProtonsQA::ConnectInputData(Option_t *) {
68 // Connect ESD or AOD here
69 // Called once
70
71 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
72 if (!tree) {
73 Printf("ERROR: Could not read chain from input slot 0");
74 } else {
7b59a00b 75 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
76
77 if (!esdH) {
78 Printf("ERROR: Could not get ESDInputHandler");
79 } else
80 fESD = esdH->GetEvent();
81 }
82
83 AliMCEventHandler* mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
84 if (!mcH) {
85 Printf("ERROR: Could not retrieve MC event handler");
86 }
87 else
88 fMC = mcH->MCEvent();
75decd62 89
7b59a00b 90}
91
92//________________________________________________________________________
93void AliAnalysisTaskProtonsQA::CreateOutputObjects() {
94 // Create histograms
95 // Called once
96 //Prior probabilities
97 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
98
99 //proton analysis object
5429dd65 100 fProtonQAAnalysis = new AliProtonQAAnalysis();
dd3fa486 101 fProtonQAAnalysis->SetEtaMode(); //in case you want eta-Pt instead of y-Pt
5429dd65 102 fProtonQAAnalysis->SetRunMCAnalysis();
dd3fa486 103 fProtonQAAnalysis->SetRunEfficiencyAnalysis(kFALSE); //kTRUE if the cuts should be used in the reco and pid efficiencies
5429dd65 104 //fProtonQAAnalysis->SetMCProcessId(13);//4: weak decay - 13: hadronic interaction
105 //fProtonQAAnalysis->SetMotherParticlePDGCode(3122);//3122: Lambda
7b59a00b 106
3a954fe7 107 //Use of TPConly tracks
5429dd65 108 if(fProtonAnalysisMode == kTPC) {
3e23254a 109 //fProtonQAAnalysis->SetQAYPtBins(20, -1.0, 1.0, 28, 0.1, 1.5); //TPC only
6667f3a7 110 fProtonQAAnalysis->SetQAYPtBins(10, -0.5, 0.5, 16, 0.5, 0.9); //TPC only
5429dd65 111 fProtonQAAnalysis->UseTPCOnly();
112 //fProtonQAAnalysis->SetTPCpid();
113 fProtonQAAnalysis->SetMinTPCClusters(100);
114 fProtonQAAnalysis->SetMaxChi2PerTPCCluster(2.2);
115 fProtonQAAnalysis->SetMaxCov11(0.5);
116 fProtonQAAnalysis->SetMaxCov22(0.5);
117 fProtonQAAnalysis->SetMaxCov33(0.5);
118 fProtonQAAnalysis->SetMaxCov44(0.5);
119 fProtonQAAnalysis->SetMaxCov55(0.5);
120 fProtonQAAnalysis->SetMaxSigmaToVertexTPC(2.0);
121 //fProtonQAAnalysis->SetMaxDCAXYTPC(1.5);
122 //fProtonQAAnalysis->SetMaxDCAZTPC(1.5);
123 }
0326e385 124 //Use of HybridTPC tracks
5429dd65 125 else if(fProtonAnalysisMode == kHybrid) {
6667f3a7 126 fProtonQAAnalysis->SetQAYPtBins(10, -0.5, 0.5, 16, 0.5, 0.9); //HybridTPC
5429dd65 127 fProtonQAAnalysis->UseHybridTPC();
128 fProtonQAAnalysis->SetTPCpid();
129 fProtonQAAnalysis->SetMinTPCClusters(110);
130 fProtonQAAnalysis->SetMaxChi2PerTPCCluster(2.2);
131 fProtonQAAnalysis->SetMaxCov11(0.5);
132 fProtonQAAnalysis->SetMaxCov22(0.5);
133 fProtonQAAnalysis->SetMaxCov33(0.5);
134 fProtonQAAnalysis->SetMaxCov44(0.5);
135 fProtonQAAnalysis->SetMaxCov55(0.5);
136 fProtonQAAnalysis->SetMaxSigmaToVertex(2.0);
137 /*fProtonQAAnalysis->SetMaxDCAXY(1.5);
138 fProtonQAAnalysis->SetMaxDCAZ(1.5);*/
3e23254a 139 //fProtonQAAnalysis->SetPointOnITSLayer6();
140 //fProtonQAAnalysis->SetPointOnITSLayer5();
141 //fProtonQAAnalysis->SetPointOnITSLayer4();
142 //fProtonQAAnalysis->SetPointOnITSLayer3();
143 //fProtonQAAnalysis->SetPointOnITSLayer2();
144 //fProtonQAAnalysis->SetPointOnITSLayer1();
dd3fa486 145 //fProtonQAAnalysis->SetMinITSClusters(4);
5429dd65 146 }
7b59a00b 147 //Combined tracking
5429dd65 148 else if(fProtonAnalysisMode == kGlobal) {
dd3fa486 149 fProtonQAAnalysis->SetQAYPtBins(20, -1.0, 1.0, 48, 0.3, 1.5); //combined tracking
5429dd65 150 fProtonQAAnalysis->SetMinTPCClusters(110);
151 fProtonQAAnalysis->SetMaxChi2PerTPCCluster(2.2);
152 fProtonQAAnalysis->SetMaxCov11(0.5);
153 fProtonQAAnalysis->SetMaxCov22(0.5);
154 fProtonQAAnalysis->SetMaxCov33(0.5);
155 fProtonQAAnalysis->SetMaxCov44(0.5);
156 fProtonQAAnalysis->SetMaxCov55(0.5);
157 fProtonQAAnalysis->SetMaxSigmaToVertex(2.0);
158 //fProtonQAAnalysis->SetMaxDCAXY(2.0);
159 //fProtonQAAnalysis->SetMaxDCAZ(2.0);
160 fProtonQAAnalysis->SetTPCRefit();
161 fProtonQAAnalysis->SetPointOnITSLayer1();
162 fProtonQAAnalysis->SetPointOnITSLayer2();
163 //fProtonQAAnalysis->SetPointOnITSLayer3();
164 //fProtonQAAnalysis->SetPointOnITSLayer4();
165 fProtonQAAnalysis->SetPointOnITSLayer5();
166 fProtonQAAnalysis->SetPointOnITSLayer6();
167 fProtonQAAnalysis->SetMinITSClusters(5);
168 fProtonQAAnalysis->SetITSRefit();
169 fProtonQAAnalysis->SetESDpid();
170 }
7b59a00b 171
5429dd65 172 fProtonQAAnalysis->SetPriorProbabilities(partFrac);
173
d4733690 174 fList0 = new TList();
5429dd65 175 fList0 = fProtonQAAnalysis->GetGlobalQAList();
d4733690 176
177 fList1 = new TList();
5429dd65 178 fList1 = fProtonQAAnalysis->GetPDGList();
d4733690 179
180 fList2 = new TList();
5429dd65 181 fList2 = fProtonQAAnalysis->GetMCProcessesList();
5b8133c7 182
183 fList3 = new TList();
5429dd65 184 fList3 = fProtonQAAnalysis->GetAcceptedCutList();
5b8133c7 185
186 fList4 = new TList();
5661e210 187 fList4 = fProtonQAAnalysis->GetRejectedCutList();
9c0b9f24 188
189 fList5 = new TList();
5661e210 190 fList5 = fProtonQAAnalysis->GetAcceptedDCAList();
75decd62 191
192 fList6 = new TList();
5661e210 193 fList6 = fProtonQAAnalysis->GetEfficiencyQAList();
194
195 fList7 = new TList();
196 fList7 = fProtonQAAnalysis->GetVertexQAList();
7b59a00b 197}
198
199//________________________________________________________________________
200void AliAnalysisTaskProtonsQA::Exec(Option_t *) {
201 // Main loop
202 // Called for each event
203
204 if (!fESD) {
205 Printf("ERROR: fESD not available");
206 return;
207 }
5429dd65 208
7b59a00b 209 if (!fMC) {
210 Printf("ERROR: Could not retrieve MC event");
211 return;
212 }
213
75decd62 214 AliGenEventHeader *header = fMC->GenEventHeader();
215 if (!header) {
216 Printf("ERROR: Could not retrieve the header");
217 return;
218 }
219
7b59a00b 220 AliStack* stack = fMC->Stack();
221 if (!stack) {
222 Printf("ERROR: Could not retrieve the stack");
223 return;
224 }
225
5429dd65 226 if(IsEventTriggered(fESD,fTriggerMode)) {
75decd62 227 fProtonQAAnalysis->RunVertexQA(header,
228 stack,
229 fESD);
5429dd65 230 const AliESDVertex *vertex = GetVertex(fESD,fProtonAnalysisMode,
231 fVxMax,fVyMax,fVzMax);
232 if(vertex) {
6667f3a7 233 fProtonQAAnalysis->RunQAAnalysis(stack, fESD, vertex);
5429dd65 234 fProtonQAAnalysis->RunMCAnalysis(stack);
6667f3a7 235 fProtonQAAnalysis->RunEfficiencyAnalysis(stack, fESD, vertex);
5429dd65 236 }//accepted vertex
237 }//triggered event
238
7b59a00b 239 // Post output data.
d4733690 240 PostData(0, fList0);
241 PostData(1, fList1);
242 PostData(2, fList2);
5b8133c7 243 PostData(3, fList3);
244 PostData(4, fList4);
9c0b9f24 245 PostData(5, fList5);
75decd62 246 PostData(6, fList6);
5661e210 247 PostData(7, fList7);
7b59a00b 248}
249
250//________________________________________________________________________
251void AliAnalysisTaskProtonsQA::Terminate(Option_t *) {
252 // Draw result to the screen
253 // Called once at the end of the query
254
d4733690 255 fList0 = dynamic_cast<TList*> (GetOutputData(0));
256 if (!fList0) {
5429dd65 257 Printf("ERROR: fList0 not available");
258 return;
259 }
260 fList1 = dynamic_cast<TList*> (GetOutputData(1));
261 if (!fList1) {
262 Printf("ERROR: fList1 not available");
263 return;
264 }
265 fList2 = dynamic_cast<TList*> (GetOutputData(2));
266 if (!fList2) {
267 Printf("ERROR: fList2 not available");
268 return;
269 }
270 fList3 = dynamic_cast<TList*> (GetOutputData(3));
271 if (!fList3) {
272 Printf("ERROR: fList3 not available");
273 return;
274 }
275 fList4 = dynamic_cast<TList*> (GetOutputData(4));
276 if (!fList4) {
277 Printf("ERROR: fList4 not available");
7b59a00b 278 return;
279 }
5429dd65 280 fList5 = dynamic_cast<TList*> (GetOutputData(5));
281 if (!fList5) {
282 Printf("ERROR: fList5 not available");
283 return;
284 }
285}
286
287//________________________________________________________________________
288Bool_t AliAnalysisTaskProtonsQA::IsEventTriggered(const AliESDEvent *esd,
289 TriggerMode trigger) {
290 // check if the event was triggered
291 ULong64_t triggerMask = esd->GetTriggerMask();
292
293 // definitions from p-p.cfg
294 ULong64_t spdFO = (1 << 14);
295 ULong64_t v0left = (1 << 11);
296 ULong64_t v0right = (1 << 12);
297
298 switch (trigger) {
299 case kMB1: {
300 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
301 return kTRUE;
302 break;
303 }
304 case kMB2: {
305 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
306 return kTRUE;
307 break;
308 }
309 case kSPDFASTOR: {
310 if (triggerMask & spdFO)
311 return kTRUE;
312 break;
313 }
314 }//switch
315
316 return kFALSE;
7b59a00b 317}
318
5429dd65 319//________________________________________________________________________
320const AliESDVertex* AliAnalysisTaskProtonsQA::GetVertex(AliESDEvent* esd,
321 AnalysisMode mode,
322 Double_t gVxMax,
323 Double_t gVyMax,
324 Double_t gVzMax) {
325 // Get the vertex from the ESD and returns it if the vertex is valid
326 // Second argument decides which vertex is used (this selects
327 // also the quality criteria that are applied)
328 const AliESDVertex* vertex = 0;
329 if(mode == kHybrid)
330 vertex = esd->GetPrimaryVertexSPD();
331 else if(mode == kTPC){
332 Double_t kBz = esd->GetMagneticField();
333 AliVertexerTracks vertexer(kBz);
334 vertexer.SetTPCMode();
335 AliESDVertex *vTPC = vertexer.FindPrimaryVertex(esd);
336 esd->SetPrimaryVertexTPC(vTPC);
337 for (Int_t i=0; i<esd->GetNumberOfTracks(); i++) {
338 AliESDtrack *t = esd->GetTrack(i);
339 t->RelateToVertexTPC(vTPC, kBz, kVeryBig);
340 }
341 delete vTPC;
342 vertex = esd->GetPrimaryVertexTPC();
343 }
344 else if(mode == kGlobal)
345 vertex = esd->GetPrimaryVertex();
346 else
347 Printf("GetVertex: ERROR: Invalid second argument %d", mode);
348
349 if(!vertex) return 0;
350
351 // check Ncontributors
352 if(vertex->GetNContributors() <= 0) return 0;
353
354 // check resolution
355 Double_t zRes = vertex->GetZRes();
356 if(zRes == 0) return 0;
357
358 //check position
359 if(TMath::Abs(vertex->GetXv()) > gVxMax) return 0;
360 if(TMath::Abs(vertex->GetYv()) > gVyMax) return 0;
361 if(TMath::Abs(vertex->GetZv()) > gVzMax) return 0;
362
363 return vertex;
364}
365
366
367
7b59a00b 368