diff --git a/FCCee/CLD/compact/CLD_o4_v05/LAr_ECalBarrel.xml b/FCCee/CLD/compact/CLD_o4_v05/LAr_ECalBarrel.xml
index 55519bd5a..c0ccdbf10 100644
--- a/FCCee/CLD/compact/CLD_o4_v05/LAr_ECalBarrel.xml
+++ b/FCCee/CLD/compact/CLD_o4_v05/LAr_ECalBarrel.xml
@@ -82,15 +82,13 @@
-
system:5,cryo:1,type:3,subtype:3,layer:8,module:11,eta:9
-
-
+
system:5,cryo:1,type:3,subtype:3,layer:8,eta:9,phi:10
diff --git a/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v03_geo.cpp b/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v03_geo.cpp
index 288b8c158..87614c7bb 100644
--- a/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v03_geo.cpp
+++ b/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v03_geo.cpp
@@ -1,6 +1,8 @@
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Handle.h"
#include "XML/Utilities.h"
+#include "DDRec/MaterialManager.h"
+#include "DDRec/Vector3D.h"
#include
@@ -687,9 +689,73 @@ static dd4hep::detail::Ref_t createECalBarrelInclined(dd4hep::Detector& aLcdd,
caloData->layoutType = dd4hep::rec::LayeredCalorimeterData::BarrelLayout;
caloDetElem.addExtension(caloData);
+ caloData->extent[0] = Rmin;
+ caloData->extent[1] = Rmax;
+ caloData->extent[2] = 0.; // NN: for barrel detectors this is 0
+ caloData->extent[3] = caloDim.dz();
+
// Set type flags
dd4hep::xml::setDetectorTypeFlag(xmlDetElem, caloDetElem);
+ // Information needed for Pandora: average interaction and radiation lengths per layer
+ dd4hep::rec::MaterialManager matMgr(envelopeVol);
+ dd4hep::rec::LayeredCalorimeterData::Layer caloLayer;
+
+ double rad_first = Rmin;
+ double rad_last = 0;
+ double scale_fact = dR / (-Rmin * cos(angle) + sqrt(pow(Rmax, 2) - pow(Rmin * sin(angle), 2)));
+ // since the layer height is given along the electrode and not along the radius it needs to be scaled to get the values of layer height radially
+ std::cout << "Scaling factor " << scale_fact << std::endl;
+ for (size_t il = 0; il < layerHeight.size(); il++) {
+ double thickness_sen = 0.;
+ double absorberThickness = 0.;
+
+ rad_last = rad_first + (layerHeight[il] * scale_fact);
+ dd4hep::rec::Vector3D ivr1 = dd4hep::rec::Vector3D(0., rad_first, 0); // defining starting vector points of the given layer
+ dd4hep::rec::Vector3D ivr2 = dd4hep::rec::Vector3D(0., rad_last, 0); // defining end vector points of the given layer
+ std::cout << "radius first " << rad_first << " radius last " << rad_last << std::endl;
+
+ const dd4hep::rec::MaterialVec &materials = matMgr.materialsBetween(ivr1, ivr2); // calling material manager to get material info between two points
+ auto mat = matMgr.createAveragedMaterial(materials); // creating average of all the material between two points to calculate X0 and lambda of averaged material
+ const double nRadiationLengths = mat.radiationLength();
+ const double nInteractionLengths = mat.interactionLength();
+ const double difference_bet_r1r2 = (ivr1 - ivr2).r();
+ const double value_of_x0 = layerHeight[il] / nRadiationLengths;
+ const double value_of_lambda = layerHeight[il] / nInteractionLengths;
+ std::string str1("LAr");
+
+ for (size_t imat = 0; imat < materials.size(); imat++) {
+
+ std::string str2(materials.at(imat).first.name());
+ if (str1.compare(str2) == 0){
+ thickness_sen += materials.at(imat).second;
+ }
+ else {
+ absorberThickness += materials.at(imat).second;
+ }
+ }
+ rad_first = rad_last;
+ std::cout << "The sensitive thickness is " << thickness_sen << std::endl;
+ std::cout << "The absorber thickness is " << absorberThickness << std::endl;
+ std::cout << "The radiation length is " << value_of_x0 << " and the interaction length is " << value_of_lambda << std::endl;
+
+ caloLayer.distance = rad_first;
+ caloLayer.sensitive_thickness = thickness_sen;
+ caloLayer.inner_nRadiationLengths = value_of_x0 / 2.0;
+ caloLayer.inner_nInteractionLengths = value_of_lambda / 2.0;
+ caloLayer.inner_thickness = difference_bet_r1r2 / 2.0;
+
+ caloLayer.outer_nRadiationLengths = value_of_x0 / 2.0;
+ caloLayer.outer_nInteractionLengths = value_of_lambda / 2.0;
+ caloLayer.outer_thickness = difference_bet_r1r2 / 2;
+
+ caloLayer.absorberThickness = absorberThickness;
+ caloLayer.cellSize0 = 2 * dd4hep::mm;
+ caloLayer.cellSize1 = 2 * dd4hep::mm;
+
+ caloData->layers.push_back(caloLayer);
+ }
+
return caloDetElem;
}
} // namespace det
diff --git a/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v04_geo.cpp b/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v04_geo.cpp
index 11eb17d16..9c1f1def2 100644
--- a/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v04_geo.cpp
+++ b/detector/calorimeter/ECalBarrel_NobleLiquid_InclinedTrapezoids_o1_v04_geo.cpp
@@ -1,6 +1,8 @@
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Handle.h"
#include "XML/Utilities.h"
+#include "DDRec/MaterialManager.h"
+#include "DDRec/Vector3D.h"
#include
@@ -757,9 +759,73 @@ static dd4hep::detail::Ref_t createECalBarrelInclined(dd4hep::Detector& aLcdd,
caloData->layoutType = dd4hep::rec::LayeredCalorimeterData::BarrelLayout;
caloDetElem.addExtension(caloData);
+ caloData->extent[0] = Rmin;
+ caloData->extent[1] = Rmax;
+ caloData->extent[2] = 0.; // NN: for barrel detectors this is 0
+ caloData->extent[3] = caloDim.dz();
+
// Set type flags
dd4hep::xml::setDetectorTypeFlag(xmlDetElem, caloDetElem);
+ // Information needed for Pandora: average interaction and radiation lengths per layer
+ dd4hep::rec::MaterialManager matMgr(envelopeVol);
+ dd4hep::rec::LayeredCalorimeterData::Layer caloLayer;
+
+ double rad_first = Rmin;
+ double rad_last = 0;
+ double scale_fact = dR / (-Rmin * cos(angle) + sqrt(pow(Rmax, 2) - pow(Rmin * sin(angle), 2)));
+ // since the layer height is given along the electrode and not along the radius it needs to be scaled to get the values of layer height radially
+ std::cout << "Scaling factor " << scale_fact << std::endl;
+ for (size_t il = 0; il < layerHeight.size(); il++) {
+ double thickness_sen = 0.;
+ double absorberThickness = 0.;
+
+ rad_last = rad_first + (layerHeight[il] * scale_fact);
+ dd4hep::rec::Vector3D ivr1 = dd4hep::rec::Vector3D(0., rad_first, 0); // defining starting vector points of the given layer
+ dd4hep::rec::Vector3D ivr2 = dd4hep::rec::Vector3D(0., rad_last, 0); // defining end vector points of the given layer
+ std::cout << "radius first " << rad_first << " radius last " << rad_last << std::endl;
+
+ const dd4hep::rec::MaterialVec &materials = matMgr.materialsBetween(ivr1, ivr2); // calling material manager to get material info between two points
+ auto mat = matMgr.createAveragedMaterial(materials); // creating average of all the material between two points to calculate X0 and lambda of averaged material
+ const double nRadiationLengths = mat.radiationLength();
+ const double nInteractionLengths = mat.interactionLength();
+ const double difference_bet_r1r2 = (ivr1 - ivr2).r();
+ const double value_of_x0 = layerHeight[il] / nRadiationLengths;
+ const double value_of_lambda = layerHeight[il] / nInteractionLengths;
+ std::string str1("LAr");
+
+ for (size_t imat = 0; imat < materials.size(); imat++) {
+
+ std::string str2(materials.at(imat).first.name());
+ if (str1.compare(str2) == 0){
+ thickness_sen += materials.at(imat).second;
+ }
+ else {
+ absorberThickness += materials.at(imat).second;
+ }
+ }
+ rad_first = rad_last;
+ std::cout << "The sensitive thickness is " << thickness_sen << std::endl;
+ std::cout << "The absorber thickness is " << absorberThickness << std::endl;
+ std::cout << "The radiation length is " << value_of_x0 << " and the interaction length is " << value_of_lambda << std::endl;
+
+ caloLayer.distance = rad_first;
+ caloLayer.sensitive_thickness = thickness_sen;
+ caloLayer.inner_nRadiationLengths = value_of_x0 / 2.0;
+ caloLayer.inner_nInteractionLengths = value_of_lambda / 2.0;
+ caloLayer.inner_thickness = difference_bet_r1r2 / 2.0;
+
+ caloLayer.outer_nRadiationLengths = value_of_x0 / 2.0;
+ caloLayer.outer_nInteractionLengths = value_of_lambda / 2.0;
+ caloLayer.outer_thickness = difference_bet_r1r2 / 2;
+
+ caloLayer.absorberThickness = absorberThickness;
+ caloLayer.cellSize0 = 2 * dd4hep::mm;
+ caloLayer.cellSize1 = 2 * dd4hep::mm;
+
+ caloData->layers.push_back(caloLayer);
+ }
+
return caloDetElem;
}
} // namespace det