33#include <Inventor/nodes/SoSeparator.h>
34#include <Inventor/nodes/SoMaterial.h>
35#include <Inventor/nodes/SoSwitch.h>
36#include "Inventor/nodes/SoDrawStyle.h"
37#include "Inventor/nodes/SoLightModel.h"
43#include <QTreeWidgetItem>
44#include <QElapsedTimer>
121 m_d->theclass =
this;
123 m_d->lastUsedPropagator =
nullptr;
124 m_d->notifystatesave =
false;
129 m_d->tsos_useShortTRTMeasurements =
true;
130 m_d->tsos_useShortMDTMeasurements =
true;
131 m_d->tsos_drawMeasGlobalPositions =
false;
132 m_d->tsos_measurementsShorttubesScale = 2.0;
133 m_d->tsos_nStdDevForParamErrors =
false;
134 m_d->tsos_numberOfPointsOnCircles = 12;
135 m_d->tsos_materialEffectsOnTrackScale = 2.0;
136 m_d->tsos_parTubeErrorsDrawCylinders =
false;
138 m_d->comboBox_colourby =
new QComboBox;
139 m_d->objBrowseTree =
nullptr;
140 m_d->matButton=
nullptr;
147 m_d->matButton->setText(
text());
153 m_d->comboBox_colourby->setToolTip(
"Determine how tracks from this collection are coloured.\n The 'Dist. Sel.' option means the tracks will be coloured by distance from the last selected track. ");
169 m_d->comboBox_colourby->addItems(l);
170 m_d->comboBox_colourby->setCurrentIndex(0);
171 connect(
m_d->comboBox_colourby,SIGNAL(currentIndexChanged(
int)),
210 connect(controller,SIGNAL(propagationOptionsChanged(TrackSystemController::PropagationOptionFlags)),
this,SLOT(
setPropagationOptions(TrackSystemController::PropagationOptionFlags)));
213 connect(controller,SIGNAL(propMaxRadiusChanged(
float)),
this,SLOT(
setPropMaxRadius(
float)));
219 connect(controller,SIGNAL(shownTrackPartsChanged(TrackCommonFlags::TrackPartsFlags)),
this,SLOT(
setParts(TrackCommonFlags::TrackPartsFlags)));
220 connect(
m_d->matButton,SIGNAL(hideActualTrackPathChanged(
bool)),
this,SLOT(
setActualPathShown(
bool)));
223 connect(controller,SIGNAL(vertexProjectionAngleChanged(
int)),
this,SLOT(
setParts(
int)));
227 connect(
m_d->matButton,SIGNAL(trackTubeRadiusChanged(
const double&)),
this,SLOT(
setTrackTubeRadius(
const double&)));
246 connect(controller,SIGNAL(cutAllowedPhiChanged(
const QList<VP1Interval>&)),
this,SLOT(
setCutAllowedPhi(
const QList<VP1Interval>&)));
247 connect(
m_d->matButton,SIGNAL(cutAllowedPhiChanged(
const QList<VP1Interval>&)),
this,SLOT(
setCutAllowedPhi(
const QList<VP1Interval>&)));
250 connect(controller,SIGNAL(cutRequiredNHitsChanged(
const QList<unsigned>&)),
this,SLOT(
setRequiredNHits(
const QList<unsigned>&)));
251 connect(
m_d->matButton,SIGNAL(cutRequiredNHitsChanged(
const QList<unsigned>&)),
this,SLOT(
setRequiredNHits(
const QList<unsigned>&)));
254 connect(controller,SIGNAL(cutRequiredDetectorElementChanged(
const QString&)),
this,SLOT(
setRequiredDetectorElement(
const QString&)));
261 connect(controller,SIGNAL(customColouredTSOSPartsChanged(TrackCommonFlags::TSOSPartsFlags)),
277 connect(controller,SIGNAL(nStdDevForParamErrorsChanged(
const double&)),
this,SLOT(
setNStdDevForParamErrors(
const double&)));
289 connect(controller,SIGNAL(shownTSOSPartsChanged(TrackCommonFlags::TSOSPartsFlags)),
293 connect(controller,SIGNAL(customColouredTSOSPartsChanged(TrackCommonFlags::TSOSPartsFlags)),
297 connect(controller,SIGNAL(trackLabelsChanged(TrackSystemController::TrackLabelModes)),
this,SLOT(
setLabels(TrackSystemController::TrackLabelModes)));
298 connect(controller,SIGNAL(trackLabelTrkOffsetChanged(
float)),
this,SLOT(
setLabelTrkOffset(
float)));
299 connect(controller,SIGNAL(trackLabelPosOffsetChanged(QList<int>)),
this,SLOT(
setLabelPosOffsets(QList<int>)));
344 if (mom.mag2()!=0.0) {
357 if (phirange.contains(
phi)||phirange.contains(
phi+2*
M_PI)||phirange.contains(
phi-2*
M_PI)) {
395 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
396 for (;it!=itE;++it) {
397 if ((*it)->visible())
413 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
414 for (;it!=itE;++it) {
415 if (!(*it)->visible())
430 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
445 messageVerbose(
"update3DObjectsOfAllHandles start (onlythosetouchingmuonchambers = "
446 +
str(onlythosetouchingmuonchambers)+
", invalidatePropagatedPoints = "
447 +
str(invalidatePropagatedPoints)+
")");
449 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
450 if (onlythosetouchingmuonchambers) {
452 if (!(*it)->touchedMuonChambers().empty())
453 (*it)->update3DObjects(invalidatePropagatedPoints, maxR);
456 (*it)->update3DObjects(invalidatePropagatedPoints, maxR);
471 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
473 (*it)->updateInDetProjections();
486 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
488 (*it)->updateMuonProjections();
501 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
503 (*it)->updateMaterial();
511 m_d->trackhandles.reserve(n);
517 m_d->trackhandles.push_back(handle);
529 bool mustUpdatePropagatedPoints = (p &&
m_d->lastUsedPropagator!=p);
532 m_d->lastUsedPropagator = p;
606 messageVerbose(
"setLabelTrkOffset ==> Changed to "+QString::number(offset));
668 if (targetText!=
m_d->comboBox_colourby->currentText()) {
669 int i =
m_d->comboBox_colourby->findText(targetText);
670 if (i>=0&&i<m_d->comboBox_colourby->count()) {
671 bool save =
m_d->comboBox_colourby->blockSignals(
true);
672 m_d->comboBox_colourby->setCurrentIndex(i);
673 m_d->comboBox_colourby->blockSignals(save);
675 message(
"ERROR: Problems finding correct text in combo box");
695 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
697 (*it)->rerandomiseRandomMaterial();
709 std::vector<TrackHandleBase*>::iterator it(
m_d->trackhandles.begin()),itE(
m_d->trackhandles.end());
711 (*it)->updateMaterial();
719 m_d->itTrackHandles =
m_d->trackhandles.begin();
720 m_d->itTrackHandlesEnd =
m_d->trackhandles.end();
725 if (
m_d->itTrackHandles==
m_d->itTrackHandlesEnd)
728 return *(
m_d->itTrackHandles++);
733 if ( (
m_d->last_useDefaultCuts) == useDefaults)
return;
734 messageVerbose(
"setUseDefaultCuts changed to "+
str(useDefaults)+
"- rechecking all handles");
755 double signMin = allowedpt.
lower()<0.0 ? -1.0 : 1.0;
756 double signMax = allowedpt.
upper()<0.0 ? -1.0 : 1.0;
757 double minptsq = allowedpt.
lower() == -std::numeric_limits<double>::infinity() ? -std::numeric_limits<double>::infinity() : signMin*(allowedpt.
lower()*allowedpt.
lower());
758 double maxptsq = allowedpt.
upper() == std::numeric_limits<double>::infinity() ? std::numeric_limits<double>::infinity() : signMax*(allowedpt.
upper()*allowedpt.
upper());
840 bool relaxed(
false),tightened(
false);
852 for (
int i=0;i<l.count();++i) {
860 assert(relaxed||tightened);
862 if (relaxed&&tightened) {
914 if (
m_d->shownTSOSParts==f)
916 m_d->shownTSOSParts=f;
925 if (
m_d->customColouredTSOSParts==f)
927 m_d->customColouredTSOSParts=f;
935 if (
m_d->tsos_useShortTRTMeasurements==b)
937 m_d->tsos_useShortTRTMeasurements=b;
950 if (
m_d->tsos_useShortMDTMeasurements==b)
952 m_d->tsos_useShortMDTMeasurements=b;
966 if (
m_d->tsos_drawMeasGlobalPositions==b)
968 m_d->tsos_drawMeasGlobalPositions=b;
981 if (
m_d->tsos_measurementsShorttubesScale==n)
983 m_d->tsos_useShortMDTMeasurements=n;
995 if (
m_d->tsos_nStdDevForParamErrors==nstddev)
997 m_d->tsos_nStdDevForParamErrors=nstddev;
1009 if (
m_d->tsos_numberOfPointsOnCircles==n)
1011 m_d->tsos_numberOfPointsOnCircles=n;
1023 if (
m_d->tsos_materialEffectsOnTrackScale==n)
1025 m_d->tsos_materialEffectsOnTrackScale=n;
1037 if (
m_d->tsos_parTubeErrorsDrawCylinders==b)
1039 m_d->tsos_parTubeErrorsDrawCylinders=b;
1065 if (
m_d->objBrowseTree)
m_d->objBrowseTree->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
1074 if (
m_d->objBrowseTree)
m_d->objBrowseTree->setFlags(Qt::ItemFlags());
1081 messageVerbose(
"TrackCollHandleBase::updateObjectBrowserVisibilityCounts called for "+
name());
1083 if (!trkObjBrowser || !
m_d->objBrowseTree) {
1084 messageVerbose(
"TrackCollHandleBase::updateObjectBrowserVisibilityCounts: no common()->controller()->trackObjBrowser() and/or m_d->objBrowseTree. Aborting");
1088 QString
text(QString(
": (")+QString::number(
nShownHandles())+QString(
"/")+QString::number(
m_d->trackhandles.size())+QString(
") visible"));
1089 m_d->objBrowseTree->setText(1,
text);
1098 if (!trkObjBrowser) {
1099 messageVerbose(
"TrackCollHandleBase::fillObjectBrowser: no common()->controller()->trackObjBrowser(). Aborting");
1108 trkObjBrowser->setUpdatesEnabled(
false);
1110 bool firstTime=
false;
1111 if (!
m_d->objBrowseTree) {
1112 m_d->objBrowseTree =
new QTreeWidgetItem(0);
1114 messageVerbose(
"TrackCollHandleBase::fillObjectBrowser: First time so creating QTreeWidgetItem.");
1116 int index = trkObjBrowser->indexOfTopLevelItem(
m_d->objBrowseTree);
1118 messageVerbose(
"Missing from WidgetTree! Will continue but something must be wrong");
1122 messageVerbose(
"TrackCollHandleBase::fillObjectBrowser about to start looping over tracks at "+QString::number(t.elapsed())+
" ms");
1124 QList<QTreeWidgetItem *> list;
1128 unsigned int numVisible=0;
1137 if (trkHandle->
visible() ) numVisible++;
1141 QString
text(QString(
": (")+QString::number(numVisible)+QString(
"/")+QString::number(i)+QString(
") visible"));
1143 m_d->objBrowseTree->setText(0,
name());
1144 m_d->objBrowseTree->setText(1,
text);
1145 m_d->objBrowseTree->addChildren(list);
1146 trkObjBrowser->addTopLevelItem(
m_d->objBrowseTree);
1147 trkObjBrowser->setUpdatesEnabled(
true);
1149 messageVerbose(
"TrackCollHandleBase::fillObjectBrowser completed in "+QString::number(t.elapsed())+
" ms");
1169 default:
return "Unknown (ERROR)";
1175 return QList<QWidget*>() <<
m_d->comboBox_colourby;
1183 serialise.save(
m_d->comboBox_colourby);
1184 serialise.disableUnsavedChecks();
1185 return serialise.result();
1202 messageVerbose(
"Collection detail level combo box changed index");
1238 if (!
m_d->matButton) {
1239 message(
"ERROR: useDefaultCuts(..) called before init()");
1242 return m_d->matButton->useDefaultCuts();
1247 if (!
m_d->matButton) {
1248 message(
"ERROR: cutOnlyVertexAssocTracks(..) called before init()");
1252 return m_d->matButton->cutOnlyVertexAssocTracks();
1261 if (!
m_d->matButton) {
1262 message(
"ERROR: setState(..) called before init()");
1268 messageDebug(
"Warning: Ignoring state with wrong version");
1274 m_d->matButton->restoreFromState(matState);
1278 if (extraWidgetState!=QByteArray())
1285 if (!
m_d->matButton) {
1286 message(
"ERROR: persistifiableState() called before init()");
1290 serialise.disableUnsavedChecks();
1292 Q_ASSERT(
m_d->matButton&&
"Did you forget to call init() on this VP1StdCollection?");
1293 serialise.save(
m_d->matButton->saveState());
1295 return serialise.result();
Scalar phi() const
phi method
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
virtual void deselectAll(SoCooperativeSelection *exception_sel=0)
bool tsos_parTubeErrorsDrawCylinders
std::vector< TrackHandleBase * > trackhandles
TrackCollHandleBase * theclass
TrackCommonFlags::TSOSPartsFlags shownTSOSParts
QTreeWidgetItem * objBrowseTree
bool tsos_useShortMDTMeasurements
static QString comboBoxEntry_ColourByRandom()
static QString comboBoxEntry_ColourByDistanceFromSelectedTrack()
static QString comboBoxEntry_ColourByVertex()
static QString comboBoxEntry_ColourByMomentum()
double tsos_materialEffectsOnTrackScale
Trk::IExtrapolator * lastUsedPropagator
static QString comboBoxEntry_ColourByCharge()
std::vector< TrackHandleBase * >::iterator itTrackHandlesEnd
double tsos_measurementsShorttubesScale
TrackCommonFlags::TSOSPartsFlags customColouredTSOSParts
bool tsos_drawMeasGlobalPositions
bool tsos_useShortTRTMeasurements
double tsos_nStdDevForParamErrors
TrackCollectionSettingsButton * matButton
int tsos_numberOfPointsOnCircles
static QString comboBoxEntry_ColourByPID()
QComboBox * comboBox_colourby
std::vector< TrackHandleBase * >::iterator itTrackHandles
static QString comboBoxEntry_ColourByCollection()
TrackSysCommonData * common() const
virtual void init(VP1MaterialButtonBase *matBut=0)
VP1Interval m_cut_allowedEta
void recheckCutStatusOfAllHandles()
void colourByComboBoxItemChanged()
virtual ~TrackCollHandleBase()
TrackSysCommonData * m_commonData
void setParTubeErrorsDrawCylinders(bool)
void clipVolumeChanged(double)
VP1ExtraSepLayerHelper * m_sephelper
void actualSetShownTSOSPartsOnHandles()
virtual bool allowColourByDistanceFromSelectedTrack() const
void setNStdDevForParamErrors(const double &)
void updateMaterialOfAllHandles()
void recheckCutStatus(TrackHandleBase *)
TrackSystemController::TrackLabelModes m_labels
bool cutOnlyVertexAssocTracks() const
Return true if this collection should only should tracks associated to a vertex.
QString m_requiredDetectorElement
void setPropagator(Trk::IExtrapolator *)
void setCutAllowedPt(const VP1Interval &)
void setUseShortMDTMeasurements(bool)
void extrapolateToThisVolumeChanged(void)
virtual bool mightHaveSubSystemHitInfo() const
void setLabelPosOffsets(const QList< int > &)
QList< QWidget * > provideExtraWidgetsForGuiRow() const
void setLabelTrkOffset(float)
void recheckCutStatusOfAllVisibleHandles()
void setNumberOfPointsOnCircles(int)
void setShownTSOSParts(TrackCommonFlags::TSOSPartsFlags)
void setupSettingsFromController(TrackSystemController *)
void update3DObjectsOfAllHandles(bool onlythosetouchingmuonchambers=false, bool invalidatePropagatedPoints=false, float maxR=0.0)
void hintNumberOfTracksInEvent(unsigned)
void setPropagationOptions(TrackSystemController::PropagationOptionFlags)
const QString & name() const
void setUseShortTRTMeasurements(bool)
void collVisibilityChanged(bool)
void rerandomiseRandomTrackColours()
QList< unsigned > m_cut_requiredNHits
virtual void setState(const QByteArray &)
Provide specific implementation.
virtual void collMaterialTransparencyAndBrightnessChanged()
bool useDefaultCuts() const
Return true if this collection uses the default (i.e.
bool m_cut_etaptphi_allwillfail
void setMeasurementsShorttubesScale(double)
void setCustomColouredTSOSParts(TrackCommonFlags::TSOSPartsFlags)
void setColourBy(COLOURBY)
qint32 provideCollTypeID() const
void setOnlyVertexAssocTracks(bool)
QList< int > m_labelsPosOffsets
void setExtraWidgetsState(const QByteArray &)
QList< VP1Interval > m_cut_allowedPhi
void trackSelectionChanged()
virtual QColor defaultColor() const =0
void updateObjectBrowserVisibilityCounts()
void setLabels(TrackSystemController::TrackLabelModes)
void setUseDefaultCuts(bool)
void setActualPathShown(bool)
VP1Interval cutAllowedEta() const
QByteArray extraWidgetsState() const
void setCutAllowedPhi(const QList< VP1Interval > &)
virtual void setupSettingsFromControllerSpecific(TrackSystemController *)
virtual bool cut(TrackHandleBase *)
void setTrackTubeRadius(const double &)
void setMaterialEffectsOnTrackScale(double)
void setDrawMeasGlobalPositions(bool)
VP1Interval cutAllowedPt() const
COLOURBY colourBy() const
void cleanupPtrContainer(T &) const
void setParts(TrackCommonFlags::TrackPartsFlags)
virtual bool allowColourByMomentum() const
static QString toString(const COLOURBY &)
virtual void assignDefaultMaterial(SoMaterial *) const
void updateMuonProjectionsOfAllHandles()
QList< unsigned > cutRequiredNHits() const
void setRequiredNHits(const QList< unsigned > &)
void addTrackHandle(TrackHandleBase *)
void setPropMaxRadius(float)
void setCutAllowedEta(const VP1Interval &)
TrackCollHandleBase(TrackSysCommonData *, const QString &name, TrackType::Type)
TrackSystemController::PropagationOptionFlags m_propagationOptions
TrackCommonFlags::TrackPartsFlags m_parts
void recheckCutStatusOfAllNotVisibleHandles()
VP1Interval m_cut_allowedPtSq
void trackHandleIterationBegin()
virtual QByteArray persistifiableState() const
Provide specific implementation.
virtual COLOURBY defaultColourBy() const
void updateInDetProjectionsOfAllHandles()
TrackHandleBase * getNextTrackHandle()
QList< VP1Interval > cutAllowedPhi() const
virtual bool allowColourByVertex() const
Trk::IExtrapolator * m_propagator
virtual bool allowColourByCharge() const
void setRequiredDetectorElement(const QString &id)
virtual bool allowColourByPID() const
TrackCommonFlags::TrackPartsFlags parts() const
void actualSetCustomColouredTSOSPartsOnHandles()
void setCustomColouredTSOSParts(TrackCommonFlags::TSOSPartsFlags f)
void updateShapes_TSOSWithMaterialEffects()
virtual void fillObjectBrowser(QList< QTreeWidgetItem * > &list)
Called in child classes.
virtual unsigned getNTRTHits() const
void setVisible(bool)
use by the collection handle.
virtual unsigned getNSCTHits() const
virtual bool containsDetElement(const QString &) const
void updateShapes_TSOSWithErrors()
virtual unsigned getNMuonPrecisionHits() const
void updateShapes_TSOSWithMeasurements()
virtual void updateObjectBrowser()
virtual bool hasSubSystemHitInfo() const
virtual Amg::Vector3D momentum() const
void setShownTSOSParts(TrackCommonFlags::TSOSPartsFlags f)
virtual bool isIDTrack() const
virtual unsigned getNMuonHits() const
void updateRandomColourTransparencyAndBrightness()
virtual unsigned getNPixelHits() const
VP1TrackSystem * system() const
TrackSystemController * controller() const
VP1Interval cutAllowedEta() const
VP1Interval cutAllowedPt() const
QList< unsigned > cutRequiredNHits() const
bool drawMeasGlobalPositions() const
Trk::IExtrapolator * propagator() const
bool useShortTRTMeasurements() const
double measurementsShorttubesScale() const
bool ignoreMeasurementEffectsOnTrackInProp()
If true (default) don't use TSOS with MEOT to draw track points.
TrackLabelModes trackLabels()
float propMaxRadius() const
QTreeWidget * trackObjBrowser() const
Returns a pointer to the Track Object Browser (if it exists)
int numberOfPointsOnCircles() const
TrackCommonFlags::TSOSPartsFlags customColouredTSOSParts() const
bool cutOnlyVertexAssocTracks() const
double nStdDevForParamErrors() const
PropagationOptionFlags propagationOptions() const
double materialEffectsOnTrackScale() const
bool useShortMDTMeasurements() const
TrackCommonFlags::TrackPartsFlags shownTrackParts() const
bool parTubeErrorsDrawCylinders() const
QList< VP1Interval > cutAllowedPhi() const
TrackCommonFlags::TSOSPartsFlags shownTSOSParts() const
int vertexProjectionAngle() const
static qint32 typeToInt(const Type &)
static VP1CustomTourEditor * customTourEditor()
QByteArray restoreByteArray()
void disableUnrestoredChecks()
void restore(QCheckBox *sb)
void messageVerbose(const QString &) const
void message(const QString &) const
IVP1System * systemBase() const
void messageDebug(const QString &) const
bool contains(const double &x) const
static double phiFromXY(const double &x, const double &y)
static void setMatColor(SoMaterial *, const double &r, const double &g, const double &b, const double &brightness=0.0, const double &transp=0.0)
virtual void largeChangesEnd()
virtual void init(VP1MaterialButtonBase *button=0)
SoSeparator * collSep() const
All 3D objects from this coll.
SoSwitch * collSwitch() const
Add this somewhere in your scenegraph (do not add any children here!)
virtual void largeChangesBegin()
void visibilityChanged(bool)
VP1StdCollection(IVP1System *, const QString &helperClassName)
SoMaterial * materialFromVertex(const TrackHandleBase *trk) const
Returns the material for the vertex which knows this trackhandle (if known)
Eigen::Matrix< double, 3, 1 > Vector3D