45#include <Inventor/nodes/SoSeparator.h>
46#include <Inventor/nodes/SoMaterial.h>
47#include <Inventor/nodes/SoSwitch.h>
48#include <Inventor/nodes/SoComplexity.h>
49#include <Inventor/nodes/SoLineSet.h>
50#include <Inventor/nodes/SoVertexProperty.h>
51#include "Inventor/nodes/SoDrawStyle.h"
52#include "Inventor/nodes/SoLightModel.h"
53#include <Inventor/nodes/SoCylinder.h>
54#include <Inventor/SoPath.h>
55#include <Inventor/nodes/SoFont.h>
106 QList<TrackCollHandleBase*> l;
107 for (
const QString&
name : T::availableCollections(
theclass)) {
108 std::cout<<
name.toStdString()<<std::endl;
116 QList<TrackCollHandleBase*> l;
117 l << createSpecificCollections<TrackCollHandle_TrkTrack>();
118 l << createSpecificCollections<TrackCollHandle_TrkSegment>();
122 l << createSpecificCollections<TrackCollHandle_TruthTracks>();
123 l << createSpecificCollections<TrackCollHandle_SimulationTracks>();
125 l << createSpecificCollections<TrackCollHandle_TrackParticle>();
126 l << createSpecificCollections<TrackCollHandle_xAODTrackParticle>();
127 theclass->message(
"Creating coll handle for ACTS TrackContainers");
128 l << createSpecificCollections<TrackCollHandle_TrackContainer>();
138 "System showing all track-like objects.",
139 "Edward.Moyse@cern.ch, Thomas.Kittelmann@cern.ch"),
m_d(new
Imp)
141 m_d->theclass =
this;
142 m_d->sel_tracks =
nullptr;
143 m_d->common =
nullptr;
144 m_d->totmomsep =
nullptr;
145 m_d->totmomline =
nullptr;
147 m_d->ascObjSelManager =
nullptr;
150 const unsigned n_chamber_t0_sources=2;
151 m_d->chamberT0s.resize(n_chamber_t0_sources);
165 m_d->common->controller()->initTools();
167 connect(
m_d->common->controller(),SIGNAL(shownTrackPartsChanged(TrackCommonFlags::TrackPartsFlags)),
169 connect(
m_d->common->controller()->collWidget(),SIGNAL(visibleStdCollectionsChanged(
const QList<VP1StdCollection*>&)),
179 if (
m_d->totmomsep) {
180 m_d->totmomsep->unref();
181 m_d->totmomsep=
nullptr;
183 if (
m_d->totmomline) {
184 m_d->totmomline->unref();
185 m_d->totmomline =
nullptr;
187 delete m_d->common;
m_d->common =
nullptr;
200 connect(controller,SIGNAL(showTotMomentumOnMultiTrackSelectionChanged(
bool)),
this,SLOT(
updateShownTotMomentum()));
203 connect(controller,SIGNAL(
refit()),
this,SLOT(
refit()));
217 SoComplexity * complexity =
new SoComplexity;
218 complexity->value.setValue(0.3f);
219 root->addChild(complexity);
220 root->addChild(
m_d->common->controller()->ascObjDrawStyle());
221 root->addChild(
m_d->common->controller()->ascObjComplexity());
226 m_d->sel_tracks->ref();
232 m_d->common->setEventData(
m_d->ascObjSelManager);
233 m_d->common->trackLODManager()->setAttachNode(
m_d->ascObjSelManager->getAscObjAttachSep());
236 m_d->common->setLastSelectedTrack(
nullptr);
239 if (!
m_d->common->m_textSep) {
242 m_d->common->m_textSep =
new SoSeparator;
243 m_d->common->m_textSep->setName(
"TextSep");
244 m_d->common->m_textSep->ref();
246 root->addChild(
m_d->common->m_textSep);
249 SoFont *myFont =
new SoFont;
250 myFont->name.setValue(
"Arial");
251 myFont->size.setValue(12.0);
252 m_d->common->m_textSep->addChild(myFont);
257 m_d->common->controller()->collWidget()->setCollections(
m_d->createCollections());
261 m_d->sel_tracks->addChild(col->collSwitch());
263 root->addChild(
m_d->sel_tracks);
264 if (!
m_d->totmomsep) {
265 m_d->totmomsep =
new SoSeparator;
266 m_d->totmomsep->ref();
269 root->addChild(
m_d->totmomsep);
278 std::vector<std::string> key;
279 key.emplace_back(
"MooreMuonChamberT0s");
280 key.emplace_back(
"MboyMuonChamberT0s");
281 assert(
m_d->chamberT0s.size()==key.size());
283 for (
unsigned int i=0; i<
m_d->chamberT0s.size(); i++){
284 assert(i<key.size());
285 m_d->chamberT0s.at(i).clear();
290 if (isThere && sg->
retrieve(chamberT0s, key[i]).isFailure())
291 message(
"Problems loading ChamberT0s!");
293 if (!isThere)
messageVerbose(
"No " +QString(key[i].c_str())+
" in event");
296 messageVerbose(
"Found " +QString(key[i].c_str())+
" Chamber T0s");
299 for (it=chamberT0s->
getAllT0s().begin(); it!=itEnd; ++it){
315 messageDebug(
"MDT chamber Info - technology: " + QString::fromStdString(techStr) +
" - stName: " + QString::fromStdString(stationName) +
" - stEta: " + QString::number(stEta) +
" - stPhi: " + QString::number(stPhi) +
" - ml: " + QString::number(ml) );
318 if (muonDetEl)
m_d->chamberT0s[i][muonDetEl->getMaterialGeom()->getParent()]=it->second;
328 messageDebug(
"MDT chamber Info - technology: " + QString::fromStdString(techStr) +
" - stName: " + QString::fromStdString(stationName) +
" - stEta: " + QString::number(stEta) +
" - stPhi: " + QString::number(stPhi) );
331 if (muonDetEl)
m_d->chamberT0s[i][muonDetEl->getMaterialGeom()->getParent()]=it->second;
347 m_d->common->controller()->collWidget()->clear();
350 if (
m_d->common->controller()->trackObjBrowser())
m_d->common->controller()->trackObjBrowser()->clear();
352 m_d->common->clearEventData();
353 if (
m_d->sel_tracks) {
355 m_d->sel_tracks->unref();
356 m_d->sel_tracks=
nullptr;
360 m_d->totmomsep->removeAllChildren();
362 if (
m_d->common->m_textSep)
363 m_d->common->m_textSep->removeAllChildren();
370 +
" instances of AssociatedObjectHandleBase alive at end of systemerase(). "
371 "(ignore this warning if there is more than one track system instance).");
374 +
" instances of TrackHandleBase alive at end of systemerase(). "
375 "(ignore this warning if there is more than one track system instance).");
378 std::map<const Trk::Track*, SoMaterial*>::iterator itMat =
m_d->vertexMaterialForTrackBases.begin();
379 std::map<const Trk::Track*, SoMaterial*>::iterator itMatEnd =
m_d->vertexMaterialForTrackBases.end();
380 for(;itMat!=itMatEnd;++itMat) {
381 SoMaterial* curmat = itMat->second;
384 m_d->vertexMaterialForTrackBases.clear();
385 for (
unsigned int i=0;i<
m_d->chamberT0s.size();++i)
386 m_d->chamberT0s.at(i).clear();
400 serialise.save(
m_d->common->controller()->saveSettings());
403 serialise.disableUnsavedChecks();
405 return serialise.result();
413 if (
state.version()==0) {
415 message(
"Warning: State data has obsolete format - ignoring!");
418 if (
state.version()!=1) {
419 message(
"Warning: State data has wrong format - ignoring!");
427 m_d->common->controller()->restoreSettings(
state.restoreByteArray());
430 state.disableUnrestoredChecks();
436 messageVerbose(
"Emitting touchedMuonChambersChanged (with ntouchedchambers = "+QString::number(s.size())+
")" );
447 std::vector< std::pair<const Trk::Track*, const SoMaterial*> > vistracks;
449 std::map<const Trk::Track*,SoMaterial*>::const_iterator it, itE = trackhelper->
visibleObjects().end();
451 vistracks.emplace_back(it->first,it->second);
452 messageVerbose(
"Emitting visibleTracksChanged (with nvistracks = "+QString::number(vistracks.size())+
")" );
460 std::vector< std::pair<const Trk::Segment*, const SoMaterial*> > vissegments;
462 std::map<const Trk::Segment*,SoMaterial*>::const_iterator it, itE = segmenthelper->
visibleObjects().end();
464 vissegments.emplace_back(it->first,it->second);
465 messageVerbose(
"Emitting visibleSegmentsChanged (with nvissegments = "+QString::number(vissegments.size())+
")" );
469 message(
"unexpected signal received in visibleObjectsChanged slot");
474 InDetProjFlags::InDetProjPartsFlags sct,
475 InDetProjFlags::InDetProjPartsFlags trt )
477 messageVerbose(
"Signal received in setApplicableIDProjections slot");
482 if (
m_d->common->indetProjHelper_Pixel()->parts() !=
pixel) {
483 m_d->common->indetProjHelper_Pixel()->setParts(
pixel);
486 if (
m_d->common->indetProjHelper_SCT()->parts() != sct) {
487 m_d->common->indetProjHelper_SCT()->setParts(sct);
490 if (
m_d->common->indetProjHelper_TRT()->parts() != trt) {
491 m_d->common->indetProjHelper_TRT()->setParts(trt);
497 if (
m_d->common->controller()) {
499 collhandle->updateInDetProjectionsOfAllHandles();
511 if (!
m_d->sel_tracks||!
m_d->ascObjSelManager) {
512 messageVerbose(
"updateSelectionMode Warning: Ignoring due to null pointers.");
516 m_d->ascObjSelManager->deselectAll();
517 m_d->selMode =
m_d->common->controller()->selectionMode();
520 m_d->sel_tracks->policy = SoCooperativeSelection::SINGLE;
524 m_d->sel_tracks->policy = SoCooperativeSelection::TOGGLE;
528 message(
"updateSelectionMode ERROR: Unexpected selection mode flag");
530 m_d->sel_tracks->policy = SoCooperativeSelection::SINGLE;
540 if (pickedNode==
m_d->totmomline) {
541 message(
"Total momentum of selected tracks [GeV]: p = "+
str(
m_d->totmomgev)+
", m = "+
str(
m_d->totmass/CLHEP::GeV));
545 message(
"Unknown object clicked");
553 if (!
m_d->ascObjSelManager->handleUserSelectedSingleNode(
sel,
node,pickedPath,pickedHandle)) {
554 if (
sel==
m_d->sel_tracks) {
556 if (
node->getTypeId().isDerivedFrom(SoCylinder::getClassTypeId())) {
558 node=pickedPath->getTail();
562 message(
"ERROR: Unknown track.");
567 messageVerbose(
"userSelectedSingleNode - find measurements for track fit");
571 if (trackmeas.empty())
message(
"In refit mode, but no visible measurements found so can't do anything. Perhaps they're not enabled in 'Details'?");
572 QList<AssociatedObjectHandleBase*> currentsel =
m_d->ascObjSelManager->currentSelection();
575 bool oneunselected(
false);
577 if (!currentsel.contains(meas)) {
578 oneunselected =
true;
582 QList<const Trk::PrepRawData*> prdSet;
584 messageVerbose(
"userSelectedSingleNode - selecting " +QString::number(trackmeas.size()) +
" measurements.");
585 m_d->ascObjSelManager->ensureSelected(trackmeas);
593 messageVerbose(
"userSelectedSingleNode - deselecting " +QString::number(trackmeas.size()) +
" measurements.");
594 m_d->ascObjSelManager->ensureDeselected(trackmeas);
598 m_d->sel_tracks->deselectAll();
600 if (
m_d->common->controller()->printInfoOnSingleSelection()){
603 m_d->common->setLastSelectedTrack(handle);
605 m_d->common->controller()->setNumberOfSelectedPRDsAndTracks(
m_d->selectedPRDs.count(),1);
609 message(
"ERROR: Unknown selection.");
613 if (
m_d->common->controller()->orientAndZoomOnSingleSelection()) {
616 std::set<SoCamera*>::iterator it,itE = cameras.end();
617 for (it=cameras.begin();it!=itE;++it)
627 if (
m_d->ascObjSelManager)
628 m_d->ascObjSelManager->userClickedOnBgd();
629 m_d->common->setLastSelectedTrack(
nullptr);
630 QList<const Trk::PrepRawData*> prdSet;
650 for (
int i = 0; i <
sel_tracks->getList()->getLength(); ++i) {
651 SoFullPath *fPath =
static_cast<SoFullPath *
>((*(
sel_tracks->getList()))[i]);
659 std::optional<Amg::Vector3D> pos = handle->
startPoint();
666 totenergy += sqrt(mom.mag2() + mass*mass);
669 double msq = totenergy*totenergy - totmom.mag2();
670 mass = (msq<0?-1.0:1.0)*sqrt(fabs(msq));
681 if (!
m_d->common->controller()->showTotMomentumOnMultiTrackSelection()) {
684 if (
m_d->totmomsep&&
m_d->totmomline&&
m_d->totmomsep->findChild(
m_d->totmomline)>-1)
685 m_d->totmomsep->removeChild(
m_d->totmomline);
691 unsigned nused =
m_d->calcTotalMomentumOfSelectedHandles(totmom,totpos,totmass);
695 if (
m_d->totmomsep&&
m_d->totmomline&&
m_d->totmomsep->findChild(
m_d->totmomline)>-1)
696 m_d->totmomsep->removeChild(
m_d->totmomline);
700 if (!
m_d->totmomline) {
701 m_d->totmomline =
new SoLineSet;
702 m_d->totmomline->ref();
703 SoVertexProperty * vertices =
new SoVertexProperty;
704 m_d->totmomline->vertexProperty = vertices;
705 m_d->totmomline->numVertices.set1Value(0,2);
708 SoVertexProperty * vertices =
static_cast<SoVertexProperty*
>(
m_d->totmomline->vertexProperty.getValue());
709 vertices->vertex.set1Value(0,totpos.x(),totpos.y(),totpos.z());
710 vertices->vertex.set1Value(1,p2.x(),p2.y(),p2.z());
711 m_d->totmomgev = totmom / CLHEP::GeV;
712 m_d->totmass = totmass;
715 if (
m_d->totmomsep&&
m_d->totmomline&&
m_d->totmomsep->findChild(
m_d->totmomline)<0)
716 m_d->totmomsep->addChild(
m_d->totmomline);
731 if (
m_d->common->controller()->printTotMomentumOnMultiTrackSelection()) {
735 if (
m_d->calcTotalMomentumOfSelectedHandles(totmom,totpos,totmass)>0) {
737 totmomgev /= CLHEP::GeV;
738 message(
"Total momentum [GeV] : "+
str(totmomgev));
739 message(
"Total mass [GeV] : "+
str(totmass/CLHEP::GeV));
752 if (
common->controller()->collWidget()->visibleStdCollections().isEmpty())
762 InDetProjFlags::DetTypeFlags usedidprojs =
m_d->currentUsedIDProjections();
763 if (
m_d->lastEmittedUsedIDProjections == usedidprojs)
765 m_d->lastEmittedUsedIDProjections = usedidprojs;
772 m_d->selectedPRDs = s;
773 if (
m_d->common&&
m_d->common->controller())
774 m_d->common->controller()->setNumberOfSelectedPRDsAndTracks(
m_d->selectedPRDs.count(),0);
782 if (!
m_d->common||!
m_d->common->controller()||!
m_d->sel_tracks)
786 if (!currentFitter) {
787 message(
"ERROR - Aborting refit as no fitter available.");
791 QList<const Trk::Track*> fittedtracks;
792 switch (
m_d->common->controller()->fitterMode()) {
799 if (fittedtracks.empty())
return;
803 m_d->common->controller()->nameOfNewlyFittedCollections(),
805 newtrackcoll->
init();
807 QList<TrackCollHandleBase*> newcols;
808 newcols << newtrackcoll;
810 m_d->common->controller()->collWidget()->addCollections(newcols);
814 m_d->sel_tracks->addChild(col->collSwitch());
815 col->setVisible(
true);
896 if (!trkhandle)
return;
900 bool outlier =
m_d->common->controller()->fitterRemoveOutliers();
904 currentFitter->
fit(Gaudi::Hive::currentContext(), *track, outlier, hypo).release();
907 message(
"Fit failed - no resulting track.");
911 fittedtracks << fittedtrk;
913 std::ostringstream s;
920 return m_d->sel_tracks;
926 std::vector<double> values =
m_d->common->controller()->alignmentShiftValue();
927 int level =
m_d->common->controller()->alignmentShiftLevel();
929 messageVerbose(
"updateAlignment called with level="+QString::number(level));
930 assert (values.size()==6);
941 if (!
m_d->ascObjSelManager) {
943 message (
"No selection manager - giving up.");
947 QList<AssociatedObjectHandleBase*> currentsel =
m_d->ascObjSelManager->currentSelection();
966 messageVerbose(
"Found det Element from station="+QString(stationName.c_str()));
974 messageVerbose(
"VP1TrackSystem::tracksFromVertexChanged. Got a list THIS big! "+QString::number(vertexList.size()));
977 m_d->common->controller()->vertexCutsAllowed(
true);
980 for (
const auto& it : vertexList){
981 SoMaterial* mat =
const_cast<SoMaterial*
>(it.first);
982 messageVerbose(
"Number of tracks associated with this vertex= "+QString::number(it.second.size()));
986 m_d->vertexMaterialForTrackBases[trk]=mat;
994 if (coll->allowColourByVertex()) coll->updateMaterialOfAllHandles();
1001 std::map<const Trk::Track*, SoMaterial*>::const_iterator it =
m_d->vertexMaterialForTrackBases.find(handle->
trkTrackPointer());
1003 if (it!=
m_d->vertexMaterialForTrackBases.end()){
1007 messageVerbose(
"VP1TrackSystem::materialFromVertex. No matching track handle for handle with pointer="+QString::number((uintptr_t)trk));
const Trk::RIO_OnTrack * rioOnTrack() const
const Trk::TrackStateOnSurface * trackStateOnSurface() const
static int numberOfInstances()
virtual bool initiatesOwnZooms() const
IVP13DSystemSimple(const QString &name, const QString &information, const QString &contact_info)
void ensureBuildController()
void unregisterSelectionNode(SoCooperativeSelection *)
virtual void deselectAll(SoCooperativeSelection *exception_sel=0)
void registerSelectionNode(SoCooperativeSelection *)
void messageVerbose(const QString &) const
virtual void restoreFromState(QByteArray)
void messageDebug(const QString &) const
const QString & name() const
void message(const QString &) const
virtual QByteArray saveState()
int multilayer(const Identifier &id) const
Access to components of the ID.
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const MdtIdHelper * mdtIdHelper() const
const CscIdHelper * cscIdHelper() const
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const CscReadoutElement * getCscReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Base class for the XxxReadoutElement, with Xxx = Mdt, Rpc, Tgc, Csc.
int stationEta(const Identifier &id) const
const std::string & technologyString(const int &index) const
bool is_csc(const Identifier &id) const
int stationPhi(const Identifier &id) const
int technology(const Identifier &id) const
int stationName(const Identifier &id) const
bool is_mdt(const Identifier &id) const
const std::string & stationNameString(const int &index) const
Stores links between chambers and the reconstructed T0.
const std::vector< std::pair< Identifier, float > > & getAllT0s() const
Returns entire list of T0s.
The Athena Transient Store API.
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
bool contains(const TKEY &key) const
Look up a keyed object in TDS (compare also tryRetrieve) returns false if object not available in TDS...
virtual void init(VP1MaterialButtonBase *matBut=0)
static QString toString(const SELECTIONMODE &)
QList< AssociatedObjectHandleBase * > getVisibleMeasurements() const
virtual std::optional< Amg::Vector3D > startPoint() const
returns 0 if can't find start point.
virtual double mass() const
virtual QStringList clicked() const =0
Called when user selects the node (stringlist is displayed in messagebox).
virtual Amg::Vector3D momentum() const
static int numberOfInstances()
const Trk::Track * trkTrackPointer() const
void setNumberOfSelectedPRDsAndTracks(unsigned prds, unsigned trks)
void setCommonData(TrackSysCommonData *)
set pointer to the common data
Provides the abstract interface for track fitting in the common ATLAS Tracking EDM.
virtual std::unique_ptr< Track > fit(const EventContext &ctx, const Track &track, const RunOutlierRemoval runOutlier=false, const ParticleHypothesis matEffects=Trk::nonInteracting) const =0
RE-FIT A TRACK.
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
virtual const TrkDetElementBase * detectorElement() const =0
returns the detector element, assoicated with the PRD of this class
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
This is the base class for all tracking detector elements with read-out relevant information.
virtual Identifier identify() const =0
Identifier.
static VP1CameraHelper * animatedZoomToPath(SoCamera *camera, SoGroup *sceneroot, SoPath *path, double duration_in_secs=1.0, double clipVolPercent=100.0, double slack=1.0, const SbVec3f &lookat=SbVec3f(999, 999, 999), const SbVec3f &upvec=SbVec3f(999, 999, 999), bool varySpeed=true, bool forceCircular=false)
static const MdtIdHelper * mdtIDHelper()
static const MuonGM::MuonDetectorManager * muonDetMgr()
std::vector< std::map< GeoPVConstLink, float > > chamberT0s
std::map< const Trk::Track *, SoMaterial * > vertexMaterialForTrackBases
InDetProjFlags::DetTypeFlags currentUsedIDProjections() const
unsigned calcTotalMomentumOfSelectedHandles(Amg::Vector3D &totmom, Amg::Vector3D &totpos, double &mass) const
QList< TrackCollHandleBase * > createCollections()
VP1TrackSystem * theclass
AscObjSelectionManager * ascObjSelManager
SoCooperativeSelection * sel_tracks
QList< TrackCollHandleBase * > createSpecificCollections()
QList< const Trk::PrepRawData * > selectedPRDs
TrackCommonFlags::SELECTIONMODE selMode
InDetProjFlags::DetTypeFlags lastEmittedUsedIDProjections
void refitSingleTrack(const Trk::ITrackFitter *currentFitter, QList< const Trk::Track * > &fittedtracks)
void visibleObjectsChanged()
void tracksFromVertexChanged(QList< std::pair< const SoMaterial *, QList< const Trk::Track * > > > &)
SoCooperativeSelection * selTracks()
Needed in TrackSystemController::objectBrowserClicked(QTreeWidgetItem * item, int)
void visibleTracksChanged(const std::vector< std::pair< const Trk::Track *, const SoMaterial * > > &)
void possiblyEmitUsedIDProjectionsChanged()
QWidget * buildController()
void touchedMuonChambersChanged(const std::set< GeoPVConstLink > &)
void updateAlignment()
Special mode to allow in VP1 alignment tests.
void visibleSegmentsChanged(const std::vector< std::pair< const Trk::Segment *, const SoMaterial * > > &)
void restoreFromState(QByteArray)
void setSelectedPRDs(const QList< const Trk::PrepRawData * > &)
virtual ~VP1TrackSystem()
void userDeselectedSingleNode(SoCooperativeSelection *, SoNode *, SoPath *)
void userPickedNode(SoNode *pickedNode, SoPath *pickedPath)
void systemcreate(StoreGateSvc *detstore)
void updateShownTotMomentum()
void setApplicableIDProjections(InDetProjFlags::InDetProjPartsFlags pixel, InDetProjFlags::InDetProjPartsFlags sct, InDetProjFlags::InDetProjPartsFlags trt)
void userSelectedSingleNode(SoCooperativeSelection *, SoNode *, SoPath *)
void muonChamberT0sChanged(const std::map< GeoPVConstLink, float > &, int)
The map is the dt0 per chamber, plus a label identifier, which by convention (!) is 0=Moore,...
void newTrackSelected(const TrackHandleBase &)
void emitTouchedMuonChambersChanged(const std::set< GeoPVConstLink > &)
void usedIDProjectionsChanged(InDetProjFlags::DetTypeFlags)
void userChangedSelection(SoCooperativeSelection *, const QSet< SoNode * > &, QSet< SoPath * >)
VP1TrackSystem(const QString &name="Tracks")
void buildEventSceneGraph(StoreGateSvc *sg, SoSeparator *root)
SoMaterial * materialFromVertex(const TrackHandleBase *trk) const
Returns the material for the vertex which knows this trackhandle (if known)
void updateSelectionMode()
void refitFromPRDs(const Trk::ITrackFitter *currentFitter, QList< const Trk::Track * > &fittedtracks)
const std::map< const objectT *, SoMaterial * > & visibleObjects()
Eigen::Matrix< double, 3, 1 > Vector3D
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.