diff --git a/DDRec/include/DDRec/DetectorData.h b/DDRec/include/DDRec/DetectorData.h index 899346e04f09d6ed3c96a9555facb4a9430b0bc7..fef36cd9f50938ae5581de34ea6818f905f680b6 100644 --- a/DDRec/include/DDRec/DetectorData.h +++ b/DDRec/include/DDRec/DetectorData.h @@ -256,8 +256,7 @@ namespace DD4hep { - /** Simple data structure defining a - * layered calorimeter layout for + /** Simple data structure defining a layered calorimeter layout for * reconstruction. * * @author F.Gaede, CERN/DESY @@ -278,13 +277,21 @@ namespace DD4hep { /// extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm. double extent[4] ; - /** the order of the rotational symmetry: + /** the order of the rotational symmetry at the outside: * 8 for an octagonal barrel calorimeter * 2 for an endcap calorimeter * 1 for a standalone prototype * 0 for an idealized cylindrical calorimeter. */ - int symmetry ; + int outer_symmetry ; + + /** the order of the rotational symmetry at the inside: + * 8 for an octagonal barrel calorimeter + * 2 for an endcap calorimeter + * 1 for a standalone prototype + * 0 for an idealized cylindrical calorimeter. + */ + int inner_symmetry ; /// azimuthal angle of the first module in barrel layout double phi0 ; diff --git a/DDRec/src/gear/createGearForILD.cpp b/DDRec/src/gear/createGearForILD.cpp index aeb50463c9631ad1f90de1fe9a3692bd1526d083..a240eec22076580fea3bef58027c4d8b02427770 100644 --- a/DDRec/src/gear/createGearForILD.cpp +++ b/DDRec/src/gear/createGearForILD.cpp @@ -192,7 +192,7 @@ namespace DD4hep{ 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); @@ -300,41 +300,71 @@ namespace DD4hep{ //========= CALO ============================================================================== //********************************************************** - //* test gear interface w/ LayeredCalorimeterData extension + //* gear interface w/ LayeredCalorimeterData extension //********************************************************** - try { + std::map< std::string, std::string > caloMap ; + caloMap["HcalBarrel"] = "HcalBarrelParameters" ; + caloMap["EcalBarrel"] = "EcalBarrelParameters" ; + caloMap["EcalEndcap"] = "EcalEndcapParameters" ; + caloMap["EcalPlug"] = "EcalPlugParameters" ; + caloMap["YokeBarrel"] = "YokeBarrelParameters" ; + caloMap["YokeEndcap"] = "YokeEndcapParameters" ; + caloMap["YokePlug"] = "YokePlugParameters" ; + caloMap["HcalBarrel"] = "HcalBarrelParameters" ; + caloMap["HcalEndcap"] = "HcalEndcapParameters" ; + caloMap["HcalRing"] = "HcalRingParameters" ; + caloMap["Lcal"] = "LcalParameters" ; + caloMap["LHcal"] = "LHcalParameters" ; + caloMap["BeamCal"] = "BeamCalParameters" ; + + for( std::map< std::string, std::string >::const_iterator it = caloMap.begin() ; it != caloMap.end() ; ++it ){ - 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 { + + DetElement caloDE = lcdd.detector( it->first ) ; + + LayeredCalorimeterData* calo = caloDE.extension<LayeredCalorimeterData>() ; - LayeredCalorimeterData::Layer& l = calo->layers[i] ; + gear::CalorimeterParametersImpl* gearCalo = + ( calo->layoutType == LayeredCalorimeterData::BarrelLayout ? + new gear::CalorimeterParametersImpl( calo->extent[0]/dd4hep::mm, calo->extent[3]/dd4hep::mm, calo->inner_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->outer_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. - 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 ) ; + 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" ) ) ; - + if( it->first == "HcalBarrel" ){ + // additional parameters needed by MarlinPandora + gearCalo->setIntVal("Hcal_outer_polygon_order" , calo->outer_symmetry ) ; + gearCalo->setDoubleVal("Hcal_outer_polygon_phi0" , calo->phi0 ) ; + } + + + + caloDE.addExtension< GearHandle >( new GearHandle( gearCalo, it->second ) ) ; + + } catch( std::runtime_error& e ){ + std::cerr << " >>>> " << e.what() << std::endl ; + } + + } // calo loop - } catch( std::runtime_error& e ){ - std::cerr << " >>>> " << e.what() << std::endl ; - } //**********************************************************