Newer
Older
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "DD4hep/LCDD.h"
#include "DD4hep/TGeoUnits.h"
#include "DD4hep/Fields.h"
// ROOT
//#include "TGeoManager.h"
//---- GEAR ----
#include "gear/GEAR.h"
#include "gearxml/GearXML.h"
#include "gearimpl/Util.h"
#include "gearimpl/ConstantBField.h"
#include "gearimpl/GearMgrImpl.h"
#include "geartgeo/TGeoGearPointProperties.h"
#include "geartgeo/TGeoGearDistanceProperties.h"
namespace DD4hep{
using namespace Geometry ;
gear::GearMgr* createGearMgr( const Geometry::LCDD& lcdd ){
DetElement world = lcdd.world() ;
gear::GearMgrImpl* gearMgr = new gear::GearMgrImpl() ;
gearMgr->setDetectorName( lcdd.header().name() ) ;
std::cout << " **** will convert detector " << lcdd.header().name() << " to Gear \n"
<< " Iterating over all subdetectors: " << std::endl ;
//------------------ SubdetectorParamters ----------------------------------
std::vector< DetElement > dets ;
dets.reserve(1024) ;
DetElement::Children chMap = world.children() ;
// --- get all DetElements and their children into on vector
// ( expect gear parameters to be only at top two levels )
for ( DetElement::Children::const_iterator it=chMap.begin() ; it != chMap.end() ; ++it ){
dets.push_back( subDet ) ;
// std::cout << " *** subdetector : " << subDet.name() << std::endl ;
DetElement::Children grCh = subDet.children() ;
for ( DetElement::Children::const_iterator it=grCh.begin() ; it != grCh.end() ; ++it ){
DetElement subDet = (*it).second ;
dets.push_back( subDet ) ;
// std::cout << " *** sub-subdetector : " << subDet.name() << std::endl ;
}
}
for( unsigned i=0, N= dets.size() ; i<N ; ++i){
gearH = dets[i].extension<DD4hep::GearHandle>() ;
std::cout << " *** subdetector " << dets[i].name() << " - found gear object : " << gearH->name() << std::endl ;
} catch( std::exception& e) {
std::cout << " *** " << e.what() << std::endl ;
continue ; // with next DetElement
}
// --- check for canonical names of GearHandle objects :
// (fixme: will have to iterate over daughters as well ... )
if ( gearH->name() == "TPCParameters" ) { gearMgr->setTPCParameters ( dynamic_cast<gear::TPCParameters* >( gearH->takeGearObject() ) ) ; }
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
else if( gearH->name() == "EcalBarrelParameters" ) { gearMgr->setEcalBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "EcalEndcapParameters" ) { gearMgr->setEcalEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "EcalPlugParameters" ) { gearMgr->setEcalPlugParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "YokeBarrelParameters" ) { gearMgr->setYokeBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "YokeEndcapParameters" ) { gearMgr->setYokeEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "YokePlugParameters" ) { gearMgr->setYokePlugParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "HcalBarrelParameters" ) { gearMgr->setHcalBarrelParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "HcalEndcapParameters" ) { gearMgr->setHcalEndcapParameters( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "HcalRingParameters" ) { gearMgr->setHcalRingParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "LcalParameters" ) { gearMgr->setLcalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "LHcalParameters" ) { gearMgr->setLHcalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "BeamCalParameters" ) { gearMgr->setBeamCalParameters ( dynamic_cast<gear::CalorimeterParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "VXDParameters" ) { gearMgr->setVXDParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "FTDParameters" ) { gearMgr->setFTDParameters ( dynamic_cast<gear::FTDParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "SITParameters" ) { gearMgr->setSITParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "SETParameters" ) { gearMgr->setSETParameters ( dynamic_cast<gear::ZPlanarParameters* >( gearH->takeGearObject() ) ) ; }
else if( gearH->name() == "SiPlanesParameters" ) { gearMgr->setSiPlanesParameters ( dynamic_cast<gear::SiPlanesParameters* >( gearH->takeGearObject() ) ) ; }
else {
gearMgr->setGearParameters( gearH->name() , gearH->takeGearObject() ) ;
}
}
std::cout << std::endl ;
//------------------ Bfield ----------------------------------
// fixme: for now we just assume a constant field - should be a real field map ...
double origin[3] = { 0., 0., 0. } ;
double bfield[3] ;
OverlayedField ovField = lcdd.field() ;
ovField.magneticField( origin , bfield ) ;
gearMgr->setBField( new gear::ConstantBField( gear::Vector3D( bfield[0]/ tgeo::tesla , bfield[1]/ tgeo::tesla , bfield[2] / tgeo::tesla ) ) ) ;
//----------------- PointProperties and DistanceProperties -------------------------
TGeoManager *geoManager = world.volume()->GetGeoManager();
gearMgr->setPointProperties( new gear::TGeoGearPointProperties( geoManager ) ) ;
gearMgr->setDistanceProperties( new gear::TGeoGearDistanceProperties( geoManager ) ) ;
//----------------------------------------------------------------------------------
return gearMgr ;
}
}