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 **************************************************************************/
9 #ifndef ALIEVE_Cascade_H
10 #define ALIEVE_Cascade_H
12 /***********************************************************************
13 * This code defines the reconstructed cascades visualized with EVE
15 * Ludovic Gaudichet (gaudichet@to.infn.it)
16 ************************************************************************/
18 #include <TEveVSDStructs.h>
19 #include <TEveElement.h>
20 #include <TEveTrack.h>
22 #include <TPolyMarker3D.h>
23 #include <TPolyLine3D.h>
31 class AliEveCascade : public TEveElement,
35 typedef std::vector<TEvePathMark*> vpPathMark_t;
38 friend class CascadeList;
40 AliEveCascade(const AliEveCascade&); // Not implemented
41 AliEveCascade& operator=(const AliEveCascade&); // Not implemented
44 typedef std::vector<TEvePathMark*>::iterator vpPathMark_i;
46 TEveVector fV_neg; // Vertex of negative track
47 TEveVector fP_neg; // Momentum of negative track
48 TEveVector fV_pos; // Vertex of positive track
49 TEveVector fP_pos; // Momentum of positive track
50 TEveVector fV_bach; // Vertex of positive track
51 TEveVector fP_bach; // Momentum of positive track
53 TEveVector fV_decay; //decay point of the cascade
54 TEveVector fV_birth; // Reconstructed birth point of neutral particle
56 vpPathMark_t fPathMarksNeg;
57 vpPathMark_t fPathMarksPos;
58 vpPathMark_t fPathMarksBach;
59 TEveTrackPropagator *fRnrStyle;
61 TPolyLine3D fPolyLineNeg;
62 TPolyLine3D fPolyLinePos;
63 TPolyLine3D fPolyLineBach;
64 TPolyLine3D fPolyLineV0; // line of AliEveV0 travel
65 TPolyLine3D fPolyLineCas; // line of cascade travel
74 Float_t fCasCosPointingAngle;
75 Float_t fCasDecayLength;
77 static const Float_t fgkMassPion2;
78 static const Float_t fgkMassKaon2;
79 static const Float_t fgkMassProton2;
80 static const Float_t fgkMassLambda2;
84 AliEveCascade(TEveTrackPropagator* rs);
85 virtual ~AliEveCascade();
87 virtual void SetESDIndex(Int_t ind) { fESDIndex = ind;}
88 virtual void SetMainColor(Color_t col)
90 fMarkerColor = col; fMainColorPtr = &fMarkerColor;
91 fPolyLineV0.SetLineColor(fMarkerColor);
93 virtual void SetTracksColor(Color_t cNeg, Color_t cPos, Color_t cBach)
95 fPolyLineNeg.SetLineColor(cNeg); fPolyLinePos.SetLineColor(cPos);
96 fPolyLineBach.SetLineColor(cBach);
98 void SetRnrStyle(TEveTrackPropagator* rs) { fRnrStyle = rs; }
100 void AddPathMarkPos(TEvePathMark* pm) { fPathMarksPos.push_back(pm); }
101 void AddPathMarkNeg(TEvePathMark* pm) { fPathMarksNeg.push_back(pm); }
102 void AddPathMarkBach(TEvePathMark* pm) { fPathMarksBach.push_back(pm); }
104 virtual void PaintV0Daughters(Option_t* option="") {
105 if(fRnrSelf) {fPolyLineNeg.Paint(option);fPolyLinePos.Paint(option); } }
106 virtual void PaintBachelor(Option_t* option="") {
107 if(fRnrSelf) fPolyLineBach.Paint(option); }
108 virtual void Paint(Option_t* option="") {
109 if(fRnrSelf) TPolyMarker3D::Paint(option);}
110 virtual void PaintV0Path(Option_t* option="") {
111 if(fRnrSelf) fPolyLineV0.Paint(option);}
112 virtual void PaintCasPath(Option_t* option="") {
113 if(fRnrSelf) fPolyLineCas.Paint(option);}
115 void Reset(TPolyLine3D* polyLine);
116 void MakeTrack(vpPathMark_t& pathMark, TEveVector& vtx, TEveVector& p,
117 Int_t charge, Float_t beta, TPolyLine3D& polyLine);
122 void SetBeta(Float_t betaNeg, Float_t betaPos, Float_t betaBach);
123 void SetDCA_v0_Bach(Float_t dca) {fDCA_v0_Bach = dca;}
124 void SetCasCosPointingAngle(Float_t cos) {fCasCosPointingAngle = cos;}
125 void SetNegP(Float_t px, Float_t py, Float_t pz) {fP_neg.x = px; fP_neg.y = py; fP_neg.z = pz;}
126 void SetPosP(Float_t px, Float_t py, Float_t pz) {fP_pos.x = px; fP_pos.y = py; fP_pos.z = pz;}
127 void SetBachP(Float_t px, Float_t py, Float_t pz) {fP_bach.x = px; fP_bach.y = py; fP_bach.z = pz;}
129 void SetV0vtx(Float_t vx, Float_t vy, Float_t vz) {
130 fV_neg.x = vx; fV_neg.y = vy; fV_neg.z = vz;
131 fV_pos.x = vx; fV_pos.y = vy; fV_pos.z = vz;
133 void SetCascadeVtx(Float_t vx, Float_t vy, Float_t vz) {
134 fV_decay.x = vx; fV_decay.y = vy; fV_decay.z = vz; }
136 void SetDecayLength(Float_t primx, Float_t primy, Float_t primz);
138 Int_t GetESDIndex() const { return fESDIndex; }
139 virtual const Text_t* GetName() const { return Form("ESDcascade_%i",fESDIndex); }
140 virtual const Text_t* GetTitle() const { return Form("ESDcascade_%i",fESDIndex); }
142 Float_t GetDCA_v0_Bach() const;
143 Float_t GetCasCosPointingAngle() const;
144 Float_t GetRadius() const;
145 Float_t GetPseudoRapidity() const;
146 Float_t GetPt2() const;
147 Float_t GetPt() const;
148 Float_t GetP2() const;
149 Float_t GetMomentum() const;
150 Float_t GetPx() const;
151 Float_t GetPy() const;
152 Float_t GetPz() const;
153 Float_t GetCasAlphaArmenteros() const;
154 Float_t GetCasPtArmenteros() const;
155 Float_t GetPosP2() const;
156 Float_t GetPosP() const;
157 Float_t GetPosPt() const;
158 Float_t GetPosPseudoRapidity() const;
159 Float_t GetNegP2() const;
160 Float_t GetNegP() const;
161 Float_t GetNegPt() const;
162 Float_t GetNegPseudoRapidity() const;
163 Float_t GetBachP2() const;
164 Float_t GetBachP() const;
165 Float_t GetBachPt() const;
166 Float_t GetBachPseudoRapidity() const;
168 Float_t GetV0P2() const;
169 Float_t GetLambdaE() const;
170 Float_t GetXiE() const;
171 Float_t GetOmegaE() const;
172 Float_t GetXiMass() const;
173 Float_t GetAntiXiMass() const;
174 Float_t GetOmegaMass() const;
175 Float_t GetAntiOmegaMass() const;
177 ClassDef(AliEveCascade, 1); // Visual representation of a cascade.
178 }; // endclass AliEveCascade
182 //______________________________________________________________________________
184 inline void AliEveCascade::SetBeta(Float_t betaNeg, Float_t betaPos, Float_t betaBach) {
187 fBeta_bach = betaBach;
191 //______________________________________________________________________________
193 inline Float_t AliEveCascade::GetV0P2() const {
194 Float_t px = fP_neg.x + fP_pos.x, py = fP_neg.y + fP_pos.y,
195 pz = fP_neg.z+fP_pos.z;
196 return px*px + py*py + pz*pz;
200 inline Float_t AliEveCascade::GetLambdaE() const {
201 return sqrt(fgkMassLambda2+GetV0P2());
204 inline Float_t AliEveCascade::GetXiE() const {
205 Float_t e = GetLambdaE() +
206 sqrt(fgkMassPion2 + fP_bach.x*fP_bach.x + fP_bach.y*fP_bach.y +
207 fP_bach.z*fP_bach.z);
211 inline Float_t AliEveCascade::GetOmegaE() const {
212 Float_t e = GetLambdaE() +
213 sqrt(fgkMassKaon2 + fP_bach.x*fP_bach.x + fP_bach.y*fP_bach.y +
214 fP_bach.z*fP_bach.z);
218 inline Float_t AliEveCascade::GetXiMass() const {
219 Float_t e = GetXiE();
220 return sqrt(e*e - GetP2());
223 inline Float_t AliEveCascade::GetAntiXiMass() const { return GetXiMass();}
225 inline Float_t AliEveCascade::GetOmegaMass() const {
226 Float_t e = GetOmegaE();
227 return sqrt(e*e - GetP2());
230 inline Float_t AliEveCascade::GetAntiOmegaMass() const { return GetOmegaMass();}
233 //______________________________________________________________________________
235 inline Float_t AliEveCascade::GetDCA_v0_Bach() const {
239 inline Float_t AliEveCascade::GetCasCosPointingAngle() const {
240 return fCasCosPointingAngle;
243 inline Float_t AliEveCascade::GetRadius() const {
244 return sqrt(fV_birth.x*fV_birth.x + fV_birth.y*fV_birth.y);
247 //inline Float_t AliEveCascade::GetDecayLength() const {
248 //return fDecayLength;
251 inline Float_t AliEveCascade::GetPseudoRapidity() const {
252 Float_t theta = acos( GetPz()/GetMomentum() );
253 return ( -log(tan(theta/2.)) );
257 //______________________________________________________________________________
258 inline Float_t AliEveCascade::GetPt2() const {
259 Float_t px = GetPx(), py = GetPy();
260 return (px*px+py*py);
263 inline Float_t AliEveCascade::GetP2() const {
265 Float_t px = GetPx(), py = GetPy(), pz = GetPz();
266 return (px*px+py*py+pz*pz);
269 inline Float_t AliEveCascade::GetPt() const {
270 return sqrt(GetPt2());
273 inline Float_t AliEveCascade::GetMomentum() const {
274 return sqrt(GetP2());
277 inline Float_t AliEveCascade::GetPx() const {
278 return (fP_neg.x + fP_pos.x + fP_bach.x);
281 inline Float_t AliEveCascade::GetPy() const {
282 return (fP_neg.y + fP_pos.y + fP_bach.y);
285 inline Float_t AliEveCascade::GetPz() const {
286 return (fP_neg.z + fP_pos.z + fP_bach.z);
289 //______________________________________________________________________________
291 inline Float_t AliEveCascade::GetPosP2() const {
292 return (fP_pos.x*fP_pos.x + fP_pos.y*fP_pos.y + fP_pos.z*fP_pos.z);
295 inline Float_t AliEveCascade::GetPosP() const {
296 return sqrt(GetPosP2());
299 inline Float_t AliEveCascade::GetPosPt() const {
300 return sqrt(fP_pos.x*fP_pos.x + fP_pos.y*fP_pos.y);
303 inline Float_t AliEveCascade::GetPosPseudoRapidity() const {
304 Float_t theta = acos( fP_pos.z/GetPosP() );
305 return ( -log(tan(theta/2.)) );
308 //______________________________________________________________________________
309 inline Float_t AliEveCascade::GetNegP2() const {
310 return (fP_neg.x*fP_neg.x + fP_neg.y*fP_neg.y + fP_neg.z*fP_neg.z);
313 inline Float_t AliEveCascade::GetNegP() const {
314 return sqrt(GetNegP2());
317 inline Float_t AliEveCascade::GetNegPt() const {
318 return sqrt(fP_neg.x*fP_neg.x + fP_neg.y*fP_neg.y);
321 inline Float_t AliEveCascade::GetNegPseudoRapidity() const {
322 Float_t theta = acos( fP_neg.z/GetNegP() );
323 return ( -log(tan(theta/2.)) );
327 //______________________________________________________________________________
328 inline Float_t AliEveCascade::GetBachP2() const {
329 return (fP_bach.x*fP_bach.x + fP_bach.y*fP_bach.y + fP_bach.z*fP_bach.z);
332 inline Float_t AliEveCascade::GetBachP() const {
333 return sqrt(GetBachP2());
336 inline Float_t AliEveCascade::GetBachPt() const {
337 return sqrt(fP_bach.x*fP_bach.x + fP_bach.y*fP_bach.y);
340 inline Float_t AliEveCascade::GetBachPseudoRapidity() const {
341 Float_t theta = acos( fP_bach.z/GetBachP() );
342 return ( -log(tan(theta/2.)) );
346 /***********************************************************************
350 ************************************************************************/
352 class CascadeList : public TEveElementList
354 CascadeList(const CascadeList&); // Not implemented
355 CascadeList& operator=(const CascadeList&); // Not implemented
363 TEveTrackPropagator *fRnrStyle;
366 Bool_t fRnrV0Daughters;
376 static const Int_t fgkNcutVar = 14;
377 TH1F *fHist[fgkNcutVar];
378 Float_t fMin[fgkNcutVar];
379 Float_t fMax[fgkNcutVar];
381 static const Int_t fgkNcutVar2D = 1;
382 TH2F *fHist2D[fgkNcutVar2D];
383 Float_t fMinX[fgkNcutVar2D];
384 Float_t fMinY[fgkNcutVar2D];
385 Float_t fMaxX[fgkNcutVar2D];
386 Float_t fMaxY[fgkNcutVar2D];
389 CascadeList(TEveTrackPropagator* rs=0);
390 CascadeList(const Text_t* name, TEveTrackPropagator* rs=0);
392 virtual const Text_t* GetTitle() const { return fTitle; }
393 virtual void SetTitle(const Text_t* t) { fTitle = t; }
394 virtual void SetTracksColor(Color_t cNeg, Color_t cPos, Color_t cBach)
395 { fNegColor = cNeg; fPosColor = cPos; fBachColor = cBach; }
397 virtual Bool_t CanEditMainColor() { return kTRUE; }
399 virtual void Paint(Option_t* option="");
401 void SetRnrStyle(TEveTrackPropagator* rst) { fRnrStyle= rst; }
402 TEveTrackPropagator* GetPropagator() { return fRnrStyle; }
404 Bool_t GetRnrCasVtx() const { return fRnrCasVtx; }
405 Bool_t GetRnrCasPath() const { return fRnrCasPath; }
406 Bool_t GetRnrV0vtx() const { return fRnrV0vtx; }
407 Bool_t GetRnrV0path() const { return fRnrV0path; }
408 Bool_t GetRnrV0Daughters() const { return fRnrV0Daughters; }
409 Bool_t GetRnrBachelor() const { return fRnrBach; }
411 void SetRnrV0vtx(Bool_t);
412 void SetRnrV0path(Bool_t);
413 void SetRnrV0Daughters(Bool_t);
414 void SetRnrBachelor(Bool_t);
415 void SetRnrCasPath(Bool_t);
416 void SetRnrCasVtx(Bool_t);
417 void SetMin(Int_t i, Float_t val) {
418 if ((i>=0)&&(i<fgkNcutVar)) fMin[i]=val;}
419 void SetMax(Int_t i, Float_t val) {
420 if ((i>=0)&&(i<fgkNcutVar)) fMax[i]=val;}
424 TH1F* GetHist(Int_t i) {
425 if ((i>=0)&&(i<fgkNcutVar)) return fHist[i]; else return 0;}
426 TH2F* GetHist2D(Int_t i) {
427 if ((i>=0)&&(i<fgkNcutVar2D)) return fHist2D[i]; else return 0;}
428 Float_t GetMin(Int_t i) {
429 if ((i>=0)&&(i<fgkNcutVar)) return fMin[i]; else return 0;}
430 Float_t GetMax(Int_t i) {
431 if ((i>=0)&&(i<fgkNcutVar)) return fMax[i]; else return 0;}
432 void GetCasIndexRange(Int_t &imin, Int_t &imax);
434 void AdjustHist(Int_t iHist);
435 void UnFill(AliEveCascade* cas);
436 void Filter(AliEveCascade* cas);
439 void XiMassFilter(Float_t min, Float_t max);
440 void OmegaMassFilter(Float_t min, Float_t max);
441 void IndexFilter(Float_t min, Float_t max);
442 void CosPointingFilter(Float_t min, Float_t max);
443 void BachV0DCAFilter(Float_t min, Float_t max);
444 void RadiusFilter(Float_t min, Float_t max);
445 void PtFilter(Float_t min, Float_t max);
446 void PseudoRapFilter(Float_t min, Float_t max);
447 void NegPtFilter(Float_t min, Float_t max);
448 void NegEtaFilter(Float_t min, Float_t max);
449 void PosPtFilter(Float_t min, Float_t max);
450 void PosEtaFilter(Float_t min, Float_t max);
451 void BachPtFilter(Float_t min, Float_t max);
452 void BachEtaFilter(Float_t min, Float_t max);
454 //--------------------------------
456 ClassDef(CascadeList, 1); // A list of AliEveCascade objects.