track.C

Go to the documentation of this file.
00001 // @(#)root/eve:$Id: text_test.C 26717 2008-12-07 22:07:55Z matevz $
00002 // Author: Alja Mrak-Tadel
00003 
00004 // Demonstrates usage of TEveTrackPRopagator with different magnetic
00005 // field configurations.
00006 // Needs to be run in compiled mode.
00007 // root
00008 //   .L track.C+
00009 //   track(3, kTRUE)
00010 //
00011 // void track(Int_t mode = 5, Bool_t isRungeKutta = kTRUE)
00012 // Modes are
00013 // 0 - B = 0, no difference btween signed and charge particles;
00014 // 1 - constant B field (along z, but could have arbitrary direction);
00015 // 2 - variable B field, sign change at  R = 200 cm;
00016 // 3 - magnetic field with a zero-field region;
00017 // 4 - CMS magnetic field - simple track;
00018 // 5 - CMS magnetic field - track with different path-marks.
00019 // 6 - Concpetual ILC detector, problematic track
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 /*x*/, Float_t /*y*/, 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       //barrel
00105       if ( TMath::Abs(z)<724 )
00106       {
00107          //inside solenoid
00108          if ( R < 300) return TEveVector(0,0,field);
00109          // outside solinoid
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          // endcaps
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          // proper model
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   // Make track with given propagator.
00149   // Add to math-marks to test fit.
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   // daughter 0
00159   TEvePathMark* pm1 = new TEvePathMark(TEvePathMark::kDaughter);
00160   pm1->fV.Set(1.479084, -4.370661, 3.119761);
00161   track->AddPathMark(*pm1);
00162   // daughter 1
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          // B = 0 no difference btween signed and charge particles
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          // constant B field, const angle
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          // variable B field, sign change at  R = 200 cm
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          // gapped field
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          // Magnetic field of CMS I.
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          // Magnetic field of CMS I.
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          // Problematic track from Druid
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

Generated on Tue Jul 5 15:44:05 2011 for ROOT_528-00b_version by  doxygen 1.5.1