]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/JCORRAN/AliJCORRANTask.cxx
Corrections from Filip
[u/mrichter/AliRoot.git] / PWG4 / JCORRAN / AliJCORRANTask.cxx
CommitLineData
2f4cac02 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16//______________________________________________________________________________
17// Analysis task for high pt particle correlations
18// author: R.Diaz, J. Rak, D.J. Kim
19// ALICE Group University of Jyvaskyla
20// Finland
21// Fill the analysis containers for ESD or AOD
22// Adapted for AliAnalysisTaskSE and AOD objects
23//////////////////////////////////////////////////////////////////////////////
24
25
26#include <Riostream.h>
27#include <TChain.h>
28#include <TVector3.h>
29#include <TFile.h>
30#include <TH1.h>
31#include <TClonesArray.h>
32#include <TObjArray.h>
33#include <TObjString.h>
34#include <TFormula.h>
35#include <TString.h>
36#include <TRefArray.h>
37#include <TNtuple.h>
38
39#include "AliAnalysisTaskSE.h"
7b3462ad 40#include "AliAODHandler.h"
2f4cac02 41
42#include "AliJCORRANTask.h"
43#include "AliAnalysisManager.h"
44#include "AliESDEvent.h"
45#include "AliMCEvent.h"
46#include "AliStack.h"
47#include "AliGenEventHeader.h"
48#include "AliGenCocktailEventHeader.h"
49#include "AliGenPythiaEventHeader.h"
50#include "AliInputEventHandler.h"
51#include "AliESDCaloCluster.h"
52#include "AliAODEvent.h"
53#include "AliAODHeader.h"
54#include "AliLog.h"
55#include "AliESDVertex.h"
56#include "AliESDtrack.h"
57#include "AliAODTrack.h"
58#include "AliAnalysisFilter.h"
2f4cac02 59#include "AliPHOSGeoUtils.h"
60#include "AliEMCALGeoUtils.h"
6392490d 61#include "AliESDtrackCuts.h"
7d365db4 62#include "AliAODVertex.h"
63#include "AliAODTracklets.h"
64#include "AliAODPid.h"
2f4cac02 65
66#include "AliPhJTrackList.h"
67#include "AliPhJMCTrackList.h"
68#include "AliPhJPhotonList.h"
69#include "AliPhJHeaderList.h"
70#include "AliJTrack.h"
71#include "AliJPhoton.h"
72#include "AliJHeader.h"
73#include "AliAODTracklets.h"
74#include "AliMultiplicity.h"
75#include "JConst.h"
76#include "AliESDRun.h"
77#include "AliJRunHeader.h"
78
79
7d365db4 80
81
82
2f4cac02 83//______________________________________________________________________________
84AliJCORRANTask::AliJCORRANTask() :
85 AliAnalysisTaskSE("PWG4JCORRAN"),
7d365db4 86 fInputFormat("ESD"),
87 fEsdTrackCuts(0x0),
7b3462ad 88 fDownscaling(1),
89 fLowerCutOnLPMom(0),
7d365db4 90 fLowerCutOnLeadingCaloClusterE(0),
7b3462ad 91 fLowerCutOnCaloClusterE(0.2),
92 fIsRealOrMC(0),
93 fAODName("jcorran.root"),
7d365db4 94 f1CutMaxDCAToVertexXYPtDep(0x0),
2f4cac02 95 fTrackList(0x0),
7b3462ad 96 fMCTrackList(0x0),
2f4cac02 97 fPhotonList(0x0),
98 fHeaderList(0x0),
99 fAliRunHeader(0x0),
7d365db4 100 fPHOSGeom(0x0)
2f4cac02 101{
102 //Default constructor
2f4cac02 103 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
104 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
105
106 DefineInput (0, TChain::Class());
2f4cac02 107}
108
109//______________________________________________________________________________
7d365db4 110AliJCORRANTask::AliJCORRANTask(const char *name, TString inputformat):
2f4cac02 111 AliAnalysisTaskSE(name),
112 fInputFormat(inputformat),
7d365db4 113 fEsdTrackCuts(0x0),
7b3462ad 114 fDownscaling(1),
115 fLowerCutOnLPMom(0),
116 fLowerCutOnLeadingCaloClusterE(0),
117 fLowerCutOnCaloClusterE(0.2),
118 fIsRealOrMC(0),
119 fAODName("jcorran.root"),
7d365db4 120 f1CutMaxDCAToVertexXYPtDep(0x0),
2f4cac02 121 fTrackList(0x0),
7b3462ad 122 fMCTrackList(0x0),
2f4cac02 123 fPhotonList(0x0),
124 fHeaderList(0x0),
125 fAliRunHeader(0x0),
7d365db4 126 fPHOSGeom(0x0)
2f4cac02 127{
7d365db4 128 // Constructor
2f4cac02 129 if(fDebug > 5) cout << "---- AliJCORRANTask Constructor ----"<<endl;
130
131 for(Int_t i=0;i<kRangeTriggerTableAlice;i++) fActiveTriggers[i]=" ";
132 for(Int_t i=0;i<kRangeTriggerTableJCorran;i++) fTriggerTableJCorran[i]=" ";
133
134 DefineInput (0, TChain::Class());
2f4cac02 135}
136
137//____________________________________________________________________________
138AliJCORRANTask::AliJCORRANTask(const AliJCORRANTask& ap) :
139 AliAnalysisTaskSE(ap.GetName()),
6392490d 140 fInputFormat(ap.fInputFormat),
7b3462ad 141 fEsdTrackCuts(ap.fEsdTrackCuts),
7d365db4 142 fDownscaling(ap.fDownscaling),
143 fLowerCutOnLPMom(ap.fLowerCutOnLPMom),
144 fLowerCutOnLeadingCaloClusterE(ap.fLowerCutOnLeadingCaloClusterE),
7b3462ad 145 fLowerCutOnCaloClusterE(ap.fLowerCutOnCaloClusterE),
146 fIsRealOrMC(ap.fIsRealOrMC),
7d365db4 147 fAODName(ap.fAODName),
148 f1CutMaxDCAToVertexXYPtDep(ap.f1CutMaxDCAToVertexXYPtDep),
2f4cac02 149 fTrackList(ap.fTrackList),
7b3462ad 150 fMCTrackList(ap.fMCTrackList),
2f4cac02 151 fPhotonList(ap.fPhotonList),
152 fHeaderList(ap.fHeaderList),
153 fAliRunHeader(ap.fAliRunHeader),
7d365db4 154 fPHOSGeom(ap.fPHOSGeom)
2f4cac02 155{
156 // cpy ctor
7d365db4 157 for(int k=0; k < kRangeTriggerTableAlice; k++)
158 fActiveTriggers[k] = ap.fActiveTriggers[k];
159
160 for(int j=0; j < kRangeTriggerTableJCorran; j++)
161 fTriggerTableJCorran[j] = ap.fTriggerTableJCorran[j];
2f4cac02 162}
163
164//_____________________________________________________________________________
7d365db4 165AliJCORRANTask& AliJCORRANTask::operator = (const AliJCORRANTask& ap)
2f4cac02 166{
167// assignment operator
168
169 this->~AliJCORRANTask();
170 new(this) AliJCORRANTask(ap);
171 return *this;
172}
173
174//______________________________________________________________________________
175AliJCORRANTask::~AliJCORRANTask()
176{
177 // destructor
7d365db4 178 if(f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
179 if(fTrackList) delete fTrackList;
180 if(fMCTrackList) delete fMCTrackList;
181 if(fPhotonList) delete fPhotonList;
182 if(fHeaderList) delete fHeaderList;
183 if(fAliRunHeader) delete fAliRunHeader;
184 if(fPHOSGeom) delete fPHOSGeom ;
185 GetEMCALGeoUtils(kTRUE);
2f4cac02 186}
187
188//________________________________________________________________________
189void AliJCORRANTask::UserCreateOutputObjects()
190{
7d365db4 191 // create the jcorran outputs objects
5d4d46c0 192 fTrackList = new AliPhJTrackList(kALICE);
7d365db4 193 if(fIsRealOrMC) fMCTrackList = new AliPhJMCTrackList(kALICE);
5d4d46c0 194 fPhotonList = new AliPhJPhotonList(kALICE);
195 fHeaderList = new AliPhJHeaderList(kALICE);
7d365db4 196
5d4d46c0 197 fAliRunHeader = new AliJRunHeader();
198
199 fPHOSGeom = new AliPHOSGeoUtils("PHOSgeo") ;
7d365db4 200
7b3462ad 201 // create the jcorran output deltaAOD
202 //if(fDebug > 5) cout << "AliJCORRANTask UserCreateOutputObjects----------------------"<<endl;
7d365db4 203
7b3462ad 204 if(fDebug > 1) printf("AliJCORRANTask::UserCreateOutPutData() \n");
205 if(!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) {
206 Fatal("UserCreateOutputObjects", "This task needs an AOD handler");
207 return;
7d365db4 208 }
7b3462ad 209
210 AddAODBranch("AliPhJTrackList", &fTrackList,fAODName.Data());
211 AddAODBranch("AliPhJPhotonList", &fPhotonList,fAODName.Data());
7d365db4 212 AddAODBranch("AliPhJHeaderList", &fHeaderList,fAODName.Data());
7b3462ad 213
7d365db4 214 if(fIsRealOrMC){
215 AddAODBranch("AliPhJMCTrackList", &fMCTrackList, fAODName.Data());
7b3462ad 216 }
2f4cac02 217
218}
219
220//______________________________________________________________________________
7d365db4 221void AliJCORRANTask::UserExec(Option_t* /*option*/)
2f4cac02 222{
223 // Processing of one event
224 //if(fDebug > 5) cout << "------- AliJCORRANTask Exec-------"<<endl;
225 if(!((Entry()-1)%100))
226 AliInfo(Form(" Processing event # %lld", Entry()));
7d365db4 227
228
229 Bool_t storeEvent = kFALSE;//based on offline trigger decide whether to store the event or not
7b3462ad 230 if(fIsRealOrMC){
231 storeEvent = kTRUE; //store all MC events
232 }else{ //when we are processing real events store only selected events
7d365db4 233 if(StoreDownscaledMinBiasEvent() ||
234 ContainsESDHighPtTrack() ||
7b3462ad 235 ContainsESDHighECaloClusters()){
7d365db4 236 storeEvent = kTRUE;
7b3462ad 237 }
238 }
7d365db4 239
7b3462ad 240 fTrackList->Reset();
7d365db4 241 if(fIsRealOrMC) fMCTrackList->Reset();
7b3462ad 242 fPhotonList->Reset();
243 fHeaderList->Reset();
7b3462ad 244
2f4cac02 245 static int runId=-1;
246
7d365db4 247 if(fInputFormat=="ESD"){ // Reading ESD
248 AliESDEvent* esd = (AliESDEvent*)InputEvent();
249 if(!esd) return;
250 //cout << storeEvent<<" "<<esd->GetFiredTriggerClasses() << endl;
251 AliMCEvent* mcEvent = NULL;
252 if(fIsRealOrMC) mcEvent = MCEvent();
2f4cac02 253
6392490d 254 //=========== FILL AND STORE RUN HEADER (ONLY ONCE PER RUN) =============
2f4cac02 255 if(esd->GetRunNumber() != runId){ //new run has started
256
257 const AliESDRun* esdRun = esd->GetESDRun();
258
259 for(Int_t triggerBit=0; triggerBit<kRangeTriggerTableAlice; triggerBit++){
260 fActiveTriggers[triggerBit] = esdRun->GetTriggerClass(triggerBit);
261 }
262 runId = esd->GetRunNumber();
263
264 //Polarity of magnetic field in L3 solenoid
265 Short_t l3MgFieldPolarity=0; // (LHC convention: +current -> +Bz)
266 if(esd->GetCurrentL3() >0) l3MgFieldPolarity = 1;
267 if(esd->GetCurrentL3() <0) l3MgFieldPolarity = -1;
268
7d365db4 269 //Create internal JCorran trigger mask. Mapping between trigger and trigger bit
2f4cac02 270 fTriggerTableJCorran[kMinBiasTriggerBitJCorran]="Minimum Bias";//minimum bias occupies first trigger bit
7d365db4 271 fTriggerTableJCorran[kHighMultTriggerBitJCorran]="High Multiplicity";//high multiplicity trigger => second trigger bit
2f4cac02 272
273 //=========== Fill Run header object ===============
274 fAliRunHeader->SetRunNumber(runId);
275 fAliRunHeader->SetActiveTriggersAlice(fActiveTriggers);
276 fAliRunHeader->SetL3Field(l3MgFieldPolarity, esd->GetMagneticField());
277 fAliRunHeader->SetActiveTriggersJCorran(fTriggerTableJCorran,kRangeTriggerTableJCorran);
278
7d365db4 279 //Store Run header
280 ( OutputTree()->GetUserInfo())->Add(fAliRunHeader);
281 }//end RunHeader
6392490d 282
7d365db4 283 if(storeEvent){ //FK//
6392490d 284 //-------------- reset all the arrays -------------
7d365db4 285 //store event only when it is downscaled min bias
6392490d 286 // or contais high pt hadron
287 // or contains high energy cluster in EMCAL or PHOS
7b3462ad 288 ReadESDTracks(esd);
289 ReadESDCaloClusters(esd);
290 ReadESDHeader(esd);
291 if(fIsRealOrMC) ReadMCTracks(mcEvent);
6392490d 292 }
7d365db4 293 }else if( fInputFormat == "AOD") {
2f4cac02 294
7d365db4 295 AliAODEvent* aod = AODEvent();
296 if(!aod) return;
297
298 //=========== FILL AND STORE RUN HEADER (ONLY ONCE PER RUN) =============
299 if(aod->GetRunNumber() != runId){ //new run has started
300
301 runId = aod->GetRunNumber();
302 // trigger names???
303
304 //Polarity of magnetic field in L3 solenoid
305 Short_t l3MgFieldPolarity=0; // (LHC convention: +current -> +Bz)
306 if( aod->GetMagneticField() > 0 ) l3MgFieldPolarity = 1;
307 if( aod->GetMagneticField() < 0 ) l3MgFieldPolarity = -1;
308
309 fAliRunHeader->SetRunNumber(runId);
310 fAliRunHeader->SetL3Field(l3MgFieldPolarity, aod->GetMagneticField());
311 //Store Run header
312 (OutputTree()->GetUserInfo())->Add(fAliRunHeader);
7b3462ad 313
7b3462ad 314 }
7d365db4 315
316 ReadAODTracks(aod);
317 ReadAODCaloClusters(aod);
318 ReadAODHeader(aod);
6392490d 319
7b3462ad 320 }else{
321 cout << "Error: Not correct InputDataFormat especified " << endl;
322 return;
2f4cac02 323 }
7d365db4 324
325
326 if(fTrackList->GetNTracks() > 0 ||
327 fPhotonList->GetNPhotons() >0 ||
328 ( fIsRealOrMC && fMCTrackList->GetNTracks()>0)){
329
330 AliAODHandler* outputHandler =
331 (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
332 outputHandler->SetFillAOD(kTRUE);
333 }
2f4cac02 334}
335
336//______________________________________________________________________________
337void AliJCORRANTask::Init()
338{
339 // Intialisation of parameters
340 AliInfo("Doing initialization") ;
341
7d365db4 342 TString formula(fEsdTrackCuts->GetMaxDCAToVertexXYPtDep());
343 if(formula.Length()>0){ // momentum dep DCA cut for AOD
344 formula.ReplaceAll("pt","x");
345 if(f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
346 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",formula.Data());
347 }
2f4cac02 348}
349
350//______________________________________________________________________________
351void AliJCORRANTask::Terminate(Option_t *)
352{
353 // Processing when the event loop is ended
7d365db4 354 // OutputTree()->Print();
2f4cac02 355
7d365db4 356 // ((AliJRunHeader *) (( OutputTree()->GetUserInfo())->First()))->PrintOut();
2f4cac02 357
6392490d 358 cout<<"PWG4JCORRAN Analysis DONE !!"<<endl;
2f4cac02 359}
360
361//______________________________________________________________________________
362void AliJCORRANTask::ReadESDTracks(const AliESDEvent * esd)
363{
2f4cac02 364 // Read the AliESDtrack and fill the list of AliJTrack containers
365 Int_t nt = esd->GetNumberOfTracks();
7d365db4 366 // if(fDebug < 5) cout << "ESD::NumberOfTracks = " << nt << endl;
2f4cac02 367 Short_t ntrk = 0;
368 Double_t pid[10];
7d365db4 369
2f4cac02 370 //loop over tracks
371 for(Int_t it = 0; it < nt; it++) {
372
373 AliESDtrack *track = esd->GetTrack(it);
7d365db4 374 if(! fEsdTrackCuts->IsSelected(track)) continue; // apply track selection criteria
6392490d 375
2f4cac02 376 //------------ T P C ------------
377 Float_t tpcDca[2], tpcCov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
378 track->GetImpactParametersTPC(tpcDca,tpcCov);
379
2f4cac02 380 Int_t nClust = track->GetTPCclusters(0);
381 Int_t nFindableClust = track->GetTPCNclsF();
2f4cac02 382 Float_t tpcChi2PerCluster = 0.;
383 if(nClust>0.) tpcChi2PerCluster = track->GetTPCchi2()/Float_t(nClust);
7d365db4 384
2f4cac02 385 Float_t tpcClustPerFindClust = 0.;
386 if(nFindableClust>0.) tpcClustPerFindClust = Float_t(nClust)/nFindableClust;
387 //--------------------------------
2f4cac02 388
7d365db4 389 //create a new AliJTrack and fill the track info
2f4cac02 390 fTrackList->AddAliJTrack(ntrk);
391 AliJTrack *ctrack = fTrackList->GetAliJTrack(ntrk);
392
7d365db4 393 ctrack->SetPtot(track->P());//here
394 ctrack->SetPt(track->Pt());
395 ctrack->SetTheta(track->Theta());
396 ctrack->SetPhi(atan2(sin(track->Phi()), cos(track->Phi())));
397 track->GetESDpid(pid);
2f4cac02 398 ctrack->SetPID(pid);
7d365db4 399
400 ctrack->SetFlavor(kNone);
401 ctrack->SetCharge(track->Charge());
2f4cac02 402 ctrack->ConvertAliPID();
7d365db4 403 ctrack->SetEta(track->Eta());
2f4cac02 404
405 Int_t itof = track->GetTOFcluster(); // index of the assigned TOF cluster
406 if(itof>=0) ctrack->SetTof(track->GetTOFsignal());
407
7d365db4 408 ctrack->SetTPCdEdx(track->GetTPCsignal());
409 ctrack->SetTPCnClust(track->GetTPCNcls());
2f4cac02 410 ctrack->SetTPCDCAXY(tpcDca[0]);
411 ctrack->SetTPCDCAZ(tpcDca[1]);
412 ctrack->SetTPCClustPerFindClust(tpcClustPerFindClust);
413 ctrack->SetTPCChi2PerClust(tpcChi2PerCluster);
7d365db4 414
415 Float_t impactXY, impactZ; //get track impact parameters
416 track->GetImpactParameters(impactXY,impactZ);
2f4cac02 417 ctrack->SetImapactXY(impactXY);
418 ctrack->SetImapactZ(impactZ);
419
420 ctrack->SetKinkIndex(track->GetKinkIndex(0));
7d365db4 421 ctrack->SetStatus(track->GetStatus()); // ULong_t
7b3462ad 422
7d365db4 423 if(fIsRealOrMC){
424 ctrack->SetITSLabel(track->GetITSLabel());
425 ctrack->SetTPCLabel(track->GetTPCLabel());
426 }
7b3462ad 427
2f4cac02 428 fTrackList->SetNTracks(++ntrk);
429
430 } // end tracks loop
431}
432
433//______________________________________________________________________________
434void AliJCORRANTask::ReadAODTracks(const AliAODEvent * aod)
435{
436 // Read the AliAODtrack and fill the list of AliJTrack containers
437 Int_t nt = aod->GetNumberOfTracks();
438 if(fDebug < 5) cout << "AOD::NumberOfTracks = " << nt << endl;
439 Short_t ntrk = 0;
440 //loop over tracks
441 for(Int_t it = 0; it < nt; it++) {
442
443 AliAODTrack *track = aod->GetTrack(it);
7d365db4 444 if(!AcceptAODTrack(track)) continue;
445 //if(! fEsdTrackCuts->IsSelected(track)) continue; //apply loose selection criteria
446 //FK//if(track->GetType() != AliAODTrack::kPrimary) continue; // only primaries
447
2f4cac02 448 //create a new AliJTrack and fill the track info
449 fTrackList->AddAliJTrack(ntrk);
450 AliJTrack *ctrack = fTrackList->GetAliJTrack(ntrk);
451
7b3462ad 452 ctrack->SetPtot(track->P());
2f4cac02 453 ctrack->SetPt(track->Pt());
454 ctrack->SetTheta(track->Theta());
7d365db4 455 //ctrack->SetPhi(track->Phi());
456 ctrack->SetPhi(atan2(sin(track->Phi()), cos(track->Phi())));
2f4cac02 457 ctrack->SetPID((Double_t*)track->PID());
7d365db4 458 ctrack->SetFlavor(kNone);
2f4cac02 459 ctrack->SetCharge(track->Charge());
7d365db4 460 ctrack->SetEta(track->Eta());
461
462 AliAODPid* pidAOD = track->GetDetPid();
463 if(pidAOD){
464 ctrack->SetTof(pidAOD->GetTOFsignal());
465 ctrack->SetTPCdEdx(pidAOD->GetTPCsignal());
466 }
467
7b685429 468 Double_t impactDCA[3];
7d365db4 469 if( track->GetPosition(impactDCA)){
7b685429 470 ctrack->SetImapactXY(sqrt(impactDCA[0]*impactDCA[0] + impactDCA[1]*impactDCA[1]));//impactXY);
471 ctrack->SetImapactZ(impactDCA[2]);//impactZ);
7d365db4 472 }
473
2f4cac02 474 ctrack->SetChi2perNDF(track->Chi2perNDF());
7d365db4 475 ctrack->SetTPCnClust(track->GetTPCNcls());
2f4cac02 476 ctrack->SetChi2Trig(track->GetChi2MatchTrigger());
7d365db4 477
478 ctrack->SetStatus(track->GetStatus());//
479 //ctrack->SetRecFlags(track->GetFlags());//?status
480
481 if(fIsRealOrMC){
482 Int_t label = track->GetLabel();
483 ctrack->SetITSLabel(label);
484 ctrack->SetTPCLabel(label);
485 }
486
2f4cac02 487 fTrackList->SetNTracks(++ntrk);
488
489 } // end tracks loop
490}
491
492//______________________________________________________________________________
493void AliJCORRANTask::ReadESDCaloClusters(const AliESDEvent* esd)
494{
495 // Read the AliESDCaloClusters and fill the list of AliJPhoton containers
496 Short_t nPhotons = 0;
497 Int_t numberOfCaloClusters = esd->GetNumberOfCaloClusters() ;
498 if(fDebug < 5) cout << "ESD::number of ESD caloclusters " << numberOfCaloClusters << endl;
7d365db4 499
2f4cac02 500 // loop over all the Calo Clusters
501 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
7d365db4 502
2f4cac02 503 AliESDCaloCluster *caloCluster = esd->GetCaloCluster(icluster) ;
504 if(!caloCluster) continue;
7d365db4 505 if(caloCluster->GetNTracksMatched()<=0){
506 if(caloCluster->E()<fLowerCutOnCaloClusterE) continue;
507
2f4cac02 508 // we will not implement any PID cut here
509 fPhotonList->AddAliJPhoton(nPhotons);
510 AliJPhoton *pht = fPhotonList->GetAliJPhoton(nPhotons);
7d365db4 511 pht->SetFlavor(kNone);//kPhoton);
2f4cac02 512 pht->SetE(caloCluster->E());
c8fe2783 513 pht->SetChi2(caloCluster->Chi2());
514 pht->SetPID(caloCluster->GetPID());
2f4cac02 515 Float_t pos[3]; caloCluster->GetPosition(pos) ;
516 pht->SetX(pos[0]);
517 pht->SetY(pos[1]);
518 pht->SetZ(pos[2]);
519 pht->SetPhi(atan2(pos[1],pos[0]));
520 pht->SetTheta(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2]));
521 pht->SetPt(caloCluster->E()*sin(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2])));
522 pht->SetCharge(0);
523 if(caloCluster->IsEMCAL()) pht->SetCaloType(AliJPhoton::kEMCALCalo);
524 if(caloCluster->IsPHOS()) pht->SetCaloType(AliJPhoton::kPHOSCalo);
525 pht->SetDistToBadChannel(caloCluster->GetDistanceToBadChannel());
c8fe2783 526 pht->SetDispersion(caloCluster->GetDispersion());
2f4cac02 527 pht->SetM20(caloCluster->GetM20());
528 pht->SetM02(caloCluster->GetM02());
529 pht->SetEmcCpvDist(caloCluster->GetEmcCpvDistance());
530 pht->SetNCells(caloCluster->GetNCells());
531 pht->SetCellsAbsId(caloCluster->GetCellsAbsId());
532 Int_t imoduleID = GetSuperModuleNumber(caloCluster->IsEMCAL(), caloCluster->GetCellAbsId(0));
533 pht->SetSuperModuleID(imoduleID);
2f4cac02 534
535 fPhotonList->SetNPhotons(++nPhotons);
536 } // end if
537 } //PHOS and EMCAL clusters
6392490d 538
2f4cac02 539}
540
541//______________________________________________________________________________
542void AliJCORRANTask::ReadAODCaloClusters(const AliAODEvent* aod)
543{
544 // Read the AliAODCaloClusters and fill the list of AliJPhoton containers
7d365db4 545 Int_t numberOfCaloClusters = aod->GetNumberOfCaloClusters();
2f4cac02 546 if(fDebug < 5) cout << "AOD::number of ESD caloclusters " << numberOfCaloClusters << endl;
547 Short_t nPhotons = 0;
7d365db4 548
2f4cac02 549 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
7d365db4 550
551 AliAODCaloCluster * caloCluster = aod->GetCaloCluster(icluster) ;
552 if(!caloCluster) continue;
553 if(caloCluster->GetNTracksMatched() > 0) continue;
554 if(caloCluster->E() < fLowerCutOnCaloClusterE) continue;
2f4cac02 555 // we will not implement any PID cut here
556 fPhotonList->AddAliJPhoton(nPhotons);
7d365db4 557
2f4cac02 558 AliJPhoton *pht = fPhotonList->GetAliJPhoton(nPhotons);
7d365db4 559 pht->SetFlavor(kNone);
2f4cac02 560 pht->SetE(caloCluster->E());
561 pht->SetChi2(caloCluster->Chi2());
c8fe2783 562 pht->SetPID((Double_t*)caloCluster->GetPID());
7d365db4 563 Float_t pos[3]; caloCluster->GetPosition(pos);
2f4cac02 564 pht->SetX(pos[0]);
565 pht->SetY(pos[1]);
566 pht->SetZ(pos[2]);
567 pht->SetPhi(atan2(pos[1],pos[0]));
568 pht->SetTheta(atan2(sqrt(pos[0]*pos[1]+pos[1]*pos[1]),pos[2]));
569 pht->SetPt(caloCluster->E()*sin(atan2(sqrt(pos[0]*pos[0]+pos[1]*pos[1]),pos[2])));
570 pht->SetCharge(0);
c8fe2783 571 if(caloCluster->IsEMCAL()) pht->SetCaloType(AliJPhoton::kEMCALCalo);
572 if(caloCluster->IsPHOS()) pht->SetCaloType(AliJPhoton::kPHOSCalo);
573 pht->SetDistToBadChannel(caloCluster->GetDistanceToBadChannel());
2f4cac02 574 pht->SetDispersion(caloCluster->GetDispersion());
575 pht->SetM20(caloCluster->GetM20());
576 pht->SetM02(caloCluster->GetM02());
577 pht->SetEmcCpvDist(caloCluster->GetEmcCpvDistance());
578 pht->SetNCells(int(caloCluster->GetNCells()));
579 pht->SetCellsAbsId(caloCluster->GetCellsAbsId());
c8fe2783 580 Int_t imoduleID = GetSuperModuleNumber(caloCluster->IsEMCAL(), caloCluster->GetCellAbsId(0));
2f4cac02 581 pht->SetSuperModuleID(imoduleID);
582
583 fPhotonList->SetNPhotons(++nPhotons);
584
585 } // clusters
586}
587
588//______________________________________________________________________________
589void AliJCORRANTask::ReadESDHeader(const AliESDEvent *esd)
590{
591 // Read the AliESDEvent and fill the list of AliJHeader containers
592 Short_t nHeaders = 0;
593 //create a header and fill it
594 fHeaderList->AddAliJHeader(nHeaders);
595 AliJHeader *hdr = fHeaderList->GetAliJHeader(nHeaders);
2f4cac02 596
597 AliMultiplicity *fSPDMult =(AliMultiplicity *) esd->GetMultiplicity();
7d365db4 598 if(fSPDMult) hdr->SetSPDTrackletMult(fSPDMult->GetNumberOfTracklets());
2f4cac02 599
600 hdr->SetEventID( esd->GetEventNumberInFile());
601
602 hdr->SetTriggerMaskAlice(esd->GetTriggerMask()); //ULong64_t
7d365db4 603 hdr->SetTriggerMaskJCorran(ConvertTriggerMask()); //UInt_t
2f4cac02 604
605 const AliESDVertex * vtxESD = esd->GetVertex();
7d365db4 606 if(vtxESD){
607 hdr->SetZVertex(vtxESD->GetZv());
608 hdr->SetZVertexErr(vtxESD->GetZRes());
609 }
610 hdr->SetEventType(esd->GetEventType());
2f4cac02 611
612 fHeaderList->SetNHeaders(++nHeaders);
613}
614
615//______________________________________________________________________________
616void AliJCORRANTask::ReadAODHeader(const AliAODEvent *aod)
7d365db4 617{
618 //Read the AliAODEvent and fill the list of AliJHeader containers
619 static int eventID = 0; //FK//?? dummy indexing of events (I cannot see how to get evet ID from AOD)
620
621 //read AOD event header
622 Short_t nHeaders = 0;
623
624 //create a header and fill it
625 fHeaderList->AddAliJHeader(nHeaders);
626 AliJHeader *hdr = fHeaderList->GetAliJHeader(nHeaders);
2f4cac02 627
7d365db4 628 const AliAODTracklets *trackletsSPD = aod->GetTracklets();
629 if(trackletsSPD){
630 hdr->SetSPDTrackletMult(trackletsSPD->GetNumberOfTracklets());
631 }
632 hdr->SetEventID( eventID++ ); //FK//?? I cannot see how to get evet ID from AOD
633 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
634 if(vtxAOD){
635 hdr->SetZVertex((float) vtxAOD->GetZ());
636 float sigmaVtx[3];
637 vtxAOD->GetSigmaXYZ(sigmaVtx);
638 hdr->SetZVertexErr((float) sqrt(sigmaVtx[2]));//TMath::Sqrt(fCovZZ)
639 }
640
641 //load aod event header
642 AliAODHeader * aodh = aod->GetHeader();
643 if(aodh){
644 hdr->SetCentrality(int(aodh->GetCentrality()));
645 hdr->SetEventType(aodh->GetEventType());
646 hdr->SetTriggerMaskAlice(aodh->GetTriggerMask()); //ULong64_t
647 }
648
649 hdr->SetTriggerMaskJCorran(ConvertTriggerMask()); //UInt_t
650
651 fHeaderList->SetNHeaders(++nHeaders);
2f4cac02 652}
653
2f4cac02 654//______________________________________________________________________________
655Int_t AliJCORRANTask::GetSuperModuleNumber(bool isemcal, Int_t absId)
656{
657 //get super module number
658 if(isemcal){
7d365db4 659 return GetEMCALGeoUtils()->GetSuperModuleNumber(absId) ;
2f4cac02 660 } else {
661 Int_t relId[4];
662 if ( absId >= 0) {
663 fPHOSGeom->AbsToRelNumbering(absId,relId);
664 return relId[0]-1;
665 } else return -1;
666 }//PHOS
667
668 return -1;
669}
670
671//_____________________________________________________________________________
672
7d365db4 673UInt_t AliJCORRANTask::ConvertTriggerMask(){
674
675 //convert alice trigger mask to jcorran trigger mask
2f4cac02 676 UInt_t triggerMaskJC=0;
7d365db4 677 if(!fIsRealOrMC){ //REAL data
678 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
679 ->IsEventSelected() & AliVEvent::kMB){
680 // minimum bias TBit 0
681 triggerMaskJC += (1<<kMinBiasTriggerBitJCorran);
682 }
2f4cac02 683
7d365db4 684 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
685 ->IsEventSelected() & AliVEvent::kHighMult){
686 //high multiplicity trigger TBit 1
687 triggerMaskJC += (1<<kHighMultTriggerBitJCorran);
688 }
689 }else{
690 triggerMaskJC=1; //MC data, at the moment all events filled as MB
2f4cac02 691 }
692
693 return triggerMaskJC;
694}
695
696
697//______________________________________________________________________________
6392490d 698bool AliJCORRANTask::StoreDownscaledMinBiasEvent(){
7d365db4 699 //Decide whether to downscale this MinBiasEvent and store it
6392490d 700 bool isThisEventToBeStored = kFALSE;
701 static Long_t evtNumber=0;
702
703 if( ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() ){
704 //collision candidate
705
7d365db4 706 if(evtNumber % fDownscaling ==0){ isThisEventToBeStored = kTRUE; } //store every Xth collision candidate event
6392490d 707 evtNumber++;
708 }
709 return isThisEventToBeStored;
710}
711//______________________________________________________________________________
7b3462ad 712bool AliJCORRANTask::ContainsESDHighPtTrack(){
7d365db4 713 //If there was an identified high pT particle above threshold reutrn flag to store this event
714 bool isThisEventToBeStored = kFALSE;
6392490d 715
7d365db4 716 if(fInputFormat=="ESD"){ // E S D
7b3462ad 717
7d365db4 718 AliESDEvent* esd = (AliESDEvent*)InputEvent();
719 if(!esd) return kFALSE;
7b3462ad 720 Int_t nt = esd->GetNumberOfTracks();
721
7d365db4 722 for(Int_t it = 0; it < nt; it++){
7b3462ad 723 AliESDtrack *track = esd->GetTrack(it);
724 //Does event contain high pt particle above thereshold in GeV
725 if(track->Pt() > fLowerCutOnLPMom && fEsdTrackCuts->IsSelected(track)){
726 isThisEventToBeStored = kTRUE;
7d365db4 727 break;
7b3462ad 728 }
729 }
7d365db4 730 }else{ // A O D
731 AliAODEvent* aod=(AliAODEvent*) InputEvent();
732 if(!aod) return kFALSE;
7b3462ad 733 Int_t nt = aod->GetNumberOfTracks();
734
735 for(Int_t it = 0; it < nt; it++) {
736 AliAODTrack *track = aod->GetTrack(it);
737 //Does event contain high pt particle above threshold in GeV
7d365db4 738 if(track->Pt() > fLowerCutOnLPMom && AcceptAODTrack(track)){
739 isThisEventToBeStored = kTRUE;
740 break;
7b3462ad 741 }
6392490d 742 }
743 }
744
745 return isThisEventToBeStored;
746}
747
748//______________________________________________________________________________
7b3462ad 749bool AliJCORRANTask::ContainsESDHighECaloClusters(){
7d365db4 750 //Check whether there was in the event high E calo clustre and renturn a flag whether to store this event.
751 bool isThisEventToBeStored = kFALSE;
6392490d 752
7b3462ad 753 if(fInputFormat=="ESD"){
754
7d365db4 755 AliESDEvent* esd = (AliESDEvent*)InputEvent();
756 if(!esd) return kFALSE;
7b3462ad 757 Int_t numberOfCaloClusters = esd->GetNumberOfCaloClusters() ;
758 // loop over all the Calo Clusters
759 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
760 AliESDCaloCluster *caloCluster = esd->GetCaloCluster(icluster) ;
761 if(!caloCluster) continue;
7d365db4 762 if(caloCluster->GetNTracksMatched() ==-1){
7b3462ad 763 //sotre calo clusters above 1 GeV
764 if( caloCluster->E() > fLowerCutOnLeadingCaloClusterE){
765 isThisEventToBeStored = kTRUE;
7d365db4 766 break;
7b3462ad 767 }
768 }
769 }
770 }else{
771
7d365db4 772 AliAODEvent* aod = (AliAODEvent*)InputEvent();
773 if(!aod) return kFALSE;
774 Int_t numberOfCaloClusters = aod->GetNumberOfCaloClusters();
7b3462ad 775 // loop over all the Calo Clusters
776 for(Int_t icluster = 0 ; icluster < numberOfCaloClusters ; icluster++) {
777 AliAODCaloCluster *caloCluster = aod->GetCaloCluster(icluster) ;
778 if(!caloCluster) continue;
7d365db4 779 if(caloCluster->GetNTracksMatched() == -1){
780 //sotre calo clusters above 1 GeV
781 if( caloCluster->E() > fLowerCutOnLeadingCaloClusterE){
782 isThisEventToBeStored = kTRUE;
783 break;
784 }
6392490d 785 }
786 }
787 }
7b3462ad 788
6392490d 789 return isThisEventToBeStored;
790}
791
792
7d365db4 793//--------------------------------------------------------------------
2f4cac02 794
7d365db4 795void AliJCORRANTask::ReadMCTracks(AliMCEvent *fMC){
796 //store MC information from AliStack
7b3462ad 797 AliStack *stack = fMC->Stack();
7d365db4 798 Int_t np = fMC->GetNumberOfTracks();
799
800 // AliGenEventHeader* genHeader = fMC->GenEventHeader();
801 // AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
802 // Double_t ptHard = 0;
803 // Double_t nTrials = 1; // Trials for MC trigger weigth for real data
804 // nTrials = pythiaGenHeader->Trials();
805 // ptHard = pythiaGenHeader->GetPtHard();
806 // Int_t nprim = stack->GetNtrack();
7b3462ad 807
808 Short_t ntrack = 0;
2f4cac02 809
7d365db4 810 for(Int_t iTrack = 0; iTrack < np; iTrack++){
811 AliMCParticle *track = (AliMCParticle*) fMC->GetTrack(iTrack);
7b3462ad 812 if(!track){
7d365db4 813 Printf("ERROR: Could not receive track %d", iTrack);
7b3462ad 814 continue;
815 }
7d365db4 816 Bool_t isPrimary = fMC->Stack()->IsPhysicalPrimary(iTrack);
817 if(isPrimary){
818 //create a new JMCTrack and fill the track info
819 fMCTrackList->AddJMCTrack(ntrack);
820 AliJMCTrack *ctrack = fMCTrackList->GetTrack(ntrack);
821
822 TParticle *partStack = stack->Particle(iTrack);
823 Int_t pdg = partStack->GetPdgCode();
824 Float_t engy = partStack->Energy();
825 Float_t pt = partStack->Pt();
826 Float_t ptot = partStack->P();
827 Float_t eta = partStack->Eta();
828 Float_t theta = partStack->Theta();
829 Float_t phi = atan2(sin( partStack->Phi()), cos(partStack->Phi()));
830 Short_t ch = (Short_t) partStack->GetPDG()->Charge();
831 Int_t label = track->GetLabel();
832
833 ctrack->SetLabel(label);
834 ctrack->SetPdgCode(pdg);
835 ctrack->SetPt(pt);
836 ctrack->SetTheta(theta);
837 ctrack->SetEta(eta);
838 ctrack->SetPhi(phi);
839 ctrack->SetE(engy);
840 ctrack->SetCharge(ch);
841 ctrack->SetPtot(ptot);
842 ctrack->SetIsPrimary(isPrimary);
843
844 ctrack->SetProductionVertex(partStack->Vx(),partStack->Vy(),partStack->Vz());
845 /*
846 Int_t status = partStack->GetStatusCode();
847 ctrack->SetStatusCode(status);
848
849 //ctrack->SetPtHard(ptHard);
850
851 //bool isInc = (status == 1 && icode == 22); //Inclusive
852 bool ispi0 = (status == 11 && pdg == 111); //kPizero
853 bool isDgamma = (status == 6 || status == 7) && pdg == 22; // Direct photon
854 bool inPHOS = (ispi0||isDgamma)&&fabs(eta)<0.12;
855 bool inEMCAL = (ispi0||isDgamma)&&fabs(eta)<0.7;
856 bool inTPC = fabs(eta)<0.9;
857 ctrack->SetMother(0,partStack->GetFirstMother());
858 ctrack->SetMother(1,partStack->GetSecondMother());
859 ctrack->SetDaughter(0,partStack->GetFirstDaughter());
860 ctrack->SetDaughter(1,partStack->GetLastDaughter());
861 ctrack->SetIsInPHOS(inPHOS);
862 ctrack->SetIsInEMCAL(inEMCAL);
863 ctrack->SetIsInTPC(inTPC);
864*/
865 fMCTrackList->SetNTracks(++ntrack);
866 }// loop for al primary tracks
867 }
7b3462ad 868}
869
7d365db4 870//--------------------------------------------------------------------
871bool AliJCORRANTask::AcceptAODTrack(AliAODTrack* aodTrack){
872 //This function mimics for the AliAODTracks object the AliESDtrackCut function IsSelected
873 //Cuts are taken from fEsdTrackCuts object
874 if(fEsdTrackCuts->GetMinNClusterTPC() > aodTrack->GetTPCNcls()) return kFALSE;
7b3462ad 875
7d365db4 876 //if(fEsdTrackCuts->GetMaxChi2PerClusterTPC() < );//<-------- how to check?
877 // ctrack->SetChi2perNDF(track->Chi2perNDF());
7b3462ad 878
7d365db4 879 // C h e c k r e f i t
7b3462ad 880
7d365db4 881 if(fEsdTrackCuts->GetRequireTPCRefit() &&
882 ((aodTrack->GetStatus() & AliJTrack::kTPCrefit) == 0)) return kFALSE;
883 if(fEsdTrackCuts->GetRequireITSRefit() &&
884 ((aodTrack->GetStatus() & AliJTrack::kITSrefit) == 0)) return kFALSE;
7b3462ad 885
7d365db4 886
887 // C u t s o n D C A
7b685429 888 Float_t impactDCA[3];
7d365db4 889 if( aodTrack->GetPosition(impactDCA)){
890 if((fEsdTrackCuts->GetMaxDCAToVertexXY()>0) &&
7b685429 891 (fEsdTrackCuts->GetMaxDCAToVertexXY() < sqrt(impactDCA[0]*impactDCA[0] + impactDCA[1]*impactDCA[1]))) return kFALSE;
7d365db4 892 if((fEsdTrackCuts->GetMaxDCAToVertexZ()>0) &&
7b685429 893 (fEsdTrackCuts->GetMaxDCAToVertexZ() < TMath::Abs(impactDCA[2]))) return kFALSE;
7d365db4 894 } else return kFALSE;
895
896 if(f1CutMaxDCAToVertexXYPtDep){
7b685429 897 if(f1CutMaxDCAToVertexXYPtDep->Eval(aodTrack->Pt()) < sqrt(impactDCA[0]*impactDCA[0] + impactDCA[1]*impactDCA[1])) return kFALSE;
7d365db4 898 }
7b3462ad 899
900
7d365db4 901 // if(fEsdTrackCuts->GetAcceptKinkDaughters()) //<--------how to check ?
902 // esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
7b3462ad 903
904
7d365db4 905 return kTRUE;
906}
907
908//--------------------------------------------------------------------
909AliEMCALGeoUtils * AliJCORRANTask::GetEMCALGeoUtils (bool doDelete){
910 //include EMCAL singleton modul
911 static AliEMCALGeoUtils* emcalgeo = 0x0;
912 if( ! emcalgeo ){
913 emcalgeo = new AliEMCALGeoUtils("EMCAL_COMPLETE");
914 }
915 if( emcalgeo && doDelete ){ //FK// !emcalgeo
916 delete emcalgeo;
917 emcalgeo=0x0;
918 }
919 return emcalgeo;
920}
921
7b3462ad 922
923