]>
Commit | Line | Data |
---|---|---|
5a5a1232 | 1 | // $Header$ |
2 | ||
3 | #include "Track.h" | |
4 | #include "MCHelixLine.hi" | |
5 | ||
6 | #include <TPolyLine3D.h> | |
7 | #include <TPolyMarker3D.h> | |
8 | #include <TColor.h> | |
9 | ||
10 | // Updates | |
11 | #include <Reve/RGTopFrame.h> | |
12 | #include <TCanvas.h> | |
13 | ||
14 | #include <vector> | |
15 | ||
16 | using namespace Reve; | |
17 | ||
18 | //______________________________________________________________________ | |
19 | // Track | |
20 | // | |
21 | ||
22 | ClassImp(Reve::Track) | |
23 | ||
265ecb21 | 24 | Track::Track() : |
25 | RenderElement(), | |
26 | TPolyLine3D(), | |
5a5a1232 | 27 | |
265ecb21 | 28 | fV(), |
29 | fP(), | |
30 | fBeta(0), | |
31 | fCharge(0), | |
32 | fLabel(0), | |
33 | fPathMarks(), | |
34 | ||
35 | fRnrStyle(0), | |
36 | ||
37 | fName(), | |
38 | fTitle() | |
39 | {} | |
40 | ||
41 | Track::Track(Reve::MCTrack* t, TrackRnrStyle* rs): | |
42 | RenderElement(), | |
43 | TPolyLine3D(), | |
5a5a1232 | 44 | |
265ecb21 | 45 | fV(t->Vx(), t->Vy(), t->Vz()), |
46 | fP(t->Px(), t->Py(), t->Pz()), | |
47 | fBeta(t->P()/t->Energy()), | |
48 | fCharge(0), | |
49 | fLabel(t->label), | |
50 | fPathMarks(), | |
51 | ||
52 | fRnrStyle(rs), | |
53 | ||
54 | fName(t->GetName()), | |
55 | fTitle() | |
56 | { | |
5a5a1232 | 57 | fLineColor = fRnrStyle->GetColor(); |
58 | fMainColorPtr = &fLineColor; | |
59 | ||
5a5a1232 | 60 | TParticlePDG* pdgp = t->GetPDG(); |
61 | if(pdgp == 0) { | |
62 | t->ResetPdgCode(); pdgp = t->GetPDG(); | |
63 | } | |
48dc973d | 64 | fCharge = (Int_t) TMath::Nint(pdgp->Charge()/3); |
5a5a1232 | 65 | } |
66 | ||
265ecb21 | 67 | Track::Track(Reve::RecTrack* t, TrackRnrStyle* rs) : |
68 | RenderElement(), | |
69 | TPolyLine3D(), | |
70 | ||
71 | fV(t->V), | |
72 | fP(t->P), | |
73 | fBeta(t->beta), | |
74 | fCharge(t->sign), | |
75 | fLabel(t->label), | |
76 | fPathMarks(), | |
77 | ||
78 | fRnrStyle(rs), | |
79 | ||
80 | fName(t->GetName()), | |
81 | fTitle() | |
5a5a1232 | 82 | { |
5a5a1232 | 83 | fLineColor = fRnrStyle->GetColor(); |
84 | fMainColorPtr = &fLineColor; | |
5a5a1232 | 85 | } |
86 | ||
87 | Track::~Track() | |
265ecb21 | 88 | { |
89 | for (vpPathMark_i i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) | |
90 | delete *i; | |
91 | } | |
5a5a1232 | 92 | |
93 | void Track::Reset(Int_t n_points) | |
94 | { | |
95 | delete [] TPolyLine3D::fP; TPolyLine3D::fP = 0; | |
96 | fN = n_points; | |
97 | if(fN) TPolyLine3D::fP = new Float_t [3*fN]; | |
98 | memset(TPolyLine3D::fP, 0, 3*fN*sizeof(Float_t)); | |
99 | fLastPoint = -1; | |
100 | } | |
101 | ||
102 | /**************************************************************************/ | |
103 | ||
104 | void Track::MakeTrack() | |
105 | { | |
106 | ||
107 | TrackRnrStyle& RS((fRnrStyle != 0) ? *fRnrStyle : TrackRnrStyle::fgDefStyle); | |
108 | ||
109 | Float_t px = fP.x, py = fP.y, pz = fP.z; | |
110 | ||
111 | MCVertex mc_v0; | |
112 | mc_v0.x = fV.x; | |
113 | mc_v0.y = fV.y; | |
114 | mc_v0.z = fV.z; | |
115 | mc_v0.t = 0; | |
116 | ||
117 | std::vector<MCVertex> track_points; | |
48dc973d | 118 | Bool_t decay = kFALSE; |
5a5a1232 | 119 | |
120 | if ((TMath::Abs(fV.z) > RS.fMaxZ) || (fV.x*fV.x + fV.y*fV.y > RS.fMaxR*RS.fMaxR)) | |
121 | goto make_polyline; | |
122 | ||
01024c63 | 123 | if (fCharge != 0 && TMath::Abs(RS.fMagField) > 1e-5) { |
124 | ||
125 | // Charged particle in magnetic field | |
5a5a1232 | 126 | |
48dc973d | 127 | Float_t a = RS.fgkB2C * RS.fMagField * fCharge; |
5a5a1232 | 128 | |
129 | MCHelix helix(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points, a); //m->cm | |
130 | helix.Init(TMath::Sqrt(px*px+py*py), pz); | |
131 | ||
132 | if(!fPathMarks.empty()){ | |
133 | for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) { | |
134 | Reve::PathMark* pm = *i; | |
135 | ||
136 | if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){ | |
137 | if(TMath::Abs(pm->V.z) > RS.fMaxZ | |
138 | || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR ) | |
139 | goto helix_bounds; | |
140 | ||
141 | //printf("%s fit daughter \n", fName.Data()); | |
142 | helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z); | |
143 | fP.x -= pm->P.x; | |
144 | fP.y -= pm->P.y; | |
145 | fP.z -= pm->P.z; | |
146 | } | |
147 | if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){ | |
148 | ||
149 | if(TMath::Abs(pm->V.z) > RS.fMaxZ | |
150 | || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR ) | |
151 | goto helix_bounds; | |
152 | helix.LoopToVertex(fP.x, fP.y, fP.z, pm->V.x, pm->V.y, pm->V.z); | |
153 | decay = true; | |
154 | break; | |
155 | } | |
156 | } | |
157 | } | |
158 | helix_bounds: | |
159 | //go to bounds | |
48dc973d | 160 | if(!decay || RS.fFitDecay == kFALSE){ |
5a5a1232 | 161 | helix.LoopToBounds(px,py,pz); |
162 | // printf("%s loop to bounds \n",fName.Data() ); | |
163 | } | |
164 | ||
01024c63 | 165 | } else { |
166 | ||
167 | // Neutral particle or no field | |
5a5a1232 | 168 | |
169 | MCLine line(fRnrStyle, &mc_v0, TMath::C()*fBeta, &track_points); | |
170 | ||
171 | if(!fPathMarks.empty()){ | |
172 | for(std::vector<Reve::PathMark*>::iterator i=fPathMarks.begin(); i!=fPathMarks.end(); ++i) { | |
173 | Reve::PathMark* pm = *i; | |
174 | ||
175 | if(RS.fFitDaughters && pm->type == Reve::PathMark::Daughter){ | |
176 | if(TMath::Abs(pm->V.z) > RS.fMaxZ | |
177 | || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR ) | |
178 | goto line_bounds; | |
179 | line.GotoVertex(pm->V.x, pm->V.y, pm->V.z); | |
180 | fP.x -= pm->P.x; | |
181 | fP.y -= pm->P.y; | |
182 | fP.z -= pm->P.z; | |
183 | } | |
184 | ||
185 | if(RS.fFitDecay && pm->type == Reve::PathMark::Decay){ | |
186 | if(TMath::Abs(pm->V.z) > RS.fMaxZ | |
187 | || TMath::Sqrt(pm->V.x*pm->V.x + pm->V.y*pm->V.y) > RS.fMaxR ) | |
188 | goto line_bounds; | |
189 | line.GotoVertex(pm->V.x, pm->V.y, pm->V.z); | |
190 | decay = true; | |
191 | break; | |
192 | } | |
193 | } | |
194 | } | |
195 | ||
196 | line_bounds: | |
48dc973d | 197 | if(!decay || RS.fFitDecay == kFALSE) |
5a5a1232 | 198 | line.GotoBounds(px,py,pz); |
199 | ||
200 | } | |
201 | make_polyline: | |
202 | Reset(track_points.size()); | |
203 | for(std::vector<MCVertex>::iterator i=track_points.begin(); i!=track_points.end(); ++i) | |
204 | SetNextPoint(i->x, i->y, i->z); | |
205 | } | |
206 | ||
207 | /**************************************************************************/ | |
208 | ||
48dc973d | 209 | void Track::ImportHits() |
210 | { | |
211 | Reve::LoadMacro("hits_from_label.C"); | |
212 | gROOT->ProcessLine(Form("hits_from_label(%d);", fLabel)); | |
213 | } | |
214 | ||
215 | void Track::ImportClusters() | |
216 | { | |
217 | Reve::LoadMacro("clusters_from_label.C"); | |
218 | gROOT->ProcessLine(Form("clusters_from_label(%d);", fLabel)); | |
219 | } | |
220 | ||
221 | ||
222 | /**************************************************************************/ | |
223 | /**************************************************************************/ | |
224 | ||
5a5a1232 | 225 | //______________________________________________________________________ |
226 | // TrackRnrStyle | |
227 | // | |
228 | ||
229 | ClassImp(Reve::TrackRnrStyle) | |
230 | ||
48dc973d | 231 | Float_t TrackRnrStyle::fgDefMagField = 5; |
232 | const Float_t TrackRnrStyle::fgkB2C = 0.299792458e-3; | |
5a5a1232 | 233 | TrackRnrStyle TrackRnrStyle::fgDefStyle; |
234 | ||
265ecb21 | 235 | TrackRnrStyle::TrackRnrStyle() : |
236 | TObject(), | |
5a5a1232 | 237 | |
265ecb21 | 238 | fColor(1), |
239 | fMagField(fgDefMagField), | |
5a5a1232 | 240 | |
265ecb21 | 241 | fMaxR (350), |
242 | fMaxZ (450), | |
5a5a1232 | 243 | |
265ecb21 | 244 | fMaxOrbs (0.5), |
245 | fMinAng (45), | |
246 | fDelta (0.1), | |
5a5a1232 | 247 | |
265ecb21 | 248 | fFitDaughters(kTRUE), |
249 | fFitDecay (kTRUE) | |
250 | {} | |
5a5a1232 | 251 | |
252 | /**************************************************************************/ | |
253 | /**************************************************************************/ | |
254 | ||
255 | //______________________________________________________________________ | |
256 | // TrackList | |
257 | // | |
258 | ||
259 | ClassImp(Reve::TrackList) | |
260 | ||
261 | void TrackList::Init() | |
262 | { | |
263 | fMarkerStyle = 6; | |
264 | fMarkerColor = 5; | |
265 | // fMarker->SetMarkerSize(0.05); | |
266 | ||
5a5a1232 | 267 | mRnrStyle = new TrackRnrStyle; |
268 | SetMainColorPtr(&mRnrStyle->fColor); | |
269 | } | |
270 | ||
271 | TrackList::TrackList(Int_t n_tracks) : | |
7d42b6c2 | 272 | RenderElementListBase(), |
265ecb21 | 273 | TPolyMarker3D(n_tracks), |
274 | ||
275 | fTitle(), | |
276 | ||
277 | mRnrStyle (0), | |
278 | fRnrMarkers (kTRUE), | |
279 | fRnrTracks (kTRUE) | |
5a5a1232 | 280 | { |
281 | Init(); | |
282 | } | |
283 | ||
284 | TrackList::TrackList(const Text_t* name, Int_t n_tracks) : | |
7d42b6c2 | 285 | RenderElementListBase(), |
265ecb21 | 286 | TPolyMarker3D(n_tracks), |
287 | ||
288 | fTitle(), | |
289 | ||
290 | mRnrStyle (0), | |
291 | fRnrMarkers (kTRUE), | |
292 | fRnrTracks (kTRUE) | |
5a5a1232 | 293 | { |
294 | Init(); | |
295 | SetName(name); | |
296 | } | |
297 | ||
298 | void TrackList::Reset(Int_t n_tracks) | |
299 | { | |
300 | delete [] fP; fP = 0; | |
301 | fN = n_tracks; | |
302 | if(fN) fP = new Float_t [3*fN]; | |
303 | memset(fP, 0, 3*fN*sizeof(Float_t)); | |
304 | fLastPoint = -1; | |
305 | } | |
306 | ||
307 | /**************************************************************************/ | |
308 | ||
309 | void TrackList::Paint(Option_t* option) | |
310 | { | |
311 | if(fRnrElement) { | |
312 | if(fRnrMarkers) { | |
313 | TPolyMarker3D::Paint(option); | |
314 | } | |
315 | if(fRnrTracks) { | |
7d42b6c2 | 316 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { |
5a5a1232 | 317 | if((*i)->GetRnrElement()) |
318 | (*i)->GetObject()->Paint(option); | |
319 | } | |
320 | } | |
321 | } | |
322 | } | |
323 | ||
324 | /**************************************************************************/ | |
325 | ||
326 | void TrackList::AddElement(RenderElement* el) | |
327 | { | |
328 | static const Exc_t eH("TrackList::AddElement "); | |
329 | if (dynamic_cast<Track*>(el) == 0) | |
330 | throw(eH + "new element not a Track."); | |
331 | RenderElementListBase::AddElement(el); | |
332 | } | |
333 | ||
334 | /**************************************************************************/ | |
335 | ||
336 | void TrackList::SetRnrMarkers(Bool_t rnr) | |
337 | { | |
338 | fRnrMarkers = rnr; | |
339 | gReve->Redraw3D(); | |
340 | } | |
341 | ||
342 | void TrackList::SetRnrTracks(Bool_t rnr) | |
343 | { | |
344 | ||
345 | fRnrTracks = rnr; | |
346 | gReve->Redraw3D(); | |
347 | } | |
348 | ||
349 | /**************************************************************************/ | |
350 | ||
351 | void TrackList::MakeTracks() | |
352 | { | |
7d42b6c2 | 353 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { |
5a5a1232 | 354 | ((Track*)(*i))->MakeTrack(); |
355 | } | |
356 | gReve->Redraw3D(); | |
357 | } | |
358 | ||
359 | ||
360 | void TrackList::MakeMarkers() | |
361 | { | |
7d42b6c2 | 362 | Reset(fChildren.size()); |
363 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { | |
5a5a1232 | 364 | Track& t = *((Track*)(*i)); |
365 | if(t.GetN() > 0) | |
366 | SetNextPoint(t.fV.x, t.fV.y, t.fV.z); | |
367 | } | |
368 | gReve->Redraw3D(); | |
369 | } | |
370 | ||
371 | /**************************************************************************/ | |
372 | /*************************************************************************/ | |
373 | ||
374 | void TrackList::SetMaxR(Float_t x) | |
375 | { | |
376 | mRnrStyle->fMaxR = x; | |
377 | MakeTracks(); | |
378 | MakeMarkers(); | |
379 | } | |
380 | ||
381 | void TrackList::SetMaxZ(Float_t x) | |
382 | { | |
383 | mRnrStyle->fMaxZ = x; | |
384 | MakeTracks(); | |
385 | MakeMarkers(); | |
386 | } | |
387 | ||
388 | void TrackList::SetMaxOrbs(Float_t x) | |
389 | { | |
390 | mRnrStyle->fMaxOrbs = x; | |
391 | MakeTracks(); | |
392 | } | |
393 | ||
394 | void TrackList::SetMinAng(Float_t x) | |
395 | { | |
396 | mRnrStyle->fMinAng = x; | |
397 | MakeTracks(); | |
398 | } | |
399 | ||
400 | void TrackList::SetDelta(Float_t x) | |
401 | { | |
402 | mRnrStyle->fDelta = x; | |
403 | MakeTracks(); | |
404 | } | |
405 | ||
406 | void TrackList::SetFitDaughters(Bool_t x) | |
407 | { | |
408 | mRnrStyle->fFitDaughters = x; | |
409 | MakeTracks(); | |
410 | } | |
411 | ||
412 | void TrackList::SetFitDecay(Bool_t x) | |
413 | { | |
414 | mRnrStyle->fFitDecay = x; | |
415 | MakeTracks(); | |
416 | } | |
417 | ||
418 | /**************************************************************************/ | |
419 | /**************************************************************************/ | |
420 | ||
421 | void TrackList::SelectByPt(Float_t min_pt, Float_t max_pt) | |
422 | { | |
423 | Float_t minptsq = min_pt*min_pt; | |
424 | Float_t maxptsq = max_pt*max_pt; | |
425 | Float_t ptsq; | |
426 | ||
7d42b6c2 | 427 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { |
5a5a1232 | 428 | ptsq = ((Track*)(*i))->fP.Perp2(); |
429 | (*i)->SetRnrElement(ptsq >= minptsq && ptsq <= maxptsq); | |
430 | } | |
431 | } | |
432 | ||
433 | /**************************************************************************/ | |
434 | ||
b99aed53 | 435 | void TrackList::ImportHits() |
5a5a1232 | 436 | { |
7d42b6c2 | 437 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { |
b99aed53 | 438 | ((Track*)(*i))->ImportHits(); |
439 | } | |
5a5a1232 | 440 | } |
441 | ||
b99aed53 | 442 | void TrackList::ImportClusters() |
5a5a1232 | 443 | { |
7d42b6c2 | 444 | for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) { |
b99aed53 | 445 | ((Track*)(*i))->ImportClusters(); |
446 | } | |
5a5a1232 | 447 | } |