2 //**************************************************************************
3 //* This file is property of and copyright by the ALICE HLT Project *
4 //* ALICE Experiment at CERN, All rights reserved. *
6 //* Primary Authors: Gaute Ovrebekk <st05886@alf.uib.no>, *
7 //* for The ALICE HLT Project. *
9 //* Permission to use, copy, modify and distribute this software and its *
10 //* documentation strictly for non-commercial purposes is hereby granted *
11 //* without fee, provided that the above copyright notice appears in all *
12 //* copies and that both the copyright notice and this permission notice *
13 //* appear in the supporting documentation. The authors make no claims *
14 //* about the suitability of this software for any purpose. It is *
15 //* provided "as is" without express or implied warranty. *
16 //**************************************************************************
19 /** @file AliAnalysisTaskD0Trigger.cxx
20 @author Gaute Ovrebekk
22 @brief An analysis task for the D0 Trigger.
25 class AliAnalysisTask;
26 class AliAnalysisManager;
30 #include "AliESDEvent.h"
31 #include "AliESDInputHandler.h"
32 #include "TObjArray.h"
33 #include "TDatabasePDG.h"
34 #include "AliESDVertex.h"
36 #include "AliExternalTrackParam.h"
37 #include "AliAODVertex.h"
38 #include "TDatabasePDG.h"
39 #include "AliESDtrack.h"
41 #include "AliVertexerTracks.h"
42 #include "AliKFVertex.h"
43 #include "TDatabasePDG.h"
46 #include "AliAnalysisTaskD0Trigger.h"
48 ClassImp(AliAnalysisTaskD0Trigger)
50 AliAnalysisTaskD0Trigger::AliAnalysisTaskD0Trigger()
61 , fD0PDG(TDatabasePDG::Instance()->GetParticle(421)->Mass())
68 , ftwoTrackArray(NULL)
76 // Define input and output slots here
77 // Input slot #0 works with a TChain
78 // DefineInput(0, TChain::Class());
79 // Output slot #0 writes into a TH1 container
81 //DefineOutput(1, TList::Class());
84 AliAnalysisTaskD0Trigger::AliAnalysisTaskD0Trigger(const char *name,float cuts[7])
86 AliAnalysisTaskSE(name)
91 , fcosThetaStar(cuts[3])
95 , fD0PDG(TDatabasePDG::Instance()->GetParticle(421)->Mass())
102 , ftwoTrackArray(NULL)
110 // Define input and output slots here
111 // Input slot #0 works with a TChain
112 // DefineInput(0, TChain::Class());
113 // Output slot #0 writes into a TH1 container
115 DefineOutput(1, TList::Class());
117 void AliAnalysisTaskD0Trigger::UserCreateOutputObjects(){
122 fOutputList = new TList();
123 fOutputList->SetName(GetName());
125 fD0massHLT = new TH1F("hMassHLT","D^{0} mass plot from HLT reconstruction",100,1.7,2);
126 fD0ptHLT = new TH1F("hPtHLT","D^{0} Pt plot HLT reconstruction",20,0,20);
128 fD0massOFF = new TH1F("hMassOFF","D^{0} mass plot Offline reconstruction",100,1.7,2);
129 fD0ptOFF = new TH1F("hPtOFF","D^{0} Pt plot Offline reconstruction",20,0,20);
131 fOutputList->Add(fD0massHLT);
132 fOutputList->Add(fD0ptHLT);
133 fOutputList->Add(fD0massOFF);
134 fOutputList->Add(fD0ptOFF);
138 void AliAnalysisTaskD0Trigger::NotifyRun(){
139 // see header file of AliAnalysisTask for documentation
142 void AliAnalysisTaskD0Trigger::UserExec(Option_t *){
143 // see header file of AliAnalysisTask for documentation
145 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
148 Printf("ERROR: fESD not available");
152 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
153 AliESDEvent *esdHLT = NULL;
154 if(esdH) esdHLT = esdH->GetHLTEvent();
157 Printf("ERROR: HLTesd not available");
163 ftwoTrackArray = new TObjArray(2);
166 fField = esdHLT->GetMagneticField();
167 const AliESDVertex* pvHLT = esdHLT->GetPrimaryVertexTracks();
168 AliESDVertex *pVertexHLT = new AliESDVertex(*pvHLT);
169 if(pVertexHLT->GetNContributors()<2){
170 //Printf("ERROR: Contributiors to HLT Primary vertex is to low or not set");
174 for(Int_t it=0;it<esdHLT->GetNumberOfTracks();it++){
175 SingleTrackSelect(esdHLT->GetTrack(it),pVertexHLT);
178 RecD0(nD0,pVertexHLT,true);
186 fField = esdOFF->GetMagneticField();
187 const AliESDVertex* pvOFF = esdOFF->GetPrimaryVertexTracks();
188 AliESDVertex *pVertexOFF = new AliESDVertex(*pvOFF);
189 if(pVertexOFF->GetNContributors()<2){
190 //Printf("ERROR: Contributiors to OFFLINE Primary vertex is to low or not set");
193 for(Int_t it=0;it<esdOFF->GetNumberOfTracks();it++){
194 SingleTrackSelect(esdOFF->GetTrack(it),pVertexOFF);
197 RecD0(nD0,pVertexOFF,false);
204 PostData(1, fOutputList);
205 ftwoTrackArray->Clear();
210 void AliAnalysisTaskD0Trigger::Terminate(Option_t *){
211 Printf("Event Number: %d",fNevents);
212 Printf("Total Number of D0 foundfor HLT: %d",fTotalD0HLT);
213 Printf("Total Number of D0 found for OFFLINE: %d",fTotalD0OFF);
216 void AliAnalysisTaskD0Trigger::SingleTrackSelect(AliExternalTrackParam* t, AliESDVertex *pV){
217 // Offline har || på disse kuttene på de to henfallsproduktene
221 if(t->Pt()<fPtMin){return;}
222 if(TMath::Abs(t->GetD(pv[0],pv[1],fField)) > fd0){return;}
232 void AliAnalysisTaskD0Trigger::RecD0(Int_t& nD0, AliESDVertex *pV,bool isHLT){
234 Double_t starD0,starD0bar,xdummy,ydummy;
238 ftwoTrackArray->Clear();
241 Printf("No Primary Vertex");
246 for(UInt_t ip=0;ip<fPos.size();ip++){
247 AliExternalTrackParam *tP=fPos[ip];
248 for(UInt_t in=0;in<fNeg.size();in++){
249 AliExternalTrackParam *tN=fNeg[in];
251 tP->PropagateToDCA(pV,fField,kVeryBig); //do I need this??????
252 tN->PropagateToDCA(pV,fField,kVeryBig);
254 Double_t dcatPtN = tP->GetDCA(tN,fField,xdummy,ydummy);
255 if(dcatPtN>fdca) { continue; }
257 ftwoTrackArray->AddAt(tP,0);
258 ftwoTrackArray->AddAt(tN,1);
259 AliAODVertex *vertexp1n1 = ReconstructSecondaryVertex(ftwoTrackArray,fField,pV,fuseKF);
261 ftwoTrackArray->Clear();
265 vertexp1n1->GetXYZ(svpos);
267 tP->PropagateToDCA(vertexp1n1,fField,kVeryBig);
268 tN->PropagateToDCA(vertexp1n1,fField,kVeryBig);
270 if((TMath::Abs(InvMass(tN,tP)-fD0PDG)) > finvMass && TMath::Abs((InvMass(tP,tN))-fD0PDG) > finvMass){continue;}
271 CosThetaStar(tN,tP,starD0,starD0bar);
272 if(TMath::Abs(starD0) > fcosThetaStar && TMath::Abs(starD0bar) > fcosThetaStar){continue;}
273 d0[0] = tP->GetD(pvpos[0],pvpos[1],fField);
274 d0[1] = tN->GetD(pvpos[0],pvpos[1],fField);
275 if((d0[0]*d0[1]) > fd0d0){continue;}
276 if(PointingAngle(tN,tP,pvpos,svpos) < fcosPoint){continue;}
279 fD0massHLT->Fill(InvMass(tN,tP));
280 fD0massHLT->Fill(InvMass(tP,tN));
281 fD0ptHLT->Fill(Pt(tP,tN));
284 fD0massOFF->Fill(InvMass(tN,tP));
285 fD0massOFF->Fill(InvMass(tP,tN));
286 fD0ptOFF->Fill(Pt(tP,tN));
294 Double_t AliAnalysisTaskD0Trigger::InvMass(AliExternalTrackParam* d1, AliExternalTrackParam* d2)
296 // Calculating the invariant mass
297 Double_t mpi=TDatabasePDG::Instance()->GetParticle(211)->Mass();
298 Double_t mK=TDatabasePDG::Instance()->GetParticle(321)->Mass();
301 energy[1] = TMath::Sqrt(mK*mK+d1->GetP()*d1->GetP());
302 energy[0] = TMath::Sqrt(mpi*mpi+d2->GetP()*d2->GetP());
304 Double_t p1[3],p2[3];
308 Double_t momTot2 = (p1[0]+p2[0])*(p1[0]+p2[0])+
309 (p1[1]+p2[1])*(p1[1]+p2[1])+
310 (p1[2]+p2[2])*(p1[2]+p2[2]);
312 return TMath::Sqrt((energy[0]+energy[1])*(energy[0]+energy[1])-momTot2);
316 void AliAnalysisTaskD0Trigger::CosThetaStar(AliExternalTrackParam* d1, AliExternalTrackParam* d2,Double_t &D0,Double_t &D0bar)
318 //Calculating the decay angle
319 Double_t mD0 = TDatabasePDG::Instance()->GetParticle(421)->Mass();
320 Double_t mpi=TDatabasePDG::Instance()->GetParticle(211)->Mass();
321 Double_t mK=TDatabasePDG::Instance()->GetParticle(321)->Mass();
323 Double_t pStar = TMath::Sqrt(TMath::Power(mD0*mD0-mK*mK-mpi*mpi,2.)-4.*mK*mK*mpi*mpi)/(2.*mD0);
325 Double_t px = d1->Px()+d2->Px();
326 Double_t py = d1->Py()+d2->Py();
327 Double_t pz = d1->Pz()+d2->Pz();
328 Double_t p = TMath::Sqrt(px*px+py*py+pz*pz);
329 Double_t energy = TMath::Sqrt(p*p+mD0*mD0);
331 Double_t beta = p/energy;
332 Double_t gamma = energy/mD0;
335 TVector3 mom(d1->Px(),d1->Py(),d1->Pz());
336 TVector3 momD(px,py,pz);
337 qL = mom.Dot(momD)/momD.Mag();
339 D0 = (qL/gamma-beta*TMath::Sqrt(pStar*pStar+mK*mK))/pStar;
341 TVector3 mom2(d2->Px(),d2->Py(),d2->Pz());
342 TVector3 momD2(px,py,pz);
343 qL = mom2.Dot(momD2)/momD2.Mag();
345 D0bar = (qL/gamma-beta*TMath::Sqrt(pStar*pStar+mK*mK))/pStar;
349 Double_t AliAnalysisTaskD0Trigger::PointingAngle(AliExternalTrackParam* n, AliExternalTrackParam* p, Double_t *pv, Double_t *sv)
351 // Calcutating the pointing angle
352 TVector3 mom(n->Px()+p->Px(),n->Py()+p->Py(),n->Pz()+p->Pz());
353 TVector3 flight(sv[0]-pv[0],sv[1]-pv[1],sv[2]-pv[2]);
355 double pta = mom.Angle(flight);
357 return TMath::Cos(pta);
360 AliAODVertex* AliAnalysisTaskD0Trigger::ReconstructSecondaryVertex(TObjArray *trkArray, Double_t b, const AliESDVertex *v, bool useKF)
362 // Finding the vertex of the two tracks in trkArray
363 AliESDVertex *vertexESD = 0;
364 AliAODVertex *vertexAOD = 0;
367 AliVertexerTracks *vertexer = new AliVertexerTracks(b);
368 AliESDVertex* vertex = const_cast<AliESDVertex*>(v);
369 vertexer->SetVtxStart(vertex);
370 //if(isESD){vertexESD = (AliESDVertex*)vertexer->VertexForSelectedESDTracks(trkArray);}
371 UShort_t *id = new UShort_t[2];
372 AliExternalTrackParam *t1 = (AliExternalTrackParam*) trkArray->At(0);
373 AliExternalTrackParam *t2 = (AliExternalTrackParam*) trkArray->At(1);
374 id[0]=(UShort_t) t1->GetID();
375 id[1]=(UShort_t) t2->GetID();
376 vertexESD = (AliESDVertex*)vertexer->VertexForSelectedTracks(trkArray,id);
378 delete vertexer; vertexer=NULL;
380 if(!vertexESD) return vertexAOD;
382 if(vertexESD->GetNContributors()!=trkArray->GetEntriesFast()) {
383 //AliDebug(2,"vertexing failed");
384 delete vertexESD; vertexESD=NULL;
390 AliKFParticle::SetField(b);
392 AliKFVertex vertexKF;
394 Int_t nTrks = trkArray->GetEntriesFast();
395 for(Int_t i=0; i<nTrks; i++) {
396 AliESDtrack *esdTrack = (AliESDtrack*)trkArray->At(i);
397 AliKFParticle daughterKF(*esdTrack,211);
398 vertexKF.AddDaughter(daughterKF);
400 vertexESD = new AliESDVertex(vertexKF.Parameters(),
401 vertexKF.CovarianceMatrix(),
403 vertexKF.GetNContributors());
405 // convert to AliAODVertex
406 Double_t pos[3],cov[6],chi2perNDF;
407 vertexESD->GetXYZ(pos); // position
408 vertexESD->GetCovMatrix(cov); //covariance matrix
409 chi2perNDF = vertexESD->GetChi2toNDF();
410 //dispersion = vertexESD->GetDispersion();
411 delete vertexESD; vertexESD=NULL;
413 Int_t nprongs= trkArray->GetEntriesFast();
414 vertexAOD = new AliAODVertex(pos,cov,chi2perNDF,0x0,-1,AliAODVertex::kUndef,nprongs);
420 Double_t AliAnalysisTaskD0Trigger::Pt(AliExternalTrackParam* d1, AliExternalTrackParam* d2)
422 //Calculating pT of the two tracks
423 Double_t p1[3],p2[3];
427 Double_t pt2 = (p1[0]+p2[0])*(p1[0]+p2[0]) + (p1[1]+p2[1])*(p1[1]+p2[1]);
429 return TMath::Sqrt(pt2);