diff --git a/Service/GearSvc/CMakeLists.txt b/Service/GearSvc/CMakeLists.txt index 248cf3dfebc8ce42bca6f4e45c1803293989f853..a70dae702f0d31a63bd831d083bde979ad2e31eb 100644 --- a/Service/GearSvc/CMakeLists.txt +++ b/Service/GearSvc/CMakeLists.txt @@ -8,6 +8,7 @@ gaudi_add_module(GearSvcPlugins ${GEAR_LIBRARIES} ${DD4hep_COMPONENT_LIBRARIES} DetInterface + DetSegmentation ) install(TARGETS GearSvc GearSvcPlugins diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp index 9b3a6ade809ab87a17daa00401ba0706732446cb..5e4f21754ade341c5b4f241891f185fef2618ba2 100644 --- a/Service/GearSvc/src/GearSvc.cpp +++ b/Service/GearSvc/src/GearSvc.cpp @@ -1,5 +1,7 @@ #include "GearSvc.h" #include "DetInterface/IGeomSvc.h" +#include "DetSegmentation/GridDriftChamber.h" + #include "gearxml/GearXML.h" #include "gearimpl/GearMgrImpl.h" #include "gearimpl/ConstantBField.h" @@ -736,6 +738,11 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ catch(std::runtime_error& e){ warning() << e.what() << " " << dcData << ", to search volume" << endmsg; // before extension ready, force to convert from volumes + auto geomSvc = service<IGeomSvc>("GeomSvc"); + dd4hep::Readout readout = geomSvc->lcdd()->readout("DriftChamberHitsCollection"); + dd4hep::Segmentation seg = readout.segmentation(); + dd4hep::DDSegmentation::GridDriftChamber* grid = dynamic_cast< dd4hep::DDSegmentation::GridDriftChamber* > ( seg.segmentation() ) ; + dcData = new dd4hep::rec::FixedPadSizeTPCData; dcData->rMinReadout = 99999; dcData->rMaxReadout = 0; @@ -745,40 +752,68 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ for(int i=0;i<dc_vol->GetNdaughters();i++){ TGeoNode* daughter = dc_vol->GetNode(i); std::string nodeName = daughter->GetName(); - std::cout << nodeName << std::endl; - if(nodeName.find("chamber_vol")!=-1){ - const TGeoShape* chamber_shape = daughter->GetVolume()->GetShape(); - if(chamber_shape->TestShapeBit(TGeoTube::kGeoTube)){ - const TGeoTube* tube = (const TGeoTube*) chamber_shape; - double innerRadius = tube->GetRmin(); - double outerRadius = tube->GetRmax(); - double halfLength = tube->GetDz(); - dcData->driftLength = halfLength; + //info << nodeName << endmsg; + if(nodeName.find("chamber_vol")!=-1||nodeName.find("assembly")!=-1){ + if(grid){ + // if more than one chamber, just use the outer, TODO + dcData->rMinReadout = grid->DC_outer_rbegin(); + dcData->rMaxReadout = grid->DC_outer_rend(); + dcData->driftLength = grid->detectorLength(); + dcData->maxRow = grid->DC_outer_layer_number(); + dcData->padHeight = grid->layer_width(); + dcData->padWidth = dcData->padHeight; } else{ - error() << nodeName << " not TGeoTube::kGeoTube" << endmsg; - is_convert = false; - } - - dcData->maxRow = daughter->GetNdaughters(); - for(int i=0;i<daughter->GetNdaughters();i++){ - TGeoNode* layer = daughter->GetDaughter(i); - const TGeoShape* shape = layer->GetVolume()->GetShape(); - if(shape->TestShapeBit(TGeoTube::kGeoTube)){ - const TGeoTube* tube = (const TGeoTube*) shape; + TGeoNode* next = daughter; + if(nodeName.find("assembly")!=-1){ + // if more than one chamber, just use the outer, TODO + next = daughter->GetDaughter(1); + std::string s = next->GetName(); + if(s.find("chamber_vol")==-1){ + error() << s << " not chamber_vol" << endmsg; + is_convert = false; + } + } + + //info() << next->GetName() << endmsg; + + const TGeoShape* chamber_shape = next->GetVolume()->GetShape(); + if(chamber_shape->TestShapeBit(TGeoTube::kGeoTube)){ + const TGeoTube* tube = (const TGeoTube*) chamber_shape; double innerRadius = tube->GetRmin(); double outerRadius = tube->GetRmax(); double halfLength = tube->GetDz(); - if(innerRadius<dcData->rMinReadout) dcData->rMinReadout = innerRadius; - if(outerRadius>dcData->rMaxReadout) dcData->rMaxReadout = outerRadius; + dcData->driftLength = halfLength; } else{ - error() << layer->GetName() << " not TGeoTube::kGeoTube" << endmsg; + error() << next->GetName() << " not TGeoTube::kGeoTube" << endmsg; is_convert = false; } + + dcData->maxRow = next->GetNdaughters(); + if(dcData->maxRow>512){ + error() << " layer number > 512, something wrong!" << endmsg; + is_convert = false; + } + for(int i=0;i<next->GetNdaughters();i++){ + TGeoNode* layer = next->GetDaughter(i); + const TGeoShape* shape = layer->GetVolume()->GetShape(); + if(shape->TestShapeBit(TGeoTube::kGeoTube)){ + const TGeoTube* tube = (const TGeoTube*) shape; + double innerRadius = tube->GetRmin(); + double outerRadius = tube->GetRmax(); + double halfLength = tube->GetDz(); + if(innerRadius<dcData->rMinReadout) dcData->rMinReadout = innerRadius; + if(outerRadius>dcData->rMaxReadout) dcData->rMaxReadout = outerRadius; + } + else{ + error() << layer->GetName() << " not TGeoTube::kGeoTube" << endmsg; + is_convert = false; + } + } + dcData->padHeight = (dcData->rMaxReadout-dcData->rMinReadout)/dcData->maxRow; + dcData->padWidth = dcData->padHeight; } - dcData->padHeight = (dcData->rMaxReadout-dcData->rMinReadout)/dcData->maxRow; - dcData->padWidth = dcData->padHeight; } else if(nodeName.find("wall_vol")!=-1){ const TGeoShape* wall_shape = daughter->GetVolume()->GetShape();