00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #if defined(__CINT__) && !defined(__MAKECINT__)
00022 {
00023 Info("track.C",
00024 "Has to be run in compiled mode, esp. if you want to pass parameters.");
00025 gSystem->CompileMacro("track.C");
00026 track();
00027 }
00028 #else
00029
00030 #include "TEveTrackPropagator.h"
00031 #include "TEveTrack.h"
00032 #include "TEveVSDStructs.h"
00033 #include "TEveManager.h"
00034 #include "TEveViewer.h"
00035 #include "TSystem.h"
00036 #include "TGLViewer.h"
00037 #include "TMath.h"
00038
00039 #include "TEveViewer.h"
00040 #include "TEvePointSet.h"
00041
00042 #include <iostream>
00043
00044 TEveTrackPropagator* g_prop = 0;
00045
00046 class GappedField : public TEveMagField
00047 {
00048 public:
00049 GappedField():TEveMagField(){}
00050 ~GappedField(){};
00051 using TEveMagField::GetField;
00052
00053 virtual TEveVector GetField(Float_t , Float_t , Float_t z) const
00054 {
00055 if (TMath::Abs(z) < 300) return TEveVector(0, 0, -4);
00056 if (TMath::Abs(z) < 600) return TEveVector(0, 0, 0);
00057 return TEveVector(0, 0, 4);
00058 }
00059 };
00060
00061
00062
00063 class CmsMagField: public TEveMagField
00064 {
00065 bool m_magnetIsOn;
00066 bool m_reverse;
00067 bool m_simpleModel;
00068
00069 public:
00070 CmsMagField():
00071 m_magnetIsOn(true),
00072 m_reverse(false),
00073 m_simpleModel(true){}
00074
00075 virtual ~CmsMagField(){}
00076
00077 virtual Float_t GetMaxFieldMag() const
00078 { return m_magnetIsOn ? 3.8 : 0.0; }
00079
00080 void setMagnetState( bool state )
00081 {
00082 if (state != m_magnetIsOn)
00083 {
00084 if ( state )
00085 std::cout << "Magnet state is changed to ON" << std::endl;
00086 else
00087 std::cout << "Magnet state is changed to OFF" << std::endl;
00088 }
00089 m_magnetIsOn = state;
00090 }
00091
00092 bool isMagnetOn() const { return m_magnetIsOn;}
00093 void setReverseState(bool state) { m_reverse = state; }
00094 bool isReverse() const { return m_reverse;}
00095 void setSimpleModel(bool simpleModel) { m_simpleModel = simpleModel; }
00096 bool isSimpleModel() const { return m_simpleModel;}
00097
00098 using TEveMagField::GetField;
00099
00100 virtual TEveVector GetField(Float_t x, Float_t y, Float_t z) const
00101 {
00102 double R = sqrt(x*x+y*y);
00103 double field = m_reverse?-GetMaxFieldMag():GetMaxFieldMag();
00104
00105 if ( TMath::Abs(z)<724 )
00106 {
00107
00108 if ( R < 300) return TEveVector(0,0,field);
00109
00110 if ( m_simpleModel ||
00111 ( R>461.0 && R<490.5 ) ||
00112 ( R>534.5 && R<597.5 ) ||
00113 ( R>637.0 && R<700.0 ) )
00114 return TEveVector(0,0,-field/3.8*1.2);
00115
00116 } else {
00117
00118 if (m_simpleModel)
00119 {
00120 if ( R < 50 ) return TEveVector(0,0,field);
00121 if ( z > 0 )
00122 return TEveVector(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
00123 else
00124 return TEveVector(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
00125 }
00126
00127 if ( ( TMath::Abs(z)>724 && TMath::Abs(z)<786 ) ||
00128 ( TMath::Abs(z)>850 && TMath::Abs(z)<910 ) ||
00129 ( TMath::Abs(z)>975 && TMath::Abs(z)<1003 ) )
00130 {
00131 if ( z > 0 )
00132 return TEveVector(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
00133 else
00134 return TEveVector(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
00135 }
00136 }
00137 return TEveVector(0,0,0);
00138 }
00139 };
00140
00141
00142
00143
00144
00145
00146 TEveTrack* make_track(TEveTrackPropagator* prop, Int_t sign)
00147 {
00148
00149
00150
00151 TEveRecTrack *rc = new TEveRecTrack();
00152 rc->fV.Set(0.028558, -0.000918, 3.691919);
00153 rc->fP.Set(0.767095, -2.400006, -0.313103);
00154 rc->fSign = sign;
00155
00156 TEveTrack* track = new TEveTrack(rc, prop);
00157 track->SetName(Form("Charge %d", sign));
00158
00159 TEvePathMark* pm1 = new TEvePathMark(TEvePathMark::kDaughter);
00160 pm1->fV.Set(1.479084, -4.370661, 3.119761);
00161 track->AddPathMark(*pm1);
00162
00163 TEvePathMark* pm2 = new TEvePathMark(TEvePathMark::kDaughter);
00164 pm2->fV.Set(57.72345, -89.77011, -9.783746);
00165 track->AddPathMark(*pm2);
00166
00167 return track;
00168 }
00169
00170
00171 void track(Int_t mode = 5, Bool_t isRungeKutta = kTRUE)
00172 {
00173 #if defined (__CINT__)
00174 Error("track.C", "Must be run in compiled mode!");
00175 return;
00176 #endif
00177
00178 gSystem->IgnoreSignal(kSigSegmentationViolation, true);
00179 TEveManager::Create();
00180
00181 TEveTrackList *list = new TEveTrackList();
00182 TEveTrackPropagator* prop = g_prop = list->GetPropagator();
00183 prop->SetFitDaughters(kFALSE);
00184 prop->SetMaxZ(1000);
00185
00186 if (isRungeKutta)
00187 {
00188 prop->SetStepper(TEveTrackPropagator::kRungeKutta);
00189 list->SetName("RK Propagator");
00190 }
00191 else
00192 {
00193 list->SetName("Heix Propagator");
00194 }
00195
00196 TEveTrack *track = 0;
00197 switch (mode)
00198 {
00199 case 0:
00200 {
00201
00202 prop->SetMagField(0.);
00203 list->SetElementName(Form("%s, zeroB", list->GetElementName()));
00204 track = make_track(prop, 1);
00205 break;
00206 }
00207
00208 case 1:
00209 {
00210
00211 prop->SetMagFieldObj(new TEveMagFieldConst(0., 0., -3.8));
00212 list->SetElementName(Form("%s, constB", list->GetElementName()));
00213 track = make_track(prop, 1);
00214 break;
00215 }
00216
00217 case 2:
00218 {
00219
00220 prop->SetMagFieldObj(new TEveMagFieldDuo(200, -4.4, 2));
00221 list->SetElementName(Form("%s, duoB", list->GetElementName()));
00222 track = make_track(prop, 1);
00223 break;
00224 }
00225
00226 case 3:
00227 {
00228
00229 prop->SetMagFieldObj(new GappedField());
00230 list->SetElementName(Form("%s, gappedB", list->GetElementName()));
00231
00232
00233 TEveRecTrack *rc = new TEveRecTrack();
00234 rc->fV.Set(0.028558, -0.000918, 3.691919);
00235 rc->fP.Set(0.767095, -0.400006, 2.313103);
00236 rc->fSign = 1;
00237 track = new TEveTrack(rc, prop);
00238
00239 TEvePointSet* marker = new TEvePointSet(2);
00240 marker->SetElementName("B field break points");
00241 marker->SetPoint(0, 0., 0., 300.f);
00242 marker->SetPoint(1, 0., 0., 600.f);
00243 marker->SetMarkerColor(3);
00244 gEve->AddElement(marker);
00245 break;
00246 }
00247
00248 case 4:
00249 {
00250
00251 CmsMagField* mf = new CmsMagField;
00252 mf->setReverseState(true);
00253
00254 prop->SetMagFieldObj(mf);
00255 prop->SetMaxR(1000);
00256 prop->SetMaxZ(1000);
00257 prop->SetRnrDaughters(kTRUE);
00258 prop->SetRnrDecay(kTRUE);
00259 prop->RefPMAtt().SetMarkerStyle(4);
00260 list->SetElementName(Form("%s, CMS field", list->GetElementName()));
00261
00262
00263 TEveRecTrack *rc = new TEveRecTrack();
00264 rc->fV.Set(0.027667, 0.007919, 0.895964);
00265 rc->fP.Set(3.903134, 2.252232, -3.731366);
00266 rc->fSign = -1;
00267 track = new TEveTrack(rc, prop);
00268
00269 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00270 TEveVector(3.576755e+00, 2.080579e+00, -2.507230e+00)));
00271 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00272 TEveVector(8.440379e+01, 6.548286e+01, -8.788129e+01)));
00273 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00274 TEveVector(1.841321e+02, 3.915693e+02, -3.843072e+02)));
00275 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00276 TEveVector(1.946167e+02, 4.793932e+02, -4.615060e+02)));
00277 track->AddPathMark(TEvePathMark(TEvePathMark::kDecay,
00278 TEveVector(2.249656e+02, 5.835767e+02, -5.565275e+02)));
00279
00280 track->SetRnrPoints(kTRUE);
00281 track->SetMarkerStyle(4);
00282
00283 break;
00284 }
00285
00286 case 5:
00287 {
00288
00289 CmsMagField* mf = new CmsMagField;
00290 mf->setReverseState(true);
00291 mf->setSimpleModel(false);
00292
00293 prop->SetMagFieldObj(mf);
00294 prop->SetMaxR(1000);
00295 prop->SetMaxZ(1000);
00296 prop->SetRnrReferences(kTRUE);
00297 prop->SetRnrDaughters(kTRUE);
00298 prop->SetRnrDecay(kTRUE);
00299 prop->RefPMAtt().SetMarkerStyle(4);
00300 list->SetElementName(Form("%s, CMS field", list->GetElementName()));
00301
00302 TEveRecTrack *rc = new TEveRecTrack();
00303 rc->fV.Set(-16.426592, 16.403185, -19.782692);
00304 rc->fP.Set(3.631100, 3.643450, 0.682254);
00305 rc->fSign = -1;
00306 track = new TEveTrack(rc, prop);
00307
00308 track->AddPathMark(TEvePathMark(TEvePathMark::kReference,
00309 TEveVector(-1.642659e+01, 1.640318e+01, -1.978269e+01),
00310 TEveVector(3.631100, 3.643450, 0.682254)));
00311 track->AddPathMark(TEvePathMark(TEvePathMark::kReference,
00312 TEveVector(-1.859987e+00, 3.172243e+01, -1.697866e+01),
00313 TEveVector(3.456056, 3.809894, 0.682254)));
00314 track->AddPathMark(TEvePathMark(TEvePathMark::kReference,
00315 TEveVector(4.847579e+01, 9.871711e+01, -5.835719e+00),
00316 TEveVector(2.711614, 4.409945, 0.687656)));
00317 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00318 TEveVector(1.342045e+02, 4.203950e+02, 3.846268e+01)));
00319 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00320 TEveVector(1.483827e+02, 5.124750e+02, 5.064311e+01)));
00321 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00322 TEveVector(1.674676e+02, 6.167731e+02, 6.517403e+01)));
00323 track->AddPathMark(TEvePathMark(TEvePathMark::kDecay,
00324 TEveVector(1.884976e+02, 7.202000e+02, 7.919290e+01)));
00325
00326 track->SetRnrPoints(kTRUE);
00327 track->SetMarkerStyle(4);
00328
00329 break;
00330 }
00331
00332 case 6:
00333 {
00334
00335 prop->SetMagFieldObj(new TEveMagFieldDuo(350, -3.5, 2.0));
00336 prop->SetMaxR(1000);
00337 prop->SetMaxZ(1000);
00338 prop->SetRnrReferences(kTRUE);
00339 prop->SetRnrDaughters(kTRUE);
00340 prop->SetRnrDecay(kTRUE);
00341 prop->RefPMAtt().SetMarkerStyle(4);
00342 list->SetElementName(Form("%s, Some ILC Detector field",
00343 list->GetElementName()));
00344
00345 TEveRecTrack *rc = new TEveRecTrack();
00346 rc->fV.Set(57.1068, 31.2401, -7.07629);
00347 rc->fP.Set(4.82895, 2.35083, -0.611757);
00348 rc->fSign = 1;
00349 track = new TEveTrack(rc, prop);
00350
00351 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00352 TEveVector(1.692235e+02, 7.047929e+01, -2.064785e+01)));
00353 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
00354 TEveVector(5.806180e+02, 6.990633e+01, -6.450000e+01)));
00355 track->AddPathMark(TEvePathMark(TEvePathMark::kDecay,
00356 TEveVector(6.527213e+02, 1.473249e+02, -8.348498e+01)));
00357
00358 track->SetRnrPoints(kTRUE);
00359 track->SetMarkerStyle(4);
00360
00361 break;
00362 }
00363 };
00364
00365 if (isRungeKutta)
00366 list->SetLineColor(kMagenta);
00367 else
00368 list->SetLineColor(kCyan);
00369
00370 track->SetLineColor(list->GetLineColor());
00371
00372 gEve->AddElement(list);
00373 list->AddElement(track);
00374
00375 track->MakeTrack();
00376
00377 TEveViewer *ev = gEve->GetDefaultViewer();
00378 TGLViewer *gv = ev->GetGLViewer();
00379 gv->SetGuideState(TGLUtil::kAxesOrigin, kTRUE, kFALSE, 0);
00380
00381 gEve->Redraw3D(kTRUE);
00382 gSystem->ProcessEvents();
00383
00384 gv->CurrentCamera().RotateRad(-0.5, 1.4);
00385 gv->RequestDraw();
00386 }
00387
00388 #endif