4 #include "MCHelixLine.hi"
6 #include <TPolyLine3D.h>
7 #include <TPolyMarker3D.h>
11 #include <Reve/RGTopFrame.h>
18 //______________________________________________________________________
37 Track::Track(TParticle* t, Int_t label, TrackRnrStyle* rs):
40 fV(t->Vx(), t->Vy(), t->Vz()),
41 fP(t->Px(), t->Py(), t->Pz()),
42 fBeta(t->P()/t->Energy()),
49 fLineColor = fRnrStyle->GetColor();
50 fMainColorPtr = &fLineColor;
52 TParticlePDG* pdgp = t->GetPDG();
54 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
56 SetName(t->GetName());
59 Track::Track(Reve::MCTrack* t, TrackRnrStyle* rs):
62 fV(t->Vx(), t->Vy(), t->Vz()),
63 fP(t->Px(), t->Py(), t->Pz()),
64 fBeta(t->P()/t->Energy()),
71 fLineColor = fRnrStyle->GetColor();
72 fMainColorPtr = &fLineColor;
74 TParticlePDG* pdgp = t->GetPDG();
76 t->ResetPdgCode(); pdgp = t->GetPDG();
78 fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3);
80 SetName(t->GetName());
83 Track::Track(Reve::RecTrack* t, TrackRnrStyle* rs) :
95 fLineColor = fRnrStyle->GetColor();
96 fMainColorPtr = &fLineColor;
98 SetName(t->GetName());
103 for (vpPathMark_i i=fPathMarks.begin(); i!=fPathMarks.end(); ++i)
108 void Track::Reset(Int_t n_points)
110 delete [] TPolyLine3D::fP; TPolyLine3D::fP = 0;
112 if(fN) TPolyLine3D::fP = new Float_t [3*fN];
113 memset(TPolyLine3D::fP, 0, 3*fN*sizeof(Float_t));
118 /**************************************************************************/
120 void Track::MakeTrack()
123 TrackRnrStyle& RS((fRnrStyle != 0) ? *fRnrStyle : TrackRnrStyle::fgDefStyle);
125 Float_t px = fP.x, py = fP.y, pz = fP.z;
133 std::vector<MCVertex> track_points;
134 Bool_t decay = kFALSE;
136 if ((TMath::Abs(fV.z) > RS.fMaxZ) || (fV.x*fV.x + fV.y*fV.y > RS.fMaxR*RS.fMaxR))
139 if (fCharge != 0 && TMath::Abs(RS.fMagField) > 1e-5) {
141 // Charged particle in magnetic field
143 Float_t a = RS.fgkB2C * RS.fMagField * fCharge;
145 MCHelix helix(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points, a); //m->cm
146 helix.Init(TMath::Sqrt(px*px+py*py), pz);
148 if(!fPathMarks.empty()){
149 for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
150 Reve::PathMark* pm = *i;
152 if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){
153 if(TMath::Abs(pm->V.z) > RS.fMaxZ
154 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
157 //printf("%s fit daughter \n", fName.Data());
158 helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
163 if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){
165 if(TMath::Abs(pm->V.z) > RS.fMaxZ
166 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
168 helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z);
176 if(!decay || RS.fFitDecay == kFALSE){
177 helix.LoopToBounds(px,py,pz);
178 // printf("%s loop to bounds \n",fName.Data() );
183 // Neutral particle or no field
185 MCLine line(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points);
187 if(!fPathMarks.empty()){
188 for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) {
189 Reve::PathMark* pm = *i;
191 if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){
192 if(TMath::Abs(pm->V.z) > RS.fMaxZ
193 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
195 line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
201 if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){
202 if(TMath::Abs(pm->V.z) > RS.fMaxZ
203 || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR )
205 line.GotoVertex(pm->V.x, pm->V.y, pm->V.z);
213 if(!decay || RS.fFitDecay == kFALSE)
214 line.GotoBounds(px,py,pz);
218 Reset(track_points.size());
219 for(std::vector<MCVertex>::iterator i=track_points.begin(); i!=track_points.end(); ++i)
220 SetNextPoint(i->x, i->y, i->z);
223 /**************************************************************************/
225 void Track::ImportHits()
227 Reve::LoadMacro("hits_from_label.C");
228 gROOT->ProcessLine(Form("hits_from_label(%d);", fLabel));
231 void Track::ImportClusters()
233 Reve::LoadMacro("clusters_from_label.C");
234 gROOT->ProcessLine(Form("clusters_from_label(%d);", fLabel));
238 /**************************************************************************/
239 /**************************************************************************/
241 //______________________________________________________________________
245 ClassImp(Reve::TrackRnrStyle)
247 Float_t TrackRnrStyle::fgDefMagField = 5;
248 const Float_t TrackRnrStyle::fgkB2C = 0.299792458e-3;
249 TrackRnrStyle TrackRnrStyle::fgDefStyle;
251 TrackRnrStyle::TrackRnrStyle() :
256 fMagField(fgDefMagField),
265 fFitDaughters(kTRUE),
269 /**************************************************************************/
270 /**************************************************************************/
272 //______________________________________________________________________
276 ClassImp(Reve::TrackList)
278 void TrackList::Init()
282 // fMarker->SetMarkerSize(0.05);
284 if (fRnrStyle== 0) fRnrStyle = new TrackRnrStyle;
285 SetMainColorPtr(&fRnrStyle->fColor);
288 TrackList::TrackList(Int_t n_tracks, TrackRnrStyle* rs) :
289 RenderElementListBase(),
290 TPolyMarker3D(n_tracks),
301 TrackList::TrackList(const Text_t* name, Int_t n_tracks, TrackRnrStyle* rs) :
302 RenderElementListBase(),
303 TPolyMarker3D(n_tracks),
315 void TrackList::Reset(Int_t n_tracks)
317 delete [] fP; fP = 0;
319 if(fN) fP = new Float_t [3*fN];
320 memset(fP, 0, 3*fN*sizeof(Float_t));
324 /**************************************************************************/
326 void TrackList::Paint(Option_t* option)
330 TPolyMarker3D::Paint(option);
333 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
334 if((*i)->GetRnrElement())
335 (*i)->GetObject()->Paint(option);
341 /**************************************************************************/
343 void TrackList::AddElement(RenderElement* el)
345 static const Exc_t eH("TrackList::AddElement ");
346 if (dynamic_cast<Track*>(el) == 0)
347 throw(eH + "new element not a Track.");
348 RenderElementListBase::AddElement(el);
351 /**************************************************************************/
353 void TrackList::SetRnrMarkers(Bool_t rnr)
359 void TrackList::SetRnrTracks(Bool_t rnr)
366 /**************************************************************************/
368 void TrackList::MakeTracks()
370 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
371 ((Track*)(*i))->MakeTrack();
377 void TrackList::MakeMarkers()
379 Reset(fChildren.size());
380 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
381 Track& t = *((Track*)(*i));
383 SetNextPoint(t.fV.x, t.fV.y, t.fV.z);
388 /**************************************************************************/
389 /*************************************************************************/
391 void TrackList::SetWidth(Width_t w)
393 Width_t oldw = fRnrStyle->fWidth;
394 fRnrStyle->fWidth = w;
395 for (lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
396 Track& t = *((Track*)(*i));
397 if (t.GetLineWidth() == oldw)
402 void TrackList::SetMaxR(Float_t x)
404 fRnrStyle->fMaxR = x;
409 void TrackList::SetMaxZ(Float_t x)
411 fRnrStyle->fMaxZ = x;
416 void TrackList::SetMaxOrbs(Float_t x)
418 fRnrStyle->fMaxOrbs = x;
422 void TrackList::SetMinAng(Float_t x)
424 fRnrStyle->fMinAng = x;
428 void TrackList::SetDelta(Float_t x)
430 fRnrStyle->fDelta = x;
434 void TrackList::SetFitDaughters(Bool_t x)
436 fRnrStyle->fFitDaughters = x;
440 void TrackList::SetFitDecay(Bool_t x)
442 fRnrStyle->fFitDecay = x;
446 /**************************************************************************/
447 /**************************************************************************/
449 void TrackList::SelectByPt(Float_t min_pt, Float_t max_pt)
451 Float_t minptsq = min_pt*min_pt;
452 Float_t maxptsq = max_pt*max_pt;
455 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
456 ptsq = ((Track*)(*i))->fP.Perp2();
457 (*i)->SetRnrElement(ptsq >= minptsq && ptsq <= maxptsq);
461 /**************************************************************************/
463 void TrackList::ImportHits()
465 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
466 ((Track*)(*i))->ImportHits();
470 void TrackList::ImportClusters()
472 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
473 ((Track*)(*i))->ImportClusters();