From d69f20919b80ba6182e5c5efe17319086b55c9f6 Mon Sep 17 00:00:00 2001 From: Frank Gaede <frank.gaede@desy.de> Date: Tue, 4 Nov 2014 20:32:31 +0000 Subject: [PATCH] - added DDRec::LayeredCalorimeterData - fill for HcalBarrel in createGearForILD --- DDRec/include/DDRec/DetectorData.h | 58 ++++++++++++++++++++++++++++- DDRec/src/gear/createGearForILD.cpp | 57 +++++++++++++++++++++------- 2 files changed, 100 insertions(+), 15 deletions(-) diff --git a/DDRec/include/DDRec/DetectorData.h b/DDRec/include/DDRec/DetectorData.h index ed6f83369..899346e04 100644 --- a/DDRec/include/DDRec/DetectorData.h +++ b/DDRec/include/DDRec/DetectorData.h @@ -20,8 +20,8 @@ namespace DD4hep { StructExtension() : T() { } StructExtension(const StructExtension<T>& t) : T(t) {} StructExtension(const T& t) : T(t) {} - StructExtension(const Geometry::DetElement& d) : T() {} - StructExtension(const StructExtension<T>& t, const Geometry::DetElement& d) : T(t) {} + StructExtension(const Geometry::DetElement&) : T() {} + StructExtension(const StructExtension<T>& t, const Geometry::DetElement&) : T(t) {} }; /** Simple data structure with key parameters for @@ -255,6 +255,60 @@ namespace DD4hep { typedef StructExtension<ConicalSupportStruct> ConicalSupportData ; + + /** Simple data structure defining a + * layered calorimeter layout for + * reconstruction. + * + * @author F.Gaede, CERN/DESY + * @date Nov, 05 2014 + * @version $Id: $ + */ + struct LayeredCalorimeterStruct{ + + /// enum for encoding the sensor type in typeFlags + enum LayoutType{ + BarrelLayout=0, + EndcapLayout + }; + + /// type of layout: BarrelLayout or EndcapLayout + LayoutType layoutType ; + + /// extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm. + double extent[4] ; + + /** the order of the rotational symmetry: + * 8 for an octagonal barrel calorimeter + * 2 for an endcap calorimeter + * 1 for a standalone prototype + * 0 for an idealized cylindrical calorimeter. + */ + int symmetry ; + + /// azimuthal angle of the first module in barrel layout + double phi0 ; + + struct Layer { + /// distance from Origin (or the z-axis) + double distance; + /// total thickness of the layer + double thickness ; + /// thickness of the absorber part of the layer + double absorberThickness ; + /// cell size along the first axis where first is either along the beam (BarrelLayout) or up (EndcapLayout) or the direction closest to that. + double cellSize0 ; + /// second cell size, perpendicular to the first direction cellSize0 and the depth of the layers. + double cellSize1 ; + } ; + + std::vector<Layer> layers ; + } ; + + typedef StructExtension<LayeredCalorimeterStruct> LayeredCalorimeterData ; + + + } /* namespace DDRec */ } /* namespace DD4hep */ diff --git a/DDRec/src/gear/createGearForILD.cpp b/DDRec/src/gear/createGearForILD.cpp index 04450ddb4..d06101563 100644 --- a/DDRec/src/gear/createGearForILD.cpp +++ b/DDRec/src/gear/createGearForILD.cpp @@ -12,6 +12,7 @@ #include "gearimpl/FixedPadSizeDiskLayout.h" #include "gearimpl/ZPlanarParametersImpl.h" #include "gearimpl/FTDParametersImpl.h" +#include "gearimpl/CalorimeterParametersImpl.h" #include <iostream> @@ -118,7 +119,7 @@ namespace DD4hep{ sit->zHalfShell/dd4hep::mm , sit->gapShell/dd4hep::mm , 0. ) ; std::vector<int> n_sensors_per_ladder ; - for(unsigned i=0,n=sit->layers.size() ; i<n; ++i){ + for(unsigned i=0,n=sit->layers.size() ; i<n; ++i){ const DDRec::ZPlanarData::LayerLayout& l = sit->layers[i] ; @@ -129,7 +130,7 @@ namespace DD4hep{ n_sensors_per_ladder.push_back( l.sensorsPerLadder); - } + } gearSIT->setDoubleVal("strip_width_mm" , sit->widthStrip / dd4hep::mm ) ; gearSIT->setDoubleVal("strip_length_mm" , sit->lengthStrip/ dd4hep::mm ) ; @@ -140,7 +141,7 @@ namespace DD4hep{ gearSIT->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); sitDE.addExtension< GearHandle >( new GearHandle( gearSIT, "SITParameters" ) ) ; - //============================================================================================ + //============================================================================================ DetElement setDE = lcdd.detector("SET") ; @@ -153,7 +154,7 @@ namespace DD4hep{ // std::vector<int> n_sensors_per_ladder ; n_sensors_per_ladder.clear() ; - for(unsigned i=0,n=set->layers.size() ; i<n; ++i){ + for(unsigned i=0,n=set->layers.size() ; i<n; ++i){ const DDRec::ZPlanarData::LayerLayout& l = set->layers[i] ; @@ -164,7 +165,7 @@ namespace DD4hep{ n_sensors_per_ladder.push_back( l.sensorsPerLadder); - } + } gearSET->setDoubleVal("strip_width_mm" , set->widthStrip / dd4hep::mm ) ; gearSET->setDoubleVal("strip_length_mm" , set->lengthStrip/ dd4hep::mm ) ; @@ -175,7 +176,7 @@ namespace DD4hep{ gearSET->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); setDE.addExtension< GearHandle >( new GearHandle( gearSET, "SETParameters" ) ) ; - //============================================================================================ + //============================================================================================ DetElement ftdDE = lcdd.detector("FTD") ; @@ -190,11 +191,11 @@ namespace DD4hep{ bool isDoubleSided = l.typeFlags[ DDRec::ZDiskPetalsStruct::SensorType::DoubleSided ] ; - // avoid 'undefined reference' at link time ( if built w/o optimization ): - static const int PIXEL = gear::FTDParameters::PIXEL ; - static const int STRIP = gear::FTDParameters::STRIP ; - int sensorType = ( l.typeFlags[ DDRec::ZDiskPetalsStruct::SensorType::Pixel ] ? PIXEL : STRIP ) ; -// gear::FTDParameters::PIXEL : gear::FTDParameters::STRIP ) ; + // avoid 'undefined reference' at link time ( if built w/o optimization ): + static const int PIXEL = gear::FTDParameters::PIXEL ; + static const int STRIP = gear::FTDParameters::STRIP ; + int sensorType = ( l.typeFlags[ DDRec::ZDiskPetalsStruct::SensorType::Pixel ] ? PIXEL : STRIP ) ; + // gear::FTDParameters::PIXEL : gear::FTDParameters::STRIP ) ; double zoffset = fabs( l.zOffsetSupport ) ; double signoffset = l.zOffsetSupport > 0 ? 1. : -1 ; @@ -224,7 +225,7 @@ namespace DD4hep{ ftdDE.addExtension< GearHandle >( new GearHandle( gearFTD, "FTDParameters" ) ) ; - //============================================================================================ + //============================================================================================ DetElement tubeDE = lcdd.detector("Tube") ; @@ -257,7 +258,37 @@ namespace DD4hep{ tubeDE.addExtension< GearHandle >( new GearHandle( gearTUBE, "BeamPipe" ) ) ; - //============================================================================================ + + //========= CALO ============================================================================== + DetElement caloDE = lcdd.detector("HcalBarrel") ; + + LayeredCalorimeterData* calo = caloDE.extension<LayeredCalorimeterData>() ; + + + gear::CalorimeterParametersImpl* gearCalo = + ( calo->layoutType == LayeredCalorimeterData::BarrelLayout ? + new gear::CalorimeterParametersImpl( calo->extent[0]/dd4hep::mm, calo->extent[3]/dd4hep::mm, calo->symmetry, calo->phi0 ) : + //CalorimeterParametersImpl (double rMin, double zMax, int symOrder=8, double phi0=0.0) - C'tor for a cylindrical (octagonal) BARREL calorimeter. + new gear::CalorimeterParametersImpl( calo->extent[0]/dd4hep::mm, calo->extent[1]/dd4hep::mm, calo->extent[2]/dd4hep::mm, calo->symmetry, calo->phi0 ) ) ; + //CalorimeterParametersImpl (double rMin, double rMax, double zMin, int symOrder=2, double phi0=0.0) - C'tor for a cylindrical (octagonal) ENDCAP calorimeter. + + for( unsigned i=0, nL = calo->layers.size() ; i <nL ; ++i ){ + + LayeredCalorimeterData::Layer& l = calo->layers[i] ; + + if( i == 0 ) { + gearCalo->layerLayout().positionLayer( l.distance/dd4hep::mm, l.thickness/dd4hep::mm , l.cellSize0/dd4hep::mm, l.cellSize1/dd4hep::mm, l.absorberThickness/dd4hep::mm ) ; + }else{ + gearCalo->layerLayout().addLayer( l.thickness/dd4hep::mm , l.cellSize0/dd4hep::mm, l.cellSize1/dd4hep::mm, l.absorberThickness/dd4hep::mm ) ; + } + + + } + + + caloDE.addExtension< GearHandle >( new GearHandle( gearCalo, "HcalBarrelParameters" ) ) ; + + //============================================================================================ -- GitLab