47#include <Inventor/C/errors/debugerror.h>
48#include <Inventor/nodes/SoLineSet.h>
49#include <Inventor/nodes/SoVertexProperty.h>
50#include <Inventor/nodes/SoSeparator.h>
51#include <Inventor/nodes/SoMaterial.h>
52#include <Inventor/nodes/SoPickStyle.h>
53#include <Inventor/nodes/SoCylinder.h>
54#include <Inventor/nodes/SoMatrixTransform.h>
55#include <Inventor/SbRotation.h>
56#include <Inventor/SbMatrix.h>
57#include <Inventor/nodes/SoTranslation.h>
58#include <Inventor/nodes/SoText2.h>
79 static double dist(
const SbVec3f& p1,
const SbVec3f& p2);
147 int & iver,
int& numlines, SoLineSet *, SoVertexProperty * )
const;
149 int & iver,
int& numlines,SoLineSet *, SoVertexProperty * )
const;
166 if (p.x()!=p.x()||fabs(p.x())>1.0*CLHEP::km)
168 if (p.y()!=p.y()||fabs(p.y())>1.0*CLHEP::km)
170 if (p.z()!=p.z()||fabs(p.z())>1.0*CLHEP::km)
199 theclass->collHandle()->systemBase()->message(
"ERROR: No path information for track in collection "+
theclass->collHandle()->name());
214 if (
m_d->extraRepresentation)
222 if (
m_d->points_propagated !=
m_d->points_raw)
223 delete m_d->points_propagated;
224 delete m_d->points_raw;
225 if (
m_d->points_propagated_id_projections !=
m_d->points_raw_id_projections)
226 delete m_d->points_propagated_id_projections;
227 delete m_d->points_raw_id_projections;
228 if (
m_d->points_propagated_muon_projections !=
m_d->points_raw_muon_projections)
229 delete m_d->points_propagated_muon_projections;
230 delete m_d->points_raw_muon_projections;
235 if (
m_d->randommaterial)
236 m_d->randommaterial->unref();
238 m_d->label_sep->unref();
241 for (it =
m_d->attachmentHandles.begin();it!=itE;++it)
263 if (!
m_d->tsos_ascobjs)
265 std::vector<AssociatedObjectHandleBase*>::iterator
266 it(
m_d->tsos_ascobjs->begin()),
267 itE(
m_d->tsos_ascobjs->end());
269 if ((*it)->hasMeasurement())
270 (*it)->update3DObjects();
276 if (!
m_d->tsos_ascobjs)
278 std::vector<AssociatedObjectHandleBase*>::iterator
279 it(
m_d->tsos_ascobjs->begin()),
280 itE(
m_d->tsos_ascobjs->end());
282 if ((*it)->hasError())
283 (*it)->update3DObjects();
289 if (!
m_d->tsos_ascobjs)
291 std::vector<AssociatedObjectHandleBase*>::iterator
292 it(
m_d->tsos_ascobjs->begin()),
293 itE(
m_d->tsos_ascobjs->end());
295 if ((*it)->hasMaterialEffect())
296 (*it)->update3DObjects();
302 return m_d->shownTSOSParts;
308 return m_d->customColouredTSOSParts;
316 if (
m_d->shownTSOSParts==f){
322 TrackCommonFlags::TSOSPartsFlags change(
m_d->shownTSOSParts ^ f);
323 m_d->shownTSOSParts=f;
330 std::vector<AssociatedObjectHandleBase*>::iterator it(
m_d->tsos_ascobjs->begin()), itE(
m_d->tsos_ascobjs->end());
331 for (;it!=itE;++it) {
332 const bool vis = (*it)->parts() &
m_d->shownTSOSParts;
333 if (!((*it)->parts()&change)){
337 if (vis==(*it)->visible()) {
339 (*it)->update3DObjects();
345 (*it)->update3DObjects();
346 (*it)->setVisible(vis);
349 (*it)->setVisible(vis);
350 (*it)->update3DObjects();
358 if (
m_d->customColouredTSOSParts==f)
361 TrackCommonFlags::TSOSPartsFlags change(
m_d->customColouredTSOSParts ^ f);
362 m_d->customColouredTSOSParts=f;
367 TrackCommonFlags::TSOSPartsFlags changedShownParts(change &
m_d->shownTSOSParts);
369 if (!changedShownParts)
372 std::vector<AssociatedObjectHandleBase*>::iterator it(
m_d->tsos_ascobjs->begin()), itE(
m_d->tsos_ascobjs->end());
373 for (;it!=itE;++it) {
374 if ((*it)->parts()&changedShownParts)
375 (*it)->update3DObjects();
382 std::cout<<
"TrackHandleBase::ensureInitTSOSs"<<std::endl;
386 tsos_ascobjs =
new std::vector<AssociatedObjectHandleBase*>;
387 m_d->ensureLoadPathInfo();
389 if (!
m_d->pathInfo_TrkTrack||!
m_d->pathInfo_TrkTrack->trackParameters()||
m_d->pathInfo_TrkTrack->trackParameters()->empty())
392 tsos_ascobjs->reserve(
m_d->pathInfo_TrkTrack->trackParameters()->size());
394 unsigned parindex(0);
400 for (; tsos_iter != tsos_end; ++tsos_iter) {
401 trackParam = (*tsos_iter)->trackParameters();
411 if (ascObjNeedDistToNext&&trackParam) {
413 ascObjNeedDistToNext =
nullptr;
416 ascObjNeedDistToNext =
m_d->addTSOS(*tsos_iter,parindex++);
436 std::cout<<
"TrackHandleBase::setVisible"<<std::endl;
437 QString tmp = (vis)?
"True":
"False";
438 QString tmp2 = (
m_visible)?
"True":
"False";
439 VP1Msg::messageDebug(QString(
"TrackHandleBase calling setVisible with vis=")+tmp+QString(
", and m_visible=")+tmp2 );
442 std::cout<<
"TrackHandleBase::setVisible 1"<<std::endl;
452 m_d->rebuild3DObjects();
454 m_d->attach3DObjects();
461 m_d->detach3DObjects();
464 std::cout<<
"TrackHandleBase::setVisible 2"<<std::endl;
467 bool initTSOS(
false);
472 std::cout<<
"m_d->tsos_ascobjs: "<<
m_d->tsos_ascobjs<<std::endl;
474 std::cout<<
"TrackHandleBase::setVisible 3"<<std::endl;
476 if (!initTSOS &&
m_d->tsos_ascobjs) {
477 std::vector<AssociatedObjectHandleBase*>::iterator
478 it(
m_d->tsos_ascobjs->begin()),
479 itE(
m_d->tsos_ascobjs->end());
481 for (;it!=itE;++it) {
482 if ((*it)->visible()!=((*it)->parts() &
m_d->shownTSOSParts))
483 (*it)->toggleVisible();
486 for (;it!=itE;++it) {
487 if ((*it)->visible())
488 (*it)->setVisible(
false);
492 std::cout<<
"TrackHandleBase::setVisible 4"<<std::endl;
497 for (it =
m_d->attachmentHandles.begin();it!=itE;++it)
498 it->second->trackVisibilityChanged();
507 VP1Msg::messageVerbose(QString(
"TrackHandleBase::update3DObject with maxR set to ")+QString::number(maxR) );
509 m_d->tempMaxPropRadius=maxR;
511 if ( invalidatePropagatedPoints) {
512 if (
m_d->points_propagated !=
m_d->points_raw) {
513 delete m_d->points_propagated;
m_d->points_propagated =
nullptr;
515 delete m_d->points_raw;
m_d->points_raw =
nullptr;
516 if (
m_d->points_propagated_id_projections) {
delete m_d->points_propagated_id_projections;
m_d->points_propagated_id_projections =
nullptr; }
517 if (
m_d->points_propagated_muon_projections) {
delete m_d->points_propagated_muon_projections;
m_d->points_propagated_muon_projections =
nullptr; }
520 m_d->rebuild3DObjects();
525 m_d->tempMaxPropRadius=0.0;
532 if (
m_d->points_raw_id_projections!=
m_d->points_propagated_id_projections)
533 delete m_d->points_propagated_id_projections;
534 delete m_d->points_raw_id_projections;
535 m_d->points_raw_id_projections =
nullptr;
536 m_d->points_propagated_id_projections =
nullptr;
545 if (
m_d->points_raw_muon_projections!=
m_d->points_propagated_muon_projections)
546 delete m_d->points_propagated_muon_projections;
547 delete m_d->points_raw_muon_projections;
548 m_d->points_raw_muon_projections =
nullptr;
549 m_d->points_propagated_muon_projections =
nullptr;
557 int & iver,
int& numlines,
558 SoLineSet *
line, SoVertexProperty * vertices )
const
563 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (1) ERROR: Unexpected null SoLineSet pointer!");
567 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (1) ERROR: Unexpected null SoVertexPropery pointer!");
570 std::vector<Amg::Vector3D >::const_iterator pointsIt, pointsItEnd(points.end());
571 unsigned npointsused(0);
574 float maxR2=
theclass->common()->controller()->propMaxRadius()>0.0?
theclass->common()->controller()->propMaxRadius():std::numeric_limits<float>::max();
577 theclass->collHandle()->systemBase()->messageVerbose(
"maxR2 is set to "+
VP1Msg::str(maxR2));
579 float vertexPlanePhi = (
theclass->common()->controller()->vertexProjectionAngle())*
M_PI/180;
580 vertexPlanePhi-=
M_PI;
585 theclass->collHandle()->systemBase()->messageVerbose(
"Vertex projection is set to "+
VP1Msg::str(vertexPlanePhi));
592 double trkPhi =
theclass->momentum().phi();
593 double newPhi= vertexPlanePhi+
M_PI;
594 if (cos(vertexPlanePhi-trkPhi)>0) newPhi=vertexPlanePhi;
597 for (pointsIt = points.begin();pointsIt!=pointsItEnd && pointsIt->mag2()<maxR2; ++pointsIt) {
600 theclass->collHandle()->systemBase()->message(
"WARNING: Ignoring point on track:"+
VP1Msg::str( *pointsIt ) );
605 tempPoint = *pointsIt;
610 vertices->vertex.set1Value(iver++,tempPoint.x(),tempPoint.y(),tempPoint.z());
612 vertices->vertex.set1Value(iver++,pointsIt->x(),pointsIt->y(),pointsIt->z());
616 line->numVertices.set1Value(numlines++,npointsused);
621 int & iver,
int& numlines,
622 SoLineSet *
line, SoVertexProperty * vertices )
const
624 if ( !paths || ( paths->size()==1 && paths->begin()->empty()) )
627 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (2) ERROR: Unexpected null SoLineSet pointer!");
631 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (2) ERROR: Unexpected null SoVertexPropery pointer!");
634 Amg::SetVectorVector3D::const_iterator itProjPart, itProjPartEnd(paths->end());
635 for (itProjPart = paths->begin();itProjPart!=itProjPartEnd;++itProjPart)
665 if (
theclass->common()->trackPropagationHelper()->showExtrapolationSurfaces())
666 theclass->common()->trackPropagationHelper()->getExtrapolationSurfaces().clear();
683 std::vector<Amg::Vector3D > * points;
698 line =
new SoLineSet();
702 SoVertexProperty * vertices =
new SoVertexProperty();
704 int iver(0), numlines(0);
714 line->vertexProperty = vertices;
720 if (
theclass->common()->trackPropagationHelper()->showExtrapolationSurfaces()){
721 std::vector<Trk::PlaneSurface>& surfaces =
theclass->common()->trackPropagationHelper()->getExtrapolationSurfaces();
722 std::vector<Trk::PlaneSurface>::const_iterator surfIt=surfaces.begin(), surfEnd=surfaces.end();
725 for (;surfIt!=surfEnd;++surfIt){
728 SoNode * nodeToAdd = theSurfSep;
735 if (!points->empty() &&
theclass->common()->controller()->doTrackLabels() ){
744 SoText2 *labelText =
new SoText2;
747 TrackSystemController::TrackLabelModes labels=
theclass->common()->controller()->trackLabels();
762 text <<
"pdg: "+QString::number(pdg)+
" ["+name+
"]";
764 text <<
"pdg: "+QString::number(pdg);
774 <<
" MDT["+QString::number(
theclass->getNMDTHits())+
"], RPC["+QString::number(
theclass->getNRPCHits())+
"], TGC["+QString::number(
theclass->getNTGCHits())+
"], CSC["+QString::number(
theclass->getNCSCHits())+
"] MM["+QString::number(
theclass->getNMMHits())+
"], sTGC["+QString::number(
theclass->getNsTGCHits())+
"]";
780 if (mom.mag2()==0.0) {
781 text <<
"Momentum : 0 (undefined)";
786 double pseudoRapidity = mom.eta();
793 for(
const QString&
str : text){
794 QByteArray array =
str.toLatin1();
795 labelText->string.set1Value(row++,array.data());
799 float labelTrackOffset =
theclass->common()->controller()->trackLabelTrkOffset();
800 unsigned int point=(points->size()-1)*labelTrackOffset;
811 SoTranslation *labelTranslate =
new SoTranslation;
813 int xOffset =
theclass->common()->controller()->labelXOffset() ;
814 int yOffset =
theclass->common()->controller()->labelYOffset() ;
815 int zOffset =
theclass->common()->controller()->labelZOffset() ;
816 labelTranslate->translation.setValue(labelPos.x()+(xOffset*offScale),labelPos.y()+(yOffset*offScale),labelPos.z()+(zOffset*offScale));
818 SoMaterial *sMat =
new SoMaterial();
820 sColor.setValue(SbColor(0, 0, 1));
821 sMat->diffuseColor = sColor;
838 it->second->trackMaterialChanged();
844 float x1,x2,y1,y2,z1,z2;
845 p1.getValue(x1,y1,z1);
846 p2.getValue(x2,y2,z2);
847 return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
854 SoVertexProperty *vertices =
static_cast<SoVertexProperty *
>(
line->vertexProperty.getValue());
859 lastTransf.makeIdentity();
861 for (
int iline=0;iline<
line->numVertices.getNum();++iline) {
862 int nvert=
line->numVertices[iline];
867 for (
int jvert= ivert; jvert<ivert+nvert-1;++jvert) {
868 SbVec3f p1 = vertices->vertex[jvert].getValue();
869 SbVec3f p2 = vertices->vertex[jvert+1].getValue();
870 SoCylinder * cyl =
new SoCylinder;
871 cyl->radius = cylradius;
872 const double l(
dist(p1,p2));
876 m.setTranslate(SbVec3f(0,0.5*l,0));
877 SbVec3f v(p2); v -= p1;
878 SbRotation rot(SbVec3f(0,1,0),v);
879 SbMatrix m2; m2.setRotate(rot);
888 mat.multRight(lastTransf.inverse());
889 SoMatrixTransform * mt =
new SoMatrixTransform;
890 mt->matrix.setValue(mat);
912 double tube_r(
theclass->m_collhandle->trackTubeRadius());
964 SoMaterial * newmat =
m_d->determineMaterial();
967 m_d->detach3DObjects();
970 m_d->attach3DObjects();
971 m_d->materialChanged();
979 m_d->materialChanged();
1003 bool unsafeparts(
false);
1007 for (; tsos_iter != tsos_end; ++tsos_iter) {
1012 if (
theclass->collHandle()->ignoreMEOTinProp() && (*tsos_iter)->materialEffectsOnTrack())
1014 trackParam = (*tsos_iter)->trackParameters();
1022 if (!firstmomentum) {
1028 theclass->collHandle()->systemBase()->message(
"WARNING: Ignored unsafe parts of track!");
1030 if (!firstmomentum) {
1031 theclass->collHandle()->systemBase()->message(
" TrackHandleBase ERROR: Unexpected null firstmomentum!");
1034 if (firstmomentum->mag()==0.0) {
1035 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: Only point on track had zero momentum. Can't add second point.");
1042 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: No points on track.");
1045 delete firstmomentum;
1046 firstmomentum =
nullptr;
1052 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: Less than two points on track provided.");
1057 +
" points for track.");
1074 theclass->collHandle()->propagator(),
1075 theclass->extrapolationParticleHypothesis(),
1076 !
theclass->collHandle()->ignoreMEOTinProp(),
1077 theclass->collHandle()->extendTracks() ?
theclass->common()->controller()->extrapolateToThisVolume() :
nullptr );
1117 std::vector<Amg::Vector3D > * points=
nullptr;
1129 if ( !points || points->empty() || points->size()<2 ) {
1130 projections->clear();
1131 projections->insert(std::vector<Amg::Vector3D >());
1136 if (
theclass->common()->indetProjHelper_Pixel()) {
1137 theclass->common()->indetProjHelper_Pixel()->projectPath(*points,*projections);
1140 if (
theclass->common()->indetProjHelper_SCT()) {
1141 theclass->common()->indetProjHelper_SCT()->projectPath(*points,*projections);
1144 if (
theclass->common()->indetProjHelper_TRT()) {
1145 theclass->common()->indetProjHelper_TRT()->projectPath(*points,*projections);
1150 projections->clear();
1151 projections->insert(std::vector<Amg::Vector3D >());
1179 std::vector<Amg::Vector3D > * points;
1193 projections->insert(std::vector<Amg::Vector3D >());
1200 bool outsidechamber;
1201 std::vector<Amg::Vector3D > proj1, proj2;
1204 for (std::set<GeoPVConstLink>::iterator it=
theclass->touchedMuonChambers().begin(); it!=
theclass->touchedMuonChambers().end(); ++it){
1214 std::vector<Amg::Vector3D >::const_iterator pointsIt=points->begin(), pointsItEnd=points->end()-1;
1215 for (;pointsIt!=pointsItEnd; ++pointsIt) {
1219 firstEndWall_pointA, firstEndWall_pointB,
1220 secondEndWall_pointA, secondEndWall_pointB,
1224 theclass->collHandle()->systemBase()->message(
"TrackHandleBase Error: "
1225 "Problems with projectAndConstrainLineSegmentToMDTChamberEndWalls(..)");
1231 if (!outsidechamber){
1232 if ( proj1.empty() ) {
1233 proj1.push_back(firstEndWall_pointA); proj1.push_back(firstEndWall_pointB);
1235 if ( proj1[proj1.size()-1] == firstEndWall_pointA ) {
1236 proj1.push_back(firstEndWall_pointB);
1239 projections->insert(proj1); proj1.clear();
1240 proj1.push_back(firstEndWall_pointA); proj1.push_back(firstEndWall_pointB);
1243 if ( proj2.empty() ) {
1244 proj2.push_back(secondEndWall_pointA); proj2.push_back(secondEndWall_pointB);
1248 if ( proj2[proj2.size()-1] == secondEndWall_pointA ) {
1249 proj2.push_back(secondEndWall_pointB);
1252 projections->insert(proj2); proj2.clear();
1253 proj2.push_back(secondEndWall_pointA); proj2.push_back(secondEndWall_pointB);
1259 if ( !proj1.empty() ) {
1260 projections->insert(proj1);
1262 if ( !proj2.empty() ) {
1263 projections->insert(proj2);
1271 m_d->touchedmuonchambers.insert(chamberPV);
1277 if (!
m_d->inittouchedchambers) {
1280 m_d->inittouchedchambers=
true;
1282 return m_d->touchedmuonchambers;
1292 switch(
theclass->collHandle()->colourBy()) {
1302 theclass->rerandomiseRandomMaterial();
1309 return theclass->common()->controller()->getMaterialForMomentum(
theclass->momentum().mag());
1325 if (handle==
nullptr) {
1327 return theclass->collHandle()->material();
1333 float phiDistance = sqrt (
pow( selectedTrackMom.phi() - thisTrackMom.phi(),2) );
1334 float etaDistance = sqrt (
pow( selectedTrackMom.eta() - thisTrackMom.eta(),2) );
1337 float colScale=std::max(0.0, std::min(1.0,phiDistance/(
M_PI)));
1338 float brightness= std::max(0.2, 1.0-(etaDistance/5.0) );
1341 SoMaterial* mat =
new SoMaterial;
1345 const SbColor& col=
theclass->collHandle()->material()->diffuseColor[0];
1347 col.getValue(
r,g,b);
1350 if (colScale>0.01) {
1353 QColor tempCol = QColor::fromRgbF(
r,g,b );
1355 tempCol.getHsvF(&
h,&s,&v);
1360 tempCol.setHsvF(
h,s,v);
1362 tempCol.getRgbF(&r2,&g2,&b2);
1365 r3 =
r+(r2-
r)*colScale;
1366 b3 = b+(b2-b)*colScale;
1367 g3 = g+(g2-g)*colScale;
1375 theclass->collHandle()->collMaterialBrightness(),
1376 theclass->collHandle()->collMaterialTransparency());
1382 SoMaterial* mat =
theclass->common()->system()->materialFromVertex(
theclass);
1386 return theclass->collHandle()->material();
1390 return theclass->collHandle()->material();
1397 if ( !
m_d->randommaterial )
1400 double r2 = 0.3*0.3;
1405 r = (rand() /
static_cast<double>(RAND_MAX));
1406 g = (rand() /
static_cast<double>(RAND_MAX));
1407 b = (rand() /
static_cast<double>(RAND_MAX));
1411 if ( (
r-1.0)*(
r-1.0)+g*g+b*b < r2*0.5 )
1413 else if (
r*
r/(
r*
r+g*g+b*b) > 0.8 )
1415 else if (
r*
r+g*g+b*b < r2*2.0 )
1424 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::rerandomiseRandomMaterial Warning: Random colour could"
1425 " not be selected such as to satisfy all separation criterias");
1438 if ( !
m_d->randommaterial )
1441 m_d->randommaterial->diffuseColor[0].getValue(
r,g,b);
1452 if (
m_d->associatedObjects.contains(ao)) {
1453 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::registerAssocObject ERROR: object already registered!");
1459 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::registerAssocObject ERROR: object is null!");
1463 m_d->associatedObjects << ao;
1471 it =
m_d->attachmentHandles.find(std::make_pair(regionIndex,crossoverval));
1472 if (it!=
m_d->attachmentHandles.end())
1476 m_d->attachmentHandles[std::make_pair(regionIndex,crossoverval)] = attachHandle;
1477 return attachHandle;
1510 if (
m_d->chargeinit)
1512 m_d->chargeinit =
true;
1522 m_d->massinit =
true;
1556 if (mom.mag2()==0.0) {
1557 l <<
"Momentum : 0 (undefined)";
1589 m_d->ensureLoadPathInfo();
1590 if (
m_d->pathInfo_TrkTrack) {
1593 for (; tsos_iter != tsos_end; ++tsos_iter) {
1594 if (
common()->trackSanityHelper()->isSafe(*tsos_iter)) {
1596 if (
common()->trackSanityHelper()->isSafe(trackParam))
1600 }
else if (
m_d->pathInfo_Points&&!
m_d->pathInfo_Points->empty()) {
1601 return m_d->pathInfo_Points->at(0);
1609 m_d->ensureLoadPathInfo();
1610 if (
m_d->pathInfo_TrkTrack) {
1613 for (; tsos_iter != tsos_end; ++tsos_iter) {
1614 if (
common()->trackSanityHelper()->isSafe(*tsos_iter)) {
1616 if (
common()->trackSanityHelper()->isSafe(trackParam))
1620 }
else if (
m_d->pathInfo_Points&&!
m_d->pathInfo_Points->empty()) {
1621 return m_d->pathInfo_Points->back();
1628 std::optional<Amg::Vector3D> start =
startPoint();
1629 if (!start)
return false;
1630 return start->perp()<1100 &&fabs( start->z())<3500;
1636 return m_d->associatedObjects;
1641 m_d->ensureInitPointsPropagated();
1642 return m_d->points_propagated;
1691 bool b =
m_d->trackhandle->visible();
1692 if (b&&!
m_d->trackhandle->currentMaterial())
1693 VP1Msg::message(
"ERROR: track is visible but has not current material!!");
1695 m_d->ensureAttached();
1697 m_d->ensureDetached();
1702 :
m_d ( new
Imp(tlh,th) )
1705 VP1Msg::message(
"AssocObjAttachmentHandle ERROR: constructed with null LOD handle!");
1718 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes detected wrong pickStyleChildIdx");
1731 if (
m_d->septrack_simple)
1732 m_d->septrack_simple->unref();
1733 if (
m_d->septrack_detailed)
1734 m_d->septrack_detailed->unref();
1736 m_d->trackmat->unref();
1743 SoMaterial * m =
m_d->trackhandle->currentMaterial();
1744 if (
m_d->trackmat==m)
1747 if (
m_d->trackhandle->visible())
1748 VP1Msg::message(
"ERROR: track is visible but has no current material!!");
1752 if (
m_d->trackmat) {
1753 if (
m_d->septrack_simple &&
m_d->septrack_simple->findChild(
m_d->trackmat) > -1 )
1754 m_d->septrack_simple->replaceChild(
m_d->trackmat,m);
1755 if (
m_d->septrack_detailed &&
m_d->septrack_detailed->findChild(
m_d->trackmat) > -1 )
1756 m_d->septrack_detailed->replaceChild(
m_d->trackmat,m);
1757 m_d->trackmat->unref();
1774 pickStyle->style=SoPickStyle::UNPICKABLE;
1787 if (!
m_d->trackhandle->visible())
1790 if (!
m_d->trackmat) {
1791 SoMaterial * m =
m_d->trackhandle->currentMaterial();
1796 m_d->septrack_simple->addChild(m);
1797 m_d->septrack_detailed->addChild(m);
1803 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::attachNodes detected wrong pickStyleChildIdx");
1806 if (
m_d->septrack_simple->findChild(simple)>-1||
m_d->septrack_detailed->findChild(detailed)>-1) {
1807 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::attachNodes Already attached!");
1812 if (
m_d->pickStyleChildIdx==-1) {
1813 m_d->pickStyleChildIdx =
m_d->septrack_simple->getNumChildren();
1817 m_d->septrack_simple->addChild(simple);
1818 m_d->septrack_detailed->addChild(detailed);
1820 if (
m_d->pickStyleChildIdx>-1) {
1821 m_d->septrack_simple->insertChild(simple,
m_d->pickStyleChildIdx);
1822 m_d->septrack_detailed->insertChild(detailed,
m_d->pickStyleChildIdx);
1823 ++(
m_d->pickStyleChildIdx);
1825 m_d->septrack_simple->addChild(simple);
1826 m_d->septrack_detailed->addChild(detailed);
1831 if (
m_d->trackhandle->visible() &&
m_d->septrack_simple->getNumChildren() == 2 + (
m_d->pickStyleChildIdx==-1?0:1)) {
1832 m_d->ensureAttached();
1841 +QString(unpickable?
"true":
"false"));
1842 if (!simple||!detailed) {
1843 VP1Msg::messageVerbose(
"AssocObjAttachmentHandle::setPickableStateOfNodes ERROR: Called with null pointers!");
1848 int isimple =
m_d->septrack_simple->findChild(simple);
1850 if (
m_d->septrack_simple->getNumChildren()!=
m_d->septrack_detailed->getNumChildren()) {
1851 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes septrack_simple->getNumChildren()"
1852 "!=m_d->septrack_detailed->getNumChildren().");
1855 int idetailed =
m_d->septrack_detailed->findChild(detailed);
1856 if (idetailed!=isimple) {
1857 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes"
1858 " called with simple and detailed nodes that are not at same child idx!");
1863 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes detected wrong pickStyleChildIdx");
1869 " called with nodes that are not currently children. Calling attachNodes(..)." );
1873 if (unpickable == (
m_d->pickStyleChildIdx>-1&&isimple>
m_d->pickStyleChildIdx)) {
1875 " already in correct state.");
1882 m_d->septrack_simple->removeChild(simple);
1883 m_d->septrack_detailed->removeChild(detailed);
1884 if (
m_d->pickStyleChildIdx==-1) {
1885 m_d->pickStyleChildIdx =
m_d->septrack_simple->getNumChildren();
1889 --(
m_d->pickStyleChildIdx);
1891 m_d->septrack_simple->addChild(simple);
1892 m_d->septrack_detailed->addChild(detailed);
1894 if (
m_d->pickStyleChildIdx==-1) {
1895 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes Inconsistent logic");
1900 if (
m_d->pickStyleChildIdx==isimple-1&&isimple==
m_d->septrack_simple->getNumChildren()-1) {
1905 m_d->pickStyleChildIdx = -1;
1908 m_d->septrack_simple->removeChild(simple);
1909 m_d->septrack_detailed->removeChild(detailed);
1910 m_d->septrack_simple->insertChild(simple,
m_d->pickStyleChildIdx);
1911 m_d->septrack_detailed->insertChild(detailed,
m_d->pickStyleChildIdx);
1912 ++(
m_d->pickStyleChildIdx);
1924 int isimple =
m_d->septrack_simple->findChild(simple);
1926 if (!simple||!detailed) {
1930 if (
m_d->septrack_simple->getNumChildren()!=
m_d->septrack_detailed->getNumChildren()) {
1931 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes septrack_simple->getNumChildren()"
1932 "!=m_d->septrack_detailed->getNumChildren().");
1937 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes detected wrong pickStyleChildIdx");
1941 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes Not previously attached!");
1944 if (
m_d->septrack_detailed->findChild(detailed)!=isimple) {
1945 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes"
1946 " called with simple and detailed nodes that are not at same child idx!");
1950 m_d->septrack_simple->removeChild(simple);
1951 m_d->septrack_detailed->removeChild(detailed);
1952 if (
m_d->pickStyleChildIdx!=-1
1953 && isimple>
m_d->pickStyleChildIdx
1954 &&
m_d->pickStyleChildIdx==
m_d->septrack_simple->getNumChildren()-1 ) {
1958 m_d->pickStyleChildIdx = -1;
1962 if (
m_d->trackhandle->visible() &&
m_d->septrack_simple->getNumChildren() == 1 + (
m_d->pickStyleChildIdx==-1?0:1))
1963 m_d->ensureDetached();
1988 VP1Msg::message(
"TrackHandleBase::getReadoutElement:: Unable to find matching readoutElement");
1998 QList<AssociatedObjectHandleBase*> l;
1999 if (!
m_d->tsos_ascobjs)
return l;
2000 std::vector<AssociatedObjectHandleBase*>::iterator
2001 it(
m_d->tsos_ascobjs->begin()),
2002 itE(
m_d->tsos_ascobjs->end());
2004 if ((*it)->hasMeasurement()&&(*it)->visible())
2012 assert(
m_d->m_objBrowseTree==0);
2013 m_d->m_objBrowseTree =
new QTreeWidgetItem();
2015 QString direction = QString::fromUtf8(
"(\u03B7,\u03D5)=[") + QString::number(
momentum().
eta(),
'f',2) +
","+QString::number(
momentum().
phi(),
'f',2)+
"], ";
2017 m_d->m_objBrowseTree->setText(0,
type()+QString(QString::number(listOfItems.size())) );
2018 m_d->m_objBrowseTree->setText(1, l );
2021 m_d->m_objBrowseTree->setFlags(Qt::ItemFlags());
2039 browserTreeItem()->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
2042 itemFont.setStrikeOut(!
visible());
const boost::regex re(r_e)
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static const Attributes_t empty
constexpr int pow(int base, int exp) noexcept
void setDistToNextPar(const double &)
virtual TrackCommonFlags::TSOSPartsFlags parts() const
virtual void setVisible(bool)
Amg::Vector3D approxCenter() const
TrackHandleBase * trackhandle
SoSeparator * septrack_detailed
Imp(TrackLODHandle *tlh, TrackHandleBase *th)
SoSeparator * septrack_simple
static SoPickStyle * pickStyle
static SoMaterial * dummymaterial
TrackLODHandle * lodHandle
~AssocObjAttachmentHandle()
void attachNodes(SoNode *simple, SoNode *detailed, bool unpickable)
void trackMaterialChanged()
AssocObjAttachmentHandle(TrackLODHandle *, TrackHandleBase *)
friend class TrackHandleBase
void setPickableStateOfNodes(SoNode *simple, SoNode *detailed, bool unpickable)
Will attach if not currently attached.
void trackVisibilityChanged()
void detachNodes(SoNode *simple, SoNode *detailed)
Header file for AthHistogramAlgorithm.
DataModel_detail::const_iterator< DataVector > const_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
bool isKnownMDTChamber(const GeoPVConstLink &mdtChamber)
bool projectAndConstrainLineSegmentToMDTChamberEndWalls(const GeoPVConstLink &mdtChamber, const Amg::Vector3D &pointA, const Amg::Vector3D &pointB, Amg::Vector3D &firstEndWall_pointA, Amg::Vector3D &firstEndWall_pointB, Amg::Vector3D &secondEndWall_pointA, Amg::Vector3D &secondEndWall_pointB, bool &outsidechamber)
const RpcReadoutElement * getRpcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MMReadoutElement * getMMReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const TgcReadoutElement * getTgcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const sTgcReadoutElement * getsTgcReadoutElement(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.
static const int unknownPDG
SoNode * translateSurface(const Trk::Surface &sf, const bool &simple=false) const
void decrementNumberOfObjectsForPV(const GeoPVConstLink &chamberPV)
void incrementNumberOfObjectsForPV(const GeoPVConstLink &chamberPV)
AscObj_TSOS * addTSOS(const Trk::TrackStateOnSurface *tsos, unsigned index) const
std::map< std::pair< int, double >, AssocObjAttachmentHandle * > attachmentHandles
const std::vector< Amg::Vector3D > * pathInfo_Points
Used in all other cases.
Amg::SetVectorVector3D * points_propagated_id_projections
QList< AssociatedObjectHandleBase * > associatedObjects
void addPathsToSoLineSetAndSoVertexProperty(const Amg::SetVectorVector3D *paths, int &iver, int &numlines, SoLineSet *, SoVertexProperty *) const
void ensureInitPointsProjections_Muon(bool raw)
void addPathToSoLineSetAndSoVertexProperty(const std::vector< Amg::Vector3D > &points, int &iver, int &numlines, SoLineSet *, SoVertexProperty *) const
SoMaterial * determineMaterial()
void ensureInitPointsPropagated()
SoSeparator * extrapSurfaces_sep
for debugging.
TrackCommonFlags::TSOSPartsFlags shownTSOSParts
const Trk::Track * pathInfo_TrkTrack
Used in the case of a Trk::Track.
void ensureLoadPathInfo()
static double dist(const SbVec3f &p1, const SbVec3f &p2)
Amg::SetVectorVector3D * points_raw_id_projections
SoSeparator * extraRepresentation
std::set< GeoPVConstLink > touchedmuonchambers
TrackHandleBase * theclass
static bool isSane(const Amg::Vector3D &p)
SoMaterial * randommaterial
static void convertLineSetToCylinders(SoLineSet *line, SoSeparator *sep, const double &cylradius)
std::vector< Amg::Vector3D > * points_propagated
std::vector< Amg::Vector3D > * points_raw
void ensureInitPointsProjections_InDet(bool raw)
QTreeWidgetItem * m_objBrowseTree
void ensureInitPointsRaw()
Amg::SetVectorVector3D * points_raw_muon_projections
Amg::SetVectorVector3D * points_propagated_muon_projections
std::vector< AssociatedObjectHandleBase * > * tsos_ascobjs
TrackCommonFlags::TSOSPartsFlags customColouredTSOSParts
void registerTouchedMuonChamber(const GeoPVConstLink &) const
If not earlier, touched muon chambers must me registered at latest when this method is invoked.
void rerandomiseRandomMaterial()
virtual QString shortInfo() const
returns mom and hit information about track
void setCustomColouredTSOSParts(TrackCommonFlags::TSOSPartsFlags f)
TrackCommonFlags::TSOSPartsFlags customColouredTSOSParts() const
QList< AssociatedObjectHandleBase * > getVisibleMeasurements() const
virtual const Trk::Track * provide_pathInfoTrkTrack() const
void updateShapes_TSOSWithMaterialEffects()
virtual int pdgCode() const
0 means unknown
const std::set< GeoPVConstLink > & touchedMuonChambers() const
virtual void fillObjectBrowser(QList< QTreeWidgetItem * > &list)
Called in child classes.
virtual double calculateCharge() const
virtual unsigned getNTRTHits() const
virtual unsigned getNMDTHits() const
void updateMuonProjections()
virtual void visibleStateChanged()
override if need to take action in this case.
QTreeWidgetItem * browserTreeItem() const
virtual unsigned getNMMHits() const
friend class TrackCollHandleBase
friend class AssociatedObjectHandleBase
AssocObjAttachmentHandle * getAttachmentHandle(int regionIndex, const double &crossoverval)
friend class AssocObjAttachmentHandle
TrackHandleBase(TrackCollHandleBase *)
void setVisible(bool)
use by the collection handle.
virtual std::optional< Amg::Vector3D > startPoint() const
returns 0 if can't find start point.
virtual void ensureTouchedMuonChambersInitialised() const
void updateInDetProjections()
virtual Trk::ParticleHypothesis extrapolationParticleHypothesis() const
Default implementation of this next method bases hypothesis on pdgCode() and charge():
virtual unsigned getNSCTHits() const
virtual std::optional< Amg::Vector3D > endPoint() const
returns 0 if can't find start point.
virtual double mass() const
void updateShapes_TSOSWithErrors()
TrackCommonFlags::TSOSPartsFlags shownTSOSParts() const
virtual unsigned getNTGCHits() const
virtual unsigned getNCSCHits() const
void updateShapes_TSOSWithMeasurements()
QStringList baseInfo() const
virtual const MuonGM::MuonReadoutElement * getMuonReadoutElement(const Trk::RIO_OnTrack &mb) const
virtual unsigned getNRPCHits() const
virtual Amg::Vector3D momentum() const
void setShownTSOSParts(TrackCommonFlags::TSOSPartsFlags f)
virtual bool isIDTrack() const
virtual unsigned getNMuonHits() const
void updateRandomColourTransparencyAndBrightness()
virtual unsigned getNsTGCHits() const
TrackCollHandleBase * collHandle() const
std::vector< Amg::Vector3D > * hackGetPointsPropagated()
FIXME.
SoMaterial * m_currentmaterial
TrackSysCommonData * common() const
virtual void ensureInitTSOSs(std::vector< AssociatedObjectHandleBase * > *&)
Ensure that the TSOSs are initialized.
virtual ~TrackHandleBase()
static int numberOfInstances()
virtual unsigned getNPixelHits() const
const QList< AssociatedObjectHandleBase * > & getAllAscObjHandles() const
override if need to take action in this case.
void update3DObjects(bool invalidatePropagatedPoints=false, float maxR=0.0)
virtual QString type() const
return very short word with type (maybe link with collection type?)
TrackCollHandleBase * m_collhandle
void registerAssocObject(AssociatedObjectHandleBase *)
Trackhandle assumes ownership.
void registerTrack(SoNode *, TrackHandleBase *)
TouchedMuonChamberHelper * touchedMuonChamberHelper() const
void unregisterTrack(SoNode *)
static MeasurementType type(const Trk::PrepRawData *prd)
static QString shortInfo(const Trk::MeasurementBase &mb)
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
represents the track state (measurement, material, fit parameters and quality) at a surface.
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
static const MuonGM::MuonDetectorManager * muonDetMgr()
static bool hasMuonGeometry()
static double phiFromXY(const double &x, const double &y)
static void messageVerbose(const QString &)
static void messageDebug(const QString &)
static void message(const QString &, IVP1System *sys=0)
static double particleMass(const int &pdgcode, bool &ok)
static double particleCharge(const int &pdgcode, bool &ok)
static QString particleName(const int &pdgcode, bool &ok)
static QString str(const QString &s)
static bool isSafe(const Trk::TrackStateOnSurface *)
std::set< std::vector< Amg::Vector3D >, VectorVector3DComparer > SetVectorVector3D
Amg::RotationMatrix3D setPhi(Amg::RotationMatrix3D mat, double angle, int convention=0)
Eigen::Matrix< double, 3, 1 > Vector3D
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters