]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
implementing the HWCF merger into decoder of compressed TPC data
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLT.cxx
CommitLineData
fb5b189b 1// $Id$
2//**************************************************************************
3//* This file is property of and copyright by the ALICE HLT Project *
4//* ALICE Experiment at CERN, All rights reserved. *
5//* *
6//* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, *
7//* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> *
8//* for The ALICE HLT Project. *
9//* *
10//* Permission to use, copy, modify and distribute this software and its *
11//* documentation strictly for non-commercial purposes is hereby granted *
12//* without fee, provided that the above copyright notice appears in all *
13//* copies and that both the copyright notice and this permission notice *
14//* appear in the supporting documentation. The authors make no claims *
15//* about the suitability of this software for any purpose. It is *
16//* provided "as is" without express or implied warranty. *
17//**************************************************************************
18
fb5b189b 19/** @file AliAnalysisTaskHLT.cxx
20 @author Kalliopi Kanaki, Hege Erdal
21 @date
22 @brief An analysis task containing
23 loops over HLT and offline ESD trees for comparing
24 AliESDtrack properties.
25*/
26
27//#include <iostream>
28
29class AliAnalysisTask;
30class AliAnalysisManager;
31
be66aae0 32#include "AliAnalysisTaskHLT.h"
4b621d9c 33#include "AliHLTGlobalTriggerDecision.h"
fb5b189b 34#include "TH1F.h"
35#include "TH2F.h"
36#include "TString.h"
37#include "AliESDEvent.h"
e9fe1336 38#include "AliESDtrackCuts.h"
fb5b189b 39#include "AliESDInputHandler.h"
1175b105 40#include "AliTracker.h"
b2642c4c 41#include "AliCentrality.h"
fb5b189b 42
be66aae0 43#include "TText.h"
44#include "TTimeStamp.h"
fb5b189b 45
17ab437a 46#include <iostream>
47
fb5b189b 48ClassImp(AliAnalysisTaskHLT)
49
b2642c4c 50//===============================================================//
fb5b189b 51
52AliAnalysisTaskHLT::AliAnalysisTaskHLT()
53:
54AliAnalysisTaskSE()
4b621d9c 55 ,fUseHLTTrigger(kFALSE)
be66aae0 56 //,fESDOfftrackCuts(0)
57 //,fESDHLTtrackCuts(0)
fb5b189b 58 ,fOutputList(0)
e302ba9e 59 //,fHistTrigger(0)
5ab64231 60 ,fChargeOff(0)
1647e83b 61 ,fMomentumOff(0)
1175b105 62 ,fDCArOff(0)
63 ,fDCAzOff(0)
5ab64231 64 ,fNclusterOff(0)
1281a832 65 ,fNITSclusterOff(0)
fb5b189b 66 ,fPhiOff(0)
c0fbe8ec 67 ,fEtaOff(0)
fb5b189b 68 ,fMultOff(0)
fb5b189b 69 ,fXvertexOff(0)
70 ,fYvertexOff(0)
71 ,fZvertexOff(0)
1281a832 72 ,fSPDXvertexOff(0)
73 ,fSPDYvertexOff(0)
74 ,fSPDZvertexOff(0)
5ab64231 75 ,fEventSpecieOff(0)
b2642c4c 76 ,fV0cent(0)
fb5b189b 77
5ab64231 78 ,fChargeHLT(0)
fb5b189b 79 ,fMomentumHLT(0)
1175b105 80 ,fDCArHLT(0)
81 ,fDCAzHLT(0)
fb5b189b 82 ,fNclusterHLT(0)
1281a832 83 ,fNITSclusterHLT(0)
fb5b189b 84 ,fPhiHLT(0)
c0fbe8ec 85 ,fEtaHLT(0)
17ab437a 86
c0fbe8ec 87 ,fChargeHLTcut(0)
88 ,fMomentumHLTcut(0)
17ab437a 89 ,fDCArHLTcut(0)
90 ,fDCAzHLTcut(0)
c0fbe8ec 91 ,fNclusterHLTcut(0)
92 ,fNITSclusterHLTcut(0)
93 ,fPhiHLTcut(0)
94 ,fEtaHLTcut(0)
17ab437a 95
5ab64231 96 ,fMultHLT(0)
fb5b189b 97 ,fXvertexHLT(0)
98 ,fYvertexHLT(0)
99 ,fZvertexHLT(0)
1281a832 100 ,fSPDXvertexHLT(0)
101 ,fSPDYvertexHLT(0)
102 ,fSPDZvertexHLT(0)
5ab64231 103 ,fEventSpecieHLT(0)
b2642c4c 104
be66aae0 105 ,fBeamType()
106 ,fTextBox(0)
e48c64c8 107 ,fCuts(0)
be66aae0 108 ,fSwitch(kTRUE)
b2642c4c 109 ,fCentrality()
e48c64c8 110 ,fEta(0)
111 ,fPt(0)
112 ,fDCAr(0)
113 ,fDCAz(0)
971bbba6 114 ,fVertexZ(0)
fb5b189b 115{
116 // Constructor
117 // Define input and output slots here
118 // Input slot #0 works with a TChain
119 // DefineInput(0, TChain::Class());
120 // Output slot #0 writes into a TH1 container
fb5b189b 121}
122
971bbba6 123AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name, float eta, float pt, float DCAr, float DCAz, float vertexZ)
fb5b189b 124 :
4b621d9c 125 AliAnalysisTaskSE(name)
126 ,fUseHLTTrigger(kFALSE)
be66aae0 127 //,fESDOfftrackCuts(0)
128 //,fESDHLTtrackCuts(0)
fb5b189b 129 ,fOutputList(0)
e302ba9e 130 //,fHistTrigger(0)
5ab64231 131 ,fChargeOff(0)
1647e83b 132 ,fMomentumOff(0)
1175b105 133 ,fDCArOff(0)
134 ,fDCAzOff(0)
5ab64231 135 ,fNclusterOff(0)
1281a832 136 ,fNITSclusterOff(0)
fb5b189b 137 ,fPhiOff(0)
c0fbe8ec 138 ,fEtaOff(0)
fb5b189b 139 ,fMultOff(0)
fb5b189b 140 ,fXvertexOff(0)
141 ,fYvertexOff(0)
142 ,fZvertexOff(0)
5ab64231 143 ,fEventSpecieOff(0)
b2642c4c 144 ,fV0cent(0)
1281a832 145 ,fNcontOff(0)
146
5ab64231 147 ,fChargeHLT(0)
fb5b189b 148 ,fMomentumHLT(0)
fb5b189b 149 ,fNclusterHLT(0)
1281a832 150 ,fNITSclusterHLT(0)
fb5b189b 151 ,fPhiHLT(0)
c0fbe8ec 152 ,fEtaHLT(0)
17ab437a 153
c0fbe8ec 154 ,fChargeHLTcut(0)
155 ,fMomentumHLTcut(0)
17ab437a 156 ,fDCArHLTcut(0)
157 ,fDCAzHLTcut(0)
c0fbe8ec 158 ,fNclusterHLTcut(0)
159 ,fNITSclusterHLTcut(0)
160 ,fPhiHLTcut(0)
161 ,fEtaHLTcut(0)
17ab437a 162
5ab64231 163 ,fMultHLT(0)
fb5b189b 164 ,fXvertexHLT(0)
165 ,fYvertexHLT(0)
166 ,fZvertexHLT(0)
5ab64231 167 ,fEventSpecieHLT(0)
1281a832 168 ,fNcontHLT(0)
b2642c4c 169
be66aae0 170 ,fBeamType()
171 ,fTextBox(0)
e48c64c8 172 ,fCuts(0)
be66aae0 173 ,fSwitch(kTRUE)
b2642c4c 174 ,fCentrality()
e48c64c8 175 ,fEta(eta)
176 ,fPt(pt)
177 ,fDCAr(DCAr)
178 ,fDCAz(DCAz)
971bbba6 179 ,fVertexZ(vertexZ)
be66aae0 180{
1647e83b 181 // Constructor
fb5b189b 182 // Define input and output slots here
183 // Input slot #0 works with a TChain
184 // DefineInput(0, TChain::Class());
185 // Output slot #0 writes into a TH1 container
fb5b189b 186 DefineOutput(1, TList::Class());
187}
188
b2642c4c 189//------------------------------------------------------------------------//
fb5b189b 190
191void AliAnalysisTaskHLT::UserCreateOutputObjects(){
192 // Create histograms
193
194 OpenFile(1);
fb5b189b 195 fOutputList = new TList();
2476901d 196 fOutputList->SetOwner();
fb5b189b 197 fOutputList->SetName(GetName());
198
199 /*
200 //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger,
201 //4 events with offline track, 5 total events processed,
202 //6 offline track thru CE, 7 online track to CE
203 fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);
204 fHistTrigger->GetXaxis()->SetTitle("");
205 fHistTrigger->GetYaxis()->SetTitle("Events");
206 fHistTrigger->SetMarkerStyle(kFullCircle);
207 fHistTrigger->SetStats(0);
208 fHistTrigger->SetFillColor(2);
209 //fHistTrigger->SetDrawOption("B TEXT60");
210
211 //Set bin labels
212 (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");
213 (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");
214 (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");
215 (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");
216 (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");
217 (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");
218 (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");
219 (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE");
220 */
221
e302ba9e 222 //fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 24, 0, 24);
223 //fHistTrigger->GetXaxis()->SetTitle("");
224 //fHistTrigger->GetYaxis()->SetTitle("#Events");
fb5b189b 225
be66aae0 226 //=========== event properties =================//
1647e83b 227
be66aae0 228 if(fBeamType.Contains("Pb")){
c0fbe8ec 229 fMultOff = new TH1F("fMult_off", "",200,0,2000);
2f281fd6 230 fMultHLT = new TH1F("fMult_hlt", "TPC track multiplicity",200,0,2000); fMultHLT->SetXTitle("TPC track multiplicity");
c0fbe8ec 231 fNcontOff = new TH1F("fNcont_off","",200,0,2000);
2f281fd6 232 fNcontHLT = new TH1F("fNcont_hlt","# of contributors",200,0,2000); fNcontHLT->SetXTitle("# of contributors");
233 fV0cent = new TH1F("fV0cent", "V0 centrality", 100,0, 100); fV0cent->SetXTitle("V0 centrality");
be66aae0 234 }
235 else {
c0fbe8ec 236 fMultOff = new TH1F("fMult_off","",200,0,200);
2f281fd6 237 fMultHLT = new TH1F("fMult_hlt","TPC track multiplicity",200,0,200); fMultHLT->SetXTitle("TPC track multiplicity");
c0fbe8ec 238 fNcontOff = new TH1F("fNcont_off","",200,0,200);
2f281fd6 239 fNcontHLT = new TH1F("fNcont_hlt","# of contributors",200,0,200); fNcontHLT->SetXTitle("# of contributors");
be66aae0 240 }
c0fbe8ec 241
242 fXvertexOff = new TH1F("fXvertex_off","",200,-0.5,0.5);
2f281fd6 243 fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex",200,-0.5,0.5); fXvertexHLT->SetXTitle("x (cm)");
fb5b189b 244
c0fbe8ec 245 fYvertexOff = new TH1F("fYvertex_off","",200,-0.5,0.5);
2f281fd6 246 fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex",200,-0.5,0.5); fYvertexHLT->SetXTitle("y (cm)");
fb5b189b 247
c0fbe8ec 248 fZvertexOff = new TH1F("fZvertex_off","",100,-20,20);
2f281fd6 249 fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex",100,-20,20); fZvertexHLT->SetXTitle("z (cm)");
1281a832 250
c0fbe8ec 251 fSPDXvertexOff = new TH1F("fSPDXvertex_off","",200,-0.5,0.5);
2f281fd6 252 fSPDXvertexHLT = new TH1F("fSPDXvertex_hlt","X SPD primary vertex",200,-0.5,0.5); fSPDXvertexHLT->SetXTitle("x (cm)");
1281a832 253
c0fbe8ec 254 fSPDYvertexOff = new TH1F("fSPDYvertex_off","",200,-0.5,0.5);
2f281fd6 255 fSPDYvertexHLT = new TH1F("fSPDYvertex_hlt","Y SPD primary vertex",200,-0.5,0.5); fSPDYvertexHLT->SetXTitle("y (cm)");
1281a832 256
c0fbe8ec 257 fSPDZvertexOff = new TH1F("fSPDZvertex_off","",100,-20,20);
2f281fd6 258 fSPDZvertexHLT = new TH1F("fSPDZvertex_hlt","Z SPD primary vertex",100,-20,20); fSPDZvertexHLT->SetXTitle("z (cm)");
be66aae0 259
c0fbe8ec 260 fEventSpecieOff = new TH1F("fEventSpecie_off","",18, 0, 18);
261 fEventSpecieHLT = new TH1F("fEventSpecie_hlt","event species",18, 0, 18);
fb5b189b 262
b2642c4c 263 //============== track properties =================//
be66aae0 264
c0fbe8ec 265 fChargeOff = new TH1F("fCharge_off", "", 3, -1.5, 1.5);
2f281fd6 266 fChargeHLT = new TH1F("fCharge_hlt", "charge distribution", 3, -1.5, 1.5); fChargeHLT->SetXTitle("polarity");
fb5b189b 267
c0fbe8ec 268 fMomentumOff = new TH1F("fMomentum_off", "", 100, 0, 10);
2f281fd6 269 fMomentumHLT = new TH1F("fMomentum_hlt", "transverse momentum", 100, 0, 10); fMomentumHLT->SetXTitle("p_{T} (GeV/c)");
fb5b189b 270
c0fbe8ec 271 fDCArOff = new TH1F("fDCAr_off", "", 200, -15, 15);
2f281fd6 272 fDCArHLT = new TH1F("fDCAr_hlt", "DCAr", 200, -15, 15); fDCArHLT->SetXTitle("DCAr (cm)");
1281a832 273
c0fbe8ec 274 fDCAzOff = new TH1F("fDCAz_off", "", 200, -15, 15);
2f281fd6 275 fDCAzHLT = new TH1F("fDCAz_hlt", "DCAz", 200, -15, 15); fDCAzHLT->SetXTitle("DCAz (cm)");
fb5b189b 276
c0fbe8ec 277 fNclusterOff = new TH1F("fNcluster_off","", 200, 0, 200);
2f281fd6 278 fNclusterHLT = new TH1F("fNcluster_hlt","TPC clusters/track", 200, 0, 200); fNclusterHLT->SetXTitle("TPC clusters/track");
be66aae0 279
c0fbe8ec 280 fNITSclusterOff = new TH1F("fNITScluster_off","", 10, 0, 10);
2f281fd6 281 fNITSclusterHLT = new TH1F("fNITScluster_hlt","ITS clusters/track", 10, 0, 10); fNITSclusterHLT->SetXTitle("ITS clusters/track");
fb5b189b 282
c0fbe8ec 283 fPhiOff = new TH1F("fPhi_off","",90,0,360);
2f281fd6 284 fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle",90,0,360); fPhiHLT->SetXTitle("#phi (deg)");
be66aae0 285
c0fbe8ec 286 fEtaOff = new TH1F("fEta_off","",100,-2,2);
2f281fd6 287 fEtaHLT = new TH1F("fEta_hlt","pseudorapidity",100,-2,2); fEtaHLT->SetXTitle("#eta");
fb5b189b 288
2f281fd6 289 fChargeHLTcut = new TH1F("fCharge_hltcut", "", 3, -1.5, 1.5); fChargeHLTcut->SetXTitle("polarity");
290 fMomentumHLTcut = new TH1F("fMomentum_hltcut", "",100, 0, 10); fMomentumHLTcut ->SetXTitle("p_{T} (GeV/c)");
291 fDCArHLTcut = new TH1F("fDCAr_hltcut", "",200, -15, 15); fDCArHLTcut->SetXTitle("DCAr (cm)");
292 fDCAzHLTcut = new TH1F("fDCAz_hltcut", "",200, -15, 15); fDCAzHLTcut->SetXTitle("DCAz (cm)");
293 fNclusterHLTcut = new TH1F("fNcluster_hltcut", "",200, 0, 200); fNclusterHLTcut->SetXTitle("TPC clusters/track");
294 fNITSclusterHLTcut = new TH1F("fNITScluster_hltcut","", 10, 0, 10); fNITSclusterHLTcut->SetXTitle("ITS clusters/track");
295 fPhiHLTcut = new TH1F("fPhi_hltcut", "", 90, 0, 360); fPhiHLTcut->SetXTitle("#phi (deg)");
296 fEtaHLTcut = new TH1F("fEta_hltcut", "",100, -2, 2); fEtaHLTcut->SetXTitle("#eta");
c0fbe8ec 297
be66aae0 298 //--------------------------------------------------//
fb5b189b 299
be66aae0 300 fTextBox = new TText();
e48c64c8 301 fCuts = new TText();
302 fCuts->SetName("cuts");
971bbba6 303 TString s = Form("|#eta|<%2g, p_{T}>%2g, |DCAr|<%2g, |DCAz|<%2g, |vertexZ|<%2g", TMath::Abs(fEta), TMath::Abs(fPt), TMath::Abs(fDCAr), TMath::Abs(fDCAz),TMath::Abs(fVertexZ));
e48c64c8 304 fCuts->SetTitle(s);
305
e302ba9e 306 //fOutputList->Add(fHistTrigger);
c0fbe8ec 307 fOutputList->Add(fChargeOff); fOutputList->Add(fChargeHLT); fOutputList->Add(fChargeHLTcut);
308 fOutputList->Add(fMomentumOff); fOutputList->Add(fMomentumHLT); fOutputList->Add(fMomentumHLTcut);
17ab437a 309 fOutputList->Add(fDCArOff); fOutputList->Add(fDCArHLT); fOutputList->Add(fDCArHLTcut);
310 fOutputList->Add(fDCAzOff); fOutputList->Add(fDCAzHLT); fOutputList->Add(fDCAzHLTcut);
311 fOutputList->Add(fNclusterOff); fOutputList->Add(fNclusterHLT); fOutputList->Add(fNclusterHLTcut);
312 fOutputList->Add(fNITSclusterOff); fOutputList->Add(fNITSclusterHLT); fOutputList->Add(fNITSclusterHLTcut);
313 fOutputList->Add(fPhiOff); fOutputList->Add(fPhiHLT); fOutputList->Add(fPhiHLTcut);
314 fOutputList->Add(fEtaOff); fOutputList->Add(fEtaHLT); fOutputList->Add(fEtaHLTcut);
c0fbe8ec 315
be66aae0 316 fOutputList->Add(fMultOff); fOutputList->Add(fMultHLT);
be66aae0 317 fOutputList->Add(fXvertexOff); fOutputList->Add(fXvertexHLT);
318 fOutputList->Add(fYvertexOff); fOutputList->Add(fYvertexHLT);
319 fOutputList->Add(fZvertexOff); fOutputList->Add(fZvertexHLT);
1281a832 320 fOutputList->Add(fSPDXvertexOff); fOutputList->Add(fSPDXvertexHLT);
321 fOutputList->Add(fSPDYvertexOff); fOutputList->Add(fSPDYvertexHLT);
322 fOutputList->Add(fSPDZvertexOff); fOutputList->Add(fSPDZvertexHLT);
be66aae0 323 fOutputList->Add(fEventSpecieOff); fOutputList->Add(fEventSpecieHLT);
1281a832 324 fOutputList->Add(fNcontOff); fOutputList->Add(fNcontHLT);
2476901d 325
b2642c4c 326 fOutputList->Add(fTextBox);
e48c64c8 327 fOutputList->Add(fCuts);
b2642c4c 328 if(fBeamType.Contains("Pb")) fOutputList->Add(fV0cent);
329
be66aae0 330 //SetupESDtrackCuts();
2476901d 331 PostData(1, fOutputList);
fb5b189b 332}
333
fb5b189b 334void AliAnalysisTaskHLT::UserExec(Option_t *){
335 // see header file of AliAnalysisTask for documentation
336
be66aae0 337 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
fb5b189b 338 if(!esdOFF){
be66aae0 339 printf("Error:UserExec OFF esd not available\n");
340 return;
fb5b189b 341 }
be66aae0 342
343 if(esdOFF->GetEventSpecie()==16) return; // skip calibration events, HLT doesn't set this flag yet
344
fb5b189b 345 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
be66aae0 346 if(!esdH){
347 printf("The ESD input handler is empty\n");
348 return;
349 }
350
fb5b189b 351 AliESDEvent *esdHLT = NULL;
be66aae0 352 if(esdH) esdHLT = esdH->GetHLTEvent();
d132ef8c 353 if(!esdHLT){
be66aae0 354 printf("Error:UserExec HLT esd not available\n");
355 return;
fb5b189b 356 }
1647e83b 357
be66aae0 358 if(fSwitch==kTRUE){
359 TTimeStamp *timestamp = new TTimeStamp(esdHLT->GetTimeStamp());
360 fTextBox->SetName("text");
361 TString s = Form("Run %d, Date %d", esdHLT->GetRunNumber(), timestamp->GetDate());
362 printf("You are analyzing run %d from date %d\n\n", esdHLT->GetRunNumber(), timestamp->GetDate());
363 fTextBox->SetTitle(s);
364 fSwitch=kFALSE;
4b621d9c 365 }
fb5b189b 366
b60f0c88 367 //Double_t bfield = esdOFF->GetMagneticField();
fb5b189b 368
be66aae0 369// UInt_t Statusnames[12]={AliESDtrack::kTPCin,
370// AliESDtrack::kITSin,
371// AliESDtrack::kTPCout,
372// AliESDtrack::kITSout,
373// AliESDtrack::kITSrefit,
374// AliESDtrack::kTPCrefit,
375// AliESDtrack::kTRDin,
376// AliESDtrack::kTRDout,
377// AliESDtrack::kTRDrefit,
378// AliESDtrack::kTOFin,
379// AliESDtrack::kTOFout,
380// AliESDtrack::kTOFrefit};
fb5b189b 381
e9fe1336 382
383
384 //---------------- HLT ESD tree -----------------------//
e9fe1336 385
be66aae0 386 Int_t nr_tracksHLT = 0;
387 const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks();
1647e83b 388
be66aae0 389 if(vertHLT->GetStatus()==kTRUE){
e9fe1336 390 fXvertexHLT->Fill( vertHLT->GetX() );
391 fYvertexHLT->Fill( vertHLT->GetY() );
392 fZvertexHLT->Fill( vertHLT->GetZ() );
1281a832 393
394 fSPDXvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetX());
395 fSPDYvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetY());
396 fSPDZvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetZ());
397
398 fNcontHLT->Fill(vertHLT->GetNContributors());
1647e83b 399 }
5ab64231 400
4b621d9c 401 fEventSpecieHLT->Fill(esdHLT->GetEventSpecie());
402
403 for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
e9fe1336 404
4b621d9c 405 AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i);
406 if(!esdtrackHLT) continue;
407
408 //Fill which status flags that are set for an event
be66aae0 409 //for(int jjj=0;jjj<12;jjj++){
410 // if(esdtrackHLT->GetStatus()&Statusnames[jjj]) fStatusHLT->Fill(jjj);
411 //}
4b621d9c 412
be66aae0 413 if(!(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue; // only interested in tracks with kTPCin flag
414 if(esdtrackHLT->GetTPCNcls()<=0) continue;
415 nr_tracksHLT++;
b60f0c88 416
417 Double_t x[3];
418 esdtrackHLT->GetXYZ(x);
419 Double_t b[3];
420 AliTracker::GetBxByBz(x,b);
421 Bool_t isOK = esdtrackHLT->RelateToVertexTPCBxByBz(vertHLT, b, kVeryBig);
422
423 Float_t dca[2]={0,0}; Float_t cov[3]={0,0,0}; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
424 if(isOK){
425 const AliExternalTrackParam *track = esdtrackHLT->GetTPCInnerParam();
426 if(!track) return;
427 esdtrackHLT->GetImpactParametersTPC(dca,cov);
428 fDCArHLT->Fill(dca[0]);
e302ba9e 429 fDCAzHLT->Fill(dca[1]);
430 }
b60f0c88 431
432// Float_t dca[2];
433// if(vertHLT->GetStatus()==kTRUE){
434// esdtrackHLT->GetDZ(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), esdHLT->GetPrimaryVertex()->GetZv(), bfield, dca);
435// fDCArHLT->Fill(dca[0]);
436// fDCAzHLT->Fill(dca[1]);
437// }
4b621d9c 438
439 fChargeHLT->Fill(esdtrackHLT->Charge());
be66aae0 440 fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
1281a832 441 fNITSclusterHLT->Fill(esdtrackHLT->GetNcls(0));
4b621d9c 442 fEtaHLT->Fill(esdtrackHLT->Eta());
4b621d9c 443 fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
be66aae0 444 fMomentumHLT->Fill(TMath::Abs(esdtrackHLT->Pt()));
c0fbe8ec 445
971bbba6 446 if( TMath::Abs(esdtrackHLT->Eta())<TMath::Abs(fEta) &&
447 TMath::Abs(esdtrackHLT->Pt())>TMath::Abs(fPt) &&
448 TMath::Abs(dca[0])<TMath::Abs(fDCAr) &&
449 TMath::Abs(dca[1])<TMath::Abs(fDCAz) &&
450 TMath::Abs(vertHLT->GetZ())<TMath::Abs(fVertexZ) )
451 {
c0fbe8ec 452 fChargeHLTcut->Fill(esdtrackHLT->Charge());
453 fNclusterHLTcut->Fill(esdtrackHLT->GetTPCNcls());
17ab437a 454 fDCArHLTcut->Fill(dca[0]);
455 fDCAzHLTcut->Fill(dca[1]);
c0fbe8ec 456 fNITSclusterHLTcut->Fill(esdtrackHLT->GetNcls(0));
457 fEtaHLTcut->Fill(esdtrackHLT->Eta());
458 fPhiHLTcut->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
459 fMomentumHLTcut->Fill(TMath::Abs(esdtrackHLT->Pt()));
460 }
4b621d9c 461 } // end of loop over hlt tracks
462
463 if(nr_tracksHLT>0) fMultHLT->Fill(nr_tracksHLT);
e9fe1336 464
fb5b189b 465 //----------------- OFFLINE ESD tree ----------------//
466
be66aae0 467 Int_t nr_tracksOff = 0;
1281a832 468 const AliESDVertex *vertOFF = esdOFF->GetPrimaryVertexTracks();
b2642c4c 469
470 if(fBeamType.Contains("Pb")){
471 fCentrality = esdOFF->GetCentrality();
472 // this information is only available from the offline ESD for 2010 PbPb data, the V0 info was not stored in the HLTesd (17.04.11, Kelly)
473 if(!fCentrality){
474 printf("Centrality pointer is empty\n");
475 return;
476 }
477 else fV0cent->Fill(fCentrality->GetCentralityPercentile("V0M"));
478 }
5ab64231 479
1281a832 480 if(vertOFF->GetStatus()==kTRUE){
c0fbe8ec 481 fXvertexOff->Fill( vertOFF->GetX() );
482 fYvertexOff->Fill( vertOFF->GetY() );
483 fZvertexOff->Fill( vertOFF->GetZ() );
1281a832 484
c0fbe8ec 485 fSPDXvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetX());
486 fSPDYvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetY());
487 fSPDZvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetZ());
1281a832 488
c0fbe8ec 489 fNcontOff->Fill(vertOFF->GetNContributors());
1647e83b 490 }
e9fe1336 491
4b621d9c 492 fEventSpecieOff->Fill(esdOFF->GetEventSpecie());
493
494 for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
495
496 AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i);
497 if (!esdtrackOFF) continue;
498
be66aae0 499 if(!(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue;
500 if(esdtrackOFF->GetTPCNcls()<=0) continue;
4b621d9c 501 nr_tracksOff++;
17ab437a 502
b60f0c88 503 Double_t x[3];
504 esdtrackOFF->GetXYZ(x);
505 Double_t b[3];
506 AliTracker::GetBxByBz(x,b);
507 Bool_t isOK = esdtrackOFF->RelateToVertexTPCBxByBz(vertOFF, b, kVeryBig);
508 if(isOK){
509 const AliExternalTrackParam *track = esdtrackOFF->GetTPCInnerParam();
510 if(!track) return;
511 Float_t dca[2]={0,0}; Float_t cov[3]={0,0,0}; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
512 esdtrackOFF->GetImpactParametersTPC(dca,cov);
17ab437a 513 fDCArOff->Fill(dca[0]);
514 fDCAzOff->Fill(dca[1]);
b60f0c88 515 }
516// // calculate the offline DCAs the same way like for HLT. The above way is calculating the DCA for the TPC inner barrel surface (Kelly, 17.04.11)
517// Float_t dca[2];
518// if(vertOFF->GetStatus()==kTRUE){
519// esdtrackOFF->GetDZ(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), esdOFF->GetPrimaryVertex()->GetZv(), bfield, dca);
520// }
be66aae0 521
4b621d9c 522 fChargeOff->Fill(esdtrackOFF->Charge());
be66aae0 523 fNclusterOff->Fill(esdtrackOFF->GetTPCNcls());
1281a832 524 fNITSclusterOff->Fill(esdtrackOFF->GetNcls(0));
4b621d9c 525 fEtaOff->Fill(esdtrackOFF->Eta());
4b621d9c 526 fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
4b621d9c 527 fMomentumOff->Fill( TMath::Abs(esdtrackOFF->Pt()) );
528
4b621d9c 529 } // end of loop over offline tracks
5ab64231 530
4b621d9c 531 if(nr_tracksOff>0) fMultOff->Fill(nr_tracksOff);
be66aae0 532
fb5b189b 533 PostData(1, fOutputList);
534}
535
536void AliAnalysisTaskHLT::Terminate(Option_t *){
b2642c4c 537// see header file of AliAnalysisTask for documentation
5ab64231 538}
e9fe1336 539
be66aae0 540// void AliAnalysisTaskHLT::SetupESDtrackCuts(){ // not called
541// // Setup ESD cuts
542// // NB! Work in progress!
543//
544// Bool_t selPrimaries = kTRUE;
545//
546// fESDOfftrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
547// //To make Offline cuts = HLT cuts
548// fESDOfftrackCuts->SetRequireITSRefit(kFALSE);
549// fESDOfftrackCuts->SetEtaRange(-0.9,+0.9);
550//
551//
552// //HLT
553// //NB! Need to understand this a bit more! Which cuts should we keep?
554// fESDHLTtrackCuts = new AliESDtrackCuts;
555//
556// // TPC
557// fESDHLTtrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
558// fESDHLTtrackCuts->SetMinNClustersTPC(70);
559// fESDHLTtrackCuts->SetMaxChi2PerClusterTPC(4);
560// fESDHLTtrackCuts->SetAcceptKinkDaughters(kFALSE);
561//
562// fESDHLTtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
563// AliESDtrackCuts::kAny);
564//
565// if(selPrimaries) { // 7*(0.0050+0.0060/pt^0.9)
566// fESDHLTtrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
567// }
568//
569// fESDHLTtrackCuts->SetMaxDCAToVertexZ(1.e6);
570// fESDHLTtrackCuts->SetDCAToVertex2D(kFALSE);
571// fESDHLTtrackCuts->SetRequireSigmaToVertex(kFALSE);
572// fESDHLTtrackCuts->SetEtaRange(-0.9,+0.9);
573//
574// return;
575// }