Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
track.C File Reference

Detailed Description

Demonstrates usage of TEveTrackPRopagator with different magnetic field configurations.

Needs to be run in compiled mode. root

.L track.C+
track(3, kTRUE)
const Bool_t kTRUE
Definition RtypesCore.h:91

void track(Int_t mode = 5, Bool_t isRungeKutta = kTRUE) Modes are 0. B = 0, no difference between signed and charge particles;

  1. constant B field (along z, but could have arbitrary direction);
  2. variable B field, sign change at R = 200 cm;
  3. magnetic field with a zero-field region;
  4. CMS magnetic field - simple track;
  5. CMS magnetic field - track with different path-marks.
  6. Conceptual ILC detector, problematic track
#include "TEveTrack.h"
#include "TEveVSDStructs.h"
#include "TEveManager.h"
#include "TEveViewer.h"
#include "TSystem.h"
#include "TGLViewer.h"
#include "TMath.h"
#include "TEveViewer.h"
#include "TEvePointSet.h"
#include <iostream>
TEveTrackPropagator* g_prop = 0;
class GappedField : public TEveMagField
{
public:
GappedField():TEveMagField(){}
~GappedField(){};
virtual Double_t GetMaxFieldMagD() { return 4; }
virtual TEveVectorD GetFieldD(Double_t /*x*/, Double_t /*y*/, Double_t z) const
{
if (TMath::Abs(z) < 300) return TEveVectorD(0, 0, -4);
if (TMath::Abs(z) < 600) return TEveVectorD(0, 0, 0);
return TEveVectorD(0, 0, 4);
}
};
//==============================================================================
class CmsMagField: public TEveMagField
{
bool m_magnetIsOn;
bool m_reverse;
bool m_simpleModel;
public:
CmsMagField():
m_magnetIsOn(true),
m_reverse(false),
m_simpleModel(true){}
virtual ~CmsMagField(){}
void setMagnetState( bool state )
{
if (state != m_magnetIsOn)
{
if ( state )
std::cout << "Magnet state is changed to ON" << std::endl;
else
std::cout << "Magnet state is changed to OFF" << std::endl;
}
m_magnetIsOn = state;
}
bool isMagnetOn() const { return m_magnetIsOn;}
void setReverseState(bool state) { m_reverse = state; }
bool isReverse() const { return m_reverse;}
void setSimpleModel(bool simpleModel) { m_simpleModel = simpleModel; }
bool isSimpleModel() const { return m_simpleModel;}
virtual Double_t GetMaxFieldMagD() const { return m_magnetIsOn ? 3.8 : 0.0; }
{
double R = sqrt(x*x+y*y);
double field = m_reverse ? -GetMaxFieldMagD() : GetMaxFieldMagD();
//barrel
if ( TMath::Abs(z) < 724 )
{
//inside solenoid
if ( R < 300) return TEveVectorD(0,0,field);
// outside solenoid
if ( m_simpleModel ||
( R>461.0 && R<490.5 ) ||
( R>534.5 && R<597.5 ) ||
( R>637.0 && R<700.0 ) )
return TEveVectorD(0,0,-field/3.8*1.2);
} else {
// endcaps
if (m_simpleModel)
{
if ( R < 50 ) return TEveVectorD(0,0,field);
if ( z > 0 )
return TEveVectorD(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
else
return TEveVectorD(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
}
// proper model
if ( ( TMath::Abs(z)>724 && TMath::Abs(z)<786 ) ||
( TMath::Abs(z)>850 && TMath::Abs(z)<910 ) ||
( TMath::Abs(z)>975 && TMath::Abs(z)<1003 ) )
{
if ( z > 0 )
return TEveVectorD(x/R*field/3.8*2.0, y/R*field/3.8*2.0, 0);
else
return TEveVectorD(-x/R*field/3.8*2.0, -y/R*field/3.8*2.0, 0);
}
}
return TEveVectorD(0,0,0);
}
};
//==============================================================================
//==============================================================================
//______________________________________________________________________________
TEveTrack* make_track(TEveTrackPropagator* prop, Int_t sign)
{
// Make track with given propagator.
// Add to math-marks to test fit.
auto rc = new TEveRecTrackD();
rc->fV.Set(0.028558, -0.000918, 3.691919);
rc->fP.Set(0.767095, -2.400006, -0.313103);
rc->fSign = sign;
auto track = new TEveTrack(rc, prop);
track->SetName(Form("Charge %d", sign));
// daughter 0
pm1->fV.Set(1.479084, -4.370661, 3.119761);
track->AddPathMark(*pm1);
// daughter 1
pm2->fV.Set(57.72345, -89.77011, -9.783746);
track->AddPathMark(*pm2);
return track;
}
void track(Int_t mode = 1, Bool_t isRungeKutta = kTRUE)
{
auto list = new TEveTrackList();
auto prop = g_prop = list->GetPropagator();
prop->SetMaxZ(1000);
if (isRungeKutta)
{
list->SetName("RK Propagator");
}
else
{
list->SetName("Heix Propagator");
}
TEveTrack *track = 0;
switch (mode)
{
case 0:
{
// B = 0 no difference between signed and charge particles
prop->SetMagField(0.);
list->SetElementName(Form("%s, zeroB", list->GetElementName()));
track = make_track(prop, 1);
break;
}
case 1:
{
// constant B field, const angle
prop->SetMagFieldObj(new TEveMagFieldConst(0., 0., -3.8));
list->SetElementName(Form("%s, constB", list->GetElementName()));
track = make_track(prop, 1);
break;
}
case 2:
{
// variable B field, sign change at R = 200 cm
prop->SetMagFieldObj(new TEveMagFieldDuo(200, -4.4, 2));
list->SetElementName(Form("%s, duoB", list->GetElementName()));
track = make_track(prop, 1);
break;
}
case 3:
{
// gapped field
prop->SetMagFieldObj(new GappedField());
list->SetElementName(Form("%s, gappedB", list->GetElementName()));
auto rc = new TEveRecTrackD();
rc->fV.Set(0.028558, -0.000918, 3.691919);
rc->fP.Set(0.767095, -0.400006, 2.313103);
rc->fSign = 1;
track = new TEveTrack(rc, prop);
auto marker = new TEvePointSet(2);
marker->SetElementName("B field break points");
marker->SetPoint(0, 0., 0., 300.f);
marker->SetPoint(1, 0., 0., 600.f);
marker->SetMarkerColor(3);
gEve->AddElement(marker);
break;
}
case 4:
{
// Magnetic field of CMS I.
auto mf = new CmsMagField;
mf->setReverseState(true);
prop->SetMagFieldObj(mf);
prop->SetMaxR(1000);
prop->SetMaxZ(1000);
list->SetElementName(Form("%s, CMS field", list->GetElementName()));
auto rc = new TEveRecTrackD();
rc->fV.Set(0.027667, 0.007919, 0.895964);
rc->fP.Set(3.903134, 2.252232, -3.731366);
rc->fSign = -1;
track = new TEveTrack(rc, prop);
TEveVectorD(3.576755e+00, 2.080579e+00, -2.507230e+00)));
TEveVectorD(8.440379e+01, 6.548286e+01, -8.788129e+01)));
TEveVectorD(1.841321e+02, 3.915693e+02, -3.843072e+02)));
TEveVectorD(1.946167e+02, 4.793932e+02, -4.615060e+02)));
TEveVectorD(2.249656e+02, 5.835767e+02, -5.565275e+02)));
track->SetMarkerStyle(4);
break;
}
case 5:
{
// Magnetic field of CMS I.
auto mf = new CmsMagField;
mf->setReverseState(true);
mf->setSimpleModel(false);
prop->SetMagFieldObj(mf);
prop->SetMaxR(1000);
prop->SetMaxZ(1000);
list->SetElementName(Form("%s, CMS field", list->GetElementName()));
auto rc = new TEveRecTrackD();
rc->fV.Set(-16.426592, 16.403185, -19.782692);
rc->fP.Set(3.631100, 3.643450, 0.682254);
rc->fSign = -1;
track = new TEveTrack(rc, prop);
TEveVectorD(-1.642659e+01, 1.640318e+01, -1.978269e+01),
TEveVectorD(3.631100, 3.643450, 0.682254)));
TEveVectorD(-1.859987e+00, 3.172243e+01, -1.697866e+01),
TEveVectorD(3.456056, 3.809894, 0.682254)));
TEveVectorD(4.847579e+01, 9.871711e+01, -5.835719e+00),
TEveVectorD(2.711614, 4.409945, 0.687656)));
TEveVectorD(1.342045e+02, 4.203950e+02, 3.846268e+01)));
TEveVectorD(1.483827e+02, 5.124750e+02, 5.064311e+01)));
TEveVectorD(1.674676e+02, 6.167731e+02, 6.517403e+01)));
TEveVectorD(1.884976e+02, 7.202000e+02, 7.919290e+01)));
track->SetMarkerStyle(4);
break;
}
case 6:
{
// Problematic track from Druid
prop->SetMagFieldObj(new TEveMagFieldDuo(350, -3.5, 2.0));
prop->SetMaxR(1000);
prop->SetMaxZ(1000);
list->SetElementName(Form("%s, Some ILC Detector field",
list->GetElementName()));
auto rc = new TEveRecTrackD();
rc->fV.Set(57.1068, 31.2401, -7.07629);
rc->fP.Set(4.82895, 2.35083, -0.611757);
rc->fSign = 1;
track = new TEveTrack(rc, prop);
TEveVectorD(1.692235e+02, 7.047929e+01, -2.064785e+01)));
TEveVectorD(5.806180e+02, 6.990633e+01, -6.450000e+01)));
TEveVectorD(6.527213e+02, 1.473249e+02, -8.348498e+01)));
track->SetMarkerStyle(4);
break;
}
};
if (isRungeKutta)
list->SetLineColor(kMagenta);
else
list->SetLineColor(kCyan);
track->SetLineColor(list->GetLineColor());
gEve->AddElement(list);
list->AddElement(track);
track->MakeTrack();
TGLViewer *gv = ev->GetGLViewer();
gv->CurrentCamera().RotateRad(-0.5, 1.4);
gv->RequestDraw();
}
int Int_t
Definition RtypesCore.h:45
const Bool_t kFALSE
Definition RtypesCore.h:92
bool Bool_t
Definition RtypesCore.h:63
double Double_t
Definition RtypesCore.h:59
@ kMagenta
Definition Rtypes.h:66
@ kCyan
Definition Rtypes.h:66
R__EXTERN TEveManager * gEve
TEvePathMarkT< Double_t > TEvePathMarkD
TEveRecTrackT< Double_t > TEveRecTrackD
TEveVectorT< Double_t > TEveVectorD
Definition TEveVector.h:125
double sqrt(double)
char * Form(const char *fmt,...)
@ kSigSegmentationViolation
R__EXTERN TSystem * gSystem
Definition TSystem.h:559
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition TAttMarker.h:40
virtual void SetLineColor(Color_t col)
Set the line color.
Definition TEveLine.h:48
void SetRnrPoints(Bool_t r)
Set rendering of points. Propagate to projected lines.
Definition TEveLine.cxx:144
Implements constant magnetic field, given by a vector fB.
Implements constant magnetic filed that switches on given axial radius fR2 from vector fBIn to fBOut.
Abstract base-class for interfacing to magnetic field needed by the TEveTrackPropagator.
virtual TEveVectorD GetFieldD(Double_t x, Double_t y, Double_t z) const
virtual Double_t GetMaxFieldMagD() const
void AddElement(TEveElement *element, TEveElement *parent=0)
Add an element.
TEveViewer * GetDefaultViewer() const
Returns the default viewer - the first one in the fViewers list.
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
void Redraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
virtual void SetMarkerStyle(Style_t mstyle=1)
Set marker style, propagate to projecteds.
A list of tracks supporting change of common attributes and selection based on track parameters.
Definition TEveTrack.h:140
Holding structure for a number of track rendering parameters.
void SetRnrDecay(Bool_t x)
Set decay rendering and rebuild tracks.
void SetRnrDaughters(Bool_t x)
Set daughter rendering and rebuild tracks.
void SetMagFieldObj(TEveMagField *field, Bool_t own_field=kTRUE)
Set constant magnetic field and rebuild tracks.
void SetMaxR(Double_t x)
Set maximum radius and rebuild tracks.
void SetFitDaughters(Bool_t x)
Set daughter creation point fitting and rebuild tracks.
void SetStepper(EStepper_e s)
void SetRnrReferences(Bool_t x)
Set track-reference rendering and rebuild tracks.
void SetMaxZ(Double_t x)
Set maximum z and rebuild tracks.
void SetMagField(Double_t bX, Double_t bY, Double_t bZ)
Set constant magnetic field and rebuild tracks.
Visual representation of a track.
Definition TEveTrack.h:33
virtual void MakeTrack(Bool_t recurse=kTRUE)
Calculate track representation based on track data and current settings of the propagator.
void AddPathMark(const TEvePathMarkD &pm)
Definition TEveTrack.h:107
Eve representation of TGLViewer.
Definition TEveViewer.h:31
TGLViewer * GetGLViewer() const
Definition TEveViewer.h:51
virtual Bool_t RotateRad(Double_t hRotate, Double_t vRotate)
Rotate camera around center.
@ kAxesOrigin
Definition TGLUtil.h:949
Base GL viewer object - used by both standalone and embedded (in pad) GL.
Definition TGLViewer.h:55
void RequestDraw(Short_t LOD=TGLRnrCtx::kLODMed)
Post request for redraw of viewer at level of detail 'LOD' Request is directed via cross thread gVirt...
void SetGuideState(Int_t axesType, Bool_t axesDepthTest, Bool_t referenceOn, const Double_t *referencePos)
Set the state of guides (axes & reference markers) from arguments.
TGLCamera & CurrentCamera() const
Definition TGLViewer.h:267
virtual void IgnoreSignal(ESignals sig, Bool_t ignore=kTRUE)
If ignore is true ignore the specified signal, else restore previous behaviour.
Definition TSystem.cxx:594
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
Definition TSystem.cxx:417
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Short_t Abs(Short_t d)
Definition TMathBase.h:120
Author
Alja Mrak-Tadel

Definition in file track.C.