Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:27:02

0001 //==========================================================================
0002 //  AIDA Detector description implementation 
0003 //--------------------------------------------------------------------------
0004 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
0005 // All rights reserved.
0006 //
0007 // For the licensing terms see $DD4hepINSTALL/LICENSE.
0008 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
0009 //
0010 // Author     : F.Gaede
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 // ROOT
0021 //#include "TGeoManager.h"
0022 
0023 //---- GEAR ----
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     //------------------ SubdetectorParamters ----------------------------------
0056   
0057     std::vector< DetElement > dets ;
0058     dets.reserve(1024) ;
0059 
0060     DetElement::Children chMap = world.children() ;
0061 
0062     // --- get all DetElements and their children into one vector
0063     //     ( expect gear parameters to be only at top two levels )
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       //      std::cout << "  *** subdetector : " << subDet.name() << std::endl ;
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         //  std::cout << "    *** sub-subdetector : " << subDet.name() << std::endl ;
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     //  std::cout << "  ***  subdetector " << dets[i].name() << " : " <<  e.what() << std::endl ;
0093 
0094     continue ; // with next DetElement
0095       }
0096     
0097       // --- check for canonical names of GearHandle objects :
0098       //   (fixme: will have to iterate over daughters as well ... )
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       /// register any materials assigned to the handle:
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     //------------------ Bfield ----------------------------------
0136 
0137     // fixme: for now we just assume a constant field - should be a real field map ...
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     //----------------- PointProperties and DistanceProperties -------------------------
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