2 // Main author: Davide Caffarri 2009
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * ee http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
11 #include "AliAODRecoDecay.h"
13 #include <TEveTrack.h>
14 #include <TEveTrackPropagator.h>
15 #include <TEveManager.h>
17 #include <TPolyLine3D.h>
18 #include <TPolyMarker3D.h>
21 #include <TDatabasePDG.h>
22 #include <TParticlePDG.h>
27 /***********************************************************************
31 ************************************************************************/
36 //______________________________________________________________________________
57 fProngMaxProbPdg(0x0),
58 fProngMaxProbPid(0x0),
59 fInvariantMassPart(0),
60 fInvariantMassAntiPart(0),
64 // Default constructor.
66 // Override from TEveElement.
68 fMainColorPtr = &fMarkerColor;
71 //______________________________________________________________________________
72 AliEveHF::AliEveHF(TEveRecTrack* tNeg, TEveRecTrack* tPos, Double_t primVtx[3], AliAODRecoDecay* aodObj, Double_t /*firstPointTrack*/[3], TEveTrackPropagator* rs) :
77 fRecBirthHF(primVtx[0], primVtx[1], primVtx[2]),
78 fRecDecayHF(aodObj->GetSecVtxX(), aodObj->GetSecVtxY(), aodObj->GetSecVtxZ()),
79 fRecDecayP_HF(aodObj->Px(),aodObj->Py(),aodObj->Pz()),
80 fPointingAngleHF(aodObj->CosPointingAngle(primVtx)),
82 fNegTrack(new TEveTrack(tNeg, rs)),
83 fPosTrack(new TEveTrack(tPos, rs)),
85 fPointingLine(new TEveLine("Pointing line")),
87 fnProng(aodObj->GetNProngs()),
89 fChi2SecondVtx(aodObj->GetReducedChi2()),
95 fInvariantMassPart(0),
96 fInvariantMassAntiPart(0),
100 // Constructor with full HF specification.
101 // Override from TEveElement.
103 fMainColorPtr = &fMarkerColor;
106 fMarkerColor = kSpring + 6;
109 fPointingLine->SetLineColor(fMarkerColor);
110 fPointingLine->SetLineWidth(2);
111 fPointingLine->IncDenyDestroy();
112 AddElement(fPointingLine);
114 fPosTrack->SetLineColor(2); // red
115 fPosTrack->SetStdTitle();
116 fNegTrack->SetLineColor(7); // light blue
117 fNegTrack->SetStdTitle();
119 fNegTrack->IncDenyDestroy();
120 AddElement(fNegTrack);
121 fPosTrack->IncDenyDestroy();
122 AddElement(fPosTrack);
125 //______________________________________________________________________________
126 AliEveHF::~AliEveHF()
128 // Destructor. Dereferences pos/neg tracks and pointing-line objects.
130 fNegTrack->DecDenyDestroy();
131 fPosTrack->DecDenyDestroy();
132 fPointingLine->DecDenyDestroy();
135 //_____________________________________________________________________________
136 void AliEveHF::SetProngDCA() const
138 for(Int_t ip=0; ip<fnProng; ip++)
139 fProngDCA[ip] = fAODobj->GetDCA(ip);
142 //______________________________________________________________________________
143 void AliEveHF::Setd0Prong() const
145 for(Int_t ip=0; ip<fnProng; ip++)
146 fProngd0[ip] = fAODobj->Getd0Prong(ip);
150 //______________________________________________________________________________
151 void AliEveHF::SetMaxProbPdgPid()
153 // Sets the maximum probability Pdg value and Pid for one daughter
154 // Should be moved to TEveTrack property eventually (or AliEveTrack creation)
158 for (Int_t ip=0; ip<fnProng; ip++){
159 fAODobj->GetPIDProng(ip, pid);
161 fProngMaxProbPid[ip]=pid[0]; //lascio cosi perchè mi da errore se lo uso come puntatore
162 for (Int_t pp=1; pp<5; pp++)
163 if (pid[pp]>pid[pp-1]) {
164 fProngMaxProbPid[ip]=pid[pp];
169 fProngMaxProbPdg[ip] = -11;
171 fProngMaxProbPdg[ip] = -13;
173 fProngMaxProbPdg[ip] = 211;
175 fProngMaxProbPdg[ip] = 321;
177 fProngMaxProbPdg[ip] = 2212;
183 //________________________________________________________________________________________
184 void AliEveHF::CalculateInvMass(Int_t decay)
192 pdg2[0]=211; pdg2[1]=321;
193 mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
194 minv = fAODobj->InvMass(fnProng,pdg2);
195 fInvariantMassPart=minv;
197 pdg2[0]=321; pdg2[1]=211;
198 minv = fAODobj->InvMass(fnProng,pdg2);
199 fInvariantMassAntiPart=minv;
205 //______________________________________________________________________________
206 Bool_t AliEveHF::SelectInvMass(Int_t decay, Float_t decayCuts)
211 Bool_t retval=kFALSE;
215 pdg2[0]=211; pdg2[1]=321;
216 mPDG=TDatabasePDG::Instance()->GetParticle(421)->Mass();
217 minv = fAODobj->InvMass(fnProng,pdg2);
218 fInvariantMassPart=minv;
219 if(TMath::Abs(minv-mPDG)<decayCuts) retval=kTRUE;
220 pdg2[0]=321; pdg2[1]=211;
221 minv = fAODobj->InvMass(fnProng,pdg2);
222 fInvariantMassAntiPart=minv;
223 if(TMath::Abs(minv-mPDG)<decayCuts) retval=kTRUE;
231 //______________________________________________________________________________
232 void AliEveHF::MakeHF()
234 // Set all dependant components for drawing.
236 SetPoint(0, fRecDecayHF.fX, fRecDecayHF.fY, fRecDecayHF.fZ);
238 fNegTrack->MakeTrack();
239 fPosTrack->MakeTrack();
241 fPointingLine->SetPoint(0, fRecBirthHF.fX, fRecBirthHF.fY, fRecBirthHF.fZ);
242 fPointingLine->SetPoint(1, fRecDecayHF.fX, fRecDecayHF.fY, fRecDecayHF.fZ);
245 /***********************************************************************
249 ************************************************************************/
251 ClassImp(AliEveHFList)
253 //______________________________________________________________________________
254 AliEveHFList::AliEveHFList() :
258 fRnrDaughters(kTRUE),
268 fMinCosPointingAngle(0),
269 fMaxCosPointingAngle(1),
272 fProngCheckedPid(0x0),
273 fProngCheckedProb(0x0),
274 fDeltaInvariantMass(0),
277 // Default constructor.
279 fChildClass = AliEveHF::Class(); // override member from base TEveElementList
282 //______________________________________________________________________________
283 AliEveHFList::AliEveHFList(TEveTrackPropagator* rs) :
287 fRnrDaughters(kTRUE),
297 fMinCosPointingAngle(0),
298 fMaxCosPointingAngle(1),
301 fProngCheckedPid(0x0),
302 fProngCheckedProb(0x0),
303 fDeltaInvariantMass(1),
306 // Constructor with given track-propagator..
308 fChildClass = AliEveHF::Class(); // override member from base TEveElementList
313 //______________________________________________________________________________
314 AliEveHFList::AliEveHFList(const Text_t* name, TEveTrackPropagator* rs) :
318 fRnrDaughters(kTRUE),
328 fMinCosPointingAngle(0),
329 fMaxCosPointingAngle(1),
332 fProngCheckedPid(0x0),
333 fProngCheckedProb(0x0),
334 fDeltaInvariantMass(1),
337 // Standard constructor.
339 fChildClass = AliEveHF::Class(); // override member from base TEveElementList
345 //______________________________________________________________________________
346 void AliEveHFList::Init()
348 // Initialize members needed for drawing operations.
350 if (fRnrStyle== 0) fRnrStyle = new TEveTrackPropagator;
353 /******************************************************************************/
355 //______________________________________________________________________________
356 void AliEveHFList::MakeHFs()
358 // Call MakeHF() for all elements.
360 for(List_i i=fChildren.begin(); i!=fChildren.end(); i++) {
361 ((AliEveHF*)(*i))->MakeHF();
366 /******************************************************************************/
369 //______________________________________________________________________________
370 void AliEveHFList::FilterByPt(Float_t minPt, Float_t maxPt)
377 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)//lista gli HF!!!
379 AliEveHF *hf = (AliEveHF*) *i;
380 Float_t pt = hf->GetPt();
381 Bool_t show = ((pt >= fMinPt) && (pt <= fMaxPt));
382 hf->SetRnrState(show);
387 //______________________________________________________________________________
388 void AliEveHFList::FilterByRadius(Float_t minR, Float_t maxR)
390 // Select visibility of elements based on their axial radius.
395 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)//lista gli HF!!!
397 AliEveHF *hf = (AliEveHF*) *i;
398 Float_t rad = hf->GetRadius();
399 Bool_t show = rad >= fMinRCut && rad <= fMaxRCut;
400 hf->SetRnrState(show);
406 /******************************************************************************/
409 //______________________________________________________________________________
410 void AliEveHFList::FilterByCosPointingAngle(Float_t minCosPointingAngle, Float_t maxCosPointingAngle)
412 // Select visibility of elements based on the V0 pt.
414 fMinCosPointingAngle = minCosPointingAngle;
415 fMaxCosPointingAngle = maxCosPointingAngle;
418 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)//lista gli HF!!!
420 AliEveHF *hf = (AliEveHF*) *i;
421 Float_t cosPointingAngle = hf->GetCosPointingAngle();
422 Bool_t show = cosPointingAngle >= fMinCosPointingAngle && cosPointingAngle <= fMaxCosPointingAngle;
423 hf->SetRnrState(show);
429 //______________________________________________________________________________
430 void AliEveHFList::FilterByd0(Float_t mind0, Float_t maxd0)
432 // Select visibility of elements based on the V0 pt.
437 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
439 AliEveHF *hf = (AliEveHF*) *i;
440 Int_t nProng=(Int_t)hf->GetAODobj()->GetNProngs();
441 for(Int_t ip = 1; ip < nProng; ++ip) {
442 Double_t d0 = hf->Getd0Prong(ip);
443 Bool_t show = d0 >= fMind0 && d0 <= fMaxd0;
444 hf->SetRnrState(show);
452 //______________________________________________________________________________
453 void AliEveHFList::FilterByDCA(Float_t minDaughterDCA, Float_t maxDaughterDCA)
455 // Select visibility of elements based on the DCA between daughters.
457 fMinDaughterDCA = minDaughterDCA;
458 fMaxDaughterDCA = maxDaughterDCA;
464 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
466 AliEveHF* hf = (AliEveHF*) *i;
467 Int_t nProng=(Int_t)hf->GetAODobj()->GetNProngs();
468 for(Int_t ip = 1; ip < nProng; ++ip) {
469 dca = hf->GetProngDCA(ip);
470 Bool_t show = dca >= fMinDaughterDCA && dca <= fMaxDaughterDCA;
471 hf->SetRnrState(show);
478 /******************************************************************************/
479 //______________________________________________________________________________
480 /*void AliEveHFList::FilterByCheckedPidMinProb(Int_t rFlag,Int_t rDaughter, Int_t rPid, Float_t rProb)
484 fNegCheckedPid = rPid;
485 fNegCheckedProb = rProb;
488 fPosCheckedPid = rPid;
489 fPosCheckedProb = rProb;
492 // Select visibility of elements based on one of the V0 daughters PID
493 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
495 AliEveHF* hf = (AliEveHF*) *i;
499 if (!rDaughter) {// Negative daughter checked
500 pid = hf->GetNegMaxProbPdg();
501 prob = hf->GetNegMaxProbPid();
502 show = (pid == fNegCheckedPid && prob > fNegCheckedProb) || !rFlag ;
504 else if (rDaughter) {// Positive daughter checked
505 pid = hf->GetPosMaxProbPdg();
506 prob = hf->GetPosMaxProbPid();
507 show = (pid == fPosCheckedPid && prob > fPosCheckedProb) || !rFlag ;
509 hf->SetRnrState(show);
515 //______________________________________________________________________________
517 void AliEveHFList::FilterByInvariantMass(Int_t decay, Float_t deltaInvariantMass)
519 // Select visibility of elements based on the HF invariant mass.
521 fDeltaInvariantMass = deltaInvariantMass;
524 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
526 AliEveHF* hf = (AliEveHF*) *i;
527 Bool_t show = hf->SelectInvMass(decay, fDeltaInvariantMass);
528 // if (show) show = (invMass >= (fInvariantMass-fDeltaInvariantMass)) && (invMass <= (fInvariantMass+fDeltaInvariantMass));
529 hf->SetRnrState(show);