41 TEveTrackPropagator* g_prop = 0;
43 class GappedField :
public TEveMagField
46 GappedField():TEveMagField(){}
48 using TEveMagField::GetField;
50 virtual TEveVectorD GetFieldD(Double_t , Double_t , Double_t z)
const
52 if (TMath::Abs(z) < 300)
return TEveVectorD(0, 0, -4);
53 if (TMath::Abs(z) < 600)
return TEveVectorD(0, 0, 0);
54 return TEveVectorD(0, 0, 4);
60 class CmsMagField:
public TEveMagField
72 virtual ~CmsMagField(){}
73 virtual Double_t GetMaxFieldMagD()
const {
return m_magnetIsOn ? 3.8 : 0.0; }
74 void setMagnetState(
bool state )
76 if (state != m_magnetIsOn)
79 std::cout <<
"Magnet state is changed to ON" << std::endl;
81 std::cout <<
"Magnet state is changed to OFF" << std::endl;
86 bool isMagnetOn()
const {
return m_magnetIsOn;}
87 void setReverseState(
bool state) { m_reverse = state; }
88 bool isReverse()
const {
return m_reverse;}
89 void setSimpleModel(
bool simpleModel) { m_simpleModel = simpleModel; }
90 bool isSimpleModel()
const {
return m_simpleModel;}
92 using TEveMagField::GetField;
94 virtual TEveVectorD GetFieldD(Double_t x, Double_t y, Double_t z)
const
96 double R = sqrt(x*x+y*y);
97 double field = m_reverse?-GetMaxFieldMag():GetMaxFieldMag();
99 if ( TMath::Abs(z)<724 )
102 if ( R < 300)
return TEveVectorD(0,0,field);
104 if ( m_simpleModel ||
105 ( R>461.0 && R<490.5 ) ||
106 ( R>534.5 && R<597.5 ) ||
107 ( R>637.0 && R<700.0 ) )
108 return TEveVectorD(0,0,-field/3.8*1.2);
114 if ( R < 50 )
return TEveVectorD(0,0,field);
116 return TEveVectorD(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
118 return TEveVectorD(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
121 if ( ( TMath::Abs(z)>724 && TMath::Abs(z)<786 ) ||
122 ( TMath::Abs(z)>850 && TMath::Abs(z)<910 ) ||
123 ( TMath::Abs(z)>975 && TMath::Abs(z)<1003 ) )
126 return TEveVectorD(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
128 return TEveVectorD(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
131 return TEveVectorD(0,0,0);
140 TEveTrack* make_track(TEveTrackPropagator* prop, Int_t sign)
145 auto rc =
new TEveRecTrackD();
146 rc->fV.Set(0.028558, -0.000918, 3.691919);
147 rc->fP.Set(0.767095, -2.400006, -0.313103);
150 auto track =
new TEveTrack(rc, prop);
151 track->SetName(Form(
"Charge %d", sign));
153 auto pm1 =
new TEvePathMarkD(TEvePathMarkD::kDaughter);
154 pm1->fV.Set(1.479084, -4.370661, 3.119761);
155 track->AddPathMark(*pm1);
157 auto pm2 =
new TEvePathMarkD(TEvePathMarkD::kDaughter);
158 pm2->fV.Set(57.72345, -89.77011, -9.783746);
159 track->AddPathMark(*pm2);
165 void track(Int_t mode = 1, Bool_t isRungeKutta = kTRUE)
168 gSystem->IgnoreSignal(kSigSegmentationViolation,
true);
169 TEveManager::Create();
171 auto list =
new TEveTrackList();
172 auto prop = g_prop = list->GetPropagator();
173 prop->SetFitDaughters(kFALSE);
178 prop->SetStepper(TEveTrackPropagator::kRungeKutta);
179 list->SetName(
"RK Propagator");
183 list->SetName(
"Heix Propagator");
186 TEveTrack *track = 0;
192 prop->SetMagField(0.);
193 list->SetElementName(Form(
"%s, zeroB", list->GetElementName()));
194 track = make_track(prop, 1);
201 prop->SetMagFieldObj(
new TEveMagFieldConst(0., 0., -3.8));
202 list->SetElementName(Form(
"%s, constB", list->GetElementName()));
203 track = make_track(prop, 1);
210 prop->SetMagFieldObj(
new TEveMagFieldDuo(200, -4.4, 2));
211 list->SetElementName(Form(
"%s, duoB", list->GetElementName()));
212 track = make_track(prop, 1);
219 prop->SetMagFieldObj(
new GappedField());
220 list->SetElementName(Form(
"%s, gappedB", list->GetElementName()));
223 auto rc =
new TEveRecTrackD();
224 rc->fV.Set(0.028558, -0.000918, 3.691919);
225 rc->fP.Set(0.767095, -0.400006, 2.313103);
227 track =
new TEveTrack(rc, prop);
229 auto marker =
new TEvePointSet(2);
230 marker->SetElementName(
"B field break points");
231 marker->SetPoint(0, 0., 0., 300.f);
232 marker->SetPoint(1, 0., 0., 600.f);
233 marker->SetMarkerColor(3);
234 gEve->AddElement(marker);
241 auto mf =
new CmsMagField;
242 mf->setReverseState(
true);
244 prop->SetMagFieldObj(mf);
247 prop->SetRnrDaughters(kTRUE);
248 prop->SetRnrDecay(kTRUE);
249 prop->RefPMAtt().SetMarkerStyle(4);
250 list->SetElementName(Form(
"%s, CMS field", list->GetElementName()));
253 auto rc =
new TEveRecTrackD();
254 rc->fV.Set(0.027667, 0.007919, 0.895964);
255 rc->fP.Set(3.903134, 2.252232, -3.731366);
257 track =
new TEveTrack(rc, prop);
259 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
260 TEveVectorD(3.576755e+00, 2.080579e+00, -2.507230e+00)));
261 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
262 TEveVectorD(8.440379e+01, 6.548286e+01, -8.788129e+01)));
263 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
264 TEveVectorD(1.841321e+02, 3.915693e+02, -3.843072e+02)));
265 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
266 TEveVectorD(1.946167e+02, 4.793932e+02, -4.615060e+02)));
267 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay,
268 TEveVectorD(2.249656e+02, 5.835767e+02, -5.565275e+02)));
270 track->SetRnrPoints(kTRUE);
271 track->SetMarkerStyle(4);
279 auto mf =
new CmsMagField;
280 mf->setReverseState(
true);
281 mf->setSimpleModel(
false);
283 prop->SetMagFieldObj(mf);
286 prop->SetRnrReferences(kTRUE);
287 prop->SetRnrDaughters(kTRUE);
288 prop->SetRnrDecay(kTRUE);
289 prop->RefPMAtt().SetMarkerStyle(4);
290 list->SetElementName(Form(
"%s, CMS field", list->GetElementName()));
292 auto rc =
new TEveRecTrackD();
293 rc->fV.Set(-16.426592, 16.403185, -19.782692);
294 rc->fP.Set(3.631100, 3.643450, 0.682254);
296 track =
new TEveTrack(rc, prop);
298 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kReference,
299 TEveVectorD(-1.642659e+01, 1.640318e+01, -1.978269e+01),
300 TEveVectorD(3.631100, 3.643450, 0.682254)));
301 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kReference,
302 TEveVectorD(-1.859987e+00, 3.172243e+01, -1.697866e+01),
303 TEveVectorD(3.456056, 3.809894, 0.682254)));
304 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kReference,
305 TEveVectorD(4.847579e+01, 9.871711e+01, -5.835719e+00),
306 TEveVectorD(2.711614, 4.409945, 0.687656)));
307 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
308 TEveVectorD(1.342045e+02, 4.203950e+02, 3.846268e+01)));
309 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
310 TEveVectorD(1.483827e+02, 5.124750e+02, 5.064311e+01)));
311 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
312 TEveVectorD(1.674676e+02, 6.167731e+02, 6.517403e+01)));
313 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay,
314 TEveVectorD(1.884976e+02, 7.202000e+02, 7.919290e+01)));
316 track->SetRnrPoints(kTRUE);
317 track->SetMarkerStyle(4);
325 prop->SetMagFieldObj(
new TEveMagFieldDuo(350, -3.5, 2.0));
328 prop->SetRnrReferences(kTRUE);
329 prop->SetRnrDaughters(kTRUE);
330 prop->SetRnrDecay(kTRUE);
331 prop->RefPMAtt().SetMarkerStyle(4);
332 list->SetElementName(Form(
"%s, Some ILC Detector field",
333 list->GetElementName()));
335 auto rc =
new TEveRecTrackD();
336 rc->fV.Set(57.1068, 31.2401, -7.07629);
337 rc->fP.Set(4.82895, 2.35083, -0.611757);
339 track =
new TEveTrack(rc, prop);
341 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
342 TEveVectorD(1.692235e+02, 7.047929e+01, -2.064785e+01)));
343 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDaughter,
344 TEveVectorD(5.806180e+02, 6.990633e+01, -6.450000e+01)));
345 track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay,
346 TEveVectorD(6.527213e+02, 1.473249e+02, -8.348498e+01)));
348 track->SetRnrPoints(kTRUE);
349 track->SetMarkerStyle(4);
356 list->SetLineColor(kMagenta);
358 list->SetLineColor(kCyan);
360 track->SetLineColor(list->GetLineColor());
362 gEve->AddElement(list);
363 list->AddElement(track);
367 TEveViewer *ev = gEve->GetDefaultViewer();
368 TGLViewer *gv = ev->GetGLViewer();
369 gv->SetGuideState(TGLUtil::kAxesOrigin, kTRUE, kFALSE, 0);
371 gEve->Redraw3D(kTRUE);
372 gSystem->ProcessEvents();
374 gv->CurrentCamera().RotateRad(-0.5, 1.4);