36#include <Inventor/nodes/SoSeparator.h>
37#include <Inventor/nodes/SoComplexity.h>
38#include <Inventor/nodes/SoTransform.h>
39#include <Inventor/nodes/SoMaterial.h>
40#include <Inventor/nodes/SoDrawStyle.h>
41#include <Inventor/nodes/SoSwitch.h>
42#include <Inventor/nodes/SoLineSet.h>
43#include <Inventor/nodes/SoPickStyle.h>
44#include <Inventor/nodes/SoVertexProperty.h>
45#include <Inventor/SoPath.h>
82 SoSeparator* target = handle->collHandle()->simpleDetailLevel() ? handle->sepSimple() : handle->sepDetailed();
87 theclass->message(
"ERROR: Failed to relocate picked node.");
96 SoLineSet * line =
new SoLineSet;
97 SoVertexProperty * vertices =
new SoVertexProperty;
98 line->vertexProperty = vertices;
103 vertices->vertex.set1Value(i++,pos.x(),pos.y(),pos.z());
112 QList<const Trk::PrepRawData*> currentPRDs;
117 if (prd1&¤tPRDs.contains(prd1)) prd1 = 0;
118 if (prd2&¤tPRDs.contains(prd2)) prd2 = 0;
133 if ((p1-prevpos).
mag2()>(p2-prevpos).
mag2()) {
145 if ((p1-nextpos).
mag2()>(p2-nextpos).
mag2()) {
171 QList<PRDCollHandleBase*> l;
172 for (
const QString&
name : T::availableCollections(
theclass)) {
180 QList<PRDCollHandleBase*> l;
181 l << createSpecificCollections<PRDCollHandle_Pixel>();
182 l << createSpecificCollections<PRDCollHandle_SCT>();
183 l << createSpecificCollections<PRDCollHandle_TRT>();
184 l << createSpecificCollections<PRDCollHandle_SpacePoints>();
185 l << createSpecificCollections<PRDCollHandle_CSC>();
186 l << createSpecificCollections<PRDCollHandle_CSC_Strip>();
187 l << createSpecificCollections<PRDCollHandle_MDT>();
188 l << createSpecificCollections<PRDCollHandle_MM>();
189 l << createSpecificCollections<PRDCollHandle_RPC>();
190 l << createSpecificCollections<PRDCollHandle_TGC>();
191 l << createSpecificCollections<PRDCollHandle_sTGC>();
206 "System showing tracking hits (PRD's)",
207 "Edward.Moyse@cern.ch, Thomas.Kittelmann@cern.ch"),
m_d(new
Imp)
209 m_d->theclass =
this;
215 m_d->appropriatemdtprojection = 0;
216 m_d->selNode_click = 0;
217 m_d->selNode_highlight = 0;
218 m_d->multisel_sep = 0;
233 message(
"Error: Can't retrieve MuonDetectorManager. Expect reduced performance and functionality.");
234 m_d->ensureInitCommonData();
240 if (
m_d->multisel_sep) {
241 m_d->multisel_sep->unref();
245 delete m_d->common;
m_d->common = 0;
256 m_d->common->controller()->collWidget()->clear();
258 m_d->common->clearEventData();
260 if (
m_d->selNode_click) {
263 m_d->selNode_click->unref();
264 m_d->selNode_click=0;
265 m_d->selNode_highlight->unref();
266 m_d->selNode_highlight=0;
269 m_d->clearMultiSelLine();
276 messageVerbose(
"buildPermanentSceneGraph (does not do anything)");
285 SoComplexity * complexity =
new SoComplexity;
286 complexity->value.setValue(0.3f);
287 root->addChild(complexity);
294 QList<PRDCollHandleBase*> cols =
m_d->createCollections();
315 m_d->controller->collWidget()->setCollections(cols);
320 m_d->selNode_click->ref();
322 m_d->selNode_highlight->ref();
325 m_d->selNode_click->policy = SoCooperativeSelection::SINGLE;
326 m_d->selNode_highlight->policy = SoCooperativeSelection::SINGLE;
329 m_d->selNode_click->addChild(col->collSwitch());
330 m_d->selNode_highlight->addChild(
m_d->selNode_click);
331 root->addChild(
m_d->selNode_highlight);
336 if (!
m_d->multisel_sep) {
337 m_d->multisel_sep =
new SoSeparator;
338 m_d->multisel_sep->ref();
339 SoPickStyle * ps =
new SoPickStyle;
340 ps->style= SoPickStyle::UNPICKABLE;
341 m_d->multisel_sep->addChild(ps);
342 m_d->multisel_sep->addChild(
m_d->controller->getMultiSelectionLineMaterial());
344 root->addChild(
m_d->multisel_sep);
356 message(
"WARNING: The PRD system always deselects all registered nodes/");
358 m_d->currentlySelectedHandles.clear();
359 m_d->selectionChanged();
365 m_d->selectionChanged();
386 m_d->selectionChanged();
398 if (
m_d->selNode_highlight==
sel)
407 message(
"Error: Could not identify picked node");
411 if (!
m_d->controller->selectionModeMultiple()) {
412 if (
m_d->currentlySelectedHandles.count()==1&&*(
m_d->currentlySelectedHandles.begin())==handle)
414 m_d->currentlySelectedHandles.clear();
415 m_d->currentlySelectedHandles<<handle;
416 if (handle->
inMuonChamber()&&
m_d->controller->muonOrientToChambersOnClick()) {
419 }
else if (
m_d->controller->zoomOnClick()) {
421 std::set<SoCamera*>::iterator it,itE = cameras.end();
422 for (it=cameras.begin();it!=itE;++it)
425 if (
m_d->controller->printInfoOnClick()) {
426 for (
const QString& line : handle->
clicked())
430 if (
m_d->currentlySelectedHandles.contains(handle)) {
431 m_d->currentlySelectedHandles.removeAll(handle);
433 m_d->currentlySelectedHandles << handle;
437 m_d->selectionChanged();
444 if (
m_d->selNode_highlight==
sel)
452 if (
m_d->selNode_highlight==
sel)
461 if (!
m_d->controller->selectionModeMultiple()) {
462 m_d->currentlySelectedHandles.clear();
463 m_d->selectionChanged();
474 messageVerbose(
"Passing ID projection settings on to collWidget");
480 connect(
m_d->controller,SIGNAL(inDetPartsUsingProjectionsChanged(InDetProjFlags::DetTypeFlags)),
482 InDetProjFlags::DetTypeFlags f =
m_d->controller->inDetPartsUsingProjections();
486 return m_d->controller;
497 serialise.save(
m_d->controller->saveSettings());
498 serialise.save(
m_d->controller->collWidget());
500 serialise.disableUnsavedChecks();
501 return serialise.result();
508 if (
state.version()!=0) {
509 message(
"Warning: State data in .vp1 file is in wrong format - ignoring!");
516 m_d->controller->restoreSettings(
state.restoreByteArray());
517 state.restore(
m_d->controller->collWidget());
519 state.disableUnrestoredChecks();
525 m_d->ensureInitCommonData();
528 m_d->common->trackAndSegmentHelper()->visibleTracksChanged(tracks);
535 m_d->ensureInitCommonData();
538 m_d->common->trackAndSegmentHelper()->visibleSegmentsChanged(segments);
545 messageVerbose(
"emits touchedMuonChambersChanged (ntouchedchambers="+QString::number(s.size())+
")");
559 if (
m_d->appropriatemdtprojection==iproj)
561 m_d->appropriatemdtprojection = iproj;
562 if (!
m_d->controller)
565 mdtcol->setAppropriateProjection(
m_d->appropriatemdtprojection );
571 InDetProjFlags::InDetProjPartsFlags sct,
572 InDetProjFlags::InDetProjPartsFlags trt )
574 messageVerbose(
"Signal received in setApplicableProjections (from "
575 +QString(sender()?sender()->objectName():
"NULL sender")+
")");
576 if (
m_d->idprojflags_pixel==
pixel&&
m_d->idprojflags_sct==sct&&
m_d->idprojflags_trt==trt) {
581 m_d->idprojflags_trt = trt;
582 m_d->idprojflags_sct = sct;
584 if (!
m_d->controller)
588 trtcol->setAppropriateProjection(
m_d->idprojflags_trt);
597 messageVerbose(
"muonChambersWithTracksChanged : received "+
str(chambers.size())+
" chambers.");
607 m_d->ensureInitCommonData();
608 if (
m_d->common &&
m_d->common->touchedMuonChamberHelper())
609 m_d->common->touchedMuonChamberHelper()->updateTouchedByTracks(chambers);
611 message(
"muonChambersWithTracksChanged - helpers not yet created!");
Scalar mag2() const
mag2 method - forward to squaredNorm()
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)
const QString & name() const
void message(const QString &) const
virtual QByteArray saveState()
void setAppropriateProjection(int)
void setAppropriateProjection(InDetProjFlags::InDetProjPartsFlags)
virtual const Trk::PrepRawData * getSecondPRD() const
virtual const Trk::PrepRawData * getPRD() const =0
Amg::Vector3D positionPRD() const
virtual QStringList clicked() const
virtual bool inMuonChamber() const
PRDCollHandleBase * collHandle() const
virtual GeoPVConstLink parentMuonChamberPV() const
Amg::Vector3D positionSecondPRD() const
The Athena Transient Store API.
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 MuonGM::MuonDetectorManager * muonDetMgr()
static bool hasMuonGeometry()
int appropriatemdtprojection
SoCooperativeSelection * selNode_highlight
InDetProjFlags::InDetProjPartsFlags idprojflags_sct
QList< PRDCollHandleBase * > createSpecificCollections()
QList< PRDHandleBase * > currentlySelectedHandles
PRDSystemController * controller
SoSeparator * multisel_sep
QList< PRDCollHandleBase * > createCollections()
void ensureInitCommonData()
InDetProjFlags::InDetProjPartsFlags idprojflags_pixel
SoCooperativeSelection * selNode_click
InDetProjFlags::InDetProjPartsFlags idprojflags_trt
VP1PrepRawDataSystem * theclass
QList< const Trk::PrepRawData * > lastEmittedPRDList
void systemcreate(StoreGateSvc *detstore)
void userPickedNode(SoNode *pickedNode, SoPath *pickedPath)
void touchedMuonChambersChanged(const std::set< GeoPVConstLink > &)
void emitTouchedMuonChambersChanged(const std::set< GeoPVConstLink > &)
void buildEventSceneGraph(StoreGateSvc *sg, SoSeparator *root)
virtual QWidget * buildController()
void appropriateMDTProjectionsChanged(int)
void visibleSegmentsChanged(const std::vector< std::pair< const Trk::Segment *, const SoMaterial * > > &)
void userChangedSelection(SoCooperativeSelection *, const QSet< SoNode * > &, QSet< SoPath * >)
void selectionVisualsChanged()
void buildPermanentSceneGraph(StoreGateSvc *detstore, SoSeparator *root)
void visibleTracksChanged(const std::vector< std::pair< const Trk::Track *, const SoMaterial * > > &)
void selectionModeChanged()
void emitUsedIDProjectionsChanged(InDetProjFlags::DetTypeFlags)
void restoreFromState(QByteArray)
void updateSelectionVisualsAndPossiblyEmitPRDList()
void userSelectedSingleNode(SoCooperativeSelection *, SoNode *, SoPath *)
void prdInMuonChamberSelected(const GeoPVConstLink &chamberPV)
void usedIDProjectionsChanged(InDetProjFlags::DetTypeFlags)
void setApplicableIDProjections(InDetProjFlags::InDetProjPartsFlags pixel, InDetProjFlags::InDetProjPartsFlags sct, InDetProjFlags::InDetProjPartsFlags trt)
virtual void deselectAll(SoCooperativeSelection *exception_sel=0)
void muonChambersWithTracksChanged(const std::set< GeoPVConstLink > &)
void userDeselectedSingleNode(SoCooperativeSelection *, SoNode *, SoPath *)
virtual ~VP1PrepRawDataSystem()
static bool changePathTail(SoPath *path, SoNode *commonBranchPoint, SoNode *newtail)
SoSeparator * collSep() const
All 3D objects from this coll.
Eigen::Matrix< double, 3, 1 > Vector3D