Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches

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)
constexpr Bool_t kTRUE
Definition RtypesCore.h:107

void track(Int_t mode = 5, Bool_t isRungeKutta = kTRUE) Modes are

  1. B = 0, no difference between signed and charge particles;
  2. constant B field (along z, but could have arbitrary direction);
  3. variable B field, sign change at R = 200 cm;
  4. magnetic field with a zero-field region;
  5. CMS magnetic field - simple track;
  6. CMS magnetic field - track with different path-marks.
  7. 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 = nullptr;
class GappedField : public TEveMagField {
public:
GappedField() : TEveMagField() {}
~GappedField() override{};
virtual Double_t GetMaxFieldMagD() { return 4; }
TEveVectorD GetFieldD(Double_t /*x*/, Double_t /*y*/, Double_t z) const override
{
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) {}
~CmsMagField() override {}
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; }
Double_t GetMaxFieldMagD() const override { 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)
{
gSystem->IgnoreSignal(kSigSegmentationViolation, true);
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 = nullptr;
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);
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(3.576755e+00, 2.080579e+00, -2.507230e+00)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(8.440379e+01, 6.548286e+01, -8.788129e+01)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.841321e+02, 3.915693e+02, -3.843072e+02)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.946167e+02, 4.793932e+02, -4.615060e+02)));
track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay, 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)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.342045e+02, 4.203950e+02, 3.846268e+01)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.483827e+02, 5.124750e+02, 5.064311e+01)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.674676e+02, 6.167731e+02, 6.517403e+01)));
track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay, 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);
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(1.692235e+02, 7.047929e+01, -2.064785e+01)));
track->AddPathMark(
TEvePathMarkD(TEvePathMarkD::kDaughter, TEveVectorD(5.806180e+02, 6.990633e+01, -6.450000e+01)));
track->AddPathMark(TEvePathMarkD(TEvePathMarkD::kDecay, TEveVectorD(6.527213e+02, 1.473249e+02, -8.348498e+01)));
track->SetMarkerStyle(4);
break;
}
};
if (isRungeKutta)
else
list->SetLineColor(kCyan);
track->SetLineColor(list->GetLineColor());
gEve->AddElement(list);
list->AddElement(track);
track->MakeTrack();
TEveViewer *ev = gEve->GetDefaultViewer();
TGLViewer *gv = ev->GetGLViewer();
gEve->Redraw3D(kTRUE);
gSystem->ProcessEvents();
gv->CurrentCamera().RotateRad(-0.5, 1.4);
gv->RequestDraw();
}
#define R(a, b, c, d, e, f, g, h, i)
Definition RSha256.hxx:110
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
@ kMagenta
Definition Rtypes.h:67
@ kCyan
Definition Rtypes.h:67
externTEveManager * gEve
TEvePathMarkT< Double_t > TEvePathMarkD
TEveRecTrackT< Double_t > TEveRecTrackD
TEveVectorT< Double_t > TEveVectorD
Definition TEveVector.h:125
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2496
@ kSigSegmentationViolation
externTSystem * gSystem
Definition TSystem.h:582
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition TAttMarker.h:43
void SetLineColor(Color_t col) override
Set the line color.
Definition TEveLine.h:48
void SetRnrPoints(Bool_t r)
Set rendering of points. Propagate to projected lines.
Definition TEveLine.cxx:143
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
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
void SetMarkerStyle(Style_t mstyle=1) override
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:952
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:268
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:122
Author
Alja Mrak-Tadel

Definition in file track.C.