diff --git a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql index d03eafb9eda60a9e923da8da01ee28d3a2856700..91da60701ed83465bd8a3ef50b6f4d11073c424d 100644 --- a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql +++ b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql @@ -2158,7 +2158,7 @@ INSERT INTO "ELEMENTS_DATA2TAG" VALUES (100008, 91); -- INSERT INTO "EMULSIONTOPLEVEL_DATA" VALUES (0, 0.0, 0.0, -2475.72, 0.0, 0.0, 0.0, 321, "Emulsion"); INSERT INTO "EMULSIONTOPLEVEL_DATA" VALUES (1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 321, "StationA"); -INSERT INTO "EMULSIONTOPLEVEL_DATA" VALUES (2, 10.0, -21.0, -2475.72, 0.0, 0.0, 0.0, 321, "Emulsion"); +INSERT INTO "EMULSIONTOPLEVEL_DATA" VALUES (2, 10.0, -21.0, -2510.27, 0.0, 0.0, 0.0, 321, "Emulsion"); INSERT INTO "EMULSIONTOPLEVEL_DATA2TAG" VALUES (100035, 0); INSERT INTO "EMULSIONTOPLEVEL_DATA2TAG" VALUES (100035, 1); INSERT INTO "EMULSIONTOPLEVEL_DATA2TAG" VALUES (107841, 2); diff --git a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.cxx b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.cxx index 7424987e17929d371002aa7f778e7a2a0ae08b06..5dbe4b9b91c6246124800f7e3f885a46a47ce1a8 100644 --- a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.cxx +++ b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.cxx @@ -40,16 +40,16 @@ EmulsionPlates::EmulsionPlates(const std::string & name, m_logVolume = preBuild(); } - void EmulsionPlates::getParameters() { const EmulsionGeneralParameters * generalParameters = m_geometryManager->generalParameters(); const EmulsionPlatesParameters * platesParameters = m_geometryManager->platesParameters(); + const EmulsionSupportParameters* supportParameters = m_geometryManager->supportParameters(); - m_width = platesParameters->platesWidth(); - m_height = platesParameters->platesHeight(); - m_thickness = platesParameters->platesThickness(); + m_tungstenWidth = platesParameters->platesWidth(); + m_tungstenHeight = platesParameters->platesHeight(); + m_tungstenThickness = platesParameters->platesThickness(); m_material = m_materials->getMaterial(platesParameters->platesMaterial()); m_nBasesPerModule = generalParameters->nBasesPerModule(); @@ -57,6 +57,8 @@ EmulsionPlates::getParameters() m_firstBaseZ = generalParameters->firstBaseZ(); m_lastBaseZ = generalParameters->lastBaseZ(); + m_supportElements = supportParameters->supportElements(); + m_detectorManager->numerology().setNumBasesPerModule(m_nBasesPerModule); } @@ -66,6 +68,27 @@ EmulsionPlates::preBuild() // create child element m_base = new EmulsionBase("Base", m_detectorManager, m_geometryManager, m_materials); + double width = m_tungstenWidth/2; + double height = m_tungstenHeight/2; + // double thickness = m_tungstenThickness/2; + double minZ = -m_tungstenThickness/2; + double maxZ = m_tungstenThickness/2; + + for (auto e : m_supportElements) + { + width = std::max(width, std::max(std::abs(e.x + e.dx/2),std::abs(e.x - e.dx/2))); + height = std::max(height, std::max(std::abs(e.y + e.dy/2),std::abs(e.y - e.dy/2))); + minZ = std::min(minZ, e.z - e.dz/2); + maxZ = std::max(maxZ, e.z + e.dz/2); + const GeoBox* supportShape = new GeoBox(e.dx/2, e.dy/2, e.dz/2); + GeoLogVol* supportLog = new GeoLogVol(e.label, supportShape, m_materials->getMaterial(e.mat)); + m_supportVolumes.push_back(supportLog); + } + + m_width = 2 * width; + m_height = 2 * height; + m_thickness = maxZ - minZ; + m_zShift = -(maxZ + minZ)/2; // Build a box to hold everything const GeoBox* platesShape = new GeoBox(0.5*m_width, 0.5*m_height, 0.5*m_thickness); @@ -97,7 +120,7 @@ EmulsionPlates::build(EmulsionIdentifier id) for (int base = 0; base < m_nBasesPerModule; base++) { id.setBase(base); - GeoAlignableTransform* theTransform = new GeoAlignableTransform( GeoTrf::Translate3D {0.0, 0.0, m_firstBaseZ + ((m_lastBaseZ - m_firstBaseZ)/(nBasesTotal-1))*nBases++} ); + GeoAlignableTransform* theTransform = new GeoAlignableTransform( GeoTrf::Translate3D {0.0, 0.0, m_zShift + m_firstBaseZ + ((m_lastBaseZ - m_firstBaseZ)/(nBasesTotal-1))*nBases++} ); plates->add(theTransform); plates->add(new GeoNameTag("Base#"+intToString(module*100 + base))); plates->add(new GeoIdentifierTag(module*100 + base)); @@ -108,5 +131,16 @@ EmulsionPlates::build(EmulsionIdentifier id) m_detectorManager->numerology().useModule(module); } + auto iv = m_supportVolumes.begin(); + for (auto e : m_supportElements) + { + GeoVPhysVol* pv = new GeoPhysVol(*iv); + GeoTransform* theTransform = new GeoTransform( GeoTrf::Translate3D {e.x, e.y, e.z + m_zShift}); + plates->add(theTransform); + plates->add(new GeoNameTag(e.label)); + plates->add(pv); + iv++; + } + return plates; } diff --git a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.h b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.h index b827265b9f0753fd834f24d0d051eb02ba2a5675..431aecbf467997cc8a096547e15bca6c5c56c4fb 100644 --- a/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.h +++ b/Neutrino/NeutrinoDetDescr/EmulsionGeoModel/src/EmulsionPlates.h @@ -6,6 +6,7 @@ #define EMULSIONGEOMODEL_EMULSIONPLATES_H #include "EmulsionComponentFactory.h" +#include "EmulsionSupportParameters.h" #include "EmulsionBase.h" #include "GeoPrimitives/GeoPrimitives.h" #include "GeoModelKernel/GeoDefinitions.h" @@ -28,6 +29,7 @@ public: double thickness() const {return m_thickness;} double width() const {return m_width;} double height() const {return m_height;} + double shift() const {return m_zShift;} virtual GeoVPhysVol * build(EmulsionIdentifier id); @@ -38,6 +40,10 @@ private: double m_thickness; double m_width; double m_height; + double m_tungstenThickness; + double m_tungstenWidth; + double m_tungstenHeight; + double m_zShift; const GeoMaterial * m_material; int m_nModules; @@ -45,7 +51,10 @@ private: double m_firstBaseZ; double m_lastBaseZ; + std::vector<EmulsionSupportParameters::SupportElement> m_supportElements; + EmulsionBase* m_base; + std::vector<GeoLogVol*> m_supportVolumes; };