201 m_d->hgtdGuideRootSwitch =
nullptr;
202 m_d->hgtdHitSwitch =
nullptr;
203 m_d->hgtdTruthTrackSwitch =
nullptr;
204 m_d->hgtdPrimaryParticleSwitch =
nullptr;
205 m_d->hgtdSecondaryParticleSwitch =
nullptr;
206 m_d->hgtdUnlinkedParticleSwitch =
nullptr;
207 m_d->hgtdPrimaryParticleLabelsSwitch =
nullptr;
208 m_d->hgtdSecondaryParticleLabelsSwitch =
nullptr;
209 m_d->hgtdUnlinkedParticleLabelsSwitch =
nullptr;
219 if (sg->
retrieve(collection,
"HGTD_Hits")!=StatusCode::SUCCESS) {
220 message(
"Unable to retrieve HGTD Hits for guide lines");
224 SoSwitch* hgtdGuideRootSwitch =
new SoSwitch();
225 m_d->hgtdGuideRootSwitch = hgtdGuideRootSwitch;
226 root->addChild(hgtdGuideRootSwitch);
228 SoVertexProperty* primaryHitVtxProperty =
new SoVertexProperty();
229 SoVertexProperty* secondaryHitVtxProperty =
new SoVertexProperty();
230 SoVertexProperty* unlinkedHitVtxProperty =
new SoVertexProperty();
231 SoPointSet* primaryHitPointSet =
new SoPointSet();
232 SoPointSet* secondaryHitPointSet =
new SoPointSet();
233 SoPointSet* unlinkedHitPointSet =
new SoPointSet();
234 primaryHitVtxProperty->enableNotify(FALSE);
235 secondaryHitVtxProperty->enableNotify(FALSE);
236 unlinkedHitVtxProperty->enableNotify(FALSE);
237 primaryHitPointSet->enableNotify(FALSE);
238 secondaryHitPointSet->enableNotify(FALSE);
239 unlinkedHitPointSet->enableNotify(FALSE);
240 unsigned int primaryHitCount = 0;
241 unsigned int secondaryHitCount = 0;
242 unsigned int unlinkedHitCount = 0;
243 std::vector<TruthHitLabel> primaryHitLabels;
244 std::vector<TruthHitLabel> secondaryHitLabels;
245 std::vector<TruthHitLabel> unlinkedHitLabels;
246 QMap<QString, std::vector<TruthHitPoint> > truthHitPoints;
248 for (
const SiHit&
hit : *collection) {
256 QString particleLabel(
"unlinked");
260 trackKey = QString(
"truth:%1").arg(barcode);
261 bool particleNameOK =
false;
263 if (!particleNameOK || particleLabel.isEmpty())
264 particleLabel = QString(
"pdg %1").arg(particle->pdg_id());
268 unlinkedHitVtxProperty->vertex.set1Value(unlinkedHitCount++, pos.x(), pos.y(), pos.z());
269 unlinkedHitLabels.emplace_back(pos, particleLabel);
270 }
else if (particle->status()==1) {
271 primaryHitVtxProperty->vertex.set1Value(primaryHitCount++, pos.x(), pos.y(), pos.z());
272 primaryHitLabels.emplace_back(pos, particleLabel);
274 secondaryHitVtxProperty->vertex.set1Value(secondaryHitCount++, pos.x(), pos.y(), pos.z());
275 secondaryHitLabels.emplace_back(pos, particleLabel);
278 if (!trackKey.isEmpty())
279 truthHitPoints[trackKey].emplace_back(
hit.meanTime(), pos);
282 SoSwitch* hitSwitch =
new SoSwitch();
283 m_d->hgtdHitSwitch = hitSwitch;
284 hgtdGuideRootSwitch->addChild(hitSwitch);
286 auto addParticleCategory = [](SoSwitch* rootSwitch,
287 SoSwitch*& categorySwitch,
288 SoSwitch*& labelsSwitch,
289 SoVertexProperty* vertexProperty,
290 SoPointSet* pointSet,
292 const SbColor&
color,
293 const std::vector<TruthHitLabel>& labels) {
294 categorySwitch =
new SoSwitch();
295 rootSwitch->addChild(categorySwitch);
297 SoMaterial* hitMaterial =
new SoMaterial();
298 hitMaterial->diffuseColor.setValue(
color);
299 categorySwitch->addChild(hitMaterial);
300 pointSet->numPoints=
count;
301 pointSet->vertexProperty.setValue(vertexProperty);
302 categorySwitch->addChild(pointSet);
304 labelsSwitch =
new SoSwitch();
305 for (
const TruthHitLabel&
label : labels)
306 addHGTDLabel(labelsSwitch,
label);
307 categorySwitch->addChild(labelsSwitch);
309 pointSet->enableNotify(TRUE);
310 vertexProperty->enableNotify(TRUE);
313 addParticleCategory(hgtdGuideRootSwitch,
314 m_d->hgtdPrimaryParticleSwitch,
315 m_d->hgtdPrimaryParticleLabelsSwitch,
316 primaryHitVtxProperty,
321 addParticleCategory(hgtdGuideRootSwitch,
322 m_d->hgtdSecondaryParticleSwitch,
323 m_d->hgtdSecondaryParticleLabelsSwitch,
324 secondaryHitVtxProperty,
325 secondaryHitPointSet,
329 addParticleCategory(hgtdGuideRootSwitch,
330 m_d->hgtdUnlinkedParticleSwitch,
331 m_d->hgtdUnlinkedParticleLabelsSwitch,
332 unlinkedHitVtxProperty,
338 SoVertexProperty* truthTrackVtxProperty =
new SoVertexProperty();
339 SoLineSet* truthTrackLineSet =
new SoLineSet();
340 truthTrackVtxProperty->enableNotify(FALSE);
341 truthTrackLineSet->enableNotify(FALSE);
342 unsigned int truthTrackVertexCount = 0;
343 unsigned int truthTrackCount = 0;
344 for (
auto it = truthHitPoints.begin(); it != truthHitPoints.end(); ++it) {
345 std::vector<TruthHitPoint>& points = it.value();
349 [](
const TruthHitPoint&
a,
const TruthHitPoint& b) { return a.time < b.time; });
351 const int verticesInTrack = points.size() == 1 ? 2 :
static_cast<int>(points.size());
352 truthTrackLineSet->numVertices.set1Value(truthTrackCount++, verticesInTrack);
353 if (points.size()==1)
354 truthTrackVtxProperty->vertex.set1Value(truthTrackVertexCount++, 0.0, 0.0, 0.0);
355 for (
const TruthHitPoint& point : points)
356 truthTrackVtxProperty->vertex.set1Value(truthTrackVertexCount++,
362 SoSwitch* trackSwitch =
new SoSwitch();
363 m_d->hgtdTruthTrackSwitch = trackSwitch;
364 hgtdGuideRootSwitch->addChild(trackSwitch);
365 if (truthTrackCount>0) {
366 SoSeparator* trackSep =
new SoSeparator();
367 SoDrawStyle* trackDrawStyle =
new SoDrawStyle();
368 trackDrawStyle->style.setValue(SoDrawStyle::LINES);
369 trackDrawStyle->lineWidth = 2;
370 trackSep->addChild(trackDrawStyle);
371 SoMaterial* trackMaterial =
new SoMaterial();
373 trackSep->addChild(trackMaterial);
374 truthTrackLineSet->vertexProperty.setValue(truthTrackVtxProperty);
375 trackSep->addChild(truthTrackLineSet);
376 trackSwitch->addChild(trackSep);
377 truthTrackLineSet->enableNotify(TRUE);
378 truthTrackVtxProperty->enableNotify(TRUE);
381 m_d->updateHGTDGuideVisibility();
392 SoPickStyle *pickStyle =
new SoPickStyle;
393 pickStyle->style=SoPickStyle::UNPICKABLE;
394 root->addChild(pickStyle);
397 SoComplexity * complexity =
new SoComplexity;
398 complexity->value.setValue(2.0f);
399 root->addChild(complexity);
403 connect(
m_d->controller,SIGNAL(floorExtentChanged(
const double&)),
m_d->floor,SLOT(setExtent(
const double&)));
404 m_d->floor->setExtent(
m_d->controller->floorExtent());
405 connect(
m_d->controller,SIGNAL(floorSpacingChanged(
const double&)),
m_d->floor,SLOT(setSpacing(
const double&)));
406 m_d->floor->setSpacing(
m_d->controller->floorSpacing());
407 connect(
m_d->controller,SIGNAL(floorHeightChanged(
const double&)),
m_d->floor,SLOT(setVerticalPosition(
const double&)));
408 m_d->floor->setVerticalPosition(
m_d->controller->floorHeight());
409 connect(
m_d->controller,SIGNAL(floorColourAndTranspChanged(
const SbColor4f&)),
m_d->floor,SLOT(setColourAndTransp(
const SbColor4f&)));
410 m_d->floor->setColourAndTransp(
m_d->controller->floorColourAndTransp());
411 connect(
m_d->controller,SIGNAL(showFloorChanged(
bool)),
m_d->floor,SLOT(setShown(
bool)));
412 m_d->floor->setShown(
m_d->controller->showFloor());
416 connect(
m_d->controller,SIGNAL(gridExtentChanged(
const double&)),
m_d->cartesiangrid,SLOT(setExtent(
const double&)));
417 m_d->cartesiangrid->setExtent(
m_d->controller->gridExtent());
418 connect(
m_d->controller,SIGNAL(gridSpacingChanged(
const double&)),
m_d->cartesiangrid,SLOT(setSpacing(
const double&)));
419 m_d->cartesiangrid->setSpacing(
m_d->controller->gridSpacing());
420 connect(
m_d->controller,SIGNAL(gridColourAndTranspChanged(
const SbColor4f&)),
m_d->cartesiangrid,SLOT(setColourAndTransp(
const SbColor4f&)));
421 m_d->cartesiangrid->setColourAndTransp(
m_d->controller->gridColourAndTransp());
422 connect(
m_d->controller,SIGNAL(showCartesianGridChanged(
bool)),
m_d->cartesiangrid,SLOT(setShown(
bool)));
423 m_d->cartesiangrid->setShown(
m_d->controller->showCartesianGrid());
427 connect(
m_d->controller,SIGNAL(gridExtentChanged(
const double&)),
m_d->cylindricalgrid,SLOT(setExtent(
const double&)));
428 m_d->cylindricalgrid->setExtent(
m_d->controller->gridExtent());
429 connect(
m_d->controller,SIGNAL(gridSpacingChanged(
const double&)),
m_d->cylindricalgrid,SLOT(setSpacing(
const double&)));
430 m_d->cylindricalgrid->setSpacing(
m_d->controller->gridSpacing());
431 connect(
m_d->controller,SIGNAL(gridColourAndTranspChanged(
const SbColor4f&)),
m_d->cylindricalgrid,SLOT(setColourAndTransp(
const SbColor4f&)));
432 m_d->cylindricalgrid->setColourAndTransp(
m_d->controller->gridColourAndTransp());
433 connect(
m_d->controller,SIGNAL(showCylindricalGridChanged(
bool)),
m_d->cylindricalgrid,SLOT(setShown(
bool)));
434 m_d->cylindricalgrid->setShown(
m_d->controller->showCylindricalGrid());
437 m_d->letters =
new VP1Letters(
m_d->controller->lettersMaterial(),root,
this);
438 connect(
m_d->controller,SIGNAL(lettersZPosChanged(
const double&)),
m_d->letters,SLOT(setZPos(
const double&)));
439 m_d->letters->setZPos(
m_d->controller->lettersZPos());
440 connect(
m_d->controller,SIGNAL(lettersVerticalPosChanged(
const double&)),
m_d->letters,SLOT(setVerticalPosition(
const double&)));
441 m_d->letters->setVerticalPosition(
m_d->controller->lettersVerticalPos());
442 connect(
m_d->controller,SIGNAL(showLettersChanged(
bool)),
m_d->letters,SLOT(setShown(
bool)));
443 m_d->letters->setShown(
m_d->controller->showLetters());
446 m_d->people =
new VP1People(
m_d->controller->peopleMaterial(),root,
this);
448 m_d->people->setZPos(
m_d->controller->peopleZPos());
449 connect(
m_d->controller,SIGNAL(peopleVerticalPosChanged(
const double&)),
m_d->people,SLOT(setVerticalPosition(
const double&)));
450 m_d->people->setVerticalPosition(
m_d->controller->peopleVerticalPos());
451 connect(
m_d->controller,SIGNAL(showPeopleChanged(
bool)),
m_d->people,SLOT(setShown(
bool)));
452 m_d->people->setShown(
m_d->controller->showPeople());
453 connect(
m_d->controller,SIGNAL(peopleColourAndTranspChanged(
const SbColor4f&)),
m_d->people,SLOT(setColourAndTransp(
const SbColor4f&)));
454 m_d->people->setColourAndTransp(
m_d->controller->peopleColourAndTransp());
458 m_d->controller->yAxisMaterial(),
459 m_d->controller->zAxisMaterial(),
461 connect(
m_d->controller,SIGNAL(axesLengthChanged(
const double&)),
m_d->coordinateaxes,SLOT(setLength(
const double&)));
462 m_d->coordinateaxes->setLength(
m_d->controller->axesLength());
463 connect(
m_d->controller,SIGNAL(axesPositionChanged(
const SbVec3f&)),
m_d->coordinateaxes,SLOT(setPosition(
const SbVec3f&)));
464 m_d->coordinateaxes->setPosition(
m_d->controller->axesPosition());
465 connect(
m_d->controller,SIGNAL(relAxesThicknessChanged(
const double&)),
m_d->coordinateaxes,SLOT(setRelativeAxisThickness(
const double&)));
466 m_d->coordinateaxes->setRelativeAxisThickness(
m_d->controller->relAxesThickness());
467 connect(
m_d->controller,SIGNAL(showAxesChanged(
bool)),
m_d->coordinateaxes,SLOT(setShown(
bool)));
468 m_d->coordinateaxes->setShown(
m_d->controller->showAxes());
471 m_d->etacone1 =
new VP1EtaCone(
m_d->controller->etaCone1Material(),root,
this);
472 connect(
m_d->controller,SIGNAL(etaExtentChanged(
const double&)),
m_d->etacone1,SLOT(setExtent(
const double&)));
473 m_d->etacone1->setExtent(
m_d->controller->etaExtent());
474 connect(
m_d->controller,SIGNAL(etaConeValue1Changed(
const double&)),
m_d->etacone1,SLOT(setEtaValue(
const double&)));
475 m_d->etacone1->setEtaValue(
m_d->controller->etaConeValue1());
476 connect(
m_d->controller,SIGNAL(showEtaCone1Changed(
bool)),
m_d->etacone1,SLOT(setShown(
bool)));
477 m_d->etacone1->setShown(
m_d->controller->showEtaCone1());
479 m_d->etacone2 =
new VP1EtaCone(
m_d->controller->etaCone2Material(),root,
this);
480 connect(
m_d->controller,SIGNAL(etaExtentChanged(
const double&)),
m_d->etacone2,SLOT(setExtent(
const double&)));
481 m_d->etacone2->setExtent(
m_d->controller->etaExtent());
482 connect(
m_d->controller,SIGNAL(etaConeValue2Changed(
const double&)),
m_d->etacone2,SLOT(setEtaValue(
const double&)));
483 m_d->etacone2->setEtaValue(
m_d->controller->etaConeValue2());
484 connect(
m_d->controller,SIGNAL(showEtaCone2Changed(
bool)),
m_d->etacone2,SLOT(setShown(
bool)));
485 m_d->etacone2->setShown(
m_d->controller->showEtaCone2());
487 m_d->etacone3 =
new VP1EtaCone(
m_d->controller->etaCone3Material(),root,
this);
488 connect(
m_d->controller,SIGNAL(etaExtentChanged(
const double&)),
m_d->etacone3,SLOT(setExtent(
const double&)));
489 m_d->etacone3->setExtent(
m_d->controller->etaExtent());
490 connect(
m_d->controller,SIGNAL(etaConeValue3Changed(
const double&)),
m_d->etacone3,SLOT(setEtaValue(
const double&)));
491 m_d->etacone3->setEtaValue(
m_d->controller->etaConeValue3());
492 connect(
m_d->controller,SIGNAL(showEtaCone3Changed(
bool)),
m_d->etacone3,SLOT(setShown(
bool)));
493 m_d->etacone3->setShown(
m_d->controller->showEtaCone3());
497 m_d->controller->caloTrkVolumesMaterial(),
498 m_d->controller->msTrkVolumesMaterial(),
499 m_d->controller->showInnerDetector(),
500 m_d->controller->showCalorimeters(),
501 m_d->controller->showMuonSpectrometer(),
503 connect(
m_d->controller,SIGNAL(showTrackingVolumesChanged(
bool)),
m_d->trackingVolumes,SLOT(setShown(
bool)));
504 connect(
m_d->controller,SIGNAL(showInnerDetectorChanged(
bool)),
m_d->trackingVolumes,SLOT(setShownID(
bool)));
505 connect(
m_d->controller,SIGNAL(showCalorimetersChanged(
bool)),
m_d->trackingVolumes,SLOT(setShownCalo(
bool)));
506 connect(
m_d->controller,SIGNAL(showMuonSpectrometerChanged(
bool)),
m_d->trackingVolumes,SLOT(setShownMS(
bool)));
507 m_d->trackingVolumes->setShown(
m_d->controller->showTrackingVolumes());
511 connect(
m_d->controller,SIGNAL(showLinesChanged(
bool)),
m_d->lines,SLOT(setShown(
bool)));
512 m_d->lines->setShown(
m_d->controller->showLines());
513 connect(
m_d->controller,SIGNAL(lineDirectionChanged(
const SbVec3f&)),
m_d->lines,SLOT(setDirection(
const SbVec3f&)));
514 m_d->lines->setDirection(
m_d->controller->lineDirection());
524 SoSeparator * projsep =
new SoSeparator;
525 root->addChild(projsep);
531 connect(
m_d->controller,SIGNAL(shownPixelProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
532 m_d->projsurfhelper_pixel,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
533 m_d->projsurfhelper_pixel->setSurfaces(
m_d->controller->shownPixelProjSurfaces());
535 connect(
m_d->controller,SIGNAL(shownSCTProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
536 m_d->projsurfhelper_sct,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
537 m_d->projsurfhelper_sct->setSurfaces(
m_d->controller->shownSCTProjSurfaces());
539 connect(
m_d->controller,SIGNAL(shownTRTProjSurfacesChanged(InDetProjFlags::InDetProjPartsFlags)),
540 m_d->projsurfhelper_trt,SLOT(setSurfaces(InDetProjFlags::InDetProjPartsFlags)));
541 m_d->projsurfhelper_trt->setSurfaces(
m_d->controller->shownTRTProjSurfaces());