2 // Main authors: Paraskevi Ganoti: 2009
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #include "AliEveKink.h"
12 #include <TDatabasePDG.h>
13 #include <TEveTrack.h>
14 #include <TEveTrackPropagator.h>
16 #include <TEveManager.h>
18 /***********************************************************************
22 ************************************************************************/
26 //______________________________________________________________________________
27 AliEveKink::AliEveKink() :
41 // Default constructor.
43 // Override from TEveElement.
44 fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0.0;
48 //______________________________________________________________________________
49 AliEveKink::AliEveKink(TEveRecTrack* tMoth, TEveRecTrack* tDaug,
50 TEveRecKink* kink, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
52 fRecKinkPosition(kink->fVKink),
53 fMotherMomentum(kink->fPMother),
54 fDaughterMomentum(kink->fPDaughter),
55 fMotherTrack(new TEveTrack(tMoth, rsMoth)),
56 fDaughterTrack(new TEveTrack(tDaug, rsDaugh)),
57 fRnrStyleMoth(rsMoth),
58 fRnrStyleDaugh(rsDaugh),
63 // Constructor with full kink specification.
65 // Override from TEveElement.
67 fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0;
69 fMotherTrack->SetLineColor(2); // red
70 fMotherTrack->SetStdTitle();
71 fMotherTrack->SetLineWidth(3);
72 TEvePathMark* pmM = 0;
73 pmM = new TEvePathMark(TEvePathMark::kDecay);
74 pmM->fV.Set(kink->fVKink);
75 fMotherTrack->AddPathMark(*pmM);
77 fDaughterTrack->SetLineColor(7); // light blue
78 fDaughterTrack->SetLineWidth(3); //
79 fDaughterTrack->SetStdTitle();
81 fMotherTrack->IncDenyDestroy();
82 AddElement(fMotherTrack);
83 fDaughterTrack->IncDenyDestroy();
84 AddElement(fDaughterTrack);
87 //______________________________________________________________________________
88 AliEveKink::~AliEveKink()
90 // Destructor. Dereferences mother-daughter tracks
92 fMotherTrack->DecDenyDestroy();
93 fDaughterTrack->DecDenyDestroy();
95 //______________________________________________________________________________
96 void AliEveKink::SetMaxProbPdgPid(Int_t rPdg, Float_t rPid)
98 // Sets the maximum probability Pdg value and Pid for the daughter
99 // Should be moved to TEveTrack property eventually (or AliEveTrack creation)
101 fDaugMaxProbPdg = rPdg;
102 fDaugMaxProbPid = rPid;
106 //______________________________________________________________________________
107 Float_t AliEveKink::GetInvMass(Int_t dPdgCode) const
109 // Returns Invariant Mass assuming the mass of the daughter particle
110 TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
111 TEveVector lMothMomentum = fMotherTrack->GetMomentum();
112 Double_t dMass=TDatabasePDG::Instance()->GetParticle(dPdgCode)->Mass();
114 Double_t eDaug = TMath::Sqrt(dMass*dMass + lDaugMomentum.Mag2());
115 Double_t otherDaug=TMath::Sqrt(
116 (lMothMomentum.fX-lDaugMomentum.fX)*(lMothMomentum.fX-lDaugMomentum.fX)+
117 (lMothMomentum.fY-lDaugMomentum.fY)*(lMothMomentum.fY-lDaugMomentum.fY)+
118 (lMothMomentum.fZ-lDaugMomentum.fZ)*(lMothMomentum.fZ-lDaugMomentum.fZ));
120 return TMath::Sqrt( (eDaug+otherDaug)*(eDaug+otherDaug) - lMothMomentum.Mag2());
123 //______________________________________________________________________________
124 Float_t AliEveKink::GetQt() const
126 // Returns the kink daughter Qt
128 TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
129 Float_t daugMom=TMath::Sqrt(
130 (lDaugMomentum.fX)*(lDaugMomentum.fX)+
131 (lDaugMomentum.fY)*(lDaugMomentum.fY)+
132 (lDaugMomentum.fZ)*(lDaugMomentum.fZ));
134 return TMath::Sin(fKinkAngle[2])*daugMom ;
137 //______________________________________________________________________________
138 void AliEveKink::MakeKink()
140 // Set all dependant components for drawing.
142 SetPoint(0, fRecKinkPosition.fX, fRecKinkPosition.fY, fRecKinkPosition.fZ);
144 fMotherTrack->MakeTrack();
145 fDaughterTrack->MakeTrack();
150 /***********************************************************************
152 * AliEveKinkList class
154 ************************************************************************/
156 ClassImp(AliEveKinkList)
158 //______________________________________________________________________________
159 AliEveKinkList::AliEveKinkList() :
163 fRnrKinkDaughter(kTRUE),
173 fMinInvariantMass(0),
174 fMaxInvariantMass(1.0),
178 // Default constructor.
180 fChildClass = AliEveKink::Class(); // override member from base TEveElementList
183 //______________________________________________________________________________
184 AliEveKinkList::AliEveKinkList(TEveTrackPropagator* rsMoth,TEveTrackPropagator* rsDaugh) :
186 fRnrStyleMoth(rsMoth),
187 fRnrStyleDaugh(rsDaugh),
188 fRnrKinkDaughter(kTRUE),
198 fMinInvariantMass(0),
199 fMaxInvariantMass(1.0),
203 // Constructor with given track-propagator..
205 fChildClass = AliEveKink::Class(); // override member from base TEveElementList
210 //______________________________________________________________________________
211 AliEveKinkList::AliEveKinkList(const Text_t* name, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
213 fRnrStyleMoth(rsMoth),
214 fRnrStyleDaugh(rsDaugh),
215 fRnrKinkDaughter(kTRUE),
225 fMinInvariantMass(0),
226 fMaxInvariantMass(1.0),
230 // Standard constructor.
232 fChildClass = AliEveKink::Class(); // override member from base TEveElementList
238 //______________________________________________________________________________
239 void AliEveKinkList::Init()
241 // Initialize members needed for drawing operations.
243 if (fRnrStyleMoth== 0) fRnrStyleMoth = new TEveTrackPropagator;
244 if (fRnrStyleDaugh== 0) fRnrStyleDaugh = new TEveTrackPropagator;
247 /******************************************************************************/
249 //______________________________________________________________________________
250 void AliEveKinkList::MakeKinks()
252 // Call MakeKink() for all elements.
254 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
255 ((AliEveKink*)(*i))->MakeKink();
260 /******************************************************************************/
262 //______________________________________________________________________________
263 void AliEveKinkList::FilterByRadius(Float_t minR, Float_t maxR)
265 // Select visibility of elements based on their axial radius.
270 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
272 AliEveKink* kink = (AliEveKink*) *i;
273 Float_t rad = kink->GetKinkRadius();
274 Bool_t show = rad >= fMinRCut && rad <= fMaxRCut;
275 kink->SetRnrState(show);
281 /******************************************************************************/
283 //______________________________________________________________________________
284 void AliEveKinkList::FilterByKinkAngle(Float_t minKinkAngle, Float_t maxKinkAngle)
286 // Select visibility of elements based on the kink angle.
288 fMinKinkAngle = minKinkAngle;
289 fMaxKinkAngle = maxKinkAngle;
291 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
293 AliEveKink* kink = (AliEveKink*) *i;
294 Float_t angle = TMath::RadToDeg()*kink->GetKinkAngle(2);
295 Bool_t show = angle >= fMinKinkAngle && angle <= fMaxKinkAngle;
296 kink->SetRnrState(show);
302 /******************************************************************************/
304 //______________________________________________________________________________
305 void AliEveKinkList::FilterByPt(Float_t minPt, Float_t maxPt)
307 // Select visibility of elements based on the kink pt.
312 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
314 AliEveKink* kink = (AliEveKink*) *i;
315 Float_t pt = kink->GetKinkPMotherPerp();
316 Bool_t show = pt >= fMinPt && pt <= fMaxPt;
317 kink->SetRnrState(show);
323 //______________________________________________________________________________
324 void AliEveKinkList::FilterByInvariantMass(Float_t minInvariantMass, Float_t maxInvariantMass, Int_t dPdgCode)
326 // Select visibility of elements based on the kink invariant mass.
328 fMinInvariantMass = minInvariantMass;
329 fMaxInvariantMass = maxInvariantMass;
331 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
333 AliEveKink* kink = (AliEveKink*) *i;
334 Float_t invMass = kink->GetInvMass(dPdgCode);
335 Bool_t show = invMass >= fMinInvariantMass && invMass <= fMaxInvariantMass;
336 kink->SetRnrState(show);
342 //______________________________________________________________________________
343 void AliEveKinkList::FilterByCheckedPidMinProb(Int_t rFlag, Int_t rPid, Float_t rProb)
345 // Select visibility of elements based on the kink daughter PID.
347 fDaugCheckedPid = rPid;
348 fDaugCheckedProb = rProb;
350 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
352 AliEveKink* kink = (AliEveKink*) *i;
355 Bool_t show = kFALSE;
357 pid = kink->GetDaugMaxProbPdg();
358 prob = kink->GetDaugMaxProbPid();
359 show = (pid == fDaugCheckedPid && prob > fDaugCheckedProb) || !rFlag ;
361 kink->SetRnrState(show);