diff --git a/DDRec/src/MaterialManager.cpp b/DDRec/src/MaterialManager.cpp index 90a9deedf50d004eab784ba8c4c98258e61b734e..dc527f04756504beb23a34c80ffe80d92e8edb90 100644 --- a/DDRec/src/MaterialManager.cpp +++ b/DDRec/src/MaterialManager.cpp @@ -114,6 +114,13 @@ namespace DD4hep { node1=node2; } + + //fg: protect against empty list: + if( _mV.empty() ){ + _mV.push_back( std::make_pair( Material( node1->GetMedium() ), totDist ) ) ; + } + + _tgeoMgr->ClearTracks(); _tgeoMgr->CleanGarbage(); diff --git a/DDRec/src/gear/createGearForILD.cpp b/DDRec/src/gear/createGearForILD.cpp index bce26111f89bb85d6e732a2615e6a72df582a350..aeb50463c9631ad1f90de1fe9a3692bd1526d083 100644 --- a/DDRec/src/gear/createGearForILD.cpp +++ b/DDRec/src/gear/createGearForILD.cpp @@ -41,224 +41,261 @@ namespace DD4hep{ //========= TPC ============================================================================== - DetElement tpcDE = lcdd.detector("TPC") ; + try{ - FixedPadSizeTPCData* tpc = tpcDE.extension<FixedPadSizeTPCData>() ; - - gear::TPCParametersImpl* gearTPC = new gear::TPCParametersImpl( tpc->driftLength /dd4hep::mm , gear::PadRowLayout2D::POLAR ) ; - - gearTPC->setPadLayout( new gear::FixedPadSizeDiskLayout( tpc->rMinReadout/dd4hep::mm , tpc->rMaxReadout/dd4hep::mm, tpc->padHeight/dd4hep::mm, - tpc->padWidth/dd4hep::mm , tpc->maxRow, tpc->padGap /dd4hep::mm ) ) ; - - gearTPC->setDoubleVal("tpcInnerRadius", tpc->rMin/dd4hep::mm ) ; // inner r of support tube - gearTPC->setDoubleVal("tpcOuterRadius", tpc->rMax/dd4hep::mm ) ; // outer radius of TPC - gearTPC->setDoubleVal("tpcInnerWallThickness", tpc->innerWallThickness/dd4hep::mm ) ; // thickness of inner shell - gearTPC->setDoubleVal("tpcOuterWallThickness", tpc->outerWallThickness/dd4hep::mm ) ; // thickness of outer shell - - tpcDE.addExtension< GearHandle >( new GearHandle( gearTPC, "TPCParameters" ) ) ; - - //========= VXD ============================================================================== - - DetElement vxdDE = lcdd.detector("VTX") ; - - ZPlanarData* vxd = vxdDE.extension<ZPlanarData>() ; - - // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) - int vxdType = gear::ZPlanarParameters::CMOS ; - gear::ZPlanarParametersImpl* gearVXD = new gear::ZPlanarParametersImpl( vxdType, vxd->rInnerShell/dd4hep::mm, vxd->rOuterShell/dd4hep::mm, - vxd->zHalfShell/dd4hep::mm , vxd->gapShell/dd4hep::mm , 0. ) ; - - for(unsigned i=0,n=vxd->layers.size() ; i<n; ++i){ + DetElement tpcDE = lcdd.detector("TPC") ; - const DDRec::ZPlanarData::LayerLayout& l = vxd->layers[i] ; + FixedPadSizeTPCData* tpc = tpcDE.extension<FixedPadSizeTPCData>() ; - // FIXME set rad lengths to 0 -> need to get from DD4hep .... - gearVXD->addLayer( l.ladderNumber, l.phi0, - l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l.thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , - l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l.thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + gear::TPCParametersImpl* gearTPC = new gear::TPCParametersImpl( tpc->driftLength /dd4hep::mm , gear::PadRowLayout2D::POLAR ) ; - } - - GearHandle* handle = new GearHandle( gearVXD, "VXDParameters" ) ; - - // quick hack for now: add the one material that is needed by KalDet : - // handle->addMaterial( "VXDSupportMaterial", 2.075865162e+01, 1.039383117e+01, 2.765900000e+02, 1.014262421e+03, 3.341388059e+03) ; + gearTPC->setPadLayout( new gear::FixedPadSizeDiskLayout( tpc->rMinReadout/dd4hep::mm , tpc->rMaxReadout/dd4hep::mm, tpc->padHeight/dd4hep::mm, + tpc->padWidth/dd4hep::mm , tpc->maxRow, tpc->padGap /dd4hep::mm ) ) ; + + gearTPC->setDoubleVal("tpcInnerRadius", tpc->rMin/dd4hep::mm ) ; // inner r of support tube + gearTPC->setDoubleVal("tpcOuterRadius", tpc->rMax/dd4hep::mm ) ; // outer radius of TPC + gearTPC->setDoubleVal("tpcInnerWallThickness", tpc->innerWallThickness/dd4hep::mm ) ; // thickness of inner shell + gearTPC->setDoubleVal("tpcOuterWallThickness", tpc->outerWallThickness/dd4hep::mm ) ; // thickness of outer shell + + tpcDE.addExtension< GearHandle >( new GearHandle( gearTPC, "TPCParameters" ) ) ; - // -------- better: get right averaged material from first ladder: ------------------ - MaterialManager matMgr ; - - const DDRec::ZPlanarData::LayerLayout& l = vxd->layers[0] ; + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } - Vector3D a( l.distanceSupport , l.phi0 , 0. , Vector3D::cylindrical ) ; - Vector3D b( l.distanceSupport + l.thicknessSupport , l.phi0 , 0. , Vector3D::cylindrical ) ; + //========= VXD ============================================================================== - const MaterialVec& materials = matMgr.materialsBetween( a , b ) ; - - MaterialData mat = ( materials.size() > 1 ? matMgr.createAveragedMaterial( materials ) : materials[0].first ) ; + try{ + DetElement vxdDE = lcdd.detector("VXD") ; + + ZPlanarData* vxd = vxdDE.extension<ZPlanarData>() ; + + // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) + int vxdType = gear::ZPlanarParameters::CMOS ; + gear::ZPlanarParametersImpl* gearVXD = new gear::ZPlanarParametersImpl( vxdType, vxd->rInnerShell/dd4hep::mm, vxd->rOuterShell/dd4hep::mm, + vxd->zHalfShell/dd4hep::mm , vxd->gapShell/dd4hep::mm , 0. ) ; + + for(unsigned i=0,n=vxd->layers.size() ; i<n; ++i){ + + const DDRec::ZPlanarData::LayerLayout& l = vxd->layers[i] ; + + // FIXME set rad lengths to 0 -> need to get from DD4hep .... + gearVXD->addLayer( l.ladderNumber, l.phi0, + l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l.thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , + l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l.thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + + } + + GearHandle* handle = new GearHandle( gearVXD, "VXDParameters" ) ; + + // quick hack for now: add the one material that is needed by KalDet : + // handle->addMaterial( "VXDSupportMaterial", 2.075865162e+01, 1.039383117e+01, 2.765900000e+02, 1.014262421e+03, 3.341388059e+03) ; + + // -------- better: get right averaged material from first ladder: ------------------ + MaterialManager matMgr ; - // std::cout << " ####### found materials between points : " << a << " and " << b << " : " ; - // for( unsigned i=0,n=materials.size();i<n;++i){ - // std::cout << materials[i].first.name() << "[" << materials[i].second << "], " ; - // } - // std::cout << std::endl ; - // std::cout << " averaged material : " << mat << std::endl ; - - handle->addMaterial( "VXDSupportMaterial", mat.A(), mat.Z() , mat.density()/(dd4hep::kg/(dd4hep::g*dd4hep::m3)) , mat.radiationLength()/dd4hep::mm , mat.interactionLength()/dd4hep::mm ) ; - + const DDRec::ZPlanarData::LayerLayout& l = vxd->layers[0] ; + + Vector3D a( l.distanceSupport , l.phi0 , 0. , Vector3D::cylindrical ) ; + Vector3D b( l.distanceSupport + l.thicknessSupport , l.phi0 , 0. , Vector3D::cylindrical ) ; + + const MaterialVec& materials = matMgr.materialsBetween( a , b ) ; + + MaterialData mat = ( materials.size() > 1 ? matMgr.createAveragedMaterial( materials ) : materials[0].first ) ; + + // std::cout << " ####### found materials between points : " << a << " and " << b << " : " ; + // for( unsigned i=0,n=materials.size();i<n;++i){ + // std::cout << materials[i].first.name() << "[" << materials[i].second << "], " ; + // } + // std::cout << std::endl ; + // std::cout << " averaged material : " << mat << std::endl ; + + handle->addMaterial( "VXDSupportMaterial", mat.A(), mat.Z() , mat.density()/(dd4hep::kg/(dd4hep::g*dd4hep::m3)) , mat.radiationLength()/dd4hep::mm , mat.interactionLength()/dd4hep::mm ) ; + + + vxdDE.addExtension< GearHandle >( handle ) ; - vxdDE.addExtension< GearHandle >( handle ) ; + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } //========= SIT ============================================================================== - DetElement sitDE = lcdd.detector("SIT") ; - - ZPlanarData* sit = sitDE.extension<ZPlanarData>() ; - - // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) - int sitType = gear::ZPlanarParameters::CCD ; - gear::ZPlanarParametersImpl* gearSIT = new gear::ZPlanarParametersImpl( sitType, sit->rInnerShell/dd4hep::mm, sit->rOuterShell/dd4hep::mm, - sit->zHalfShell/dd4hep::mm , sit->gapShell/dd4hep::mm , 0. ) ; - std::vector<int> n_sensors_per_ladder ; + try{ - for(unsigned i=0,n=sit->layers.size() ; i<n; ++i){ + DetElement sitDE = lcdd.detector("SIT") ; - const DDRec::ZPlanarData::LayerLayout& l = sit->layers[i] ; + ZPlanarData* sit = sitDE.extension<ZPlanarData>() ; - // FIXME set rad lengths to 0 -> need to get from DD4hep .... - gearSIT->addLayer( l.ladderNumber, l.phi0, - l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l. thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , - l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l. thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) + int sitType = gear::ZPlanarParameters::CCD ; + gear::ZPlanarParametersImpl* gearSIT = new gear::ZPlanarParametersImpl( sitType, sit->rInnerShell/dd4hep::mm, sit->rOuterShell/dd4hep::mm, + 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){ + + const DDRec::ZPlanarData::LayerLayout& l = sit->layers[i] ; + + // FIXME set rad lengths to 0 -> need to get from DD4hep .... + gearSIT->addLayer( l.ladderNumber, l.phi0, + l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l. thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , + l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l. thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + + + 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 ) ; + gearSIT->setDoubleVal("strip_pitch_mm" , sit->pitchStrip / dd4hep::mm ) ; + gearSIT->setDoubleVal("strip_angle_deg" , sit->angleStrip / dd4hep::deg ) ; + + + gearSIT->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); + + sitDE.addExtension< GearHandle >( new GearHandle( gearSIT, "SITParameters" ) ) ; - 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 ) ; - gearSIT->setDoubleVal("strip_pitch_mm" , sit->pitchStrip / dd4hep::mm ) ; - gearSIT->setDoubleVal("strip_angle_deg" , sit->angleStrip / dd4hep::deg ) ; - - - gearSIT->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } - sitDE.addExtension< GearHandle >( new GearHandle( gearSIT, "SITParameters" ) ) ; //============================================================================================ - DetElement setDE = lcdd.detector("SET") ; - - ZPlanarData* set = setDE.extension<ZPlanarData>() ; - - // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) - int setType = gear::ZPlanarParameters::CCD ; - gear::ZPlanarParametersImpl* gearSET = new gear::ZPlanarParametersImpl( setType, set->rInnerShell/dd4hep::mm, set->rOuterShell/dd4hep::mm, - set->zHalfShell/dd4hep::mm , set->gapShell/dd4hep::mm , 0. ) ; - // std::vector<int> n_sensors_per_ladder ; - n_sensors_per_ladder.clear() ; + try { - for(unsigned i=0,n=set->layers.size() ; i<n; ++i){ + DetElement setDE = lcdd.detector("SET") ; - const DDRec::ZPlanarData::LayerLayout& l = set->layers[i] ; + ZPlanarData* set = setDE.extension<ZPlanarData>() ; - // FIXME set rad lengths to 0 -> need to get from DD4hep .... - gearSET->addLayer( l.ladderNumber, l.phi0, - l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l. thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , - l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l. thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + // ZPlanarParametersImpl (int type, double shellInnerRadius, double shellOuterRadius, double shellHalfLength, double shellGap, double shellRadLength) + int setType = gear::ZPlanarParameters::CCD ; + gear::ZPlanarParametersImpl* gearSET = new gear::ZPlanarParametersImpl( setType, set->rInnerShell/dd4hep::mm, set->rOuterShell/dd4hep::mm, + set->zHalfShell/dd4hep::mm , set->gapShell/dd4hep::mm , 0. ) ; + std::vector<int> n_sensors_per_ladder ; + //n_sensors_per_ladder.clear() ; + for(unsigned i=0,n=set->layers.size() ; i<n; ++i){ + + const DDRec::ZPlanarData::LayerLayout& l = set->layers[i] ; + + // FIXME set rad lengths to 0 -> need to get from DD4hep .... + gearSET->addLayer( l.ladderNumber, l.phi0, + l.distanceSupport/dd4hep::mm, l.offsetSupport/dd4hep::mm, l. thicknessSupport/dd4hep::mm, l.zHalfSupport/dd4hep::mm, l.widthSupport/dd4hep::mm, 0. , + l.distanceSensitive/dd4hep::mm, l.offsetSensitive/dd4hep::mm, l. thicknessSensitive/dd4hep::mm, l.zHalfSensitive/dd4hep::mm, l.widthSensitive/dd4hep::mm, 0. ) ; + + + 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 ) ; + gearSET->setDoubleVal("strip_pitch_mm" , set->pitchStrip / dd4hep::mm ) ; + gearSET->setDoubleVal("strip_angle_deg" , set->angleStrip / dd4hep::deg ) ; + + + gearSET->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); + + setDE.addExtension< GearHandle >( new GearHandle( gearSET, "SETParameters" ) ) ; - 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 ) ; - gearSET->setDoubleVal("strip_pitch_mm" , set->pitchStrip / dd4hep::mm ) ; - gearSET->setDoubleVal("strip_angle_deg" , set->angleStrip / dd4hep::deg ) ; - + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } - gearSET->setIntVals("n_sensors_per_ladder",n_sensors_per_ladder); - - 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 ] ; - - // 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 ; - - 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" ) ) ; + try { - //============================================================================================ + 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 ] ; + + // 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 ; + + 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" ) ) ; - DetElement tubeDE = lcdd.detector("Tube") ; - - ConicalSupportData* tube = tubeDE.extension<ConicalSupportData>() ; - - gear::GearParametersImpl* gearTUBE = new gear::GearParametersImpl(); - - tube->isSymmetricInZ = true ; + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } - unsigned n = tube->sections.size() ; - - std::vector<double> rInner(n) ; - std::vector<double> rOuter(n) ; - std::vector<double> zStart(n) ; + //============================================================================================ - for(unsigned i=0 ; i<n ; ++i){ + try { + + DetElement tubeDE = lcdd.detector("Tube") ; - const ConicalSupportData::Section& s = tube->sections[i] ; + ConicalSupportData* tube = tubeDE.extension<ConicalSupportData>() ; - rInner[i] = s.rInner/ dd4hep::mm ; - rOuter[i] = s.rOuter/ dd4hep::mm ; - zStart[i] = s.zPos / dd4hep::mm ; - - // FIXME set rad lengths to 0 -> need to get from DD4hep .... - } - - gearTUBE->setDoubleVals("RInner" , rInner ) ; - gearTUBE->setDoubleVals("ROuter" , rOuter ) ; - gearTUBE->setDoubleVals("Z" , zStart ) ; - - - tubeDE.addExtension< GearHandle >( new GearHandle( gearTUBE, "BeamPipe" ) ) ; + gear::GearParametersImpl* gearTUBE = new gear::GearParametersImpl(); + + tube->isSymmetricInZ = true ; + + unsigned n = tube->sections.size() ; + + std::vector<double> rInner(n) ; + std::vector<double> rOuter(n) ; + std::vector<double> zStart(n) ; + + for(unsigned i=0 ; i<n ; ++i){ + + const ConicalSupportData::Section& s = tube->sections[i] ; + + rInner[i] = s.rInner/ dd4hep::mm ; + rOuter[i] = s.rOuter/ dd4hep::mm ; + zStart[i] = s.zPos / dd4hep::mm ; + + // FIXME set rad lengths to 0 -> need to get from DD4hep .... + } + + gearTUBE->setDoubleVals("RInner" , rInner ) ; + gearTUBE->setDoubleVals("ROuter" , rOuter ) ; + gearTUBE->setDoubleVals("Z" , zStart ) ; + + + tubeDE.addExtension< GearHandle >( new GearHandle( gearTUBE, "BeamPipe" ) ) ; + + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } //========= CALO ============================================================================== @@ -266,32 +303,40 @@ namespace DD4hep{ //* test gear interface w/ LayeredCalorimeterData extension //********************************************************** - 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 ){ + try { - 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 ) ; + 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" ) ) ; + + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } - } - caloDE.addExtension< GearHandle >( new GearHandle( gearCalo, "HcalBarrelParameters" ) ) ; - //********************************************************** //* test gear interface w/ LayeredExtensionImpl extension //********************************************************** diff --git a/examples/SimpleDetector/compact/Simple_ILD.xml b/examples/SimpleDetector/compact/Simple_ILD.xml index cbf8fc1cddab046e04afc6562b71901dc8151ea5..097c6bb62d56a0d61fca3df4a47d9a6dab0fbae1 100644 --- a/examples/SimpleDetector/compact/Simple_ILD.xml +++ b/examples/SimpleDetector/compact/Simple_ILD.xml @@ -86,7 +86,7 @@ </layer> </detector> - <detector name="SIT" type="ZPlanarTracker" vis="SITVis" id="1" limits="Tracker_limits" readout="SITCollection" insideTrackingVolume="true"> + <detector name="SIT" type="ZPlanarTracker" vis="SITVis" id="2" limits="Tracker_limits" readout="SITCollection" insideTrackingVolume="true"> <layer nLadders="10" phi0="0.000000000e+00" id="0"> <ladder distance="1.531000000e+02*mm" thickness="1.000000000e+00*mm" width="9.916044311e+01*mm" length="3.680000000e+02*mm" offset="0.000000000e+00*mm" material="CarbonFiber" /> <sensitive distance="1.529000000e+02*mm" thickness="2.000000000e-01*mm" width="9.916044311e+01*mm" length="3.680000000e+02*mm" offset="0.000000000e+00*mm" material="G4_Si"/> diff --git a/examples/SimpleDetector/src/ZPlanarTracker_geo.cpp b/examples/SimpleDetector/src/ZPlanarTracker_geo.cpp index 35bb49b6f689ee8d2c48f92246efcacd00592ce1..0fe1bea9535d20e3b615aaecdc7f7358d210e0fe 100644 --- a/examples/SimpleDetector/src/ZPlanarTracker_geo.cpp +++ b/examples/SimpleDetector/src/ZPlanarTracker_geo.cpp @@ -11,6 +11,8 @@ #include "DD4hep/DetFactoryHelper.h" #include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" + using namespace DD4hep; using namespace DD4hep::Geometry; @@ -31,6 +33,8 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { PlacedVolume pv; + DDRec::ZPlanarData* zPlanarData = new DDRec::ZPlanarData ; + //========= loop over layer elements in xml ====================================== for(xml_coll_t c(e, _U(layer) ); c; ++c) { @@ -85,6 +89,30 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { //----------------------------------- + // store the data in an extension to be used for reconstruction + DDRec::ZPlanarData::LayerLayout thisLayer ; + + thisLayer.sensorsPerLadder = 1 ; // for now only one planar sensor + thisLayer.lengthSensor = 2. * sens_zhalf ; + + thisLayer.distanceSupport = supp_distance ; + thisLayer.offsetSupport = supp_offset ; + thisLayer.thicknessSupport = supp_thickness ; + thisLayer.zHalfSupport = supp_zhalf ; + thisLayer.widthSupport = supp_width ; + + thisLayer.distanceSensitive = sens_distance ; + thisLayer.offsetSensitive = sens_offset ; + thisLayer.thicknessSensitive = sens_thickness ; + thisLayer.zHalfSensitive = sens_zhalf ; + thisLayer.widthSensitive = sens_width ; + + thisLayer.ladderNumber = nLadders ; + thisLayer.phi0 = phi0 ; + + zPlanarData->layers.push_back( thisLayer ) ; + //----------------------------------- + Material supp_mat = lcdd.material( supp_matS ) ; Material sens_mat = lcdd.material( sens_matS ) ; @@ -170,6 +198,9 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { } + + tracker.addExtension< DDRec::ZPlanarData >( zPlanarData ) ; + Volume mother = lcdd.pickMotherVolume( tracker ) ; pv = mother.placeVolume(assembly);