18 #include "GaudiKernel/ITHistSvc.h"
24 m_incidentSvc(
"IncidentSvc",
n),
25 m_materialAssociationType(1),
26 m_maxMappingEvents(100000),
28 m_totalMaterialTree(
"TotalMaterial"),
29 m_validationTree(nullptr),
30 m_validationTreeName(
"MaterialMapper"),
31 m_validationTreeDescription(
"Material Effects Updator information"),
32 m_validationTreeFolder(
"/val/MaterialMapper"),
34 m_averageEta{}, m_averagePhi{}, m_mappedPath{}, m_mappedPathInX0{},
35 m_mappedPathInL0{}, m_mappedPathRho{}, m_mappedPathZARho{},
37 m_volumeValidation(
true),
38 m_volumeTreePrefix(
"VolumeMaterial"),
39 m_layerValidation(
true),
40 m_layerTreePrefix(
"LayerMaterial_"),
41 m_surfaceValidation(
true),
42 m_surfaceTreePrefix(
"SurfaceMaterial_")
44 declareInterface<IMaterialMapper>(
this);
50 declareProperty(
"ValidationTreeDescription", m_validationTreeDescription);
72 if (m_volumeValidation) {
73 auto volTreeIter = m_volumeTrees.begin();
74 auto endVolTreeIter = m_volumeTrees.end();
75 for ( ; volTreeIter != endVolTreeIter;
delete (volTreeIter->second), ++volTreeIter) {}
78 if (m_layerValidation) {
80 auto layTreeIter = m_layerTrees.begin();
81 auto endLayTreeIter = m_layerTrees.end();
82 for ( ; layTreeIter != endLayTreeIter;
delete (layTreeIter->second), ++layTreeIter) {}
84 layTreeIter = m_layerFullTrees.begin();
85 endLayTreeIter = m_layerFullTrees.end();
86 for ( ; layTreeIter != endLayTreeIter;
delete (layTreeIter->second), ++layTreeIter) {}
89 if (m_surfaceValidation) {
91 auto surfTreeIter = m_surfaceTrees.begin();
92 auto endSurfTreeIter = m_surfaceTrees.end();
93 for ( ; surfTreeIter != endSurfTreeIter;
delete (surfTreeIter->second), ++surfTreeIter) {}
103 if (m_incidentSvc.retrieve().isFailure()){
104 ATH_MSG_WARNING(
"Could not retrieve " << m_incidentSvc <<
". Exiting.");
105 return StatusCode::FAILURE;
108 m_incidentSvc->addListener(
this, IncidentType::EndEvent);
111 bookValidationTree();
112 return StatusCode::SUCCESS;
119 return StatusCode::SUCCESS;
125 if (m_processedEvents >= m_maxMappingEvents)
return;
135 ATH_MSG_WARNING(
"Could not associate TrackingVolume to material step!");
150 if(amhit.
A() != 0.0) {
151 (*volTreeObj).pathZARho += (amhit.
Z()/amhit.
A())*amhit.
rho()*amhit.
steplength();
161 m_averageEta += position.eta();
162 m_averagePhi += position.phi();
167 m_mappedPath += steplength;
170 m_mappedPathRho += amhit.
rho()*steplength;
171 if(amhit.
A() != 0.0) {
172 m_mappedPathZARho += (amhit.
Z()/amhit.
A())*amhit.
rho()*steplength;
174 ATH_MSG_VERBOSE(
"[ MaterialMapper ] Accumulated Path in Rho (*Z/A) = " << m_mappedPathRho <<
" ( " << m_mappedPathZARho <<
" )");
181 m_materialAccumPathInX0[m_materialSteps] = m_mappedPathInX0;
182 m_materialAccumPathZARho[m_materialSteps] = m_mappedPathZARho;
183 m_materialStepPath[m_materialSteps] = steplength;
184 m_materialStepX0[m_materialSteps] = amhit.
x0();
185 m_materialStepL0[m_materialSteps] = amhit.
l0();
186 m_materialStepA[m_materialSteps] = amhit.
A();
187 m_materialStepZ[m_materialSteps] = amhit.
Z();
188 m_materialStepRho[m_materialSteps] = amhit.
rho();
189 m_materialStepPositionX[m_materialSteps] = position.x();
190 m_materialStepPositionY[m_materialSteps] = position.y();
191 m_materialStepPositionZ[m_materialSteps] = position.z();
192 m_materialStepPositionR[m_materialSteps] = position.perp();
194 m_materialProjPositionX[m_materialSteps] = projectedPosition.x();
195 m_materialProjPositionY[m_materialSteps] = projectedPosition.y();
196 m_materialProjPositionZ[m_materialSteps] = projectedPosition.z();
197 m_materialProjPositionR[m_materialSteps] = projectedPosition.perp();
198 m_materialProjDistance[m_materialSteps] = (position-projectedPosition).
mag();
204 if (m_layerValidation) recordLayerHit(amhit);
212 auto volTreeIter =
mapped ? m_volumeTrees.begin() : m_volumeTreesUnmapped.begin();
213 auto endVolTreeIter =
mapped ? m_volumeTrees.end() : m_volumeTreesUnmapped.end();
216 for ( ; volTreeIter != endVolTreeIter; ++volTreeIter ) {
220 if (!volTreeObj)
continue;
222 if ((*volTreeObj).path > 0.) {
224 (*volTreeObj).
eta = m_averageEta;
225 (*volTreeObj).phi = m_averagePhi;
227 (*volTreeObj).tree->Fill();
230 (*volTreeObj).eta = 0.;
231 (*volTreeObj).phi = 0.;
232 (*volTreeObj).path = 0.;
233 (*volTreeObj).pathInX0 = 0.;
234 (*volTreeObj).pathInL0 = 0.;
235 (*volTreeObj).pathZARho = 0.;
244 if (m_processedEvents >= m_maxMappingEvents)
return;
247 if (m_layerValidation && lay) {
261 double posR =
pos.perp();
262 double posEta =
pos.eta();
265 (*layTreeObj).hitPositionX[(*layTreeObj).layerHits] =
posX;
266 (*layTreeObj).hitPositionY[(*layTreeObj).layerHits] =
posY;
267 (*layTreeObj).hitPositionZ[(*layTreeObj).layerHits] =
posZ;
268 (*layTreeObj).hitPositionR[(*layTreeObj).layerHits] = posR;
269 (*layTreeObj).hitPositionEta[(*layTreeObj).layerHits] = posEta;
272 ++(*layTreeObj).layerHits;
273 ++(*layTreeObj).densedHits;
276 (*layTreeObj).densedHitX +=
posX;
277 (*layTreeObj).densedHitY +=
posY;
278 (*layTreeObj).densedHitZ +=
posZ;
279 (*layTreeObj).densedHitR += posR;
280 (*layTreeObj).densedHitPhi +=
pos.phi();
281 (*layTreeObj).densedHitTheta +=
pos.theta();
301 for (
size_t iltm = 0; iltm < 2; ++iltm) {
303 auto layObjIter = iltm ? m_layerFullTrees.begin() : m_layerTrees.begin();
304 auto endIter = iltm ? m_layerFullTrees.end() : m_layerTrees.end();
306 for ( ; layObjIter != endIter; ++layObjIter ) {
310 if (!layTreeObj)
continue;
313 int hits = (*layTreeObj).densedHits;
315 if ((*layTreeObj).pathInX0 > 0.) {
317 (*layTreeObj).densedHitX /=
hits;
318 (*layTreeObj).densedHitY /=
hits;
319 (*layTreeObj).densedHitZ /=
hits;
320 (*layTreeObj).densedHitR /=
hits;
321 (*layTreeObj).densedHitPhi /=
hits;
322 (*layTreeObj).densedHitTheta /=
hits;
323 (*layTreeObj).correctionFactor /=
hits;
324 (*layTreeObj).A /= (*layTreeObj).rho;
325 (*layTreeObj).Z /= (*layTreeObj).rho;
326 (*layTreeObj).rho /= (*layTreeObj).path;
329 (*layTreeObj).tree->Fill();
332 (*layTreeObj).layerHits = 0;
333 (*layTreeObj).path = 0.;
334 (*layTreeObj).pathInX0 = 0.;
335 (*layTreeObj).pathInL0 = 0.;
336 (*layTreeObj).densedHits = 0;
337 (*layTreeObj).densedHitX = 0.;
338 (*layTreeObj).densedHitY = 0.;
339 (*layTreeObj).densedHitZ = 0.;
340 (*layTreeObj).densedHitR = 0.;
341 (*layTreeObj).densedHitPhi = 0.;
342 (*layTreeObj).densedHitTheta = 0.;
343 (*layTreeObj).correctionFactor = 0.;
344 (*layTreeObj).A = 0.;
345 (*layTreeObj).Z = 0.;
346 (*layTreeObj).rho = 0.;
356 if (m_processedEvents >= m_maxMappingEvents)
return;
359 if (m_surfaceValidation && lay) {
365 (*surfTreeObj).loc1 += locpos[0];
366 (*surfTreeObj).loc2 += locpos[1];
376 ++(*surfTreeObj).surfaceHits;
389 auto surfObjIter = m_surfaceTrees.begin();
390 auto endIter = m_surfaceTrees.end();
392 for ( ; surfObjIter != endIter; ++surfObjIter ) {
395 int hits = (*surfTreeObj).surfaceHits;
397 if ((*surfTreeObj).pathInX0 > 0.) {
399 (*surfTreeObj).loc1 /=
hits;
400 (*surfTreeObj).loc2 /=
hits;
401 (*surfTreeObj).eta /=
hits;
402 (*surfTreeObj).correctionFactor /=
hits;
403 (*surfTreeObj).A /=
hits;
404 (*surfTreeObj).Z /=
hits;
405 (*surfTreeObj).rho /=
hits;
408 (*surfTreeObj).tree->Fill();
411 (*surfTreeObj).loc1 = 0.;
412 (*surfTreeObj).loc2 = 0.;
413 (*surfTreeObj).eta = 0.;
415 (*surfTreeObj).correctionFactor = 0.;
416 (*surfTreeObj).path = 0.;
417 (*surfTreeObj).pathInX0 = 0.;
418 (*surfTreeObj).pathInL0 = 0.;
419 (*surfTreeObj).rho = 0.;
421 (*surfTreeObj).surfaceHits = 0;
430 auto endIter = lay ? m_volumeTrees.end() : m_volumeTreesUnmapped.end();
431 auto findIter = lay ? m_volumeTrees.end() : m_volumeTreesUnmapped.end();
435 findIter = lay ? m_volumeTrees.find(tvol) : m_volumeTreesUnmapped.find(tvol);
437 if (findIter == endIter) {
440 tvolName.ReplaceAll(
"::",
"_");
447 TString treeTitle =
"TrackingVolume : ";
448 treeTitle += tvolName;
449 if (!lay) treeTitle +=
" - UNMAPPED";
451 TString treeRegName =
"/val/";
455 ATH_MSG_INFO(
" -> Booking it now with register name : " << treeRegName.Data() );
459 m_volumeTrees.insert(std::make_pair(tvol,tvolTreeObj));
461 m_volumeTreesUnmapped.insert(std::make_pair(tvol,tvolTreeObj));
464 ITHistSvc* tHistSvc =
nullptr;
465 if (service(
"THistSvc",tHistSvc).isFailure()) {
466 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching Tree output for this volume off !" );
467 delete tvolTreeObj; tvolTreeObj =
nullptr;
469 else if (tHistSvc && (tHistSvc->regTree(treeRegName.Data(), (*tvolTreeObj).tree)).isFailure()) {
470 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching Tree output for this volume off !" );
471 delete tvolTreeObj; tvolTreeObj =
nullptr;
475 tvolTreeObj = findIter->second;
490 auto it = m_layerFullTrees.find(&lay);
491 if (
it != m_layerFullTrees.end()) {
496 auto it = m_layerTrees.find(&lay);
497 if (
it != m_layerTrees.end()) {
506 ATH_MSG_INFO(
"MaterialLayer from BoundarySurface detected.");
509 TString tvolName = (enclosingVolume) ? enclosingVolume->
volumeName() :
"BoundaryLayers";
510 tvolName.ReplaceAll(
"::",
"_");
517 "CylinderLayer_" :
"DiscLayer_";
520 if (mLayer)
treeName +=
"boundary_";
523 TString treeTitle =
"TrackingVolume :";
524 treeTitle += tvolName;
526 TString treeRegName =
"/val/";
530 ATH_MSG_INFO(
" -> Booking it now with register name : " << treeRegName.Data() );
533 if (
full) m_layerFullTrees.insert(std::make_pair(&lay,layTreeObj));
534 else m_layerTrees.insert(std::make_pair(&lay,layTreeObj));
537 ITHistSvc* tHistSvc =
nullptr;
538 if (service(
"THistSvc",tHistSvc).isFailure()) {
539 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching Tree output for this layer off !" );
540 delete layTreeObj; layTreeObj =
nullptr;
542 else if (tHistSvc && (tHistSvc->regTree(treeRegName.Data(), (*layTreeObj).tree)).isFailure()) {
543 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching Tree output for this layer off !" );
544 delete layTreeObj; layTreeObj =
nullptr;
556 auto endIter = m_surfaceTrees.end();
557 auto findIter = m_surfaceTrees.end();
561 findIter = m_surfaceTrees.find(&lay);
562 if (findIter == endIter) {
565 TString volumeName = (enclosingVolume) ? enclosingVolume->
volumeName() :
"Unknown";
567 TString
treeName = m_surfaceTreePrefix;
570 TString treeTitle =
"TrackingVolume :";
571 treeTitle += volumeName;
573 TString treeRegName =
"/val/";
577 <<
" in Volume '" << volumeName <<
"'." );
578 ATH_MSG_INFO(
" -> Booking it now with register name : " << treeRegName.Data() );
581 m_surfaceTrees.insert(std::make_pair(&lay,surfTreeObj));
584 ITHistSvc* tHistSvc =
nullptr;
585 if (service(
"THistSvc",tHistSvc).isFailure()) {
586 ATH_MSG_INFO(
"initialize() Could not find Hist Service -> Switching Tree output for this surface off !" );
587 delete surfTreeObj; surfTreeObj =
nullptr;
589 else if (tHistSvc && (tHistSvc->regTree(treeRegName.Data(), (*surfTreeObj).tree)).isFailure()) {
590 ATH_MSG_INFO(
"initialize() Could not register the validation Tree -> Switching Tree output for this surface off !" );
591 delete surfTreeObj; surfTreeObj =
nullptr;
595 surfTreeObj = findIter->second;
602 if ( inc.type() == IncidentType::EndEvent && m_materialSteps){
606 m_averageEta /= m_materialSteps;
607 m_averagePhi /= m_materialSteps;
609 finalizeVolumeHits(
true);
610 finalizeVolumeHits(
false);
614 finalizeSurfaceHits();
616 m_validationTree->Fill();
623 m_mappedPathInX0 = 0.;
624 m_mappedPathInL0 = 0.;
625 m_mappedPathRho = 0.;
626 m_mappedPathZARho = 0.;
639 ITHistSvc* tHistSvc =
nullptr;
643 m_validationTree =
new TTree(m_validationTreeName.c_str(), m_validationTreeDescription.c_str());
646 m_validationTree->Branch(
"Eta", &m_averageEta,
"averageEta/F");
647 m_validationTree->Branch(
"Phi", &m_averagePhi,
"averagePhiF");
648 m_validationTree->Branch(
"Path", &m_mappedPath,
"path/F");
649 m_validationTree->Branch(
"PathInX0", &m_mappedPathInX0,
"pathInX0/F");
650 m_validationTree->Branch(
"PathInL0", &m_mappedPathInL0,
"pathInL0/F");
651 m_validationTree->Branch(
"PathRho", &m_mappedPathRho,
"pathRho/F");
652 m_validationTree->Branch(
"PathZARho", &m_mappedPathZARho,
"pathZARho/F");
653 m_validationTree->Branch(
"UnmappedPathInX0", &m_unmappedPathInX0,
"unmappedPathInX0/F");
654 m_validationTree->Branch(
"MaterialSteps", &m_materialSteps,
"steps/I");
655 m_validationTree->Branch(
"Mapped", m_mapped,
"mapped[steps]/I");
656 m_validationTree->Branch(
"MaterialAccumPathInX0", m_materialAccumPathInX0,
"materialAccumPinX0[steps]/F");
657 m_validationTree->Branch(
"MaterialAccumPathZARho", m_materialAccumPathZARho,
"materialAccumPZARho[steps]/F");
658 m_validationTree->Branch(
"MaterialStepPath", m_materialStepPath,
"materialStepPath[steps]/F");
659 m_validationTree->Branch(
"MaterialStepX0", m_materialStepX0,
"materialStepX0[steps]/F");
660 m_validationTree->Branch(
"MaterialStepL0", m_materialStepL0,
"materialStepL0[steps]/F");
661 m_validationTree->Branch(
"MaterialStepZ", m_materialStepZ,
"materialStepZ[steps]/F");
662 m_validationTree->Branch(
"MaterialStepA", m_materialStepA,
"materialStepA[steps]/F");
663 m_validationTree->Branch(
"MaterialStepRho", m_materialStepRho,
"materialStepRho[steps]/F");
664 m_validationTree->Branch(
"MaterialStepPositionX", m_materialStepPositionX ,
"materialStepX[steps]/F");
665 m_validationTree->Branch(
"MaterialStepPositionY", m_materialStepPositionY ,
"materialStepY[steps]/F");
666 m_validationTree->Branch(
"MaterialStepPositionZ", m_materialStepPositionZ ,
"materialStepZ[steps]/F");
667 m_validationTree->Branch(
"MaterialStepPositionR", m_materialStepPositionR ,
"materialStepR[steps]/F");
668 m_validationTree->Branch(
"MaterialProjPositionX", m_materialProjPositionX ,
"materialProjX[steps]/F");
669 m_validationTree->Branch(
"MaterialProjPositionY", m_materialProjPositionY ,
"materialProjY[steps]/F");
670 m_validationTree->Branch(
"MaterialProjPositionZ", m_materialProjPositionZ ,
"materialProjZ[steps]/F");
671 m_validationTree->Branch(
"MaterialProjPositionR", m_materialProjPositionR ,
"materialProjR[steps]/F");
672 m_validationTree->Branch(
"MaterialProjDistance", m_materialProjDistance ,
"materialProjD[steps]/F");
675 if (service(
"THistSvc",tHistSvc).isFailure()) {
676 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching ValidationMode Off !" );
677 delete m_validationTree; m_validationTree =
nullptr;
680 if ((tHistSvc->regTree(m_validationTreeFolder.c_str(), m_validationTree)).isFailure()) {
681 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching ValidationMode Off !" );
682 delete m_validationTree; m_validationTree =
nullptr;