2 //_____________________________________________________________________________
3 // Class for semiforward UPC filter
4 // Author: Jaroslav Adam
6 // Fill structure of AliUPCEvent
7 //_____________________________________________________________________________
17 #include "TClonesArray.h"
18 #include "TParticle.h"
19 #include "TObjString.h"
24 #include "AliAnalysisManager.h"
25 #include "AliInputEventHandler.h"
26 #include "AliESDEvent.h"
27 #include "AliAODEvent.h"
28 #include "AliMCEvent.h"
29 #include "AliAODVZERO.h"
30 #include "AliAODZDC.h"
31 #include "AliAODVertex.h"
32 #include "AliESDVZERO.h"
33 #include "AliESDZDC.h"
34 #include "AliESDVertex.h"
35 #include "AliAODTrack.h"
36 #include "AliMultiplicity.h"
37 #include "AliESDtrack.h"
38 #include "AliESDMuonTrack.h"
39 #include "AliAODMCParticle.h"
40 #include "AliMCParticle.h"
41 #include "AliTriggerAnalysis.h"
42 #include "AliMuonTrackCuts.h"
43 #include "AliESDtrackCuts.h"
44 #include "AliAODPid.h"
45 #include "AliGenEventHeader.h"
46 #include "AliAODMCHeader.h"
49 #include "AliAnalysisTaskUpcFilterSemiforward.h"
50 #include "AliUPCTrack.h"
51 #include "AliUPCMuonTrack.h"
52 #include "AliUPCEvent.h"
54 ClassImp(AliAnalysisTaskUpcFilterSemiforward);
56 // task for upc semiforward filter
57 // jaroslav.adam@cern.ch
59 //_____________________________________________________________________________
60 AliAnalysisTaskUpcFilterSemiforward::AliAnalysisTaskUpcFilterSemiforward(const char *name)
61 :AliAnalysisTaskSE(name),
62 fIsESD(0), fIsMC(0), fMuonCuts(0x0), fTriggerAna(0x0), fCutsList(0x0),
63 fHistList(0x0), fCounter(0x0), fTriggerCounter(0x0),
64 fUPCEvent(0x0), fUPCTree(0x0)
69 DefineOutput(1, TTree::Class());
70 DefineOutput(2, TList::Class());
72 }//AliAnalysisTaskUpcFilterSemiforward
74 //_____________________________________________________________________________
75 AliAnalysisTaskUpcFilterSemiforward::~AliAnalysisTaskUpcFilterSemiforward()
79 if(fHistList) {delete fHistList; fHistList = 0x0;}
80 if(fCounter) {delete fCounter; fCounter = 0x0;}
81 if(fTriggerCounter) {delete fTriggerCounter; fTriggerCounter = 0x0;}
82 if(fUPCEvent) {delete fUPCEvent; fUPCEvent = 0x0;}
83 if(fUPCTree) {delete fUPCTree; fUPCTree = 0x0;}
84 if(fMuonCuts) {delete fMuonCuts; fMuonCuts = 0x0;}
85 if(fTriggerAna) {delete fTriggerAna; fTriggerAna = 0x0;}
86 if(fCutsList) {delete[] fCutsList; fCutsList=0x0;}
88 }//~AliAnalysisTaskUpcFilterSemiforward
90 //_____________________________________________________________________________
91 void AliAnalysisTaskUpcFilterSemiforward::UserCreateOutputObjects()
94 fMuonCuts = new AliMuonTrackCuts("StdMuonCuts", "StdMuonCuts");
95 fMuonCuts->SetFilterMask ( AliMuonTrackCuts::kMuPdca );
96 fMuonCuts->Print("mask");
97 fMuonCuts->SetAllowDefaultParams(kTRUE);
98 fMuonCuts->SetPassName("muon_pass2");
100 //trigger analysis for SPD FO fired chips in MC
101 fTriggerAna = new AliTriggerAnalysis();
102 fTriggerAna->SetAnalyzeMC( fIsMC );
106 fCutsList = new AliESDtrackCuts*[32];
107 for(UInt_t i=0; i<32; i++) fCutsList[i] = 0x0;
109 // bits 0 - 10 set in $ALICE_ROOT/ANALYSIS/ESDfilter/macros/AddTaskESDFilter.C
111 // Cuts on primary tracks
112 AliESDtrackCuts* esdTrackCutsL = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
113 fCutsList[0] = esdTrackCutsL;
115 // standard cuts with very loose DCA
116 AliESDtrackCuts* esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
117 esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
118 esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
119 esdTrackCutsH->SetDCAToVertex2D(kTRUE);
120 fCutsList[4] = esdTrackCutsH;
122 // standard cuts with tight DCA cut
123 AliESDtrackCuts *esdTrackCutsH2 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
124 fCutsList[5] = esdTrackCutsH2;
128 // selection by Daniele, UPC meeting, 15 July 2014
129 // https://indico.cern.ch/event/330483/contribution/3/material/slides/0.pdf
131 AliESDtrackCuts *cuts11 = new AliESDtrackCuts();
132 cuts11->SetMinNClustersTPC(70);
133 cuts11->SetRequireTPCRefit(kTRUE);
134 cuts11->SetRequireITSRefit(kTRUE);
135 cuts11->SetMaxChi2PerClusterTPC(4);
136 cuts11->SetAcceptKinkDaughters(kFALSE);
137 cuts11->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
138 cuts11->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.01");
139 cuts11->SetMaxDCAToVertexZ(2);
140 cuts11->SetDCAToVertex2D(kFALSE);
141 cuts11->SetRequireSigmaToVertex(kFALSE);
142 cuts11->SetMaxChi2PerClusterITS(5.);
143 fCutsList[11] = cuts11;
145 AliESDtrackCuts *cuts12 = new AliESDtrackCuts();
146 cuts12->SetMinNClustersTPC(70);
147 cuts12->SetRequireTPCRefit(kTRUE);
148 cuts12->SetRequireITSRefit(kTRUE);
149 cuts12->SetMaxChi2PerClusterTPC(4);
150 cuts12->SetAcceptKinkDaughters(kFALSE);
151 cuts12->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
152 cuts12->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.01");
153 cuts12->SetMaxDCAToVertexZ(2);
154 cuts12->SetDCAToVertex2D(kFALSE);
155 cuts12->SetRequireSigmaToVertex(kFALSE);
156 fCutsList[12] = cuts12;
158 // setting in Evgeny's trees
159 AliESDtrackCuts *cuts13 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011();
160 cuts13->SetMaxChi2TPCConstrainedGlobal(1e+10);
161 fCutsList[13] = cuts13;
166 fHistList = new TList();
167 fHistList->SetOwner();
168 fCounter = new TH1I("fCounter", "fCounter", 30, 1, 31);
169 fHistList->Add(fCounter);
170 fTriggerCounter = new TH2I("fTriggerCounter", "fTriggerCounter", 44000, 154000, 198000, NTRG+1, 0, NTRG+1);
171 fHistList->Add(fTriggerCounter);
174 fUPCEvent = new AliUPCEvent();
175 fUPCEvent->SetIsMC( fIsMC );
176 fUPCEvent->SetIsESD( fIsESD );
178 TDirectory *pwd = gDirectory;
180 fUPCTree = new TTree("fUPCTree", "fUPCTree");
182 fUPCTree->Branch("fUPCEvent", &fUPCEvent);
184 PostData(1, fUPCTree);
185 PostData(2, fHistList);
187 }//UserCreateOutputObjects
189 //_____________________________________________________________________________
190 void AliAnalysisTaskUpcFilterSemiforward::NotifyRun()
193 //cout<<"AliAnalysisTaskUpcFilterSemiforward::NotifyRun()"<<endl;
195 fMuonCuts->SetRun(fInputHandler); // use input handler from AliAnalysisTaskSE
197 if( fIsESD ) { ((AliESDEvent*) InputEvent())->InitMagneticField(); }
201 //_____________________________________________________________________________
202 void AliAnalysisTaskUpcFilterSemiforward::UserExec(Option_t *)
205 //cout<<"#################### Next event ##################"<<endl;
208 AliVEvent *vEvent = InputEvent();
211 fUPCEvent->ClearEvent();
213 fCounter->Fill( 1 ); // 1 = analyzed events
216 TString trigger = vEvent->GetFiredTriggerClasses();
217 Bool_t trgClasses[NTRG]; // array of fired trigger classes
218 for(Int_t itrg=0; itrg<NTRG; itrg++) trgClasses[itrg] = kFALSE;
220 trgClasses[1] = trigger.Contains("CMUP6-B"); // p-Pb FW
221 trgClasses[2] = trigger.Contains("CMUP3-B"); // Pb-p FW
222 trgClasses[3] = trigger.Contains("CMUP8-B"); // Pb-p FW
224 trgClasses[4] = trigger.Contains("CMUP7-B"); // p-Pb SFW
225 trgClasses[5] = trigger.Contains("CMUP5-B"); // Pb-p SFW
226 trgClasses[6] = trigger.Contains("CMUP9-B"); // Pb-p SFW
228 trgClasses[7] = trigger.Contains("CCUP7-B"); // CEN
230 trgClasses[8] = trigger.Contains("CMUP7-ACE");
231 trgClasses[9] = trigger.Contains("CMUP5-ACE");
232 trgClasses[10]= trigger.Contains("CMUP9-ACE");
234 trgClasses[11]= trigger.Contains("CMUP1-B"); // PbPb FW
236 Bool_t isTrg = kFALSE;
237 for(Int_t itrg=1; itrg<NTRG; itrg++) {
238 if(!trgClasses[itrg]) continue;
239 //trigger at itrg is fired
240 fUPCEvent->SetTriggerClass( itrg , kTRUE );
241 fTriggerCounter->Fill( vEvent->GetRunNumber() , itrg );
244 if(!isTrg && !fIsMC) {PostData(2, fHistList); return;}
245 //event passed the trigger
247 fCounter->Fill( 2 ); // 2 = events after trigger (ESD and AOD)
249 // ESD / AOD specific tasks: MC, SPD FO, L0 inputs, SPD tracklets, tracks, ZDC tdc
251 if( fIsESD ) stat = RunESD();
252 if(!fIsESD ) stat = RunAOD();
253 if( !stat && !fIsMC ) {PostData(2, fHistList); return;}
254 //event passed ESD / AOD specific selection
256 fCounter->Fill( 3 ); // 3 = events after ESD / AOD specific part
259 const char *filnam = ((TTree*) GetInputData(0))->GetCurrentFile()->GetName();
260 // reconstruction pass: -1 = unknown, 1 = pass1, 2 = pass2, counter indices: 9 (unknown), 11 (pass1), 12 (pass2)
261 fUPCEvent->SetRecoPass( -1 );
262 if( strstr(filnam,"/pass1/") ) {fUPCEvent->SetRecoPass( 1 ); fCounter->Fill( 11 );}
263 if( strstr(filnam,"/pass2/") ) {fUPCEvent->SetRecoPass( 2 ); fCounter->Fill( 12 );}
264 if( fUPCEvent->GetRecoPass() < 0 ) fCounter->Fill( 9 );
265 fUPCEvent->SetInputFileName( filnam );
266 fUPCEvent->SetEventNumber( ((TTree*) GetInputData(0))->GetTree()->GetReadEntry() );
267 fUPCEvent->SetRunNumber( vEvent->GetRunNumber() );
270 AliVVZERO *dataVZERO = vEvent->GetVZEROData();
271 if(!dataVZERO) {PostData(2, fHistList); return;}
273 fUPCEvent->SetV0ADecision( dataVZERO->GetV0ADecision() );
274 fUPCEvent->SetV0CDecision( dataVZERO->GetV0CDecision() );
275 for (UInt_t iv=0; iv<32; iv++) {
276 if( dataVZERO->BBTriggerV0C((Int_t)iv) ) fUPCEvent->SetBBtriggerV0Cmask(iv);
277 if( dataVZERO->GetBBFlag((Int_t)iv) ) fUPCEvent->SetBBFlagV0Cmask(iv);
281 AliVZDC *dataZDC = vEvent->GetZDCData();
282 if(!dataZDC) {PostData(2, fHistList); return;}
285 Double_t eZnc=0., eZpc=0., eZna=0., eZpa=0.;
286 for(Int_t i=0; i<5; i++) {
287 eZnc += dataZDC->GetZNCTowerEnergy()[i];
288 eZpc += dataZDC->GetZPCTowerEnergy()[i];
289 eZna += dataZDC->GetZNATowerEnergy()[i];
290 eZpa += dataZDC->GetZPATowerEnergy()[i];
292 fUPCEvent->SetZNCEnergy( eZnc );
293 fUPCEvent->SetZPCEnergy( eZpc );
294 fUPCEvent->SetZNAEnergy( eZna );
295 fUPCEvent->SetZPAEnergy( eZpa );
297 //default primary vertex
298 const AliVVertex *vtx = vEvent->GetPrimaryVertex();
299 if(!vtx) {PostData(2, fHistList); return;}
300 Double_t pos[3]; vtx->GetXYZ(pos);
301 Double_t cov[6]; vtx->GetCovarianceMatrix(cov);
302 fUPCEvent->SetPrimaryVertex(pos, vtx->GetChi2perNDF(), cov, vtx->GetNContributors());
303 const char *vtxtitle = vtx->GetTitle();
304 fUPCEvent->SetPrimaryVertexTitle( vtxtitle );
306 fCounter->Fill( 4 ); // 4 = events written to the tree (ESD and AOD)
309 PostData(1, fUPCTree);
310 PostData(2, fHistList);
314 //_____________________________________________________________________________
315 Bool_t AliAnalysisTaskUpcFilterSemiforward::RunAOD()
317 //cout<<"#################### AOD event ##################"<<endl;
320 AliAODEvent *aodEvent = (AliAODEvent*) InputEvent();
321 if(!aodEvent) return kFALSE;
323 fCounter->Fill( 22 ); // 22 = AOD analyzed events
325 if(fIsMC) RunAODMC( (TClonesArray*) aodEvent->GetList()->FindObject(AliAODMCParticle::StdBranchName()),
326 (AliAODMCHeader*) aodEvent->FindListObject(AliAODMCHeader::StdBranchName())
329 //nominal interaction point
330 static AliAODVertex *vtx0 = 0x0;
332 // make a vertex at coordinates 0, 0, 0
333 vtx0 = new AliAODVertex();
334 vtx0->SetX(0.); vtx0->SetY(0.); vtx0->SetZ(0.);
337 //array of tracks for DCAs calculation
338 //static TClonesArray *trackArray = 0x0;
339 //if( !trackArray ) trackArray = new TClonesArray("AliAODTrack", 3); // number of DCAs
343 Double_t xyzDca[2], cov[3];
344 Float_t b[2], covF[3];
345 Int_t nmun=0, ncen=0;
347 for(Int_t itr=0; itr<aodEvent->GetNumberOfTracks(); itr++) {
348 AliAODTrack *trk = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(itr));
352 if( trk->IsMuonTrack() ) {
354 AliUPCMuonTrack *upcMuon = fUPCEvent->AddMuonTrack();
355 upcMuon->SetPtEtaPhi( trk->Pt(), trk->Eta(), trk->Phi() );
356 upcMuon->SetCharge( trk->Charge() );
357 upcMuon->SetMatchTrigger( trk->GetMatchTrigger() );
358 upcMuon->SetRAtAbsorberEnd( trk->GetRAtAbsorberEnd() );
359 upcMuon->SetChi2perNDF( trk->Chi2perNDF() );
360 upcMuon->SetDCA( trk->DCA() );
361 upcMuon->SetPxDCA( fMuonCuts->IsSelected(trk) );
369 if( trk->HasPointOnITSLayer(0) ) { maskMan |= 1 << 0; }
370 if( trk->HasPointOnITSLayer(1) ) { maskMan |= 1 << 1; }
371 if( trk->GetStatus() & AliESDtrack::kITSrefit ) { maskMan |= 1 << 2; }
372 if( trk->GetStatus() & AliESDtrack::kTPCrefit ) { maskMan |= 1 << 3; }
374 //selection for at least one point in ITS and TPC refit
375 //if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
376 //if( !(maskMan & (1 << 3)) ) continue;
378 //selection for its refit and tpc refit
379 //if( !(maskMan & (1 << 2)) || !(maskMan & (1 << 3)) ) continue;
381 //selection for tpc refit
382 //if( !(maskMan & (1 << 3)) ) continue;
384 //selection for at least one point in SPD and ITS refit and TPC refit
385 //if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
386 //if( !(maskMan & (1 << 2)) || !(maskMan & (1 << 3)) ) continue;
388 //selection for at least one point in SPD and at least one TPC cluster
389 if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
390 if( trk->GetTPCNcls() == 0 ) continue;
392 trk->GetPxPyPz(pxpypz);
393 AliAODPid *apid = trk->GetDetPid();
396 AliUPCTrack *upcTrack = fUPCEvent->AddTrack();
397 upcTrack->SetPxPyPz( pxpypz );
398 upcTrack->SetMaskMan( maskMan );
399 upcTrack->SetFilterMap( trk->GetFilterMap() );
400 upcTrack->SetCharge( trk->Charge() );
401 upcTrack->SetChi2perNDF( trk->Chi2perNDF() );
402 upcTrack->SetTPCmomentum( apid->GetTPCmomentum() );
403 upcTrack->SetTPCsignal( apid->GetTPCsignal() );
404 upcTrack->SetTPCNcls( trk->GetTPCNcls() );
405 upcTrack->SetTPCCrossedRows( (Float_t) trk->GetTPCNCrossedRows() );
406 upcTrack->SetTPCNclsF( trk->GetTPCNclsF() );
407 upcTrack->SetTPCNclsS( trk->GetTPCnclsS() );
408 upcTrack->SetITSClusterMap( trk->GetITSClusterMap() );
411 //trackArray->Clear("C");
412 //new((*trackArray)[0]) AliAODTrack(*trk);
413 //new((*trackArray)[1]) AliAODTrack(*trk);
414 //new((*trackArray)[2]) AliAODTrack(*trk);
416 //DCA to default primary vertex
417 AliAODTrack *track1 = (AliAODTrack*) trk->Clone("track1");
418 //AliAODTrack *track1 = (AliAODTrack*) trackArray->At( 0 );
419 track1->PropagateToDCA(aodEvent->GetPrimaryVertex(), aodEvent->GetMagneticField(), 9999., xyzDca, cov);
420 for(Int_t i=0; i<2; i++) {b[i] = (Float_t) xyzDca[i]; covF[i] = (Float_t) cov[i];}
421 upcTrack->SetImpactParameters(b, covF);
425 track1 = (AliAODTrack*) trk->Clone("track1");
426 //track1 = (AliAODTrack*) trackArray->At( 1 );
427 track1->PropagateToDCA(aodEvent->GetPrimaryVertexSPD(), aodEvent->GetMagneticField(), 9999., xyzDca, cov);
428 for(Int_t i=0; i<2; i++) {b[i] = (Float_t) xyzDca[i]; covF[i] = (Float_t) cov[i];}
429 upcTrack->SetImpactParametersSPD(b, covF);
432 //DCA to nominal interaction point
433 track1 = (AliAODTrack*) trk->Clone("track1");
434 //track1 = (AliAODTrack*) trackArray->At( 2 );
435 track1->PropagateToDCA(vtx0, aodEvent->GetMagneticField(), 9999., xyzDca, cov);
436 for(Int_t i=0; i<2; i++) {b[i] = (Float_t) xyzDca[i]; covF[i] = (Float_t) cov[i];}
437 upcTrack->SetImpactParametersIP(b, covF);
444 //selection for at least one muon or central track
445 if( nmun + ncen < 1 ) return kFALSE;
447 //selection for at least one muon and at least one central track
448 //if( nmun < 1 || ncen < 1 ) return kFALSE;
452 fUPCEvent->SetL0inputs( aodEvent->GetHeader()->GetL0TriggerInputs() );
455 fUPCEvent->SetNumberOfTracklets( aodEvent->GetTracklets()->GetNumberOfTracklets() );
458 AliAODZDC *dataZDCAOD = aodEvent->GetZDCData();
459 if(!dataZDCAOD) {PostData(2, fHistList); return kFALSE;}
461 Bool_t znctdc = kFALSE, znatdc = kFALSE;
462 if( dataZDCAOD->GetZNCTime() != 0. ) znctdc = kTRUE;
463 if( dataZDCAOD->GetZNATime() != 0. ) znatdc = kTRUE;
464 fUPCEvent->SetZNCtdc( znctdc );
465 fUPCEvent->SetZNAtdc( znatdc );
466 fUPCEvent->SetZPCtdc( kFALSE );
467 fUPCEvent->SetZPAtdc( kFALSE );
469 //SPD primary vertex in AOD
470 AliAODVertex *vtx = aodEvent->GetPrimaryVertexSPD();
471 if(!vtx) {PostData(2, fHistList); return kFALSE;}
472 Double_t posVtx[3]; vtx->GetXYZ( posVtx );
473 Double_t covVtx[6]; vtx->GetCovarianceMatrix( covVtx );
474 fUPCEvent->SetPrimaryVertexSPD(posVtx, vtx->GetChi2perNDF(), covVtx, vtx->GetNContributors());
475 const char *vtxtitle = vtx->GetTitle();
476 fUPCEvent->SetPrimaryVertexSPDtitle( vtxtitle );
482 //_____________________________________________________________________________
483 void AliAnalysisTaskUpcFilterSemiforward::RunAODMC(TClonesArray *arrayMC, AliAODMCHeader *headerMC)
485 // run over AOD mc particles
487 if( !arrayMC || !headerMC ) return;
489 //generated vertex in AOD MC
490 Double_t vtxD[3]; headerMC->GetVertex( vtxD );
491 Float_t vtxF[3]; for(Int_t i=0; i<3; i++) vtxF[i] = (Float_t) vtxD[i];
492 fUPCEvent->SetPrimaryVertexMC( vtxF );
494 //loop over mc particles
495 for(Int_t imc=0; imc<arrayMC->GetEntriesFast(); imc++) {
496 AliAODMCParticle *aodmc = (AliAODMCParticle*) arrayMC->At(imc);
499 if(aodmc->GetMother() >= 0) continue;
501 TParticle *part = fUPCEvent->AddMCParticle();
502 part->SetMomentum(aodmc->Px(), aodmc->Py(), aodmc->Pz(), aodmc->E());
503 part->SetProductionVertex(aodmc->Xv(), aodmc->Yv(), aodmc->Zv(), aodmc->T());
504 part->SetFirstMother(aodmc->GetMother());
505 part->SetLastDaughter(aodmc->GetNDaughters());
506 part->SetPdgCode(aodmc->GetPdgCode());
507 part->SetUniqueID(imc);
508 }//loop over mc particles
512 //_____________________________________________________________________________
513 Bool_t AliAnalysisTaskUpcFilterSemiforward::RunESD()
515 //cout<<"#################### ESD event ##################"<<endl;
518 AliESDEvent *esdEvent = (AliESDEvent*) InputEvent();
519 if(!esdEvent) return kFALSE;
521 fCounter->Fill( 21 ); // 21 = ESD analyzed events
524 fUPCEvent->SetNSPDfiredInner( fTriggerAna->SPDFiredChips(esdEvent,1,kFALSE,1) );
525 fUPCEvent->SetNSPDfiredOuter( fTriggerAna->SPDFiredChips(esdEvent,1,kFALSE,2) );
530 static AliESDVertex *vtx0 = 0x0;
532 // make a vertex at coordinates 0, 0, 0
533 vtx0 = new AliESDVertex();
534 vtx0->SetXv(0.); vtx0->SetYv(0.); vtx0->SetZv(0.);
537 // ESD central tracks
539 Float_t b[2]; Float_t cov[3];
542 Int_t nmun=0, ncen=0;
543 //ESD central tracks loop
544 for(Int_t itr=0; itr<esdEvent->GetNumberOfTracks(); itr++) {
545 AliESDtrack *eTrack = esdEvent->GetTrack(itr);
546 if( !eTrack ) continue;
550 if( eTrack->HasPointOnITSLayer(0) ) { maskMan |= 1 << 0; }
551 if( eTrack->HasPointOnITSLayer(1) ) { maskMan |= 1 << 1; }
552 if( eTrack->GetStatus() & AliESDtrack::kITSrefit ) { maskMan |= 1 << 2; }
553 if( eTrack->GetStatus() & AliESDtrack::kTPCrefit ) { maskMan |= 1 << 3; }
554 if( eTrack->GetKinkIndex(0) > 0 ) { maskMan |= 1 << 4; } // bit set if track is kink candidate
556 //selection for at least one point in ITS and TPC refit
557 //if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
558 //if( !(maskMan & (1 << 3)) ) continue;
560 //selection for its refit and tpc refit
561 //if( !(maskMan & (1 << 2)) || !(maskMan & (1 << 3)) ) continue;
563 //selection for tpc refit
564 //if( !(maskMan & (1 << 3)) ) continue;
566 //selection for at least one point in SPD and ITS refit and TPC refit
567 //if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
568 //if( !(maskMan & (1 << 2)) || !(maskMan & (1 << 3)) ) continue;
570 //selection for at least one point in SPD and at least one TPC cluster
571 if( !(maskMan & (1 << 0)) && !(maskMan & (1 << 1)) ) continue;
572 if( eTrack->GetTPCNcls() == 0 ) continue;
574 //central track accepted to write to the UPC event
576 // various configurations of AliESDtrackCuts
578 for(UInt_t i=0; i<32; i++) {
579 if( !fCutsList[i] ) continue;
581 if( fCutsList[i]->AcceptTrack(eTrack) ) { filterMap |= 1 << i; }
584 eTrack->GetPxPyPz(pxpypz);
587 AliUPCTrack *upcTrack = fUPCEvent->AddTrack();
588 upcTrack->SetPxPyPz( pxpypz );
589 upcTrack->SetMaskMan( maskMan );
590 upcTrack->SetFilterMap( filterMap );
591 upcTrack->SetCharge( eTrack->Charge() );
592 upcTrack->SetChi2perNDF( eTrack->GetTPCchi2()/((Double_t) eTrack->GetTPCNcls()) ); // TPC chi2 used to fill this data member in esd
593 upcTrack->SetTPCmomentum( eTrack->GetTPCmomentum() );
594 upcTrack->SetTPCsignal( eTrack->GetTPCsignal() );
595 upcTrack->SetTPCNcls( eTrack->GetTPCNcls() );
596 upcTrack->SetTPCCrossedRows( eTrack->GetTPCCrossedRows() );
597 upcTrack->SetTPCNclsF( eTrack->GetTPCNclsF() );
598 upcTrack->SetTPCNclsS( eTrack->GetTPCnclsS() );
599 upcTrack->SetITSchi2perNDF( eTrack->GetITSchi2()/((Double_t) eTrack->GetNcls(0)) );
600 upcTrack->SetITSClusterMap( eTrack->GetITSClusterMap() );
602 //DCA to default primary vertex
603 eTrack->GetImpactParameters(b, cov);
604 upcTrack->SetImpactParameters(b, cov);
607 AliESDtrack *track1 = (AliESDtrack*) eTrack->Clone("track1");
608 track1->RelateToVertex( esdEvent->GetPrimaryVertexSPD(), esdEvent->GetMagneticField(), 9999. );
609 track1->GetImpactParameters(b, cov);
610 upcTrack->SetImpactParametersSPD(b, cov);
613 //DCA to nominal interaction point
614 track1 = (AliESDtrack*) eTrack->Clone("track1");
615 track1->RelateToVertex( vtx0, esdEvent->GetMagneticField(), 9999. );
616 track1->GetImpactParameters(b, cov);
617 upcTrack->SetImpactParametersIP(b, cov);
621 } //ESD central tracks loop
625 for(Int_t itr=0; itr<esdEvent->GetNumberOfMuonTracks(); itr++) {
626 AliESDMuonTrack *mTrack = esdEvent->GetMuonTrack(itr);
627 if( !mTrack ) continue;
629 AliUPCMuonTrack *upcMuon = fUPCEvent->AddMuonTrack();
630 upcMuon->SetPtEtaPhi( mTrack->Pt(), mTrack->Eta(), mTrack->Phi() );
631 upcMuon->SetCharge( mTrack->Charge() );
632 upcMuon->SetMatchTrigger( mTrack->GetMatchTrigger() );
633 upcMuon->SetRAtAbsorberEnd( mTrack->GetRAtAbsorberEnd() );
634 upcMuon->SetChi2perNDF( mTrack->GetChi2()/((Double_t) mTrack->GetNDF()) );
635 upcMuon->SetDCA( mTrack->GetDCA() );
636 upcMuon->SetPxDCA( fMuonCuts->IsSelected(mTrack) );
641 //selection for at least one muon or central track
642 if( nmun + ncen < 1 ) return kFALSE;
644 //selection for at least one muon and at least one central track
645 //if( nmun < 1 || ncen < 1 ) return kFALSE;
648 fUPCEvent->SetL0inputs( esdEvent->GetHeader()->GetL0TriggerInputs() );
651 fUPCEvent->SetNumberOfTracklets( esdEvent->GetMultiplicity()->GetNumberOfTracklets() );
654 AliESDZDC *dataZDCESD = esdEvent->GetESDZDC();
655 if(!dataZDCESD) {PostData(2, fHistList); return kFALSE;}
657 Bool_t znctdc = kFALSE, zpctdc = kFALSE, znatdc = kFALSE, zpatdc = kFALSE;
658 for(Int_t iz=0;iz<4;iz++) {
659 if( dataZDCESD->GetZDCTDCData(10,iz) ) znctdc = kTRUE;
660 if( dataZDCESD->GetZDCTDCData(11,iz) ) zpctdc = kTRUE;
661 if( dataZDCESD->GetZDCTDCData(12,iz) ) znatdc = kTRUE;
662 if( dataZDCESD->GetZDCTDCData(13,iz) ) zpatdc = kTRUE;
664 fUPCEvent->SetZNCtdc( znctdc );
665 fUPCEvent->SetZPCtdc( zpctdc );
666 fUPCEvent->SetZNAtdc( znatdc );
667 fUPCEvent->SetZPAtdc( zpatdc );
669 //SPD primary vertex in ESD
670 const AliESDVertex *vtx = esdEvent->GetPrimaryVertexSPD();
671 if(!vtx) {PostData(2, fHistList); return kFALSE;}
672 Double_t posVtx[3]; vtx->GetXYZ( posVtx );
673 Double_t covVtx[6]; vtx->GetCovarianceMatrix( covVtx );
674 fUPCEvent->SetPrimaryVertexSPD(posVtx, vtx->GetChi2perNDF(), covVtx, vtx->GetNContributors());
675 const char *vtxtitle = vtx->GetTitle();
676 fUPCEvent->SetPrimaryVertexSPDtitle( vtxtitle );
682 //_____________________________________________________________________________
683 void AliAnalysisTaskUpcFilterSemiforward::RunESDMC()
687 AliMCEvent *mcEvent = MCEvent();
688 if(!mcEvent) {cout<<"Error: no ESD MC found"<<endl; return;}
692 mcEvent->GenEventHeader()->PrimaryVertex(vtx);
693 fUPCEvent->SetPrimaryVertexMC( vtx.GetArray() );
695 //loop over mc particles
696 for(Int_t imc=0; imc<mcEvent->GetNumberOfTracks(); imc++) {
697 AliMCParticle *esdmc = (AliMCParticle*) mcEvent->GetTrack(imc);
700 if(esdmc->GetMother() >= 0) continue;
702 TParticle *part = fUPCEvent->AddMCParticle();
703 part->SetMomentum(esdmc->Px(), esdmc->Py(), esdmc->Pz(), esdmc->E());
704 part->SetProductionVertex(esdmc->Xv(), esdmc->Yv(), esdmc->Zv(), 0.);
705 part->SetFirstMother(esdmc->GetMother());
706 part->SetLastDaughter(esdmc->GetLastDaughter()-esdmc->GetFirstDaughter()+1);
707 part->SetPdgCode(esdmc->PdgCode());
708 part->SetUniqueID(imc);
709 }//loop over mc particles
713 //_____________________________________________________________________________
714 void AliAnalysisTaskUpcFilterSemiforward::Terminate(Option_t *)
717 cout<<"Analysis complete."<<endl;