]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/AliAnalysisTaskProtons.cxx
Updeted files for Doxygen:
[u/mrichter/AliRoot.git] / PWG2 / AliAnalysisTaskProtons.cxx
CommitLineData
734d2c12 1#include "TChain.h"
2#include "TTree.h"
df01f00b 3#include "TString.h"
734d2c12 4#include "TList.h"
5#include "TH2F.h"
df01f00b 6#include "TH1I.h"
aafecd8b 7#include "TF1.h"
734d2c12 8#include "TCanvas.h"
9#include "TLorentzVector.h"
10
11#include "AliAnalysisTask.h"
12#include "AliAnalysisManager.h"
13
14#include "AliESDEvent.h"
15#include "AliESDInputHandler.h"
b620b667 16#include "AliAODEvent.h"
17#include "AliAODInputHandler.h"
e4358d7f 18#include "AliMCEventHandler.h"
19#include "AliMCEvent.h"
20#include "AliStack.h"
251e4034 21#include "AliCFContainer.h"
6667f3a7 22#include "AliVertexerTracks.h"
23#include "AliESDVertex.h"
734d2c12 24
5ae0977e 25#include "AliProtonAnalysis.h"
734d2c12 26#include "AliAnalysisTaskProtons.h"
27
28// Analysis task creating a the 2d y-p_t spectrum of p and antip
29// Author: Panos Cristakoglou
30
31ClassImp(AliAnalysisTaskProtons)
32
df01f00b 33//________________________________________________________________________
34AliAnalysisTaskProtons::AliAnalysisTaskProtons()
35 : AliAnalysisTask(), fESD(0), fAOD(0), fMC(0), fAnalysisType("ESD"),
6667f3a7 36 fList(0), fProtonAnalysis(0),
df01f00b 37 fElectronFunction(0), fMuonFunction(0),
38 fPionFunction(0), fKaonFunction(0), fProtonFunction(0),
39 fFunctionUsed(kFALSE) {
db10bcb0 40 //Dummy constructor
df01f00b 41
db10bcb0 42}
43
734d2c12 44//________________________________________________________________________
45AliAnalysisTaskProtons::AliAnalysisTaskProtons(const char *name)
df01f00b 46: AliAnalysisTask(name, ""), fESD(0), fAOD(0), fMC(0), fAnalysisType("ESD"),
6667f3a7 47 fList(0), fProtonAnalysis(0),
aafecd8b 48 fElectronFunction(0), fMuonFunction(0),
49 fPionFunction(0), fKaonFunction(0), fProtonFunction(0),
6667f3a7 50 fFunctionUsed(kFALSE),
51 fTriggerMode(kMB2), fProtonAnalysisMode(kTPC),
52 fVxMax(0), fVyMax(0), fVzMax(0) {
734d2c12 53 // Constructor
54
55 // Define input and output slots here
56 // Input slot #0 works with a TChain
57 DefineInput(0, TChain::Class());
58 // Output slot #0 writes into a TList container
59 DefineOutput(0, TList::Class());
60}
61
62//________________________________________________________________________
63void AliAnalysisTaskProtons::ConnectInputData(Option_t *) {
64 // Connect ESD or AOD here
65 // Called once
66
67 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
68 if (!tree) {
69 Printf("ERROR: Could not read chain from input slot 0");
70 } else {
b620b667 71 if(fAnalysisType == "ESD") {
df01f00b 72 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
73
b620b667 74 if (!esdH) {
75 Printf("ERROR: Could not get ESDInputHandler");
76 } else
77 fESD = esdH->GetEvent();
78 }
79 else if(fAnalysisType == "AOD") {
df01f00b 80 AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
81
82 if (!aodH) {
83 Printf("ERROR: Could not get AODInputHandler");
84 } else
85 fAOD = aodH->GetEvent();
b620b667 86 }
e4358d7f 87 else if(fAnalysisType == "MC") {
df01f00b 88 AliMCEventHandler* mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
89 if (!mcH) {
90 Printf("ERROR: Could not retrieve MC event handler");
91 }
92 else
93 fMC = mcH->MCEvent();
e4358d7f 94 }
df01f00b 95 else
e4358d7f 96 Printf("Wrong analysis type: Only ESD, AOD and MC types are allowed!");
734d2c12 97 }
98}
99
100//________________________________________________________________________
101void AliAnalysisTaskProtons::CreateOutputObjects() {
102 // Create histograms
103 // Called once
df01f00b 104 //Prior probabilities
734d2c12 105 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
df01f00b 106
107 //proton analysis object
6667f3a7 108 fProtonAnalysis = new AliProtonAnalysis();
df01f00b 109
b620b667 110 if(fAnalysisType == "ESD") {
251e4034 111 //Use of TPConly tracks
6667f3a7 112 if(fProtonAnalysisMode == kTPC) {
113 fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
114 fProtonAnalysis->UseTPCOnly();
da8c4c1c 115 //fProtonAnalysis->SetTPCpid();
6667f3a7 116 fProtonAnalysis->SetMinTPCClusters(100);
117 fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
118 fProtonAnalysis->SetMaxCov11(0.5);
119 fProtonAnalysis->SetMaxCov22(0.5);
120 fProtonAnalysis->SetMaxCov33(0.5);
121 fProtonAnalysis->SetMaxCov44(0.5);
122 fProtonAnalysis->SetMaxCov55(0.5);
123 fProtonAnalysis->SetMaxSigmaToVertexTPC(2.0);
124 //fProtonAnalysis->SetMaxDCAXYTPC(1.5);
125 //fProtonAnalysis->SetMaxDCAZTPC(1.5);
126 }
127 //Use of HybridTPC tracks
128 else if(fProtonAnalysisMode == kHybrid) {
129 fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
130 fProtonAnalysis->UseHybridTPC();
131 fProtonAnalysis->SetTPCpid();
132 fProtonAnalysis->SetMinTPCClusters(110);
133 fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
134 fProtonAnalysis->SetMaxCov11(0.5);
135 fProtonAnalysis->SetMaxCov22(0.5);
136 fProtonAnalysis->SetMaxCov33(0.5);
137 fProtonAnalysis->SetMaxCov44(0.5);
138 fProtonAnalysis->SetMaxCov55(0.5);
139 fProtonAnalysis->SetMaxSigmaToVertex(2.0);
140 /*fProtonAnalysis->SetMaxDCAXY(1.5);
141 fProtonAnalysis->SetMaxDCAZ(1.5);*/
142 fProtonAnalysis->SetPointOnITSLayer6();
143 fProtonAnalysis->SetPointOnITSLayer5();
144 //fProtonAnalysis->SetPointOnITSLayer4();
145 //fProtonAnalysis->SetPointOnITSLayer3();
146 fProtonAnalysis->SetPointOnITSLayer2();
147 fProtonAnalysis->SetPointOnITSLayer1();
148 fProtonAnalysis->SetMinITSClusters(5);
149 }
150 //Combined tracking
151 else if(fProtonAnalysisMode == kGlobal) {
da8c4c1c 152 fProtonAnalysis->InitAnalysisHistograms(20, -1.0, 1.0, 48, 0.3, 1.5);
6667f3a7 153 fProtonAnalysis->SetMinTPCClusters(110);
154 fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
155 fProtonAnalysis->SetMaxCov11(0.5);
156 fProtonAnalysis->SetMaxCov22(0.5);
157 fProtonAnalysis->SetMaxCov33(0.5);
158 fProtonAnalysis->SetMaxCov44(0.5);
159 fProtonAnalysis->SetMaxCov55(0.5);
160 fProtonAnalysis->SetMaxSigmaToVertex(2.0);
161 //fProtonAnalysis->SetMaxDCAXY(2.0);
162 //fProtonAnalysis->SetMaxDCAZ(2.0);
163 fProtonAnalysis->SetTPCRefit();
164 fProtonAnalysis->SetPointOnITSLayer1();
165 fProtonAnalysis->SetPointOnITSLayer2();
166 //fProtonAnalysis->SetPointOnITSLayer3();
167 //fProtonAnalysis->SetPointOnITSLayer4();
168 fProtonAnalysis->SetPointOnITSLayer5();
169 fProtonAnalysis->SetPointOnITSLayer6();
170 fProtonAnalysis->SetMinITSClusters(5);
171 fProtonAnalysis->SetITSRefit();
172 fProtonAnalysis->SetESDpid();
173 }
df01f00b 174
6667f3a7 175 if(fFunctionUsed)
176 fProtonAnalysis->SetPriorProbabilityFunctions(fElectronFunction,
177 fMuonFunction,
178 fPionFunction,
179 fKaonFunction,
180 fProtonFunction);
181 else
182 fProtonAnalysis->SetPriorProbabilities(partFrac);
183 }//ESD analysis
da8c4c1c 184 else if(fAnalysisType == "MC")
185 fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
186
738619fd 187 fList = new TList();
6667f3a7 188 fList->Add(fProtonAnalysis->GetProtonYPtHistogram());
189 fList->Add(fProtonAnalysis->GetAntiProtonYPtHistogram());
190 fList->Add(fProtonAnalysis->GetEventHistogram());
191 fList->Add(fProtonAnalysis->GetProtonContainer());
192 fList->Add(fProtonAnalysis->GetAntiProtonContainer());
734d2c12 193}
194
195//________________________________________________________________________
196void AliAnalysisTaskProtons::Exec(Option_t *) {
197 // Main loop
198 // Called for each event
199
b620b667 200 if(fAnalysisType == "ESD") {
201 if (!fESD) {
202 Printf("ERROR: fESD not available");
203 return;
204 }
df01f00b 205
6667f3a7 206 if(IsEventTriggered(fESD,fTriggerMode)) {
207 const AliESDVertex *vertex = GetVertex(fESD,fProtonAnalysisMode,
208 fVxMax,fVyMax,fVzMax);
209 if(vertex) {
210 Printf("Proton ESD analysis task: There are %d tracks in this event", fESD->GetNumberOfTracks());
211 fProtonAnalysis->Analyze(fESD,vertex);
212 }//reconstructed vertex
213 }//triggered event
df01f00b 214 }//ESD analysis
215
b620b667 216 else if(fAnalysisType == "AOD") {
217 if (!fAOD) {
218 Printf("ERROR: fAOD not available");
219 return;
220 }
221
e4358d7f 222 Printf("Proton AOD analysis task: There are %d tracks in this event", fAOD->GetNumberOfTracks());
6667f3a7 223 fProtonAnalysis->Analyze(fAOD);
df01f00b 224 }//AOD analysis
225
e4358d7f 226 else if(fAnalysisType == "MC") {
227 if (!fMC) {
228 Printf("ERROR: Could not retrieve MC event");
229 return;
230 }
df01f00b 231
e4358d7f 232 AliStack* stack = fMC->Stack();
233 if (!stack) {
234 Printf("ERROR: Could not retrieve the stack");
235 return;
236 }
237 Printf("Proton MC analysis task: There are %d primaries in this event", stack->GetNprimary());
da8c4c1c 238 fProtonAnalysis->Analyze(stack,kFALSE);//kTRUE in case of inclusive measurement
df01f00b 239 }//MC analysis
734d2c12 240
241 // Post output data.
242 PostData(0, fList);
243}
244
245//________________________________________________________________________
246void AliAnalysisTaskProtons::Terminate(Option_t *) {
247 // Draw result to the screen
248 // Called once at the end of the query
249
250 fList = dynamic_cast<TList*> (GetOutputData(0));
251 if (!fList) {
252 Printf("ERROR: fList not available");
253 return;
254 }
255
256 TH2F *fHistYPtProtons = (TH2F *)fList->At(0);
257 TH2F *fHistYPtAntiProtons = (TH2F *)fList->At(1);
258
df01f00b 259 TCanvas *c1 = new TCanvas("c1","p-\bar{p}",200,0,800,400);
260 c1->SetFillColor(10); c1->SetHighLightColor(10); c1->Divide(2,1);
734d2c12 261
df01f00b 262 c1->cd(1)->SetLeftMargin(0.15); c1->cd(1)->SetBottomMargin(0.15);
734d2c12 263 if (fHistYPtProtons) fHistYPtProtons->DrawCopy("colz");
df01f00b 264 c1->cd(2)->SetLeftMargin(0.15); c1->cd(2)->SetBottomMargin(0.15);
734d2c12 265 if (fHistYPtAntiProtons) fHistYPtAntiProtons->DrawCopy("colz");
266}
267
6667f3a7 268//________________________________________________________________________
269Bool_t AliAnalysisTaskProtons::IsEventTriggered(const AliESDEvent *esd,
270 TriggerMode trigger) {
271 // check if the event was triggered
272 ULong64_t triggerMask = esd->GetTriggerMask();
273
274 // definitions from p-p.cfg
275 ULong64_t spdFO = (1 << 14);
276 ULong64_t v0left = (1 << 11);
277 ULong64_t v0right = (1 << 12);
278
279 switch (trigger) {
280 case kMB1: {
281 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
282 return kTRUE;
283 break;
284 }
285 case kMB2: {
286 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
287 return kTRUE;
288 break;
289 }
290 case kSPDFASTOR: {
291 if (triggerMask & spdFO)
292 return kTRUE;
293 break;
294 }
295 }//switch
296
297 return kFALSE;
298}
299
300//________________________________________________________________________
301const AliESDVertex* AliAnalysisTaskProtons::GetVertex(AliESDEvent* esd,
302 AnalysisMode mode,
303 Double_t gVxMax,
304 Double_t gVyMax,
305 Double_t gVzMax) {
306 // Get the vertex from the ESD and returns it if the vertex is valid
307 // Second argument decides which vertex is used (this selects
308 // also the quality criteria that are applied)
309 const AliESDVertex* vertex = 0;
310 if(mode == kHybrid)
311 vertex = esd->GetPrimaryVertexSPD();
312 else if(mode == kTPC){
313 Double_t kBz = esd->GetMagneticField();
314 AliVertexerTracks vertexer(kBz);
315 vertexer.SetTPCMode();
316 AliESDVertex *vTPC = vertexer.FindPrimaryVertex(esd);
317 esd->SetPrimaryVertexTPC(vTPC);
318 for (Int_t i=0; i<esd->GetNumberOfTracks(); i++) {
319 AliESDtrack *t = esd->GetTrack(i);
320 t->RelateToVertexTPC(vTPC, kBz, kVeryBig);
321 }
322 delete vTPC;
323 vertex = esd->GetPrimaryVertexTPC();
324 }
325 else if(mode == kGlobal)
326 vertex = esd->GetPrimaryVertex();
327 else
328 Printf("GetVertex: ERROR: Invalid second argument %d", mode);
329
330 if(!vertex) return 0;
331
332 // check Ncontributors
333 if(vertex->GetNContributors() <= 0) return 0;
334
335 // check resolution
336 Double_t zRes = vertex->GetZRes();
337 if(zRes == 0) return 0;
338
339 //check position
340 if(TMath::Abs(vertex->GetXv()) > gVxMax) return 0;
341 if(TMath::Abs(vertex->GetYv()) > gVyMax) return 0;
342 if(TMath::Abs(vertex->GetZv()) > gVzMax) return 0;
343
344 return vertex;
345}
346
734d2c12 347