From e3b46aa05ad5c63e5b80865c1f78d9a89b16efa3 Mon Sep 17 00:00:00 2001 From: Chengdong Fu <fucd@ihep.ac.cn> Date: Wed, 17 Apr 2024 11:10:14 +0800 Subject: [PATCH] fix bug for vxd and switch fixed calorimeter to optional --- Service/GearSvc/src/GearSvc.cpp | 134 +++++++++++++++++++++++++------- Service/GearSvc/src/GearSvc.h | 1 + 2 files changed, 106 insertions(+), 29 deletions(-) diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp index cf0d6ec9..4d798658 100644 --- a/Service/GearSvc/src/GearSvc.cpp +++ b/Service/GearSvc/src/GearSvc.cpp @@ -87,7 +87,7 @@ StatusCode GearSvc::initialize() const std::map<std::string, dd4hep::DetElement>& subs = world.children(); for(std::map<std::string, dd4hep::DetElement>::const_iterator it=subs.begin();it!=subs.end();it++){ dd4hep::DetElement sub = it->second; - info() << it->first << " " << sub.path() << " " << sub.placementPath() << endmsg; + debug() << it->first << " " << sub.path() << " " << sub.placementPath() << endmsg; if(it->first=="Tube"||it->first=="BeamPipe"){ sc = convertBeamPipe(sub); } @@ -109,38 +109,43 @@ StatusCode GearSvc::initialize() else if(it->first=="SET"){ sc = convertSET(sub); } - else{ - info() << it->first << " will convert in future! now fake parameters" << endmsg; - } - if(sc==StatusCode::FAILURE) return sc; - } - - gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1847.415655, 2350., 8, 0.); - gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2088.8, 2450., 2, 0.); - for(int i=0;i<29;i++){ - if(i<19){ - barrelParam->layerLayout().positionLayer(0, 5.25, 1.016666667e+01, 1.016666667e+01, 2.1); - endcapParam->layerLayout().positionLayer(0, 5.25, 1.016666667e+01, 1.016666667e+01, 2.1); - } - else if(i<20){ - barrelParam->layerLayout().positionLayer(0, 6.3, 1.016666667e+01, 1.016666667e+01, 2.1); - endcapParam->layerLayout().positionLayer(0, 6.3, 1.016666667e+01, 1.016666667e+01, 2.1); + else if(it->first=="EcalBarrel"||it->first=="EcalEndcap"||it->first=="EcalPlug"|| + it->first=="HcalBarrel"||it->first=="HcalEndcap"||it->first=="HcalRing"|| + it->first=="YokeBarrel"||it->first=="YokeEndcap"||it->first=="YokePlug"|| + it->first=="Coil"){ + sc = convertCal(sub); } else{ - barrelParam->layerLayout().positionLayer(0, 4.2, 1.016666667e+01, 1.016666667e+01, 4.2); - endcapParam->layerLayout().positionLayer(0, 4.2, 1.016666667e+01, 1.016666667e+01, 4.2); + info() << it->first << " will convert in future!" << endmsg; } + if (sc==StatusCode::FAILURE) return sc; } - m_gearMgr->setEcalBarrelParameters(barrelParam); - m_gearMgr->setEcalEndcapParameters(endcapParam); - gear::CalorimeterParametersImpl* barrelYokeParam = new gear::CalorimeterParametersImpl(4173.929932, 4072., 12, 0.0); - gear::CalorimeterParametersImpl* endcapYokeParam = new gear::CalorimeterParametersImpl(320., 7414.929932, 4072., 2, 0.0); - gear::CalorimeterParametersImpl* plugYokeParam = new gear::CalorimeterParametersImpl(320., 2849.254326, 3781.43, 2, 0.0); - plugYokeParam->setDoubleVal("YokePlugThickness", 290.57) ; - m_gearMgr->setYokeBarrelParameters(barrelYokeParam) ; - m_gearMgr->setYokeEndcapParameters(endcapYokeParam) ; - m_gearMgr->setYokePlugParameters(plugYokeParam) ; + try { + const auto& ecalB = m_gearMgr->getEcalBarrelParameters(); + } + catch (...) { + info() << "EcalBarrelParameters not create! create fake parameters (big size) now" << endmsg; + gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(2500, 4500, 8, 0.); + barrelParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1); + m_gearMgr->setEcalBarrelParameters(barrelParam); + } + try { + const auto& ecalE = m_gearMgr->getEcalEndcapParameters(); + } + catch (...) { + info() << "EcalEndcapsParameters not create! create fake parameters (big size) now" << endmsg; + gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 3000, 4510, 2, 0.); + endcapParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1); + m_gearMgr->setEcalEndcapParameters(endcapParam); + } + //gear::CalorimeterParametersImpl* barrelYokeParam = new gear::CalorimeterParametersImpl(4173.929932, 4072., 12, 0.0); + //gear::CalorimeterParametersImpl* endcapYokeParam = new gear::CalorimeterParametersImpl(320., 7414.929932, 4072., 2, 0.0); + //gear::CalorimeterParametersImpl* plugYokeParam = new gear::CalorimeterParametersImpl(320., 2849.254326, 3781.43, 2, 0.0); + //plugYokeParam->setDoubleVal("YokePlugThickness", 290.57) ; + //m_gearMgr->setYokeBarrelParameters(barrelYokeParam) ; + //m_gearMgr->setYokeEndcapParameters(endcapYokeParam) ; + //m_gearMgr->setYokePlugParameters(plugYokeParam) ; gear::GearXML::createXMLFile(m_gearMgr, "test.xml"); } @@ -995,7 +1000,78 @@ StatusCode GearSvc::convertSET(dd4hep::DetElement& set){ return StatusCode::SUCCESS; } -TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name){ +StatusCode GearSvc::convertCal(dd4hep::DetElement& cal) { + std::string name = cal.name(); + + dd4hep::rec::LayeredCalorimeterData* calData = nullptr; + bool extensionDataValid = true; + try{ + calData = cal.extension<dd4hep::rec::LayeredCalorimeterData>(); + } + catch(std::runtime_error& e){ + extensionDataValid = false; + info() << e.what() << " " << calData << endmsg; + } + if(calData){ + double rmin = calData->extent[0]/dd4hep::mm; + double rmax = calData->extent[1]/dd4hep::mm; + double zmin = calData->extent[2]/dd4hep::mm; + double zmax = calData->extent[3]/dd4hep::mm; + int inner_symmetry = calData->inner_symmetry; + int outer_symmetry = calData->outer_symmetry; + double phi0 = calData->phi0; + gear::CalorimeterParametersImpl* param = nullptr; + if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::BarrelLayout) { + param = new gear::CalorimeterParametersImpl(rmin, zmax, inner_symmetry, phi0); + } + else if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::EndcapLayout) { + param = new gear::CalorimeterParametersImpl(rmin, rmax, zmin, inner_symmetry, phi0); + } + else { + error() << "Not BarrelLayout and EndcapLayout: " << calData->layoutType << endmsg; + } + auto layers = calData->layers; + for (auto layer : layers) { + double distance = layer.distance/dd4hep::mm; + double thickness = layer.sensitive_thickness/dd4hep::mm; + double absorberThickness = layer.absorberThickness/dd4hep::mm; + double cellsize0 = layer.cellSize0/dd4hep::mm; + double cellsize1 = layer.cellSize1/dd4hep::mm; + param->layerLayout().positionLayer(0, thickness, cellsize0, cellsize1, absorberThickness); + } + if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::BarrelLayout) { + if (name.find("Ecal")!=-1) m_gearMgr->setEcalBarrelParameters(param); + else if (name.find("Hcal")!=-1) m_gearMgr->setHcalBarrelParameters(param); + else if (name.find("Yoke")!=-1) m_gearMgr->setYokeBarrelParameters(param); + else m_gearMgr->setGearParameters("CoilParameters", param); + + info() << "BarrelParameters set " << name << endmsg; + } + else if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::EndcapLayout) { + if (name.find("Endcap")) { + if (name.find("Ecal")!=-1) m_gearMgr->setEcalEndcapParameters(param); + else if (name.find("Hcal")!=-1) m_gearMgr->setHcalEndcapParameters(param); + else if (name.find("Yoke")!=-1) m_gearMgr->setYokeEndcapParameters(param); + + info() << "EndcapParameters set" << name << endmsg; + } + else { + if (name.find("Ecal")!=-1) m_gearMgr->setEcalPlugParameters(param); + else if (name.find("Hcal")!=-1) m_gearMgr->setHcalRingParameters(param); + else if (name.find("Yoke")!=-1) m_gearMgr->setYokePlugParameters(param); + + info() << "Plug(Ring)Parameters set" << name << endmsg; + } + } + } + else{ + info() << name << " will convert in future!" << endmsg; + } + + return StatusCode::SUCCESS; +} + +TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name) { TGeoNode* next = 0; if(mother->GetNdaughters()!=0){ for(int i=0;i<mother->GetNdaughters();i++){ diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h index 312491eb..3e2e250b 100644 --- a/Service/GearSvc/src/GearSvc.h +++ b/Service/GearSvc/src/GearSvc.h @@ -25,6 +25,7 @@ class GearSvc : public extends<Service, IGearSvc> StatusCode convertDC (dd4hep::DetElement& dc); StatusCode convertSET(dd4hep::DetElement& set); StatusCode convertFTD(dd4hep::DetElement& ftd); + StatusCode convertCal(dd4hep::DetElement& cal); TGeoNode* FindNode(TGeoNode* mother, char* name); Gaudi::Property<std::string> m_gearFile{this, "GearXMLFile", ""}; -- GitLab