2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 //------------------------------------------------------------------------
12 // AliEveCascade class
14 //------------------------------------------------------------------------
16 //#include <TPolyLine3D.h>
21 #include <TDatabasePDG.h>
22 #include <TEveTrackPropagator.h>
23 #include <TEveManager.h>
25 #include "AliEveCascade.h"
30 ClassImp(AliEveCascade)
32 //______________________________________________________________________________
33 AliEveCascade::AliEveCascade() :
52 // Default constructor.
54 // Override from TEveElement.
56 fMainColorPtr = &fMarkerColor;
59 //______________________________________________________________________________
60 AliEveCascade::AliEveCascade(TEveRecTrack* tBac, TEveRecTrack* tNeg, TEveRecTrack* tPos, TEveRecV0* v0, TEveRecCascade* cascade, TEveTrackPropagator* rs) :
63 fRecBirthV(cascade->fCascadeBirth),
64 fRecDecayV(cascade->fCascadeVCa),
65 fRecDecayP(cascade->fPBac + v0->fPNeg + v0->fPPos),
66 fRecDecayV0(v0->fVCa),
67 fBacTrack(new AliEveTrack(tBac, rs)),
68 fNegTrack(new AliEveTrack(tNeg, rs)),
69 fPosTrack(new AliEveTrack(tPos, rs)),
73 fPointingCurve(new TEveLine("Pointing Curve")),
74 fV0Path(new TEveLine("V0 Path")),
76 fDaughterDCA(999), // DCA between Xi daughters is properly set in esd_make_cascade via the setter
78 fLambdaP(0.,0.,0.), // Momemtum of Lambda is properly set in esd_make_cascade via the setter
79 fBachP(0.,0.,0.) // Momemtum of Lambda is properly set in esd_make_cascade via the setter
81 // Constructor with full Cascade specification.
83 // Override from TEveElement.
85 fMainColorPtr = &fMarkerColor;
88 fMarkerColor = kMagenta+2;
91 fPointingCurve->SetTitle("Xi pointing curve");
92 fPointingCurve->SetLineColor(fMarkerColor);
93 fPointingCurve->SetLineStyle(9);
94 fPointingCurve->SetLineWidth(2);
95 fPointingCurve->IncDenyDestroy();
96 AddElement(fPointingCurve);
98 fV0Path->SetTitle("V0 path");
99 fV0Path->SetLineColor(fMarkerColor);
100 fV0Path->SetLineStyle(3);
101 fV0Path->SetLineWidth(2);
102 fV0Path->IncDenyDestroy();
105 fBacTrack->SetLineColor(kMagenta);
106 fBacTrack->SetStdTitle();
107 fBacTrack->IncDenyDestroy();
108 AddElement(fBacTrack);
110 fNegTrack->SetLineColor(kCyan+2); // in V0 = kCyan
111 fNegTrack->SetStdTitle();
112 fNegTrack->IncDenyDestroy();
113 AddElement(fNegTrack);
115 fPosTrack->SetLineColor(kRed+2); // in Eve V0 = kRed
116 fPosTrack->SetStdTitle();
117 fPosTrack->IncDenyDestroy();
118 AddElement(fPosTrack);
121 //______________________________________________________________________________
122 AliEveCascade::~AliEveCascade()
124 // Destructor. Dereferences bachelor track and pointing-line objects.
126 fBacTrack->DecDenyDestroy();
127 fNegTrack->DecDenyDestroy();
128 fPosTrack->DecDenyDestroy();
129 fPointingCurve->DecDenyDestroy();
130 fV0Path->DecDenyDestroy();
133 //______________________________________________________________________________
134 void AliEveCascade::MakeCascade()
136 // Set all dependant components for drawing.
138 SetPoint(0, fRecDecayV.fX, fRecDecayV.fY, fRecDecayV.fZ);
140 fBacTrack->MakeTrack();
141 fNegTrack->MakeTrack();
142 fPosTrack->MakeTrack();
144 fPointingCurve->SetPoint(0, fRecBirthV.fX, fRecBirthV.fY, fRecBirthV.fZ);
145 fPointingCurve->SetPoint(1, fRecDecayV.fX, fRecDecayV.fY, fRecDecayV.fZ);
147 fV0Path->SetPoint(0, fRecDecayV.fX, fRecDecayV.fY, fRecDecayV.fZ);
148 fV0Path->SetPoint(1, fRecDecayV0.fX, fRecDecayV0.fY, fRecDecayV0.fZ);
153 //______________________________________________________________________________
154 Double_t AliEveCascade::GetInvMass(Int_t cascadePdgCodeHyp) const
156 // Returns Invariant Mass assuming the masses of the daughter particles
157 TEveVector lBachMomentum = fBacTrack->GetMomentum();
158 // Does not work properly because momenta at the primary vertex for V0 daughters (same for AliEVEv0) + Bach
160 Double_t lBachMass = 0.0;
161 if(cascadePdgCodeHyp == kXiMinus || cascadePdgCodeHyp == -kXiMinus )
162 lBachMass = TDatabasePDG::Instance()->GetParticle("pi-")->Mass();
163 else if(cascadePdgCodeHyp == kOmegaMinus || cascadePdgCodeHyp == -kOmegaMinus )
164 lBachMass = TDatabasePDG::Instance()->GetParticle("K-")->Mass();
166 Double_t lLambdaMass = TDatabasePDG::Instance()->GetParticle("Lambda0")->Mass();
168 printf("\n Cascade : check the mass of the bachelor (%.5f) - the Lambda (%.5f)\n",lBachMass, lLambdaMass);
170 Double_t eBach = TMath::Sqrt(lBachMass*lBachMass + lBachMomentum.Mag2());
171 //Double_t eBach = TMath::Sqrt(lBachMass *lBachMass + fBachP.Mag2());
172 Double_t eLambda = TMath::Sqrt(lLambdaMass*lLambdaMass + fLambdaP.Mag2());
174 TVector3 lCascadeMom(fBachP + fLambdaP);
176 printf("Ptot(Lambda) : %f GeV/c \n", fLambdaP.Mag());
177 printf("Ptot(Bach) : %f GeV/c \n", lBachMomentum.Mag());
178 printf("Ptot(BachESD): %f GeV/c \n", fBachP.Mag());
179 printf("Ptot(Casc) : %f GeV/c \n", fRecDecayP.Mag());
180 printf("Ptot(CascESD): %f GeV/c \n", lCascadeMom.Mag());
182 //return TMath::Sqrt( (eBach+eLambda)*(eBach+eLambda) - fRecDecayP.Mag2() ); // numerically instable ...
183 //return TMath::Sqrt( ((eBach+eLambda) - lCascadeMom.Mag()) * ((eBach+eLambda) + lCascadeMom.Mag()) );
184 return TMath::Sqrt( ((eBach+eLambda) - fRecDecayP.Mag()) * ((eBach+eLambda) + fRecDecayP.Mag()) );
189 //------------------------------------------------------------------------
191 // AliEveCascadeList class
193 //------------------------------------------------------------------------
195 ClassImp(AliEveCascadeList)
197 //______________________________________________________________________________
198 AliEveCascadeList::AliEveCascadeList() :
202 fRnrDaughters(kTRUE),
203 fRnrCascadevtx(kTRUE),
204 fRnrCascadepath(kTRUE),
212 fInvMassHyp(kXiMinus),
213 fMinInvariantMass(1.0),
214 fMaxInvariantMass(6.0)
216 // Default constructor.
218 fChildClass = AliEveCascade::Class(); // override member from base TEveElementList
221 //______________________________________________________________________________
222 AliEveCascadeList::AliEveCascadeList(TEveTrackPropagator* rs) :
226 fRnrDaughters(kTRUE),
227 fRnrCascadevtx(kTRUE),
228 fRnrCascadepath(kTRUE),
236 fInvMassHyp(kXiMinus),
237 fMinInvariantMass(1.0),
238 fMaxInvariantMass(6.0)
240 // Constructor with given track-propagator..
242 fChildClass = AliEveCascade::Class(); // override member from base TEveElementList
247 //______________________________________________________________________________
248 AliEveCascadeList::AliEveCascadeList(const Text_t* name, TEveTrackPropagator* rs) :
252 fRnrDaughters(kTRUE),
253 fRnrCascadevtx(kTRUE),
254 fRnrCascadepath(kTRUE),
262 fInvMassHyp(kXiMinus),
263 fMinInvariantMass(1.0),
264 fMaxInvariantMass(6.0)
266 // Standard constructor.
268 fChildClass = AliEveCascade::Class(); // override member from base TEveElementList
274 //______________________________________________________________________________
275 void AliEveCascadeList::Init()
277 // Initialize members needed for drawing operations.
279 if (fRnrStyle== 0) fRnrStyle = new TEveTrackPropagator;
282 /******************************************************************************/
284 //______________________________________________________________________________
285 void AliEveCascadeList::MakeCascades()
287 // Call MakeCascade() for all elements.
289 for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
290 ((AliEveCascade*)(*i))->MakeCascade();
295 /******************************************************************************/
297 //______________________________________________________________________________
298 void AliEveCascadeList::FilterByRadius(Float_t minR, Float_t maxR)
300 // Select visibility of elements based on their axial radius.
305 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
307 AliEveCascade* cascade = (AliEveCascade*) *i;
308 Float_t rad = cascade->GetRadius();
309 Bool_t show = rad >= fMinRCut && rad <= fMaxRCut;
310 cascade->SetRnrState(show);
316 /******************************************************************************/
318 //______________________________________________________________________________
319 void AliEveCascadeList::FilterByDaughterDCA(Float_t minDaughterDCA, Float_t maxDaughterDCA)
321 // Select visibility of elements based on the DCA between daughters.
323 fMinDaughterDCA = minDaughterDCA;
324 fMaxDaughterDCA = maxDaughterDCA;
326 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
328 AliEveCascade* cascade = (AliEveCascade*) *i;
329 Float_t dca = cascade->GetDaughterDCA();
330 Bool_t show = dca >= fMinDaughterDCA && dca <= fMaxDaughterDCA;
331 cascade->SetRnrState(show);
337 /******************************************************************************/
339 //______________________________________________________________________________
340 void AliEveCascadeList::FilterByPt(Float_t minPt, Float_t maxPt)
342 // Select visibility of elements based on the Cascade pt.
347 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
349 AliEveCascade* cascade = (AliEveCascade*) *i;
350 Float_t pt = cascade->GetPt();
351 Bool_t show = pt >= fMinPt && pt <= fMaxPt;
352 cascade->SetRnrState(show);
358 /******************************************************************************/
360 //______________________________________________________________________________
361 void AliEveCascadeList::FilterByInvariantMass(Float_t minInvariantMass, Float_t maxInvariantMass, Int_t cascadePdgCodeHyp)
363 // Select visibility of elements based on the Cascade invariant mass.
365 fMinInvariantMass = minInvariantMass;
366 fMaxInvariantMass = maxInvariantMass;
368 for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
370 AliEveCascade* cascade = (AliEveCascade*) *i;
371 Float_t invMass = (Float_t)cascade->GetInvMass(cascadePdgCodeHyp);
372 Bool_t show = invMass >= fMinInvariantMass && invMass <= fMaxInvariantMass;
373 cascade->SetRnrState(show);