12 #include "GaudiKernel/Bootstrap.h"
13 #include "Gaudi/Property.h"
14 #include "GaudiKernel/IService.h"
15 #include "GaudiKernel/IToolSvc.h"
19 #include "GeoModelKernel/GeoFullPhysVol.h"
20 #include "GeoModelKernel/Units.h"
21 #include "GaudiKernel/SystemOfUnits.h"
29 static const InterfaceID IID_LArRecoMaterialTool(
"LArRecoMaterialTool", 1, 0);
32 {
return IID_LArRecoMaterialTool; }
35 const std::string&
name,
36 const IInterface*
parent) :
38 m_calo_id(nullptr),m_dm_id(nullptr)
40 declareInterface<LArRecoMaterialTool>(
this );
71 ATH_MSG_INFO (
" LArRecoMaterialTool successfully initialized ");
72 return StatusCode::SUCCESS;
82 return StatusCode::SUCCESS;
88 double&
mass,
double& volume,
89 double& x0,
double& dEdx,
90 double& aveA,
double& aveZ
114 double& x0,
double& dEdx,
115 double& aveA,
double& aveZ
192 double&
mass,
double& x0,
double& dEdx,
193 double& aveA,
double& aveZ)
205 ATH_MSG_INFO (
"method ScanCryo does not support CaloSubdetNames::ALIGNVOL " << (
int) alvol);
236 m_child_massFractions.clear();
237 m_child_volumeFractions.clear();
238 m_child_x0Fractions.clear();
239 m_child_dEdXFractions.clear();
240 m_child_averageAFractions.clear();
241 m_child_averageZFractions.clear();
243 m_child_Volume.clear();
244 m_child_Mass.clear();
246 double childVolume = 0.;
247 double childMass = 0.;
249 double childDeDx = 0.;
250 double childAverageA = 0.;
251 double childAverageZ = 0.;
252 double childRho = 0.;
255 std::string
key = map_av(alvol);
269 const GeoFullPhysVol* larTopVolLink = storedPV->
getPhysVol();
272 unsigned int larChilds = larTopVolLink->getNChildVols();
274 for (
unsigned int ichild = 0; ichild<larChilds; ++ichild){
280 larTopVolLink->getNameOfChildVol(ichild) ==
"Total LAR Volume")
stop =
true;
282 larTopVolLink->getNameOfChildVol(ichild) ==
"Total LAR Volume")
stop =
true;
287 <<
" Direct Child " << ichild <<
" - with name : "
288 << larTopVolLink->getNameOfChildVol(ichild));
290 PVConstLink childVolLink = larTopVolLink->getChildVol(ichild);
292 m_massFractions.clear();
293 m_volumeFractions.clear();
294 m_x0Fractions.clear();
295 m_dEdXFractions.clear();
296 m_averageAFractions.clear();
297 m_averageZFractions.clear();
299 this->blendGeoVolume(childVolLink,
305 m_averageZFractions);
307 this->averageFraction(m_volumeFractions,
313 childMass, childVolume,
315 childAverageA, childAverageZ, childRho );
317 m_child_x0Fractions.push_back( childX0 );
318 m_child_dEdXFractions.push_back( childDeDx );
319 m_child_averageAFractions.push_back( childAverageA );
320 m_child_averageZFractions.push_back( childAverageZ );
321 m_child_Rho.push_back( childRho );
322 m_child_Volume.push_back( childVolume );
323 m_child_Mass.push_back( childMass );
330 ATH_MSG_DEBUG (
"Final average for CaloSubdetNames::ALIGNVOL " << (
int) alvol
333 this->averageFraction(m_child_Volume, m_child_Mass,
335 m_child_dEdXFractions,
336 m_child_averageAFractions,
337 m_child_averageZFractions,
338 childMass, childVolume,
340 childAverageA, childAverageZ, childRho );
345 aveA = childAverageA;
346 aveZ = childAverageZ;
350 m_alignvol_number.push_back( alvol );
351 m_alignvol_mass.push_back(
mass );
352 m_alignvol_x0.push_back( x0 );
353 m_alignvol_dEdX.push_back( dEdx );
354 m_alignvol_aveA.push_back( aveA );
355 m_alignvol_aveZ.push_back( aveZ );
362 double&
mass,
double& x0,
double& dEdx,
363 double& aveA,
double& aveZ)
376 ATH_MSG_INFO (
"method ScanCryo does not support CaloSubdetNames::ALIGNVOL " << (
int) alvol);
407 double childVolume = 0.;
408 double childMass = 0.;
410 double childDeDx = 0.;
411 double childAverageA = 0.;
412 double childAverageZ = 0.;
413 double childRho = 0.;
430 const GeoFullPhysVol* larTopVolLink = storedPV->
getPhysVol();
433 unsigned int larChilds = larTopVolLink->getNChildVols();
435 for (
unsigned int ichild = 0; ichild<larChilds; ++ichild){
446 <<
" Direct Child " << ichild <<
" - with name : "
447 << larTopVolLink->getNameOfChildVol(ichild));
449 PVConstLink childVolLink = larTopVolLink->getChildVol(ichild);
472 childMass, childVolume,
474 childAverageA, childAverageZ, childRho );
489 ATH_MSG_DEBUG (
"Final average for CaloSubdetNames::ALIGNVOL " << (
int) alvol
497 childMass, childVolume,
499 childAverageA, childAverageZ, childRho );
504 aveA = childAverageA;
505 aveZ = childAverageZ;
520 double&
mass,
double& x0,
double& dEdx,
521 double& aveA,
double& aveZ)
531 ATH_MSG_INFO (
"method ScanEMB does not support CaloSubdetNames::ALIGNVOL " << (
int) alvol);
557 double childVolume = 0.;
558 double childMass = 0.;
560 double childDeDx = 0.;
561 double childAverageA = 0.;
562 double childAverageZ = 0.;
563 double childRho = 0.;
585 const GeoFullPhysVol* larTopVolLink = storedPV->
getPhysVol();
588 unsigned int larChilds = larTopVolLink->getNChildVols();
590 for (
unsigned int ichild = 0; ichild<larChilds; ++ichild){
601 <<
" Direct Child " << ichild <<
" - with name : "
602 << larTopVolLink->getNameOfChildVol(ichild));
604 PVConstLink childVolLink = larTopVolLink->getChildVol(ichild);
627 childMass, childVolume,
629 childAverageA, childAverageZ, childRho );
644 ATH_MSG_DEBUG (
"Final average for CaloSubdetNames::ALIGNVOL " << (
int) alvol
652 childMass, childVolume,
654 childAverageA, childAverageZ, childRho );
659 aveA = childAverageA;
660 aveZ = childAverageZ;
675 double&
mass,
double& x0,
double& dEdx,
676 double& aveA,
double& aveZ)
685 ATH_MSG_INFO (
"method ScanEMEM does not support CaloSubdetNames::ALIGNVOL " << (
int) alvol);
713 double&
mass,
double& x0,
double& dEdx,
714 double& aveA,
double& aveZ)
726 ATH_MSG_INFO (
"method ScanEMB does not support CaloSubdetNames::ALIGNVOL "
753 double childVolume = 0.;
754 double childMass = 0.;
756 double childDeDx = 0.;
757 double childAverageA = 0.;
758 double childAverageZ = 0.;
759 double childRho = 0.;
781 const GeoFullPhysVol* larTopVolLink = storedPV->
getPhysVol();
784 unsigned int larChilds = larTopVolLink->getNChildVols();
786 for (
unsigned int ichild = 0; ichild<larChilds; ++ichild){
797 <<
" Direct Child " << ichild <<
" - with name : "
798 << larTopVolLink->getNameOfChildVol(ichild));
800 PVConstLink childVolLink = larTopVolLink->getChildVol(ichild);
823 childMass, childVolume,
825 childAverageA, childAverageZ, childRho );
840 ATH_MSG_DEBUG (
"Final average for CaloSubdetNames::ALIGNVOL " << (
int) alvol
848 childMass, childVolume,
850 childAverageA, childAverageZ, childRho );
855 aveA = childAverageA;
856 aveZ = childAverageZ;
871 double&
mass,
double& x0,
double& dEdx,
872 double& aveA,
double& aveZ)
886 ATH_MSG_INFO (
"method ScanEMB does not support CaloSubdetNames::ALIGNVOL "
931 double childVolume = 0.;
932 double childMass = 0.;
934 double childDeDx = 0.;
935 double childAverageA = 0.;
936 double childAverageZ = 0.;
937 double childRho = 0.;
959 const GeoFullPhysVol* larTopVolLink = storedPV->
getPhysVol();
962 unsigned int larChilds = larTopVolLink->getNChildVols();
964 for (
unsigned int ichild = 0; ichild<larChilds; ++ichild){
975 <<
" Direct Child " << ichild <<
" - with name : "
976 << larTopVolLink->getNameOfChildVol(ichild));
978 PVConstLink childVolLink = larTopVolLink->getChildVol(ichild);
1001 childMass, childVolume,
1003 childAverageA, childAverageZ, childRho );
1018 ATH_MSG_DEBUG (
"Final average for CaloSubdetNames::ALIGNVOL " << (
int) alvol
1026 childMass, childVolume,
1028 childAverageA, childAverageZ, childRho );
1033 aveA = childAverageA;
1034 aveZ = childAverageZ;
1049 std::vector<double>& volume,
1050 std::vector<double>&
mass,
1051 std::vector<double>& x0,
1052 std::vector<double>& dEdX,
1053 std::vector<double>& aveA,
1054 std::vector<double>& aveZ)
const
1057 const GeoLogVol* currentVol = geoVolLink->getLogVol();
1060 unsigned int currentVolChilds = geoVolLink->getNChildVols();
1061 for (
unsigned int ichild = 0; ichild < currentVolChilds; ichild++){
1062 GeoPVConstLink childVolumeLink = geoVolLink->getChildVol(ichild);
1070 std::vector<double>& volume,
1071 std::vector<double>&
mass,
1072 std::vector<double>& x0,
1073 std::vector<double>& dEdX,
1074 std::vector<double>& aveA,
1075 std::vector<double>& aveZ)
const
1077 const GeoShape* childShape = geoVol.getShape();
1078 const GeoMaterial* childMaterial = geoVol.getMaterial();
1080 double childVolume = childShape->volume();
1082 double childNumberOfElements = childMaterial->getNumElements();
1083 double childX0 = childMaterial->getRadLength ();
1084 double childDeDx = childMaterial->getDeDxMin();
1085 double childRho = childMaterial->getDensity();
1088 <<
" has volume=" << childVolume <<
" mm**3 and "
1089 << childNumberOfElements <<
" elements ");
1091 for (
unsigned int iEl=0; iEl<childNumberOfElements; iEl++){
1092 const GeoElement* geoEl = childMaterial->getElement(iEl);
1093 double fraction = childMaterial->getFraction(iEl);
1095 ATH_MSG_DEBUG (
" direct child : " << geoEl->getName() <<
" fraction = " << fraction
1098 volume.push_back(fraction*childVolume);
1099 mass.push_back(fraction*childVolume*childRho);
1100 x0.push_back(fraction*childX0);
1101 dEdX.push_back(fraction*childDeDx);
1103 aveZ.push_back(fraction*(geoEl->getZ()));
1110 std::vector<double>& massFractions,
1111 std::vector<double>& x0Fractions,
1112 std::vector<double>& dEdXFractions,
1113 std::vector<double>& averageAFractions,
1114 std::vector<double>& averageZFractions,
1115 double& childMass,
double& childVolume,
1116 double& childX0,
double& childDeDx,
1117 double& childAverageA,
double& childAverageZ,
double& childRho )
1119 unsigned int parsedVolumes = massFractions.size();
1121 << parsedVolumes <<
" elements ");
1131 for (
unsigned int ivols = 0; ivols < parsedVolumes; ++ivols) {
1132 childMass += massFractions[ivols];
1133 childVolume += volumeFractions[ivols];
1136 for (
unsigned int ivolfrac = 0; ivolfrac < parsedVolumes; ++ivolfrac){
1137 double volfrac = volumeFractions[ivolfrac]/childVolume;
1138 childX0 += volfrac * x0Fractions[ivolfrac];
1139 childDeDx += volfrac * dEdXFractions[ivolfrac];
1140 double massfrac = massFractions[ivolfrac]/childMass;
1141 childAverageA += massfrac * averageAFractions[ivolfrac];
1142 childAverageZ += massfrac * averageZFractions[ivolfrac];
1148 ATH_MSG_DEBUG (
" + averaged over " << parsedVolumes <<
" volumes ");
1166 return std::string(
"LARCRYO_B");
1168 return std::string(
"LARCRYO_EC_POS");
1170 return std::string(
"LARCRYO_EC_NEG");
1172 return std::string(
"SOLENOID");
1174 return std::string(
"PRESAMPLER_B_POS");
1176 return std::string(
"PRESAMPLER_B_NEG");
1178 return std::string(
"EMB_POS");
1180 return std::string(
"EMB_NEG");
1182 return std::string(
"PRESAMPLER_EC_POS");
1184 return std::string(
"PRESAMPLER_EC_NEG");
1186 return std::string(
"EMEC_POS");
1188 return std::string(
"EMEC_NEG");
1190 return std::string(
"HEC1_POS");
1192 return std::string(
"HEC1_NEG");
1194 return std::string(
"HEC2_POS");
1196 return std::string(
"HEC2_NEG");
1198 return std::string(
"FCAL1_POS");
1200 return std::string(
"FCAL1_NEG");
1202 return std::string(
"FCAL2_POS");
1204 return std::string(
"FCAL2_NEG");
1206 return std::string(
"FCAL3_POS");
1208 return std::string(
"FCAL3_NEG");
1210 return std::string(
"");