File indexing completed on 2025-12-16 09:27:02
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include "DDRec/DDGear.h"
0014
0015 #include "DD4hep/Detector.h"
0016 #include "DD4hep/DD4hepUnits.h"
0017 #include "DD4hep/Fields.h"
0018 #include "DD4hep/Plugins.h"
0019
0020
0021
0022
0023
0024 #include "gear/GEAR.h"
0025 #include "gearxml/GearXML.h"
0026
0027 #include "gearimpl/Util.h"
0028 #include "gearimpl/ConstantBField.h"
0029 #include "gearimpl/GearMgrImpl.h"
0030
0031 #include "geartgeo/TGeoGearPointProperties.h"
0032 #include "geartgeo/TGeoGearDistanceProperties.h"
0033
0034
0035 namespace dd4hep{
0036 namespace rec{
0037 using namespace detail ;
0038
0039 gear::GearMgr* createGearMgr( Detector& description , const std::string& pluginName ){
0040
0041 int argc(0); char** argv = 0 ;
0042
0043 description.apply( pluginName.c_str() , argc, argv) ;
0044
0045 DetElement world = description.world() ;
0046
0047 gear::GearMgrImpl* gearMgr = new gear::GearMgrImpl() ;
0048
0049 gearMgr->setDetectorName( description.header().name() ) ;
0050
0051 std::cout << " **** will convert detector " << description.header().name() << " to Gear \n"
0052 << " Iterating over all subdetectors: " << std::endl ;
0053
0054
0055
0056
0057 std::vector< DetElement > dets ;
0058 dets.reserve(1024) ;
0059
0060 DetElement::Children chMap = world.children() ;
0061
0062
0063
0064
0065 for ( DetElement::Children::const_iterator it=chMap.begin() ; it != chMap.end() ; ++it ){
0066
0067 DetElement subDet = (*it).second ;
0068 dets.push_back( subDet ) ;
0069
0070
0071 DetElement::Children grCh = subDet.children() ;
0072
0073 for ( DetElement::Children::const_iterator jt=grCh.begin() ; jt != grCh.end() ; ++jt ){
0074 DetElement jdet = (*jt).second ;
0075 dets.push_back( jdet ) ;
0076
0077 }
0078 }
0079
0080 for( unsigned i=0, N= dets.size() ; i<N ; ++i){
0081
0082 GearHandle* gearH = 0 ;
0083
0084 try{
0085
0086 gearH = dets[i].extension<GearHandle>() ;
0087
0088 std::cout << " *** subdetector " << dets[i].name() << " - found gear object : " << gearH->name() << std::endl ;
0089
0090 } catch( std::exception& e) {
0091
0092
0093
0094 continue ;
0095 }
0096
0097
0098
0099
0100 if ( gearH->name() == "TPCParameters" ) { gearMgr->setTPCParameters ( dynamic_cast<gear::TPCParameters* >( gearH->takeGearObject() ) ) ; }
0101 else if( gearH->name() == "EcalBarrelParameters" ) { gearMgr->setEcalBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0102 else if( gearH->name() == "EcalEndcapParameters" ) { gearMgr->setEcalEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0103 else if( gearH->name() == "EcalPlugParameters" ) { gearMgr->setEcalPlugParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0104 else if( gearH->name() == "YokeBarrelParameters" ) { gearMgr->setYokeBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0105 else if( gearH->name() == "YokeEndcapParameters" ) { gearMgr->setYokeEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0106 else if( gearH->name() == "YokePlugParameters" ) { gearMgr->setYokePlugParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0107 else if( gearH->name() == "HcalBarrelParameters" ) { gearMgr->setHcalBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0108 else if( gearH->name() == "HcalEndcapParameters" ) { gearMgr->setHcalEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0109 else if( gearH->name() == "HcalRingParameters" ) { gearMgr->setHcalRingParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0110 else if( gearH->name() == "LcalParameters" ) { gearMgr->setLcalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0111 else if( gearH->name() == "LHcalParameters" ) { gearMgr->setLHcalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0112 else if( gearH->name() == "BeamCalParameters" ) { gearMgr->setBeamCalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
0113 else if( gearH->name() == "VXDParameters" ) { gearMgr->setVXDParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
0114 else if( gearH->name() == "FTDParameters" ) { gearMgr->setFTDParameters ( dynamic_cast<gear::FTDParameters* >( gearH->takeGearObject() ) ) ; }
0115 else if( gearH->name() == "SITParameters" ) { gearMgr->setSITParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
0116 else if( gearH->name() == "SETParameters" ) { gearMgr->setSETParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
0117 else if( gearH->name() == "SiPlanesParameters" ) { gearMgr->setSiPlanesParameters ( dynamic_cast<gear::SiPlanesParameters* >( gearH->takeGearObject() ) ) ; }
0118 else {
0119
0120 gearMgr->setGearParameters( gearH->name() , gearH->takeGearObject() ) ;
0121 }
0122
0123
0124
0125
0126 for( unsigned j=0, M=gearH->materials().size() ; j<M ; ++j) {
0127
0128 gearMgr->registerSimpleMaterial( &gearH->materials()[j] ) ;
0129 }
0130
0131
0132 }
0133 std::cout << std::endl ;
0134
0135
0136
0137
0138 double origin[3] = { 0., 0., 0. } ;
0139 double bfield[3] ;
0140 OverlayedField ovField = description.field() ;
0141 ovField.magneticField( origin , bfield ) ;
0142
0143 gearMgr->setBField( new gear::ConstantBField( gear::Vector3D( bfield[0]/ dd4hep::tesla , bfield[1]/ dd4hep::tesla , bfield[2] / dd4hep::tesla ) ) ) ;
0144
0145
0146
0147
0148 TGeoManager *geoManager = world.volume()->GetGeoManager();
0149
0150 gearMgr->setPointProperties( new gear::TGeoGearPointProperties( geoManager ) ) ;
0151
0152 gearMgr->setDistanceProperties( new gear::TGeoGearDistanceProperties( geoManager ) ) ;
0153
0154
0155
0156 return gearMgr ;
0157
0158 }
0159
0160 }}
0161