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);
146 int & iver,
int& numlines, SoLineSet *, SoVertexProperty * )
const;
148 int & iver,
int& numlines,SoLineSet *, SoVertexProperty * )
const;
165 if (p.x()!=p.x()||fabs(p.x())>1.0*CLHEP::km)
167 if (p.y()!=p.y()||fabs(p.y())>1.0*CLHEP::km)
169 if (p.z()!=p.z()||fabs(p.z())>1.0*CLHEP::km)
177 std::unique_ptr<std::vector<AssociatedObjectHandleBase*>>
tsos_ascobjs;
198 theclass->collHandle()->systemBase()->message(
"ERROR: No path information for track in collection "+
theclass->collHandle()->name());
213 if (
m_d->extraRepresentation)
221 if (
m_d->points_propagated !=
m_d->points_raw)
222 delete m_d->points_propagated;
223 delete m_d->points_raw;
224 if (
m_d->points_propagated_id_projections !=
m_d->points_raw_id_projections)
225 delete m_d->points_propagated_id_projections;
226 delete m_d->points_raw_id_projections;
227 if (
m_d->points_propagated_muon_projections !=
m_d->points_raw_muon_projections)
228 delete m_d->points_propagated_muon_projections;
229 delete m_d->points_raw_muon_projections;
234 if (
m_d->randommaterial)
235 m_d->randommaterial->unref();
237 m_d->label_sep->unref();
240 for (it =
m_d->attachmentHandles.begin();it!=itE;++it)
262 if (!
m_d->tsos_ascobjs)
264 std::vector<AssociatedObjectHandleBase*>::iterator
265 it(
m_d->tsos_ascobjs->begin()),
266 itE(
m_d->tsos_ascobjs->end());
268 if ((*it)->hasMeasurement())
269 (*it)->update3DObjects();
275 if (!
m_d->tsos_ascobjs)
277 std::vector<AssociatedObjectHandleBase*>::iterator
278 it(
m_d->tsos_ascobjs->begin()),
279 itE(
m_d->tsos_ascobjs->end());
281 if ((*it)->hasError())
282 (*it)->update3DObjects();
288 if (!
m_d->tsos_ascobjs)
290 std::vector<AssociatedObjectHandleBase*>::iterator
291 it(
m_d->tsos_ascobjs->begin()),
292 itE(
m_d->tsos_ascobjs->end());
294 if ((*it)->hasMaterialEffect())
295 (*it)->update3DObjects();
301 return m_d->shownTSOSParts;
307 return m_d->customColouredTSOSParts;
315 if (
m_d->shownTSOSParts==f){
321 TrackCommonFlags::TSOSPartsFlags change(
m_d->shownTSOSParts ^ f);
322 m_d->shownTSOSParts=f;
329 std::vector<AssociatedObjectHandleBase*>::iterator it(
m_d->tsos_ascobjs->begin()), itE(
m_d->tsos_ascobjs->end());
330 for (;it!=itE;++it) {
331 const bool vis = (*it)->parts() &
m_d->shownTSOSParts;
332 if (!((*it)->parts()&change)){
336 if (vis==(*it)->visible()) {
338 (*it)->update3DObjects();
344 (*it)->update3DObjects();
345 (*it)->setVisible(vis);
348 (*it)->setVisible(vis);
349 (*it)->update3DObjects();
357 if (
m_d->customColouredTSOSParts==f)
360 TrackCommonFlags::TSOSPartsFlags change(
m_d->customColouredTSOSParts ^ f);
361 m_d->customColouredTSOSParts=f;
366 TrackCommonFlags::TSOSPartsFlags changedShownParts(change &
m_d->shownTSOSParts);
368 if (!changedShownParts)
371 std::vector<AssociatedObjectHandleBase*>::iterator it(
m_d->tsos_ascobjs->begin()), itE(
m_d->tsos_ascobjs->end());
372 for (;it!=itE;++it) {
373 if ((*it)->parts()&changedShownParts)
374 (*it)->update3DObjects();
381 std::cout<<
"TrackHandleBase::ensureInitTSOSs"<<std::endl;
385 tsos_ascobjs = std::make_unique<std::vector<AssociatedObjectHandleBase*>>();
386 m_d->ensureLoadPathInfo();
388 if (!
m_d->pathInfo_TrkTrack||!
m_d->pathInfo_TrkTrack->trackParameters()||
m_d->pathInfo_TrkTrack->trackParameters()->empty())
391 tsos_ascobjs->reserve(
m_d->pathInfo_TrkTrack->trackParameters()->size());
393 unsigned parindex(0);
399 for (; tsos_iter != tsos_end; ++tsos_iter) {
400 trackParam = (*tsos_iter)->trackParameters();
410 if (ascObjNeedDistToNext&&trackParam) {
412 ascObjNeedDistToNext =
nullptr;
415 ascObjNeedDistToNext =
m_d->addTSOS(*tsos_iter,parindex++);
435 std::cout<<
"TrackHandleBase::setVisible"<<std::endl;
436 QString tmp = (vis)?
"True":
"False";
437 QString tmp2 = (
m_visible)?
"True":
"False";
438 VP1Msg::messageDebug(QString(
"TrackHandleBase calling setVisible with vis=")+tmp+QString(
", and m_visible=")+tmp2 );
441 std::cout<<
"TrackHandleBase::setVisible 1"<<std::endl;
451 m_d->rebuild3DObjects();
453 m_d->attach3DObjects();
460 m_d->detach3DObjects();
463 std::cout<<
"TrackHandleBase::setVisible 2"<<std::endl;
466 bool initTSOS(
false);
471 std::cout<<
"m_d->tsos_ascobjs: "<<
m_d->tsos_ascobjs<<std::endl;
473 std::cout<<
"TrackHandleBase::setVisible 3"<<std::endl;
475 if (!initTSOS &&
m_d->tsos_ascobjs) {
476 std::vector<AssociatedObjectHandleBase*>::iterator
477 it(
m_d->tsos_ascobjs->begin()),
478 itE(
m_d->tsos_ascobjs->end());
480 for (;it!=itE;++it) {
481 if ((*it)->visible()!=((*it)->parts() &
m_d->shownTSOSParts))
482 (*it)->toggleVisible();
485 for (;it!=itE;++it) {
486 if ((*it)->visible())
487 (*it)->setVisible(
false);
491 std::cout<<
"TrackHandleBase::setVisible 4"<<std::endl;
496 for (it =
m_d->attachmentHandles.begin();it!=itE;++it)
497 it->second->trackVisibilityChanged();
506 VP1Msg::messageVerbose(QString(
"TrackHandleBase::update3DObject with maxR set to ")+QString::number(maxR) );
508 m_d->tempMaxPropRadius=maxR;
510 if ( invalidatePropagatedPoints) {
511 if (
m_d->points_propagated !=
m_d->points_raw) {
512 delete m_d->points_propagated;
m_d->points_propagated =
nullptr;
514 delete m_d->points_raw;
m_d->points_raw =
nullptr;
515 if (
m_d->points_propagated_id_projections) {
delete m_d->points_propagated_id_projections;
m_d->points_propagated_id_projections =
nullptr; }
516 if (
m_d->points_propagated_muon_projections) {
delete m_d->points_propagated_muon_projections;
m_d->points_propagated_muon_projections =
nullptr; }
519 m_d->rebuild3DObjects();
524 m_d->tempMaxPropRadius=0.0;
531 if (
m_d->points_raw_id_projections!=
m_d->points_propagated_id_projections)
532 delete m_d->points_propagated_id_projections;
533 delete m_d->points_raw_id_projections;
534 m_d->points_raw_id_projections =
nullptr;
535 m_d->points_propagated_id_projections =
nullptr;
544 if (
m_d->points_raw_muon_projections!=
m_d->points_propagated_muon_projections)
545 delete m_d->points_propagated_muon_projections;
546 delete m_d->points_raw_muon_projections;
547 m_d->points_raw_muon_projections =
nullptr;
548 m_d->points_propagated_muon_projections =
nullptr;
556 int & iver,
int& numlines,
557 SoLineSet *
line, SoVertexProperty * vertices )
const
562 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (1) ERROR: Unexpected null SoLineSet pointer!");
566 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (1) ERROR: Unexpected null SoVertexPropery pointer!");
569 std::vector<Amg::Vector3D >::const_iterator pointsIt, pointsItEnd(points.end());
570 unsigned npointsused(0);
573 float maxR2=
theclass->common()->controller()->propMaxRadius()>0.0?
theclass->common()->controller()->propMaxRadius():std::numeric_limits<float>::max();
576 theclass->collHandle()->systemBase()->messageVerbose(
"maxR2 is set to "+
VP1Msg::str(maxR2));
578 float vertexPlanePhi = (
theclass->common()->controller()->vertexProjectionAngle())*
M_PI/180;
579 vertexPlanePhi-=
M_PI;
584 theclass->collHandle()->systemBase()->messageVerbose(
"Vertex projection is set to "+
VP1Msg::str(vertexPlanePhi));
591 double trkPhi =
theclass->momentum().phi();
592 double newPhi= vertexPlanePhi+
M_PI;
593 if (cos(vertexPlanePhi-trkPhi)>0) newPhi=vertexPlanePhi;
596 for (pointsIt = points.begin();pointsIt!=pointsItEnd && pointsIt->mag2()<maxR2; ++pointsIt) {
599 theclass->collHandle()->systemBase()->message(
"WARNING: Ignoring point on track:"+
VP1Msg::str( *pointsIt ) );
604 tempPoint = *pointsIt;
609 vertices->vertex.set1Value(iver++,tempPoint.x(),tempPoint.y(),tempPoint.z());
611 vertices->vertex.set1Value(iver++,pointsIt->x(),pointsIt->y(),pointsIt->z());
615 line->numVertices.set1Value(numlines++,npointsused);
620 int & iver,
int& numlines,
621 SoLineSet *
line, SoVertexProperty * vertices )
const
623 if ( !paths || ( paths->size()==1 && paths->begin()->empty()) )
626 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (2) ERROR: Unexpected null SoLineSet pointer!");
630 theclass->collHandle()->systemBase()->message(
"TrackHandleBase::Imp::addPathToSoLineSetAndSoVertexProperty (2) ERROR: Unexpected null SoVertexPropery pointer!");
633 Amg::SetVectorVector3D::const_iterator itProjPart, itProjPartEnd(paths->end());
634 for (itProjPart = paths->begin();itProjPart!=itProjPartEnd;++itProjPart)
664 if (
theclass->common()->trackPropagationHelper()->showExtrapolationSurfaces())
665 theclass->common()->trackPropagationHelper()->getExtrapolationSurfaces().clear();
682 std::vector<Amg::Vector3D > * points;
697 line =
new SoLineSet();
701 SoVertexProperty * vertices =
new SoVertexProperty();
703 int iver(0), numlines(0);
713 line->vertexProperty = vertices;
719 if (
theclass->common()->trackPropagationHelper()->showExtrapolationSurfaces()){
720 std::vector<Trk::PlaneSurface>& surfaces =
theclass->common()->trackPropagationHelper()->getExtrapolationSurfaces();
721 std::vector<Trk::PlaneSurface>::const_iterator surfIt=surfaces.begin(), surfEnd=surfaces.end();
724 for (;surfIt!=surfEnd;++surfIt){
727 SoNode * nodeToAdd = theSurfSep;
734 if (!points->empty() &&
theclass->common()->controller()->doTrackLabels() ){
743 SoText2 *labelText =
new SoText2;
746 TrackSystemController::TrackLabelModes labels=
theclass->common()->controller()->trackLabels();
761 text <<
"pdg: "+QString::number(pdg)+
" ["+name+
"]";
763 text <<
"pdg: "+QString::number(pdg);
773 <<
" 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())+
"]";
779 if (mom.mag2()==0.0) {
780 text <<
"Momentum : 0 (undefined)";
785 double pseudoRapidity = mom.eta();
792 for(
const QString&
str : text){
793 QByteArray array =
str.toLatin1();
794 labelText->string.set1Value(row++,array.data());
798 float labelTrackOffset =
theclass->common()->controller()->trackLabelTrkOffset();
799 unsigned int point=(points->size()-1)*labelTrackOffset;
810 SoTranslation *labelTranslate =
new SoTranslation;
812 int xOffset =
theclass->common()->controller()->labelXOffset() ;
813 int yOffset =
theclass->common()->controller()->labelYOffset() ;
814 int zOffset =
theclass->common()->controller()->labelZOffset() ;
815 labelTranslate->translation.setValue(labelPos.x()+(xOffset*offScale),labelPos.y()+(yOffset*offScale),labelPos.z()+(zOffset*offScale));
817 SoMaterial *sMat =
new SoMaterial();
819 sColor.setValue(SbColor(0, 0, 1));
820 sMat->diffuseColor = sColor;
837 it->second->trackMaterialChanged();
843 float x1,x2,y1,y2,z1,z2;
844 p1.getValue(x1,y1,z1);
845 p2.getValue(x2,y2,z2);
846 return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
853 SoVertexProperty *vertices =
static_cast<SoVertexProperty *
>(
line->vertexProperty.getValue());
858 lastTransf.makeIdentity();
860 for (
int iline=0;iline<
line->numVertices.getNum();++iline) {
861 int nvert=
line->numVertices[iline];
866 for (
int jvert= ivert; jvert<ivert+nvert-1;++jvert) {
867 SbVec3f p1 = vertices->vertex[jvert].getValue();
868 SbVec3f p2 = vertices->vertex[jvert+1].getValue();
869 SoCylinder * cyl =
new SoCylinder;
870 cyl->radius = cylradius;
871 const double l(
dist(p1,p2));
875 m.setTranslate(SbVec3f(0,0.5*l,0));
876 SbVec3f v(p2); v -= p1;
877 SbRotation rot(SbVec3f(0,1,0),v);
878 SbMatrix m2; m2.setRotate(rot);
887 mat.multRight(lastTransf.inverse());
888 SoMatrixTransform * mt =
new SoMatrixTransform;
889 mt->matrix.setValue(mat);
911 double tube_r(
theclass->m_collhandle->trackTubeRadius());
963 SoMaterial * newmat =
m_d->determineMaterial();
966 m_d->detach3DObjects();
969 m_d->attach3DObjects();
970 m_d->materialChanged();
978 m_d->materialChanged();
1002 bool unsafeparts(
false);
1006 for (; tsos_iter != tsos_end; ++tsos_iter) {
1011 if (
theclass->collHandle()->ignoreMEOTinProp() && (*tsos_iter)->materialEffectsOnTrack())
1013 trackParam = (*tsos_iter)->trackParameters();
1021 if (!firstmomentum) {
1027 theclass->collHandle()->systemBase()->message(
"WARNING: Ignored unsafe parts of track!");
1029 if (!firstmomentum) {
1030 theclass->collHandle()->systemBase()->message(
" TrackHandleBase ERROR: Unexpected null firstmomentum!");
1033 if (firstmomentum->mag()==0.0) {
1034 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: Only point on track had zero momentum. Can't add second point.");
1041 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: No points on track.");
1044 delete firstmomentum;
1045 firstmomentum =
nullptr;
1051 theclass->collHandle()->systemBase()->message(
"TrackHandleBase ERROR: Less than two points on track provided.");
1056 +
" points for track.");
1073 theclass->collHandle()->propagator(),
1074 theclass->extrapolationParticleHypothesis(),
1075 !
theclass->collHandle()->ignoreMEOTinProp(),
1076 theclass->collHandle()->extendTracks() ?
theclass->common()->controller()->extrapolateToThisVolume() :
nullptr );
1116 std::vector<Amg::Vector3D > * points=
nullptr;
1128 if ( !points || points->empty() || points->size()<2 ) {
1129 projections->clear();
1130 projections->insert(std::vector<Amg::Vector3D >());
1135 if (
theclass->common()->indetProjHelper_Pixel()) {
1136 theclass->common()->indetProjHelper_Pixel()->projectPath(*points,*projections);
1139 if (
theclass->common()->indetProjHelper_SCT()) {
1140 theclass->common()->indetProjHelper_SCT()->projectPath(*points,*projections);
1143 if (
theclass->common()->indetProjHelper_TRT()) {
1144 theclass->common()->indetProjHelper_TRT()->projectPath(*points,*projections);
1149 projections->clear();
1150 projections->insert(std::vector<Amg::Vector3D >());
1178 std::vector<Amg::Vector3D > * points;
1192 projections->insert(std::vector<Amg::Vector3D >());
1199 bool outsidechamber;
1200 std::vector<Amg::Vector3D > proj1, proj2;
1203 for (std::set<GeoPVConstLink>::iterator it=
theclass->touchedMuonChambers().begin(); it!=
theclass->touchedMuonChambers().end(); ++it){
1213 std::vector<Amg::Vector3D >::const_iterator pointsIt=points->begin(), pointsItEnd=points->end()-1;
1214 for (;pointsIt!=pointsItEnd; ++pointsIt) {
1218 firstEndWall_pointA, firstEndWall_pointB,
1219 secondEndWall_pointA, secondEndWall_pointB,
1223 theclass->collHandle()->systemBase()->message(
"TrackHandleBase Error: "
1224 "Problems with projectAndConstrainLineSegmentToMDTChamberEndWalls(..)");
1230 if (!outsidechamber){
1231 if ( proj1.empty() ) {
1232 proj1.push_back(firstEndWall_pointA); proj1.push_back(firstEndWall_pointB);
1234 if ( proj1[proj1.size()-1] == firstEndWall_pointA ) {
1235 proj1.push_back(firstEndWall_pointB);
1238 projections->insert(proj1); proj1.clear();
1239 proj1.push_back(firstEndWall_pointA); proj1.push_back(firstEndWall_pointB);
1242 if ( proj2.empty() ) {
1243 proj2.push_back(secondEndWall_pointA); proj2.push_back(secondEndWall_pointB);
1247 if ( proj2[proj2.size()-1] == secondEndWall_pointA ) {
1248 proj2.push_back(secondEndWall_pointB);
1251 projections->insert(proj2); proj2.clear();
1252 proj2.push_back(secondEndWall_pointA); proj2.push_back(secondEndWall_pointB);
1258 if ( !proj1.empty() ) {
1259 projections->insert(proj1);
1261 if ( !proj2.empty() ) {
1262 projections->insert(proj2);
1270 m_d->touchedmuonchambers.insert(chamberPV);
1276 if (!
m_d->inittouchedchambers) {
1279 m_d->inittouchedchambers=
true;
1281 return m_d->touchedmuonchambers;
1291 switch(
theclass->collHandle()->colourBy()) {
1301 theclass->rerandomiseRandomMaterial();
1308 return theclass->common()->controller()->getMaterialForMomentum(
theclass->momentum().mag());
1324 if (handle==
nullptr) {
1326 return theclass->collHandle()->material();
1332 float phiDistance = sqrt (
pow( selectedTrackMom.phi() - thisTrackMom.phi(),2) );
1333 float etaDistance = sqrt (
pow( selectedTrackMom.eta() - thisTrackMom.eta(),2) );
1336 float colScale=std::max(0.0, std::min(1.0,phiDistance/(
M_PI)));
1337 float brightness= std::max(0.2, 1.0-(etaDistance/5.0) );
1340 SoMaterial* mat =
new SoMaterial;
1344 const SbColor& col=
theclass->collHandle()->material()->diffuseColor[0];
1346 col.getValue(
r,g,b);
1349 if (colScale>0.01) {
1352 QColor tempCol = QColor::fromRgbF(
r,g,b );
1354 tempCol.getHsvF(&
h,&s,&v);
1359 tempCol.setHsvF(
h,s,v);
1361 tempCol.getRgbF(&r2,&g2,&b2);
1364 r3 =
r+(r2-
r)*colScale;
1365 b3 = b+(b2-b)*colScale;
1366 g3 = g+(g2-g)*colScale;
1374 theclass->collHandle()->collMaterialBrightness(),
1375 theclass->collHandle()->collMaterialTransparency());
1381 SoMaterial* mat =
theclass->common()->system()->materialFromVertex(
theclass);
1385 return theclass->collHandle()->material();
1389 return theclass->collHandle()->material();
1396 if ( !
m_d->randommaterial )
1399 double r2 = 0.3*0.3;
1404 r = (rand() /
static_cast<double>(RAND_MAX));
1405 g = (rand() /
static_cast<double>(RAND_MAX));
1406 b = (rand() /
static_cast<double>(RAND_MAX));
1410 if ( (
r-1.0)*(
r-1.0)+g*g+b*b < r2*0.5 )
1412 else if (
r*
r/(
r*
r+g*g+b*b) > 0.8 )
1414 else if (
r*
r+g*g+b*b < r2*2.0 )
1423 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::rerandomiseRandomMaterial Warning: Random colour could"
1424 " not be selected such as to satisfy all separation criterias");
1437 if ( !
m_d->randommaterial )
1440 m_d->randommaterial->diffuseColor[0].getValue(
r,g,b);
1451 if (
m_d->associatedObjects.contains(ao)) {
1452 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::registerAssocObject ERROR: object already registered!");
1458 m_d->theclass->collHandle()->systemBase()->message(
"TrackHandleBase::registerAssocObject ERROR: object is null!");
1462 m_d->associatedObjects << ao;
1470 it =
m_d->attachmentHandles.find(std::make_pair(regionIndex,crossoverval));
1471 if (it!=
m_d->attachmentHandles.end())
1475 m_d->attachmentHandles[std::make_pair(regionIndex,crossoverval)] = attachHandle;
1476 return attachHandle;
1509 if (
m_d->chargeinit)
1511 m_d->chargeinit =
true;
1521 m_d->massinit =
true;
1555 if (mom.mag2()==0.0) {
1556 l <<
"Momentum : 0 (undefined)";
1588 m_d->ensureLoadPathInfo();
1589 if (
m_d->pathInfo_TrkTrack) {
1592 for (; tsos_iter != tsos_end; ++tsos_iter) {
1593 if (
common()->trackSanityHelper()->isSafe(*tsos_iter)) {
1595 if (
common()->trackSanityHelper()->isSafe(trackParam))
1599 }
else if (
m_d->pathInfo_Points&&!
m_d->pathInfo_Points->empty()) {
1600 return m_d->pathInfo_Points->at(0);
1608 m_d->ensureLoadPathInfo();
1609 if (
m_d->pathInfo_TrkTrack) {
1612 for (; tsos_iter != tsos_end; ++tsos_iter) {
1613 if (
common()->trackSanityHelper()->isSafe(*tsos_iter)) {
1615 if (
common()->trackSanityHelper()->isSafe(trackParam))
1619 }
else if (
m_d->pathInfo_Points&&!
m_d->pathInfo_Points->empty()) {
1620 return m_d->pathInfo_Points->back();
1627 std::optional<Amg::Vector3D> start =
startPoint();
1628 if (!start)
return false;
1629 return start->perp()<1100 &&fabs( start->z())<3500;
1635 return m_d->associatedObjects;
1640 m_d->ensureInitPointsPropagated();
1641 return m_d->points_propagated;
1690 bool b =
m_d->trackhandle->visible();
1691 if (b&&!
m_d->trackhandle->currentMaterial())
1692 VP1Msg::message(
"ERROR: track is visible but has not current material!!");
1694 m_d->ensureAttached();
1696 m_d->ensureDetached();
1701 :
m_d ( new
Imp(tlh,th) )
1704 VP1Msg::message(
"AssocObjAttachmentHandle ERROR: constructed with null LOD handle!");
1717 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes detected wrong pickStyleChildIdx");
1730 if (
m_d->septrack_simple)
1731 m_d->septrack_simple->unref();
1732 if (
m_d->septrack_detailed)
1733 m_d->septrack_detailed->unref();
1735 m_d->trackmat->unref();
1742 SoMaterial * m =
m_d->trackhandle->currentMaterial();
1743 if (
m_d->trackmat==m)
1746 if (
m_d->trackhandle->visible())
1747 VP1Msg::message(
"ERROR: track is visible but has no current material!!");
1751 if (
m_d->trackmat) {
1752 if (
m_d->septrack_simple &&
m_d->septrack_simple->findChild(
m_d->trackmat) > -1 )
1753 m_d->septrack_simple->replaceChild(
m_d->trackmat,m);
1754 if (
m_d->septrack_detailed &&
m_d->septrack_detailed->findChild(
m_d->trackmat) > -1 )
1755 m_d->septrack_detailed->replaceChild(
m_d->trackmat,m);
1756 m_d->trackmat->unref();
1773 pickStyle->style=SoPickStyle::UNPICKABLE;
1786 if (!
m_d->trackhandle->visible())
1789 if (!
m_d->trackmat) {
1790 SoMaterial * m =
m_d->trackhandle->currentMaterial();
1795 m_d->septrack_simple->addChild(m);
1796 m_d->septrack_detailed->addChild(m);
1802 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::attachNodes detected wrong pickStyleChildIdx");
1805 if (
m_d->septrack_simple->findChild(simple)>-1||
m_d->septrack_detailed->findChild(detailed)>-1) {
1806 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::attachNodes Already attached!");
1811 if (
m_d->pickStyleChildIdx==-1) {
1812 m_d->pickStyleChildIdx =
m_d->septrack_simple->getNumChildren();
1816 m_d->septrack_simple->addChild(simple);
1817 m_d->septrack_detailed->addChild(detailed);
1819 if (
m_d->pickStyleChildIdx>-1) {
1820 m_d->septrack_simple->insertChild(simple,
m_d->pickStyleChildIdx);
1821 m_d->septrack_detailed->insertChild(detailed,
m_d->pickStyleChildIdx);
1822 ++(
m_d->pickStyleChildIdx);
1824 m_d->septrack_simple->addChild(simple);
1825 m_d->septrack_detailed->addChild(detailed);
1830 if (
m_d->trackhandle->visible() &&
m_d->septrack_simple->getNumChildren() == 2 + (
m_d->pickStyleChildIdx==-1?0:1)) {
1831 m_d->ensureAttached();
1840 +QString(unpickable?
"true":
"false"));
1841 if (!simple||!detailed) {
1842 VP1Msg::messageVerbose(
"AssocObjAttachmentHandle::setPickableStateOfNodes ERROR: Called with null pointers!");
1847 int isimple =
m_d->septrack_simple->findChild(simple);
1849 if (
m_d->septrack_simple->getNumChildren()!=
m_d->septrack_detailed->getNumChildren()) {
1850 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes septrack_simple->getNumChildren()"
1851 "!=m_d->septrack_detailed->getNumChildren().");
1854 int idetailed =
m_d->septrack_detailed->findChild(detailed);
1855 if (idetailed!=isimple) {
1856 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes"
1857 " called with simple and detailed nodes that are not at same child idx!");
1862 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes detected wrong pickStyleChildIdx");
1868 " called with nodes that are not currently children. Calling attachNodes(..)." );
1872 if (unpickable == (
m_d->pickStyleChildIdx>-1&&isimple>
m_d->pickStyleChildIdx)) {
1874 " already in correct state.");
1881 m_d->septrack_simple->removeChild(simple);
1882 m_d->septrack_detailed->removeChild(detailed);
1883 if (
m_d->pickStyleChildIdx==-1) {
1884 m_d->pickStyleChildIdx =
m_d->septrack_simple->getNumChildren();
1888 --(
m_d->pickStyleChildIdx);
1890 m_d->septrack_simple->addChild(simple);
1891 m_d->septrack_detailed->addChild(detailed);
1893 if (
m_d->pickStyleChildIdx==-1) {
1894 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes Inconsistent logic");
1899 if (
m_d->pickStyleChildIdx==isimple-1&&isimple==
m_d->septrack_simple->getNumChildren()-1) {
1904 m_d->pickStyleChildIdx = -1;
1907 m_d->septrack_simple->removeChild(simple);
1908 m_d->septrack_detailed->removeChild(detailed);
1909 m_d->septrack_simple->insertChild(simple,
m_d->pickStyleChildIdx);
1910 m_d->septrack_detailed->insertChild(detailed,
m_d->pickStyleChildIdx);
1911 ++(
m_d->pickStyleChildIdx);
1923 int isimple =
m_d->septrack_simple->findChild(simple);
1925 if (!simple||!detailed) {
1929 if (
m_d->septrack_simple->getNumChildren()!=
m_d->septrack_detailed->getNumChildren()) {
1930 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes septrack_simple->getNumChildren()"
1931 "!=m_d->septrack_detailed->getNumChildren().");
1936 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes detected wrong pickStyleChildIdx");
1940 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::detachNodes Not previously attached!");
1943 if (
m_d->septrack_detailed->findChild(detailed)!=isimple) {
1944 VP1Msg::message(
"ERROR: AssocObjAttachmentHandle::setPickableStateOfNodes"
1945 " called with simple and detailed nodes that are not at same child idx!");
1949 m_d->septrack_simple->removeChild(simple);
1950 m_d->septrack_detailed->removeChild(detailed);
1951 if (
m_d->pickStyleChildIdx!=-1
1952 && isimple>
m_d->pickStyleChildIdx
1953 &&
m_d->pickStyleChildIdx==
m_d->septrack_simple->getNumChildren()-1 ) {
1957 m_d->pickStyleChildIdx = -1;
1961 if (
m_d->trackhandle->visible() &&
m_d->septrack_simple->getNumChildren() == 1 + (
m_d->pickStyleChildIdx==-1?0:1))
1962 m_d->ensureDetached();
1987 VP1Msg::message(
"TrackHandleBase::getReadoutElement:: Unable to find matching readoutElement");
1997 QList<AssociatedObjectHandleBase*> l;
1998 if (!
m_d->tsos_ascobjs)
return l;
1999 std::vector<AssociatedObjectHandleBase*>::iterator
2000 it(
m_d->tsos_ascobjs->begin()),
2001 itE(
m_d->tsos_ascobjs->end());
2003 if ((*it)->hasMeasurement()&&(*it)->visible())
2011 assert(
m_d->m_objBrowseTree==0);
2012 m_d->m_objBrowseTree =
new QTreeWidgetItem();
2014 QString direction = QString::fromUtf8(
"(\u03B7,\u03D5)=[") + QString::number(
momentum().
eta(),
'f',2) +
","+QString::number(
momentum().
phi(),
'f',2)+
"], ";
2016 m_d->m_objBrowseTree->setText(0,
type()+QString(QString::number(listOfItems.size())) );
2017 m_d->m_objBrowseTree->setText(1, l );
2020 m_d->m_objBrowseTree->setFlags(Qt::ItemFlags());
2038 browserTreeItem()->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
2041 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::unique_ptr< std::vector< AssociatedObjectHandleBase * > > tsos_ascobjs
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
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
virtual void ensureInitTSOSs(std::unique_ptr< std::vector< AssociatedObjectHandleBase * > > &)
Ensure that the TSOSs are initialized.
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 ~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