diff --git a/DDRec/include/DDRec/DetectorData.h b/DDRec/include/DDRec/DetectorData.h index 60d3abd14a7afccd7b9be941bd4d6199cb5b9523..5ffc69723c214f13ea695e5f168c530070a0ce8a 100644 --- a/DDRec/include/DDRec/DetectorData.h +++ b/DDRec/include/DDRec/DetectorData.h @@ -1,6 +1,7 @@ #ifndef DDRec_DetectorData_H_ #define DDRec_DetectorData_H_ +#include <bitset> namespace DD4hep { namespace DDRec { @@ -145,6 +146,101 @@ namespace DD4hep { + /** Simple data structure with key parameters for + * reconstruction of a silicon tracking detector + * with disks (roughly orthogonal to the z-axis) built from petals. + * ( Can be used to instantiate a gear::FTDParameters object ) + * + * @author F.Gaede, CERN/DESY + * @date Oct, 20 2014 + * @version $Id: $ + */ + struct ZDiskPetalsStruct{ + + /// width of the strips (if applicable ) + double widthStrip ; + /// length of the strips (if applicable ) + double lengthStrip ; + /// strip pitch (if applicable ) + double pitchStrip ; + /// strip stereo angle (if applicable ) + double angleStrip ; + + /// enum for encoding the sensor type in typeFlags + struct SensorType{ + enum { + DoubleSided=0, + Pixel + }; + } ; + + /** Internal helper struct for defining the layer layout. Layers are defined + * with a sensitive part and a support part. + */ + struct LayerLayout{ + + + /// half angle covered by petal + double petalHalfAngle ; + + /** angle alpha by which the petal is rotated away from the plane + * that is orthogonal to the z-axis + */ + double alphaPetal ; + + /// z-position of layer ( z-position of middle axis ) + double zPosition ; + + /// The number of petals in the layer. + int petalNumber ; + + /// number of sensor per petal + int sensorsPerPetal ; + + /// Bit flag describing sensor type - use enum SensorType to access the bits. + std::bitset<32> typeFlags ; + + /// azimuthal angle of vector defined by the Z-axis to first petal x-positive, y-positive edge + double phi0 ; + + /** z-offset of support petals from layer z-position - signed for first + * petal, following petals have alternating sign + */ + double zOffsetSupport ; + /// The distance of the petal support from the z-axis. + double distanceSupport ; + /// The thickness of the petal support. + double thicknessSupport ; + /// The inner width of the petal support. + double widthInnerSupport ; + /// The outer width of the petal support. + double widthOuterSupport ; + /// The radial length of the petal support. + double lengthSupport ; + + /** z-offset of sensitive petals from layer z-position - signed for first + * petal, following petals have alternating sign + */ + double zOffsetSensitive ; + /// The distance of the petal sensitive from the z-axis. + double distanceSensitive ; + /// The thickness of the petal sensitive. + double thicknessSensitive ; + /// The inner width of the petal sensitive. + double widthInnerSensitive ; + /// The outer width of the petal sensitive. + double widthOuterSensitive ; + /// The radial length of the petal sensitive. + double lengthSensitive ; + } ; + + std::vector<LayerLayout> layers ; + + } ; + typedef StructExtension<ZDiskPetalsStruct> ZDiskPetalsData ; + + + } /* namespace DDRec */ } /* namespace DD4hep */ diff --git a/DDRec/src/gear/createGearForILD.cpp b/DDRec/src/gear/createGearForILD.cpp index 780009d7d521dc68222ff7a146e4669e94e84205..0b06802d98354d5e4500b53fbaa46758250b6fd7 100644 --- a/DDRec/src/gear/createGearForILD.cpp +++ b/DDRec/src/gear/createGearForILD.cpp @@ -8,6 +8,7 @@ #include "gearimpl/TPCParametersImpl.h" #include "gearimpl/FixedPadSizeDiskLayout.h" #include "gearimpl/ZPlanarParametersImpl.h" +#include "gearimpl/FTDParametersImpl.h" #include <iostream> @@ -145,6 +146,52 @@ namespace DD4hep{ setDE.addExtension< GearHandle >( new GearHandle( gearSET, "SETParameters" ) ) ; //============================================================================================ + DetElement ftdDE = lcdd.detector("FTD") ; + + ZDiskPetalsData* ftd = ftdDE.extension<ZDiskPetalsData>() ; + + gear::FTDParametersImpl* gearFTD = new gear::FTDParametersImpl(); + + for(unsigned i=0,n=ftd->layers.size() ; i<n; ++i){ + + const DDRec::ZDiskPetalsData::LayerLayout& l = ftd->layers[i] ; + + + bool isDoubleSided = l.typeFlags[ DDRec::ZDiskPetalsStruct::SensorType::DoubleSided ] ; + int sensorType = ( l.typeFlags[ DDRec::ZDiskPetalsStruct::SensorType::Pixel ] ? + gear::FTDParameters::PIXEL : gear::FTDParameters::STRIP ) ; + + double zoffset = fabs( l.zOffsetSupport ) ; + double signoffset = l.zOffsetSupport > 0 ? 1. : -1 ; + + gearFTD->addLayer( l.petalNumber, l.sensorsPerPetal, + isDoubleSided, sensorType, + l.petalHalfAngle, l.phi0, l.alphaPetal, + l.zPosition/dd4hep::mm, zoffset/dd4hep::mm, signoffset, + l.distanceSupport/dd4hep::mm, l.thicknessSupport/dd4hep::mm, + l.widthInnerSupport/dd4hep::mm, l.widthOuterSupport/dd4hep::mm, + l.lengthSupport/dd4hep::mm, + 0., + l.distanceSensitive/dd4hep::mm, l.thicknessSensitive/dd4hep::mm, + l.widthInnerSensitive/dd4hep::mm, l.widthOuterSensitive/dd4hep::mm, + l.lengthSensitive/dd4hep::mm, + 0. ) ; + + + // FIXME set rad lengths to 0 -> need to get from DD4hep .... + } + + gearFTD->setDoubleVal("strip_width_mm" , ftd->widthStrip / dd4hep::mm ) ; + gearFTD->setDoubleVal("strip_length_mm" , ftd->lengthStrip/ dd4hep::mm ) ; + gearFTD->setDoubleVal("strip_pitch_mm" , ftd->pitchStrip / dd4hep::mm ) ; + gearFTD->setDoubleVal("strip_angle_deg" , ftd->angleStrip / dd4hep::deg ) ; + + + ftdDE.addExtension< GearHandle >( new GearHandle( gearFTD, "FTDParameters" ) ) ; + //============================================================================================ + + + // --- LCDD::apply() expects return code 1 if all went well ! ---- return 1; }