diff --git a/Detector/CMakeLists.txt b/Detector/CMakeLists.txt index be45fff6cab99071fd9915a4452980e4a22b9340..57e6f2ce1389dc6690edf864c20b8862b81313f5 100644 --- a/Detector/CMakeLists.txt +++ b/Detector/CMakeLists.txt @@ -6,3 +6,4 @@ add_subdirectory(DetEcalMatrix) add_subdirectory(DetInterface) add_subdirectory(DetSegmentation) add_subdirectory(GeomSvc) +add_subdirectory(Identifier) diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml index 80b21fe4ef424e540376f273f796a7b91f0cd4bc..4dfed10c66362c86c902d7a0b45fa9628771971c 100644 --- a/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml +++ b/Detector/DetCEPCv4/compact/SEcal05_siw_ECRing_01.xml @@ -51,7 +51,10 @@ <readouts> <readout name="EcalEndcapRingCollection"> - <segmentation type="CartesianGridXY" grid_size_x="Ecal_cells_size" grid_size_y="Ecal_cells_size"/> + + <segmentation type="CartesianGridXY" grid_size_x="Ecal_cells_size" grid_size_y="Ecal_cells_size" + offset_x="-0.5*Ecal_ECRing_Siplate_Size+0.5*Ecal_cells_size" offset_y="-0.5*Ecal_ECRing_Siplate_Size+0.5*Ecal_cells_size"/> + <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id> </readout> </readouts> diff --git a/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml b/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml index 214e9983bf2f6d78b51f38cc3768b23fac88b7ae..07802e884723ec23f4c9305b1c8dc40f60bfeb0c 100644 --- a/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml +++ b/Detector/DetCEPCv4/compact/SEcal05_siw_Endcaps.xml @@ -80,8 +80,8 @@ <readouts> <readout name="EcalEndcapsCollection"> - <segmentation type="MegatileLayerGridXY" grid_size_x="10.1667*mm" grid_size_y="10.1667*mm"/> - <id>system:5,module:3,stave:4,tower:5,layer:6,wafer:6,cellX:32:-16,cellY:-16</id> + <segmentation type="WaferGridXY" grid_size_x="10.1667*mm" grid_size_y="10.1667*mm" offset_x="2*mm" offset_y="-1.0999755859375*mm"/> + <id>system:5,module:3,stave:4,tower:5,layer:6,wafer:6,x:32:-16,y:-16</id> </readout> </readouts> diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml index 8ea02125f3e24158e985c8f2dc9ac455b84c013f..5ce08e226f5119bc7646d7cc6b79ac37649d5bc5 100644 --- a/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml +++ b/Detector/DetCEPCv4/compact/SHcalRpc01_Barrel_01.xml @@ -33,8 +33,10 @@ <readouts> <readout name="HcalBarrelCollection"> - <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/> + + <segmentation type="TiledLayerGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/> <id>system:5,module:3,stave:3,tower:5,layer:6,slice:4,x:32:-16,y:-16</id> + </readout> </readouts> diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml index ab41b9af64cb63b92de5c198e83f90867caedc78..e598f6cd3be4879100ee811d6b02799de44033ee 100644 --- a/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml +++ b/Detector/DetCEPCv4/compact/SHcalRpc01_EndcapRing_01.xml @@ -10,7 +10,7 @@ dz="HcalEndcapRing_max_z + 2.0*env_safety"/> <shape type="PolyhedraRegular" numsides="Hcal_ring_inner_symmetry" rmin="HcalEndcapRing_inner_radius - env_safety" rmax="HcalEndcapRing_outer_radius*cos(pi/Hcal_ring_outer_symmetry) + env_safety" dz="2.0*HcalEndcapRing_max_z + env_safety" material="Air"/> - <rotation x="0" y="0" z="90*deg-180*deg/Hcal_ring_inner_symmetry"/> + <rotation x="0" y="0" z="-180*deg/Hcal_ring_inner_symmetry"/> </shape> <shape type="Box" dx="HcalEndcapRing_outer_radius + 2.0*env_safety" dy="HcalEndcapRing_outer_radius + 2.0*env_safety" dz="HcalEndcapRing_min_z - env_safety"/> @@ -32,8 +32,8 @@ <readouts> <readout name="HcalEndcapRingCollection"> - <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/> - <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id> + <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0"/> + <id>system:5,module:3,stave:4,tower:3,layer:6,y:32:-16,x:-16</id> </readout> </readouts> diff --git a/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml b/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml index 677a23dd3dcdb7f207f11089a0144e0846f00a84..3799553f5f9e4aebf59ec059d474c173a1180fa1 100644 --- a/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml +++ b/Detector/DetCEPCv4/compact/SHcalRpc01_Endcaps_01.xml @@ -31,7 +31,7 @@ <readouts> <readout name="HcalEndcapsCollection"> <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0" /> - <id>system:5,module:3,stave:3,tower:5,layer:6,x:32:-16,y:-16</id> + <id>system:5,module:3,stave:3,tower:5,layer:6,y:32:-16,x:-16</id> </readout> </readouts> diff --git a/Detector/DetCEPCv4/compact/ecal_defs.xml b/Detector/DetCEPCv4/compact/ecal_defs.xml index 057bb5bbdee6936f385a00605c36b095ea1cbf74..d258d5711f9ec0e356ffa05605dc994c743be0ad 100644 --- a/Detector/DetCEPCv4/compact/ecal_defs.xml +++ b/Detector/DetCEPCv4/compact/ecal_defs.xml @@ -55,7 +55,8 @@ <constant name="Ecal_Slab_Plug_length" value="0*mm"/> <!-- needed only for ecal ring driver... --> - <constant name="Ecal_cells_size" value="10.2105*mm"/> + <constant name="Ecal_ECRing_Siplate_Size" value="Ecal_endcap_center_box_size - 2*Ecal_EC_Ring_gap - 2*Ecal_lateral_face_thickness"/> + <constant name="Ecal_cells_size" value="Ecal_ECRing_Siplate_Size/76."/> <constant name="Ecal_Sc_reflector_thickness" value="0.057*mm"/> <constant name="Ecal_Sc_thickness" value="2.0*mm"/> <constant name="Ecal_Slab_Sc_PCB_thickness" value="0.8*mm"/> diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp index 9801a0a17418f93b03e46f8ea259be8f80e6ad6c..b49d996411f5b030dff243c9365c6535ee7d8aaf 100644 --- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp +++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Barrel.cpp @@ -4,6 +4,7 @@ #include "DD4hep/DetFactoryHelper.h" #include "DD4hep/DD4hepUnits.h" #include "DD4hep/DetType.h" +#include "DDSegmentation/TiledLayerGridXY.h" #include "DDRec/Surface.h" #include "DDRec/DetectorData.h" @@ -23,6 +24,7 @@ using dd4hep::Volume; using dd4hep::PlacedVolume; using dd4hep::Position; using dd4hep::RotationZYX; +using dd4hep::RotationZ; using dd4hep::Transform3D; using dd4hep::Box; using dd4hep::Tube; @@ -63,30 +65,31 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete Readout readout = sens.readout(); Segmentation seg = readout.segmentation(); + dd4hep::DDSegmentation::TiledLayerGridXY* tiledSeg = dynamic_cast<dd4hep::DDSegmentation::TiledLayerGridXY*> (seg.segmentation()); + assert(tiledSeg && "no TiledLayerGridXY found" ); std::vector<double> cellSizeVector = seg.segmentation()->cellDimensions(0); double cell_sizeX = cellSizeVector[0]; double cell_sizeZ = cellSizeVector[1]; - double Hcal_inner_radius = theDetector.constant<double>("Hcal_inner_radius"); - double Hcal_outer_radius_set = theDetector.constant<double>("Hcal_outer_radius"); - double Hcal_half_length = theDetector.constant<double>("Hcal_half_length"); - int Hcal_inner_symmetry = theDetector.constant<int>("Hcal_inner_symmetry"); - int Hcal_outer_symmetry = 0; - double Hcal_lateral_plate_thickness = theDetector.constant<double>("Hcal_lateral_structure_thickness"); - double Hcal_modules_gap = theDetector.constant<double>("Hcal_modules_gap"); - int Hcal_nlayers = theDetector.constant<int>("Hcal_nlayers"); - double TPC_outer_radius = theDetector.constant<double>("TPC_outer_radius"); - double Ecal_outer_radius = theDetector.constant<double>("Ecal_outer_radius"); - int Hcal_barrel_number_modules = theDetector.constant<int>("Hcal_barrel_number_modules"); + double Hcal_inner_radius = theDetector.constant<double>("Hcal_inner_radius"); + double Hcal_outer_radius_set = theDetector.constant<double>("Hcal_outer_radius"); + double Hcal_half_length = theDetector.constant<double>("Hcal_half_length"); + int Hcal_inner_symmetry = theDetector.constant<int>("Hcal_inner_symmetry"); + int Hcal_outer_symmetry = 0; + double Hcal_lateral_plate_thickness = theDetector.constant<double>("Hcal_lateral_structure_thickness"); + double Hcal_modules_gap = theDetector.constant<double>("Hcal_modules_gap"); + double Ecal_outer_radius = theDetector.constant<double>("Ecal_outer_radius"); + int Hcal_barrel_number_modules = theDetector.constant<int>("Hcal_barrel_number_modules"); - double hPrime = Ecal_outer_radius + theDetector.constant<double>("Hcal_Ecal_gap"); + double hPrime = Ecal_outer_radius + theDetector.constant<double>("Hcal_Ecal_gap"); Hcal_inner_radius = hPrime / cos(pi/8.); double Hcal_normal_dim_z = (2*Hcal_half_length - (Hcal_barrel_number_modules-1)*Hcal_modules_gap)/Hcal_barrel_number_modules; xml_coll_t c(x_det,_U(layer)); xml_comp_t x_layer = c; + int Hcal_nlayers = x_layer.repeat(); double Hcal_radiator_thickness = 0; double layerThickness = 0.0; @@ -95,6 +98,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete layerThickness += x_slice.thickness(); if(x_slice.materialStr()==Hcal_radiator_material) Hcal_radiator_thickness = x_slice.thickness(); } + cout << " cell size xy = " << cell_sizeX << " cell size z = " << cell_sizeZ << endl; cout << " layer_thickness (from slices) = " << layerThickness << " and radiator_thickness = " << Hcal_radiator_thickness << endl; double Hcal_chamber_thickness = layerThickness - Hcal_radiator_thickness; @@ -149,28 +153,31 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete PlacedVolume calo_pv = envelope.placeVolume(logicCalo, Position(0,0,0)); DetElement calo(det, "envelope", det_id); calo.setPlacement(calo_pv); - + if(tiledSeg) tiledSeg->setOffsetY(-(Hcal_regular_chamber_dim_z/2.-RPC_EdgeWidth)+0.5*cell_sizeZ); for(int layer_id=1; layer_id<=Hcal_nlayers; layer_id++){ double yn = sqrt(Hcal_outer_radius*Hcal_outer_radius - (hPrime + layer_id*layerThickness)*(hPrime + layer_id*layerThickness)); double Yn = 0.5*d_InnerOctoSize - layer_id*layerThickness; double halfX = Hcal_chamber_thickness/2.; - double halfZ = (yn+Yn)/2.; + double halfY = (yn+Yn)/2.; LayeredCalorimeterData::Layer caloLayer ; caloLayer.cellSize0 = cell_sizeX; caloLayer.cellSize1 = cell_sizeZ; - //double halfY = Hcal_normal_dim_z / 2.; - double halfY = Hcal_regular_chamber_dim_z / 2.; - + //double halfZ = Hcal_normal_dim_z / 2.; + double halfZ = Hcal_regular_chamber_dim_z / 2.; + double localXPos = hPrime + Hcal_radiator_thickness + Hcal_chamber_thickness/2. + (layer_id-1)*layerThickness; double localYPos = -Yn + 0.5*(Yn + yn); - Box chamberSolid(halfX, halfY, halfZ); + + Box chamberSolid(halfY, halfZ, halfX); string chamberLogical_name = name+_toString(layer_id,"_layer%d"); Volume chamberLogical(chamberLogical_name, chamberSolid, air); chamberLogical.setAttributes(theDetector, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr()); + if(tiledSeg) tiledSeg->setLayerOffsetX((-(halfY-RPC_EdgeWidth)+0.5*cell_sizeX)*2/cell_sizeX); + string layer_name = name+_toString(layer_id,"_layer%d"); double nRadiationLengths=0.; @@ -196,44 +203,45 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete thickness_sum += slice_thickness/2; // Slice volume & box - Box sliceSolid(slice_thickness/2., halfY, halfZ); + Box sliceSolid(halfY, halfZ, slice_thickness/2.); Volume sliceVol(slice_name, sliceSolid, slice_material); if ( x_slice.isSensitive() ) { sliceVol.setSensitiveDetector(sens); if(RPC_EdgeWidth>0){ - double RPC_GazInlet_In_Y = halfY - RPC_EdgeWidth - RPCGazInletOuterRadius; - double RPC_GazInlet_In_Z = halfZ - RPC_EdgeWidth/2; - double RPC_GazInlet_Out_Y = -RPC_GazInlet_In_Y; - double RPC_GazInlet_Out_Z = RPC_GazInlet_In_Z; + double RPC_GazInlet_In_Z = halfZ - RPC_EdgeWidth - RPCGazInletOuterRadius; + double RPC_GazInlet_In_Y = halfY - RPC_EdgeWidth/2; + double RPC_GazInlet_Out_Z = -RPC_GazInlet_In_Z; + double RPC_GazInlet_Out_Y = RPC_GazInlet_In_Y; string mateialName = x_slice.attr<string>(_Unicode(edge_material)); Material edge_material = theDetector.material(mateialName); - Box solidRPCEdge1(slice_thickness/2.,halfY, halfZ); - Box solidRPCEdge2(slice_thickness/2.,halfY-RPC_EdgeWidth, halfZ-RPC_EdgeWidth); + Box solidRPCEdge1(halfY, halfZ, slice_thickness/2.); + Box solidRPCEdge2(halfY-RPC_EdgeWidth, halfZ-RPC_EdgeWidth, slice_thickness/2.); SubtractionSolid solidRPCEdge(solidRPCEdge1, solidRPCEdge2, Position(0,0,0)); Volume logicRPCEdge(slice_name+"_edge", solidRPCEdge, edge_material); logicRPCEdge.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); sliceVol.placeVolume(logicRPCEdge); + RotationZYX rotGaz(0, pi/2., 0); Tube solidRPCGazInlet(RPCGazInletInnerRadius,RPCGazInletOuterRadius,RPC_EdgeWidth/*RPCGazInletLength*//2); Volume logicRPCGazInlet(slice_name+"_GazInlet", solidRPCGazInlet, edge_material); logicRPCGazInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - logicRPCEdge.placeVolume(logicRPCGazInlet, Position(0,RPC_GazInlet_In_Y,RPC_GazInlet_In_Z)); - logicRPCEdge.placeVolume(logicRPCGazInlet, Position(0,RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z)); + logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0))); + logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0))); Tube solidRPCGazInsideInlet(0,RPCGazInletInnerRadius,RPC_EdgeWidth/*RPCGazInletLength*//2); Volume logicRPCGazInsideInlet(slice_name+"_GazInsideInlet", solidRPCGazInsideInlet, slice_material); logicRPCGazInsideInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),"SeeThrough"); - logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Position(0,RPC_GazInlet_In_Y,RPC_GazInlet_In_Z)); - logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Position(0,RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z)); + logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0))); + logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz,Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0))); } if(Hcal_spacer_thickness>0){ Tube solidRPCSpacer(0,Hcal_spacer_thickness/2,slice_thickness/2); Material space_material = theDetector.material(x_slice.attr<string>(_Unicode(spacer_material))); Volume logicRPCSpacer(slice_name+"_spacer", solidRPCSpacer, space_material); logicRPCSpacer.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - RotationZYX rotSpacer(0, pi/2., 0); + RotationZYX rotSpacer(0, 0, 0); double gap_hZ = halfZ-RPC_EdgeWidth; double gap_hY = halfY-RPC_EdgeWidth; @@ -253,7 +261,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete double SpacerY = gap_hY - y_lateral_space - y_counter*Hcal_spacer_separation; for(int z_counter = 0; z_counter <=z_number_of_separations; z_counter++){ double SpacerZ = gap_hZ - z_lateral_space - z_counter*Hcal_spacer_separation; - PlacedVolume space_pv = sliceVol.placeVolume(logicRPCSpacer, Transform3D(rotSpacer, Position(0,SpacerY,SpacerZ))); + PlacedVolume space_pv = sliceVol.placeVolume(logicRPCSpacer, Transform3D(rotSpacer, Position(SpacerY,SpacerZ,0))); } } } @@ -279,7 +287,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete thickness_sum += slice_thickness/2; // slice PlacedVolume - PlacedVolume slice_phv = chamberLogical.placeVolume(sliceVol,Position(slice_pos_z,0,0)); + PlacedVolume slice_phv = chamberLogical.placeVolume(sliceVol,Position(0,0,slice_pos_z)); if ( x_slice.isSensitive() ) { int slice_id = (layer_id > Hcal_nlayers)? 1:-1; slice_phv.addPhysVolID("layer",layer_id).addPhysVolID("slice",slice_id); @@ -309,14 +317,17 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete for(int stave_id = 1; stave_id <= 8; stave_id++){ double phirot = stave_phi_offset+(stave_id-1)*pi/4.; - RotationZYX rot(0, phirot, pi*0.5); - RotationZYX rotInverse(0,-phirot, -pi*0.5); + RotationZYX rot(pi/2, pi/2, 0); //phirot); + RotationZ rotZ(phirot); + RotationZYX rotAll = rotZ*rot; + RotationZYX rotInverse(phirot, 0, 0); for(int module_id = 1; module_id <= Hcal_barrel_number_modules; module_id++){ module_z_offset = - Hcal_half_length + Hcal_normal_dim_z/2. + (module_id-1)*(Hcal_normal_dim_z+Hcal_modules_gap); - Position localPos(localXPos,-module_z_offset,localYPos); + Position localPos(localXPos,localYPos,module_z_offset); Position newPos = rotInverse*localPos; - Transform3D tran3D(rot, newPos); + + Transform3D tran3D(rotAll, newPos); PlacedVolume pv = logicCalo.placeVolume(chamberLogical, tran3D); pv.addPhysVolID("stave",stave_id).addPhysVolID("module",module_id).addPhysVolID("layer",layer_id); DetElement layer(calo, name+_toString(stave_id,"_stave%d")+_toString(module_id,"_module%d")+_toString(layer_id,"_layer%d"), det_id); diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp index 3a9978cc85833ad6807f55cbaae2fd9d74d3656d..08e00c5a6ef27cbf4402ed5a05621d721a06428b 100644 --- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp +++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_EndcapRing.cpp @@ -197,7 +197,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete // chamber placements for(int stave_id = 1; stave_id <= 4; stave_id++){ - double angle = pi/2.*(stave_id-1); + double angle = -pi/2.*(stave_id-1); RotationZYX lrot(angle,0,0); for (int layer_id = 1; layer_id <= number_of_chambers; layer_id++){ double Zoff = -pDz + (layer_id-1)*layerThickness + Hcal_radiator_thickness + Hcal_chamber_thickness/2.; @@ -217,28 +217,30 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete cout << "Hcal_EndcapRing: inner_thickness= " << inner_thickness << endl; cout << "Hcal_EndcapRing: outer_thickness= " << thickness_sum << endl; } - LayeredCalorimeterData::Layer caloLayer ; - caloLayer.cellSize0 = cell_sizeX; - caloLayer.cellSize1 = cell_sizeY; - caloLayer.inner_nRadiationLengths = nRadiationLengthsInside; - caloLayer.inner_nInteractionLengths = nInteractionLengthsInside; - caloLayer.inner_thickness = inner_thickness; - caloLayer.sensitive_thickness = sensitive_thickness; - caloLayer.outer_nRadiationLengths = nRadiationLengths; - caloLayer.outer_nInteractionLengths = nInteractionLengths; - caloLayer.outer_thickness = thickness_sum; + if(stave_id==1){//only one needed, according to wenxingfang's + LayeredCalorimeterData::Layer caloLayer ; + caloLayer.cellSize0 = cell_sizeX; + caloLayer.cellSize1 = cell_sizeY; + caloLayer.inner_nRadiationLengths = nRadiationLengthsInside; + caloLayer.inner_nInteractionLengths = nInteractionLengthsInside; + caloLayer.inner_thickness = inner_thickness; + caloLayer.sensitive_thickness = sensitive_thickness; + caloLayer.outer_nRadiationLengths = nRadiationLengths; + caloLayer.outer_nInteractionLengths = nInteractionLengths; + caloLayer.outer_thickness = thickness_sum; + + caloLayer.distance = start_z + (layer_id-1)*layerThickness; + caloLayer.absorberThickness = Hcal_radiator_thickness ; - caloLayer.distance = start_z + (layer_id-1)*layerThickness; - caloLayer.absorberThickness = Hcal_radiator_thickness ; - - caloData->layers.push_back( caloLayer ) ; + caloData->layers.push_back( caloLayer ) ; + } } } // Placements double endcap_z_offset = start_z + pDz; for(int side = 0; side <= 1; side++){ - int module_id = (side==0) ? 0 : 6; + int module_id = (side==0) ? 6 : 0; double this_module_z_offset = (side==0) ? endcap_z_offset : -endcap_z_offset; // use reflect volume for z<0, therefore, same rotation // segmentation violation happen if EndCapRingLogical.reflect(), back to rotate Y diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp index e55eb4722038d9f9879659d71f407b0e79313df1..92ef98190b83213dc11d3a91e01bf99b58414387 100644 --- a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp +++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc01_Endcaps.cpp @@ -205,7 +205,7 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete if(possible_number_of_chambers < number_of_chambers) number_of_chambers = possible_number_of_chambers; // chamber placements for(int stave_id = 1; stave_id <= 4; stave_id++){ - double angle = pi/2.*(stave_id-1); + double angle = -pi/2.*(stave_id-1); //RotationZ lrotz(angle); RotationZYX lrot(angle,0,0); for (int layer_id = 1; layer_id <= number_of_chambers; layer_id++){ @@ -226,28 +226,32 @@ static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDete cout << "Hcal_Endcap: inner_thickness= " << inner_thickness << endl; cout << "Hcal_Endcap: outer_thickness= " << thickness_sum << endl; } - LayeredCalorimeterData::Layer caloLayer ; - caloLayer.cellSize0 = cell_sizeX; - caloLayer.cellSize1 = cell_sizeY; - caloLayer.inner_nRadiationLengths = nRadiationLengthsInside; - caloLayer.inner_nInteractionLengths = nInteractionLengthsInside; - caloLayer.inner_thickness = inner_thickness; - caloLayer.sensitive_thickness = sensitive_thickness; - caloLayer.outer_nRadiationLengths = nRadiationLengths; - caloLayer.outer_nInteractionLengths = nInteractionLengths; - caloLayer.outer_thickness = thickness_sum; - - caloLayer.distance = Hcal_start_z + (layer_id-1)*layerThickness; - caloLayer.absorberThickness = Hcal_radiator_thickness ; - - caloData->layers.push_back( caloLayer ) ; + + if(stave_id==1){// only for one stave is good. by wenxingfang + LayeredCalorimeterData::Layer caloLayer ; + caloLayer.cellSize0 = cell_sizeX; + caloLayer.cellSize1 = cell_sizeY; + caloLayer.inner_nRadiationLengths = nRadiationLengthsInside; + caloLayer.inner_nInteractionLengths = nInteractionLengthsInside; + caloLayer.inner_thickness = inner_thickness; + caloLayer.sensitive_thickness = sensitive_thickness; + caloLayer.outer_nRadiationLengths = nRadiationLengths; + caloLayer.outer_nInteractionLengths = nInteractionLengths; + caloLayer.outer_thickness = thickness_sum; + + caloLayer.distance = Hcal_start_z + (layer_id-1)*layerThickness; + caloLayer.absorberThickness = Hcal_radiator_thickness ; + + caloData->layers.push_back( caloLayer ) ; + + } } } // Placements double endcap_z_offset = Hcal_start_z + Hcal_endcap_thickness/2.; for(int side = 0; side <= 1; side++){ - int module_id = (side==0) ? 0 : 6; + int module_id = (side==0) ? 6 : 0; double this_module_z_offset = (side==0) ? endcap_z_offset : -endcap_z_offset; // use reflect volume for z<0, therefore, same rotation // segmentation violation happen if EndCapRingLogical.reflect(), back to rotate Y diff --git a/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..a135d6eda279f136833d95e3c959db1a00520fbe --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml @@ -0,0 +1,21 @@ +<lccdd> + <detectors> + <detector name="Coil" type="SCoil02" vis="SOLVis" id="DetID_COIL" insideTrackingVolume="false" readout="COILCollection"> + <envelope vis="SeeThrough"> + <shape type="Tube" rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="Air"/> + </envelope> + + <type_flags type=" DetType_SUPPORT + DetType_COIL " /> + + <!--fg: for now only a simple aluminum cylinder is created inside the envelope --> + <tube rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="G4_Al"/> + + </detector> + </detectors> + + <readouts> + <readout name="COILCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id> + </readout> + </readouts> +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml index 8dd7602c1e415b63b47d6d52a7b9a22556926380..44f21025ccffe4e952544a836af318c54e56cd6e 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml @@ -14,16 +14,18 @@ <constant name="SDT_radius_min" value="InnerTracker_inner_radius"/> <constant name="SDT_radius_max" value="OuterTracker_outer_radius"/> - <constant name="SDT_half_length" value="MainTracker_half_length"/> + <constant name="SDT_half_length" value="DC_half_length"/> <constant name="SDT_length" value="SDT_half_length*2"/> <constant name="DC_length" value="DC_half_length*2"/> - <constant name="SDT_inner_chamber_radius_min" value="235*mm"/> - <constant name="SDT_inner_chamber_radius_max" value="InnerTracker_outer_radius"/> + <constant name="SDT_chamber_inner_wall_thickness" value="0.2*mm"/> + <constant name="SDT_chamber_outer_wall_thickness" value="2.8*mm"/> + <constant name="SDT_inner_chamber_radius_min" value="InnerTracker_inner_radius+SDT_chamber_inner_wall_thickness"/> + <constant name="SDT_inner_chamber_radius_max" value="InnerTracker_outer_radius-SDT_chamber_outer_wall_thickness"/> <constant name="SDT_inner_chamber_length" value="DC_length"/> - <constant name="SDT_outer_chamber_radius_min" value="OuterTracker_inner_radius"/> - <constant name="SDT_outer_chamber_radius_max" value="1715*mm"/> + <constant name="SDT_outer_chamber_radius_min" value="OuterTracker_inner_radius+SDT_chamber_inner_wall_thickness"/> + <constant name="SDT_outer_chamber_radius_max" value="OuterTracker_outer_radius-SDT_chamber_outer_wall_thickness"/> <constant name="SDT_outer_chamber_length" value="DC_length"/> <constant name="SDT_inner_chamber_layer_number" value="67"/> @@ -31,14 +33,14 @@ <constant name="SDT_chamber_layer_width" value="10*mm"/> <constant name="Epsilon" value="0*deg"/> - <constant name="SDT_inner_chamber_inner_wall_radius_min" value="234.8*mm"/> - <constant name="SDT_inner_chamber_inner_wall_radius_max" value="235*mm"/> - <constant name="SDT_inner_chamber_outer_wall_radius_min" value="906*mm"/> - <constant name="SDT_inner_chamber_outer_wall_radius_max" value="908.8*mm"/> - <constant name="SDT_outer_chamber_inner_wall_radius_min" value="1084.8*mm"/> - <constant name="SDT_outer_chamber_inner_wall_radius_max" value="1085*mm"/> - <constant name="SDT_outer_chamber_outer_wall_radius_min" value="1715*mm"/> - <constant name="SDT_outer_chamber_outer_wall_radius_max" value="1717.8*mm"/> + <constant name="SDT_inner_chamber_inner_wall_radius_min" value="SDT_inner_chamber_radius_min-SDT_chamber_inner_wall_thickness"/> + <constant name="SDT_inner_chamber_inner_wall_radius_max" value="SDT_inner_chamber_radius_min"/> + <constant name="SDT_inner_chamber_outer_wall_radius_min" value="SDT_inner_chamber_radius_max"/> + <constant name="SDT_inner_chamber_outer_wall_radius_max" value="SDT_inner_chamber_radius_max+SDT_chamber_outer_wall_thickness"/> + <constant name="SDT_outer_chamber_inner_wall_radius_min" value="SDT_outer_chamber_radius_min-SDT_chamber_inner_wall_thickness"/> + <constant name="SDT_outer_chamber_inner_wall_radius_max" value="SDT_outer_chamber_radius_min"/> + <constant name="SDT_outer_chamber_outer_wall_radius_min" value="SDT_outer_chamber_radius_max"/> + <constant name="SDT_outer_chamber_outer_wall_radius_max" value="SDT_outer_chamber_radius_max+SDT_chamber_outer_wall_thickness"/> <constant name="DC_Endcap_rmin" value="SDT_radius_min"/> <constant name="DC_Endcap_rmax" value="SDT_radius_max"/> @@ -55,8 +57,8 @@ <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="BlueVis" sensitive="true" insideTrackingVolume="true"> <envelope vis="SeeThrough"> <shape type="BooleanShape" operation="Union" material="Air"> - <shape type="Tube" rmin="SDT_radius_min" rmax="909*mm" dz="SDT_half_length" /> - <shape type="Tube" rmin="1084.8*mm" rmax="SDT_radius_max" dz="SDT_half_length" /> + <shape type="Tube" rmin="SDT_radius_min" rmax="InnerTracker_outer_radius" dz="MainTracker_half_length" /> + <shape type="Tube" rmin="OuterTracker_inner_radius" rmax="SDT_radius_max" dz="MainTracker_half_length" /> </shape> </envelope> diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml index dce464bf8f2dc60523562d475579e2bb696c818c..f6f865ea47763225fcef3ab8065db1a2a386fe17 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml @@ -56,8 +56,8 @@ <extended_reconstruction_parameters strip_width="0.001*mm" strip_length="250*mm" strip_pitch="0.01*mm" strip_angle="5*deg" /> <!-- SQL command: "select * from disks;" --> - <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.9*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> - <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.9*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> + <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.8*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> + <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="71.8*mm" padUp_Si_dxMax="68*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> <disk disk_number="3" z_position_ReltoTPCLength="FTD_disk3_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> <disk disk_number="4" z_position_ReltoTPCLength="FTD_disk4_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> <disk disk_number="5" z_position_ReltoTPCLength="FTD_disk5_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..afbb943147743d9a783c886da870c60feab9ee60 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml @@ -0,0 +1,76 @@ +<lccdd> + <define> + <constant name="FTD_inner_radius" value="BeamPipe_VertexRegion_rmax + FTD_BeamPipe_cable_clearance"/> + <constant name="FTD_outer_radius" value="InnerTracker_inner_radius - FTD_InnerTracker_gap"/> + <constant name="FTD_outer_radius_1" value="SIT1_inner_radius - env_safety"/> + <constant name="FTD_outer_radius_2" value="FTD_outer_radius - env_safety"/> + <constant name="FTD_half_length" value="InnerTracker_half_length"/> + <constant name="FTD_min_z_0" value="Vertex_half_length + env_safety"/> + <constant name="FTD_min_z_2" value="SIT1_half_length + env_safety"/> + <constant name="FTD_cone_min_z" value="BeamPipe_CentralAl_zmax"/> + <constant name="FTD_cone_radius" value="FTD_half_length*tan(CrossingAngle/2) + BeamPipe_Dnstream_inner_radius + BeamPipe_Cu_thickness + FTD_BeamPipe_cable_clearance/2"/> + <constant name="petal_cp_support_thickness" value="2.0*mm"/> + <constant name="petal_support_zoffset" value="1.5*mm"/> + <constant name="FTD1_vtx3_distance_z" value="95*mm"/> + <constant name="FTD7_ecal_distance_z" value="200*mm"/> + <constant name="FTD_disk2_zPosRelToDCLength" value="0.158004*2350*mm/InnerTracker_half_length"/> + <constant name="FTD_disk3_zPosRelToDCLength" value="0.273577*2350*mm/InnerTracker_half_length"/> + <constant name="FTD_disk4_zPosRelToDCLength" value="0.359149*2350*mm/InnerTracker_half_length"/> + <constant name="FTD_disk5_zPosRelToDCLength" value="0.393600*2350*mm/InnerTracker_half_length"/> + </define> + + <detectors> + <detector id="DetID_FTD" name="FTD" type="FTD_Simple_Staggered" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true"> + <envelope vis="FTDVis"> + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="Tube" rmin="FTD_inner_radius" rmax="FTD_outer_radius" dz="FTD_half_length" /> + <shape type="Tube" rmin="0." rmax="FTD_outer_radius+env_safety" dz="FTD_min_z_0" /> + </shape> + <shape type="Tube" rmin="FTD_outer_radius_1" rmax="FTD_outer_radius+env_safety" dz="FTD_min_z_2" /> + </shape> + <shape type="Cone" rmin1="0" rmax1="FTD_inner_radius" rmin2="0" rmax2="FTD_cone_radius" + z="(FTD_half_length-FTD_cone_min_z)/2. + env_safety "/> + <position x="0" y="0" z="FTD_cone_min_z+(FTD_half_length-FTD_cone_min_z)/2."/> + </shape> + <shape type="Cone" rmin1="0" rmax1="FTD_inner_radius" rmin2="0" rmax2="FTD_cone_radius" + z="(FTD_half_length-FTD_cone_min_z)/2. + env_safety "/> + <position x="0" y="0" z="-FTD_cone_min_z-(FTD_half_length-FTD_cone_min_z)/2."/> + <rotation x="0" y="180.*deg" z="0" /> + </shape> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL + DetType_STRIP "/> + + <!-- SQL command: "select * from common_parameters;" --> + <common_parameters ftd1_vtx3_distance_z="FTD1_vtx3_distance_z" + ftd7_ecal_distance_z="FTD7_ecal_distance_z" ftd1_sit1_radial_diff="-1*mm" ftd2_sit1_radial_diff="-1*mm" ftd3_sit2_radial_diff="-FTD_InnerTracker_gap" + ftd4to7_tpc_radial_gap="FTD_InnerTracker_gap" beamtube_clearance="FTD_BeamPipe_gap" cables_thickness="0.08*mm" cable_shield_thickness="0.1*mm" + outer_cylinder_total_thickness="1*mm" petal_half_angle_support="11.25*deg" petal_y_ratio="0.5015" + support_spaceframe_width="10*mm"/> + + <!-- SQL command: "select * from extended_reconstruction_parameters;" --> + <extended_reconstruction_parameters strip_width="0.001*mm" strip_length="250*mm" strip_pitch="0.01*mm" strip_angle="5*deg" /> + + <!-- SQL command: "select * from disks;" --> + <disk disk_number="1" z_position_ReltoTPCLength="0" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="62.*mm" padUp_Si_dxMax="58*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> + <disk disk_number="2" z_position_ReltoTPCLength="FTD_disk2_zPosRelToDCLength" disk_si_thickness="0.02*mm" petal_cp_support_dxMax="62.*mm" padUp_Si_dxMax="58*mm" petal_cp_support_thickness="1*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="1" double_sided="0" /> + <disk disk_number="3" z_position_ReltoTPCLength="FTD_disk3_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> + <disk disk_number="4" z_position_ReltoTPCLength="FTD_disk4_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> + <disk disk_number="5" z_position_ReltoTPCLength="FTD_disk5_zPosRelToDCLength" disk_si_thickness="0.2*mm" petal_cp_support_dxMax="103.49*mm" padUp_Si_dxMax="99.46*mm" petal_cp_support_thickness="2*mm" petal_support_zoffset="1.5*mm" sensor_is_pixel="0" double_sided="1" /> + + </detector> + + </detectors> + + <readouts> + <readout name="FTDCollection"> + <!-- fixme: for now DD4hep cannot handle signed values - side should actually be "-2" --> + <id>system:5,side:2,layer:9,module:8,sensor:8</id> + </readout> + </readouts> + + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..a65ff1dc17fcceb0db7f2e97ba6c5d0220e9f054 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml @@ -0,0 +1,79 @@ +<lccdd> + <define> + <constant name="Hcal_cells_size" value="10*mm"/> + <constant name="Hcal_inner_radius" value="Hcal_barrel_inner_radius"/> + <constant name="Hcal_half_length" value="Hcal_barrel_half_length"/> + <constant name="Hcal_inner_symmetry" value="Hcal_barrel_symmetry"/> + <constant name="Hcal_nlayers" value="40"/> + <constant name="Hcal_Ecal_gap" value="Hcal_barrel_inner_radius-Ecal_barrel_outer_radius"/> + <constant name="Ecal_outer_radius" value="Ecal_barrel_outer_radius"/> + + <constant name="Hcal_radiator_thickness" value="20.0*mm"/> + <constant name="Hcal_airgap_thickness" value="1*mm"/> + <constant name="Hcal_mylar_cathode_thickness" value="0.18*mm"/> + <constant name="Hcal_graphite_cathode_thickness" value="0.05*mm"/> + <constant name="Hcal_glass_cathode_thickness" value="1.1*mm"/> + <constant name="Hcal_sensitive_gas_gap" value="1.2*mm"/> + <constant name="Hcal_glass_anode_thickness" value="0.7*mm"/> + <constant name="Hcal_graphite_anode_thickness" value="0.05*mm"/> + <constant name="Hcal_mylar_anode_thickness" value="0.05*mm"/> + <constant name="Hcal_PCB_thickness" value="0.8*mm"/> + <constant name="Hcal_electronics_mask_thickness" value="1.6*mm"/> + + <constant name="Hcal_gas_edge_width" value="1*mm"/> + <constant name="Hcal_MinNumCellsInTransvPlane" value="11"/> + <constant name="Hcal_barrel_number_modules" value="5"/> + <constant name="Hcal_chamber_thickness" value="6.73*mm"/> + <constant name="Hcal_back_plate_thickness" value="15*mm"/> + <constant name="Hcal_lateral_structure_thickness" value="10*mm"/> + <constant name="Hcal_stave_gaps" value="0*mm"/> + <constant name="Hcal_modules_gap" value="2*mm"/> + + <constant name="Hcal_pad_separation" value="0*mm"/> + <constant name="Hcal_gasInlet_length" value="3.0*mm"/> + <constant name="Hcal_spacer_separation" value="100*mm"/> + <constant name="Hcal_spacer_thickness" value="8*mm"/> + <constant name="Hcal_gasInlet_inner_radius" value="0.4*mm"/> + <constant name="Hcal_gasInlet_outer_radius" value="0.5*mm"/> + </define> + + <detectors> + <detector name="HcalBarrel" type="SHcalRpc01_Barrel" id="DetID_HCAL" readout="HcalBarrelCollection" vis="GreenVis" insideTrackingVolume="false" > + <comment>Hadron Calorimeter Barrel</comment> + <envelope vis="HCALVis"> + <shape type="BooleanShape" operation="Subtraction" material="Air" > + <shape type="Cone" z="Hcal_barrel_half_length + env_safety/2" rmin1="0.0" rmax1="Hcal_barrel_outer_radius + env_safety" + rmin2="0.0" rmax2="Hcal_barrel_outer_radius + env_safety"/> + <shape type="PolyhedraRegular" numsides="Hcal_barrel_symmetry" rmin="0.0" + rmax="Hcal_barrel_inner_radius - env_safety" dz="2*(Hcal_barrel_half_length + env_safety)"/> + <rotation x="0" y="0" z="-180*deg/Hcal_barrel_symmetry"/> + </shape> + </envelope> + <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_HADRONIC " /> + + <staves material="stainless_steel" vis="BlueVis"/> + + <layer repeat="Hcal_nlayers" vis="SeeThrough"> + <slice material="stainless_steel" thickness="Hcal_radiator_thickness" vis="BlueVis" /> + <slice material="Air" thickness="Hcal_airgap_thickness" vis="WhiteVis" /> + <slice material="mylar" thickness="Hcal_mylar_cathode_thickness" vis="MagentaVis" /> + <slice material="graphite" thickness="Hcal_graphite_cathode_thickness" vis="Invisible" /> + <slice material="FloatGlass" thickness="Hcal_glass_cathode_thickness" vis="RedVis" /> + <slice material="RPCGAS2" thickness="Hcal_sensitive_gas_gap" sensitive = "yes" vis="YellowVis" edge_material="PEEK-GF30" spacer_material="Nylon"/> + <slice material="FloatGlass" thickness="Hcal_glass_anode_thickness" vis="RedVis" /> + <slice material="graphite" thickness="Hcal_graphite_anode_thickness" vis="Invisible" /> + <slice material="mylar" thickness="Hcal_mylar_anode_thickness" vis="MagentaVis" /> + <slice material="g10" thickness="Hcal_PCB_thickness" vis="CyanVis" /> + <slice material="g10" thickness="Hcal_electronics_mask_thickness" vis="GreenVis" /> + </layer> + </detector> + </detectors> + + <readouts> + <readout name="HcalBarrelCollection"> + <segmentation type="CartesianGridYZ" grid_size_y="Hcal_cells_size" grid_size_z="Hcal_cells_size"/> + <id>system:5,module:3,stave:3,tower:5,layer:6,slice:4,y:32:-16,z:-16</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d23b43cd6a4db765c393b568c0a2ed13ba1b9da --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml @@ -0,0 +1,48 @@ +<lccdd> + <define> + <constant name="Hcal_endcap_nlayers" value="Hcal_nlayers"/> + <constant name="Hcal_endcap_center_box_size" value="700*mm"/> + </define> + <detectors> + <detector id="DetID_HCAL_ENDCAP" name="HcalEndcap" type="SHcalRpc01_Endcaps" readout="HcalEndcapsCollection" vis="SeeThrough" calorimeterType="HAD_ENDCAP"> + <comment>Hadron Calorimeter Endcap</comment> + <envelope vis="HCALVis"> + <shape type="BooleanShape" operation="Subtraction" material="Air"> + <shape type="BooleanShape" operation="Subtraction" material="Air"> + <shape type="Tube" rmin="0.0" rmax="Hcal_endcap_outer_radius + env_safety" dz="Hcal_endcap_zmax + env_safety"/> + <shape type="Tube" rmin="0.0" rmax="Hcal_endcap_outer_radius + 2.0*env_safety" dz="Hcal_endcap_zmin - env_safety"/> + </shape> + <shape type="Box" dx="Hcal_endcap_inner_radius - env_safety" dy="Hcal_endcap_inner_radius - env_safety" dz="Hcal_endcap_zmax + 2.0*env_safety"/> + </shape> + <rotation x="0" y="0" z="0"/> + </envelope> + + <type_flags type="DetType_CALORIMETER + DetType_ENDCAP + DetType_HADRONIC " /> + + <staves material="stainless_steel" vis="SeeThrough"/> + + <layer repeat="Hcal_endcap_nlayers" vis="SeeThrough"> + <slice material="stainless_steel" thickness="Hcal_radiator_thickness" vis="BlueVis" /> + <slice material="Air" thickness="Hcal_airgap_thickness" vis="WhiteVis" /> + <slice material="mylar" thickness="Hcal_mylar_cathode_thickness" vis="MagentaVis" /> + <slice material="graphite" thickness="Hcal_graphite_cathode_thickness" vis="Invisible" /> + <slice material="FloatGlass" thickness="Hcal_glass_cathode_thickness" vis="RedVis" /> + <slice material="RPCGAS2" thickness="Hcal_sensitive_gas_gap" sensitive = "yes" vis="YellowVis"/> + <slice material="FloatGlass" thickness="Hcal_glass_anode_thickness" vis="RedVis" /> + <slice material="graphite" thickness="Hcal_graphite_anode_thickness" vis="Invisible" /> + <slice material="mylar" thickness="Hcal_mylar_anode_thickness" vis="MagentaVis" /> + <slice material="g10" thickness="Hcal_PCB_thickness" vis="CyanVis" /> + <slice material="g10" thickness="Hcal_electronics_mask_thickness" vis="GreenVis" /> + </layer> + + </detector> + </detectors> + + <readouts> + <readout name="HcalEndcapsCollection"> + <segmentation type="CartesianGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size" offset_x="Hcal_cells_size/2.0" offset_y="Hcal_cells_size/2.0" /> + <id>system:5,module:3,stave:3,tower:5,layer:6,x:32:-16,y:-16</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d90b1c81d0a5e41831bbd2f2dc19b3739e604d3 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml @@ -0,0 +1,49 @@ +<lccdd> + <define> + <constant name="SET_inner_radius" value="OuterTracker_outer_radius + env_safety"/> + <constant name="SET_outer_radius" value="Ecal_barrel_inner_radius - env_safety "/> + <constant name="SET_half_length" value="OuterTracker_half_length"/> + <constant name="SET_inner_distance_from_tpc" value="InnerTracker_outer_radius-OuterTracker_outer_radius+3*mm"/> + </define> + + <detectors> + <detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true"> + <envelope vis="SETVis"> + <shape type="BooleanShape" operation="Union" material="Air" > + <shape type="Tube" rmin="InnerTracker_outer_radius" rmax="OuterTracker_inner_radius" dz="SET_half_length" material = "Air" /> + <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length" material = "Air" /> + </shape> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/> + + <reconstruction strip_width="0.0125*mm" strip_length="92*mm" strip_pitch="0.05*mm" strip_angle="7*deg" /> + + <global sensitive_thickness="0.2*mm" support_thickness="1*mm" sensor_length="92*mm" sensitive_mat="G4_Si" + support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> + + <layer layer_id="0" sensitive_distance_from_tpc="SET_inner_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="0.98" + n_ladders="24" ladder_clearance="0.1*mm" faces_IP="1" /> + + <layer layer_id="1" sensitive_distance_from_tpc="SET_inner_distance_from_tpc+2.5*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98" + n_ladders="24" ladder_clearance="0.1*mm" faces_IP="0" /> + + <layer layer_id="2" sensitive_distance_from_tpc="3*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98" + n_ladders="24" ladder_clearance="0.1*mm" faces_IP="1" /> + + <layer layer_id="3" sensitive_distance_from_tpc="5.5*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98" + n_ladders="24" ladder_clearance="0.1*mm" faces_IP="0" /> + + </detector> + + </detectors> + + <readouts> + <readout name="SETCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id> + </readout> + </readouts> + + +</lccdd> + diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e7a967efaa134682cb5d9ae978095be20d14846 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml @@ -0,0 +1,49 @@ +<lccdd> + <define> + <constant name="SIT_sensitive_thickness" value="0.2*mm"/> + <constant name="SIT_inner_radius" value="SIT1_inner_radius"/> + <constant name="SIT_inner_radius_1" value="SIT_inner_radius + env_safety"/> + <constant name="SIT_outer_radius_1" value="SIT_inner_radius_1/cos(pi/8)"/> + <constant name="SIT_inner_radius_2" value="SIT2_inner_radius"/> + <constant name="SIT_outer_radius" value="InnerTracker_inner_radius"/> + <constant name="SIT_half_length" value="SIT2_half_length"/> + <constant name="SIT_half_length_1" value="SIT1_half_length"/> + <constant name="SIT_layer_gap" value="2.5*mm"/> + </define> + + <detectors> + <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Planar" vis="SITVis" readout="SITCollection" insideTrackingVolume="true"> + <envelope vis="SeeThrough"> + <shape type="BooleanShape" operation="Union" material="Air" > + <shape type="Tube" rmin="SIT_inner_radius" rmax="SIT_outer_radius_1" dz="SIT_half_length_1" /> + <shape type="Tube" rmin="SIT_inner_radius_2" rmax="SIT_outer_radius" dz="SIT_half_length" /> + </shape> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/> + + <!-- database : sit_simple_planar_sensors_03 --> + + <!-- SQL command: "select * from extended_reconstruction_parameters;" --> + <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="0*deg" /> + + <!-- SQL command: "select * from global;" --> + <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="1*mm" sensor_length="92*mm" + sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> + + <!-- SQL command: "select * from sit_layers;" --> + <layer layer_id="0" sensitive_radius="SIT_inner_radius_1+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="8" n_ladders="10" + ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0" /> + + <layer layer_id="1" sensitive_radius="SIT_inner_radius_2+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="48" n_ladders="16" + ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1" /> + </detector> + </detectors> + + <readouts> + <readout name="SITCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml index 857af3277bbada91568cbb05352dc6e3a7c50bc3..3a9df414610a95791f1d1a9bb0616d4d255465d9 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml @@ -25,7 +25,7 @@ <!-- database : sit_simple_planar_sensors_03 --> <!-- SQL command: "select * from extended_reconstruction_parameters;" --> - <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="0*deg" /> + <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="7*deg" /> <!-- SQL command: "select * from global;" --> <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="1*mm" sensor_length="92*mm" diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..8960b15c2c9931e19b398d049673328950dbd7ff --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml @@ -0,0 +1,38 @@ +<lccdd> + <define> + <constant name="Yoke_cells_size" value="30*mm"/> + </define> + <detectors> + <detector name="YokeBarrel" type="Yoke05_Barrel" id="DetID_YOKE" readout="MuonBarrelCollection" vis="YellowVis" insideTrackingVolume="false"> + <envelope vis="YOKEVis"> + <shape type="BooleanShape" operation="Intersection" material="Air" > + <shape type="Box" dx="Yoke_barrel_outer_radius + env_safety" dy="Yoke_barrel_outer_radius + env_safety" dz="Yoke_barrel_half_length + env_safety"/> + <shape type="PolyhedraRegular" numsides="Yoke_barrel_symmetry" rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius" + dz="2.0*Yoke_barrel_half_length" material = "Air" /> + <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_barrel_symmetry"/> + </shape> + </envelope> + + <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_MUON " /> + + <dimensions numsides="Yoke_barrel_symmetry" rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius" zhalf="Yoke_barrel_half_length" material="Air"/> + <position x="0*mm" y="0*mm" z="0*mm"/> + <rotation x="0*deg" y="0*deg" z="0*deg"/> + <staves material = "Iron" vis="BlueVis"/> + <!--TODO Yoke05_Barrel fixed 14 layers, should be updated as optional--> + <layer repeat="14" vis="SeeThrough"> + <slice material = "Air" thickness = "15.0*mm" vis="YellowVis" /> + <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes" vis="CyanVis" /> + <slice material = "Air" thickness = "15.0*mm" vis="YellowVis" /> + </layer> + </detector> + </detectors> + + <readouts> + <readout name="MuonBarrelCollection"> + <segmentation type="CartesianGridXZ" grid_size_x="Yoke_cells_size" grid_size_z="Yoke_cells_size"/> + <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,z:-16</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e49c15cb0b3c68bedf66c2f0b468689720ed70d --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml @@ -0,0 +1,47 @@ +<lccdd> + <define> + <constant name="Hcal_Yoke_plug_gap" value="25*mm"/> + <constant name="YokeEndcapPlug_symmetry" value="Yoke_endcap_outer_symmetry"/> + </define> + <detectors> + <detector name="YokeEndcap" type="Yoke05_Endcaps" id="DetID_YOKE_ENDCAP" readout="MuonEndcapsCollection" vis="YellowVis" insideTrackingVolume="false" > + <envelope vis="YOKEVis"> + <shape type="BooleanShape" operation="Subtraction" material="Air"> + <shape type="BooleanShape" operation="Subtraction" material="Air"> + <shape type="BooleanShape" operation="Intersection" material="Air"> + <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety" + dz="Yoke_endcap_zmax + env_safety"/> + <shape type="PolyhedraRegular" numsides="Yoke_endcap_outer_symmetry" rmin="Yoke_endcap_inner_radius - env_safety" + rmax="Yoke_endcap_outer_radius + env_safety" dz="2.*Yoke_endcap_zmax + env_safety" /> + <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_endcap_outer_symmetry"/> + </shape> + <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety" + dz="HcalEndcap_max_z + Hcal_Yoke_plug_gap - env_safety"/> + </shape> + <!--without Yoke_plug--> + <!--shape type="PolyhedraRegular" numsides="YokeEndcapPlug_symmetry" rmin="Hcal_barrel_outer_radius*cos(pi/Hcal_endcap_outer_symmetry) + env_safety" + rmax="Yoke_endcap_outer_radius + 2.0*env_safety" dz="2.*Yoke_endcap_zmin - env_safety" /> + <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/YokeEndcapPlug_symmetry"/--> + </shape> + </envelope> + + <type_flags type=" DetType_CALORIMETER + DetType_ENDCAP + DetType_MUON " /> + + <dimensions numsides="Yoke_endcap_outer_symmetry" rmin="Yoke_endcap_inner_radius" z="Yoke_barrel_half_length" /> + <material name="Iron"/> + <layer repeat="12" vis="SeeThrough"> + <slice material = "Air" thickness = "15.0*mm" vis="YellowVis" /> + <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes" vis="CyanVis" /> + <slice material = "Air" thickness = "15.0*mm" vis="YellowVis" /> + </layer> + </detector> + </detectors> + + <readouts> + <readout name="MuonEndcapsCollection"> + <segmentation type="CartesianGridXY" grid_size_x="Yoke_cells_size" grid_size_y="Yoke_cells_size"/> + <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml index 36230440063ab1e4785d4f3340c0cbee6bf02321..7fa9b7cba6c11d4e29037539f4dddd8a50181b20 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml @@ -85,11 +85,11 @@ <constant name="DC_half_length" value="2225*mm" /> <constant name="MainTracker_half_length" value="DC_half_length+DC_Endcap_z" /> <constant name="InnerTracker_half_length" value="DC_half_length" /> - <constant name="InnerTracker_inner_radius" value="234*mm"/> - <constant name="InnerTracker_outer_radius" value="906*mm"/> + <constant name="InnerTracker_inner_radius" value="234.8*mm"/> + <constant name="InnerTracker_outer_radius" value="908.8*mm"/> <constant name="OuterTracker_half_length" value="DC_half_length"/> - <constant name="OuterTracker_inner_radius" value="1085*mm"/> - <constant name="OuterTracker_outer_radius" value="1720*mm"/> + <constant name="OuterTracker_inner_radius" value="1084.8*mm"/> + <constant name="OuterTracker_outer_radius" value="1717.8*mm"/> <constant name="SIT1_inner_radius" value="152.90*mm"/> <constant name="SIT1_half_length" value="368.00*mm"/> @@ -125,42 +125,50 @@ <constant name="Ecal_endcap_zmin" value="2260*mm"/> <constant name="Ecal_endcap_zmax" value="2540*mm"/> <constant name="Ecal_endcap_symmetry" value="8"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/> - <constant name="Solenoid_inner_radius" value="2250*mm"/> - <constant name="Solenoid_outer_radius" value="2550*mm"/> + <constant name="Solenoid_inner_radius" value="2260*mm"/> + <constant name="Solenoid_outer_radius" value="2560*mm"/> <constant name="Solenoid_half_length" value="3000*mm"/> <constant name="SolenoidCoil_half_length" value="2900*mm"/> <constant name="SolenoidCoil_radius" value="2300*mm"/> <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/> <constant name="Hcal_barrel_inner_radius" value="2600*mm"/> - <constant name="Hcal_barrel_outer_radius" value="3700*mm"/> + <constant name="Hcal_barrel_outer_radius" value="3670.6805372782*mm"/> <constant name="Hcal_barrel_half_length" value="3000*mm"/> <constant name="Hcal_barrel_symmetry" value="8"/> <constant name="Hcal_endcap_inner_radius" value="340*mm"/> <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/> <constant name="Hcal_endcap_zmin" value="3010*mm"/> - <constant name="Hcal_endcap_zmax" value="4110*mm"/> + <constant name="Hcal_endcap_zmax" value="4094.2*mm"/> <constant name="Hcal_endcap_symmetry" value="8"/> - + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/> + <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/> + <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/> + <constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/> <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/> <constant name="Hcal_ring_zmin" value="2600*mm"/> - <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin"/> + <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/> <constant name="Hcal_ring_symmetry" value="8"/> <constant name="Yoke_barrel_inner_radius" value="3710*mm"/> - <constant name="Yoke_barrel_outer_radius" value="5170*mm"/> - <constant name="Yoke_barrel_half_length" value="3650*mm"/> + <constant name="Yoke_barrel_outer_radius" value="6951*mm"/> + <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/> <constant name="Yoke_barrel_symmetry" value="8"/> <constant name="Yoke_endcap_inner_radius" value="400*mm"/> - <constant name="Yoke_endcap_outer_radius" value="5170*mm"/> - <constant name="Yoke_endcap_zmin" value="4150*mm"/> - <constant name="Yoke_endcap_zmax" value="5610*mm"/> + <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/> + <constant name="Yoke_endcap_zmin" value="Yoke_barrel_half_length+25*mm"/> + <constant name="Yoke_endcap_zmax" value="6750*mm"/> <constant name="Yoke_endcap_outer_symmetry" value="8"/> <constant name="Yoke_endcap_inner_symmetry" value="0"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/> <constant name="LumiCal_zmax" value="805*mm" /> <constant name="LumiCal_zmin" value="700*mm"/> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml index d264a40d004528055692ba1de56706e7f009986f..2dff18ec59923381d7e98a1e999e334c4649b4e4 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml @@ -1,8 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> <lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> - <info name="CRD_i1_v01" - title="CepC reference detctor with coil inside Hcal" + <info name="CRD_o1_v01" + title="CepC reference detctor with coil inside Hcal, strip SIT" author="C.D.Fu, " url="http://cepc.ihep.ac.cn" status="developing" @@ -34,17 +35,28 @@ <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/> <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> - <!--include ref="../CRD_common_v01/Coil_v01_01.xml"/--> - <!--include ref="../CRD_common_v01/Hcal_v01_01.xml"/--> - <!--include ref="../CRD_common_v01/Yoke_v01_01.xml"/--> + <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Hcal_Rpc_EndcapRing_v01_01.xml"/--> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/> <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/--> <fields> - <field name="GlobalSolenoid" type="solenoid" + <field name="InnerSolenoid" type="solenoid" inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" outer_field="Field_outer_nominal_value" zmax="SolenoidCoil_half_length" - outer_radius="SolenoidCoil_center_radius"> + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> </field> </fields> diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ef534ce04ff16c208695f5d74661f21c30ce392 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml @@ -0,0 +1,232 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + + <info name="CRDDimensions" + title="master file with includes and world dimension" + author="C.D.Fu, " + url="no" + status="development" + version="1.0"> + <comment> + undeterminded parameters + </comment> + </info> + + <define> + <constant name="CrossingAngle" value="0.033*rad"/> + + <constant name="GlobalTrackerReadoutID_DCH" type="string" value="system:8,chamber:1,layer:7,phi:16"/> + <constant name="GlobalTrackerReadoutID" type="string" value="system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2"/> + + <constant name="Field_nominal_value" value="3*tesla"/> + <constant name="Field_outer_nominal_value" value="-1.3*tesla"/> + + <constant name="env_safety" value="0.1*mm"/> + + <constant name="DetID_NOTUSED" value=" 0"/> + <constant name="DetID_VXD" value=" 1"/> + <constant name="DetID_SIT" value=" 2"/> + <constant name="DetID_FTD" value=" 3"/> + <constant name="DetID_TPC" value=" 4"/> + <constant name="DetID_SET" value=" 5"/> + <constant name="DetID_ETD" value=" 6"/> + <constant name="DetID_DC" value=" 7"/> + + <constant name="DetID_ECAL" value=" 20"/> + <constant name="DetID_ECAL_PLUG" value=" 21"/> + <constant name="DetID_HCAL" value=" 22"/> + <constant name="DetID_HCAL_RING" value=" 23"/> + <constant name="DetID_LCAL" value=" 24"/> + <constant name="DetID_BCAL" value=" 25"/> + <constant name="DetID_LHCAL" value=" 26"/> + <constant name="DetID_YOKE" value=" 27"/> + <constant name="DetID_COIL" value=" 28"/> + <constant name="DetID_ECAL_ENDCAP" value=" 29"/> + <constant name="DetID_HCAL_ENDCAP" value=" 30"/> + <constant name="DetID_YOKE_ENDCAP" value=" 31"/> + + <constant name="DetID_bwd" value="-1"/> + <constant name="DetID_barrel" value=" 0"/> + <constant name="DetID_fwd" value="+1"/> + + <constant name="BeamPipe_Be_inner_thickness" value="0.5*mm"/> + <constant name="BeamPipe_Cooling_thickness" value="0.5*mm"/> + <constant name="BeamPipe_Be_outer_thickness" value="0.3*mm"/> + <constant name="BeamPipe_Be_total_thickness" value="BeamPipe_Be_inner_thickness+BeamPipe_Cooling_thickness+BeamPipe_Be_outer_thickness"/> + <constant name="BeamPipe_Al_thickness" value="BeamPipe_Be_total_thickness"/> + <constant name="BeamPipe_Cu_thickness" value="2.0*mm"/> + + <constant name="BeamPipe_CentralBe_zmax" value="120*mm"/> + <constant name="BeamPipe_CentralAl_zmax" value="205*mm"/> + <constant name="BeamPipe_ConeAl_zmax" value="655*mm"/> + <constant name="BeamPipe_LinkerAl_zmax" value="700*mm"/> + <constant name="BeamPipe_LinkerCu_zmax" value="780*mm"/> + <constant name="BeamPipe_Waist_zmax" value="805*mm"/> + <constant name="BeamPipe_Crotch_zmax" value="855*mm"/> + <constant name="BeamPipe_FirstSeparated_zmax" value="1110*mm"/> + <constant name="BeamPipe_SecondSeparated_zmax" value="2200*mm"/> + <constant name="BeamPipe_end_z" value="12*m"/> + + <constant name="BeamPipe_Central_inner_radius" value="14*mm"/> + <constant name="BeamPipe_Expanded_inner_radius" value="20*mm"/> + <constant name="BeamPipe_Upstream_inner_radius" value="6*mm"/> + <constant name="BeamPipe_Dnstream_inner_radius" value="10*mm"/> + <constant name="BeamPipe_Crotch_hole_height" value="30.67*mm"/> + <constant name="BeamPipe_VertexRegion_rmax" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="BeamPipe_ForwardRegion_rmax" value="BeamPipe_Expanded_inner_radius+BeamPipe_Cu_thickness"/> + + <constant name="Vertex_inner_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Be_total_thickness"/> + <constant name="Vertex_outer_radius" value="101*mm"/> + <constant name="Vertex_half_length" value="200*mm"/> + + <constant name="DC_Endcap_z" value="0.1*mm"/> + <constant name="DC_half_length" value="2225*mm" /> + <constant name="MainTracker_half_length" value="DC_half_length+DC_Endcap_z" /> + <constant name="InnerTracker_half_length" value="DC_half_length" /> + <constant name="InnerTracker_inner_radius" value="234.8*mm"/> + <constant name="InnerTracker_outer_radius" value="908.8*mm"/> + <constant name="OuterTracker_half_length" value="DC_half_length"/> + <constant name="OuterTracker_inner_radius" value="1084.8*mm"/> + <constant name="OuterTracker_outer_radius" value="1717.8*mm"/> + + <constant name="SIT1_inner_radius" value="140*mm"/> + <constant name="SIT1_half_length" value="368.00*mm"/> + <constant name="SIT2_inner_radius" value="225*mm"/> + <constant name="SIT2_half_length" value="InnerTracker_half_length"/> + + <constant name="FTD_BeamPipe_cable_clearance" value="10*mm"/> + <constant name="FTD_BeamPipe_gap" value="15*mm"/> + <constant name="FTD_InnerTracker_gap" value="5*mm"/> + + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="TPC_Ecal_Hcal_barrel_halfZ" value="MainTracker_half_length"/> + <constant name="TPC_inner_radius" value="InnerTracker_inner_radius"/> + <constant name="TPC_outer_radius" value="OuterTracker_outer_radius"/> + <constant name="SIT1_Radius" value="SIT1_inner_radius"/> + <constant name="SIT1_Half_Length_Z" value="SIT1_half_length"/> + <constant name="SIT2_Radius" value="InnerTracker_inner_radius"/> <!--fake, used by FTD_Simple_Staggered and FTD_cepc, now should be determined by inner tracker--> + <constant name="SIT2_Half_Length_Z" value="SIT2_half_length"/> + <constant name="TUBE_IPOuterTube_end_z" value="BeamPipe_CentralAl_zmax"/> + <constant name="TUBE_IPOuterTube_end_radius" value="BeamPipe_Central_inner_radius+BeamPipe_Al_thickness"/> + <constant name="TUBE_IPOuterBulge_end_z" value="BeamPipe_Crotch_zmax"/><!--"BeamPipe_ConeAl_zmax"/--> + <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/> + <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/--> + + <constant name="Ecal_barrel_inner_radius" value="1800*mm"/> + <constant name="Ecal_barrel_thickness" value="280*mm"/> + <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> + <constant name="Ecal_barrel_half_length" value="2300*mm"/> + <constant name="Ecal_barrel_symmetry" value="8"/> + + <constant name="Ecal_endcap_inner_radius" value="340*mm"/> + <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/> + <constant name="Ecal_endcap_zmin" value="2260*mm"/> + <constant name="Ecal_endcap_zmax" value="2540*mm"/> + <constant name="Ecal_endcap_symmetry" value="8"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/> + + <constant name="Solenoid_inner_radius" value="2260*mm"/> + <constant name="Solenoid_outer_radius" value="2560*mm"/> + <constant name="Solenoid_half_length" value="3000*mm"/> + <constant name="SolenoidCoil_half_length" value="2900*mm"/> + <constant name="SolenoidCoil_radius" value="2300*mm"/> + <constant name="SolenoidCoil_center_radius" value="(Solenoid_inner_radius+Solenoid_outer_radius)/2"/> + + <constant name="Hcal_barrel_inner_radius" value="2600*mm"/> + <constant name="Hcal_barrel_outer_radius" value="3670.6805372782*mm"/> + <constant name="Hcal_barrel_half_length" value="3000*mm"/> + <constant name="Hcal_barrel_symmetry" value="8"/> + + <constant name="Hcal_endcap_inner_radius" value="340*mm"/> + <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/> + <constant name="Hcal_endcap_zmin" value="3010*mm"/> + <constant name="Hcal_endcap_zmax" value="4094.2*mm"/> + <constant name="Hcal_endcap_symmetry" value="8"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/> + <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/> + <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/> + + <constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/> + <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/> + <constant name="Hcal_ring_zmin" value="2600*mm"/> + <constant name="Hcal_ring_zmax" value="Hcal_endcap_zmin-10*mm"/> + <constant name="Hcal_ring_symmetry" value="8"/> + + <constant name="Yoke_barrel_inner_radius" value="3710*mm"/> + <constant name="Yoke_barrel_outer_radius" value="6951*mm"/> + <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/> + <constant name="Yoke_barrel_symmetry" value="8"/> + + <constant name="Yoke_endcap_inner_radius" value="400*mm"/> + <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/> + <constant name="Yoke_endcap_zmin" value="Yoke_barrel_half_length+25*mm"/> + <constant name="Yoke_endcap_zmax" value="6750*mm"/> + <constant name="Yoke_endcap_outer_symmetry" value="8"/> + <constant name="Yoke_endcap_inner_symmetry" value="0"/> + <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> + <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/> + + <constant name="LumiCal_zmax" value="805*mm" /> + <constant name="LumiCal_zmin" value="700*mm"/> + <constant name="LumiCal_thickness" value="(LumiCal_zmax-LumiCal_zmin)/2.0"/> + <constant name="LumiCal_inner_radius" value="35.0*mm"/> + <constant name="LumiCal_outer_radius" value="100.0*mm- env_safety"/> + + <constant name="tracker_region_zmax" value="OuterTracker_half_length"/> + <constant name="tracker_region_rmax" value="OuterTracker_outer_radius"/> + + </define> + + <limits> + <limitset name="cal_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + <limitset name="dc_limits"> + <limit name="step_length_max" particles="*" value="10.0" unit="mm" /> + </limitset> + <limitset name="tracker_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + </limits> + + <regions> + <region name="BeampipeRegion"/> + <region name="VertexRegion"/> + <region name="ForwardRegion"/> + </regions> + + <display> + <vis name="VXDVis" alpha="0.1" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDLayerVis" alpha="1.0" r="0.1" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="FTDVis" alpha="1.0" r="0.0" g="0.1" b="0.0" showDaughters="true" visible="false"/> + <vis name="FTDSensitiveVis" alpha="1.0" r="1.0" g="1.0" b="0.45" showDaughters="true" visible="true"/> + <vis name="FTDSupportVis" alpha="1.0" r="1.0" g="0.5" b="0.5" showDaughters="true" visible="true"/> + <vis name="SITVis" alpha="1.0" r="0.54" g="0.43" b="0.04" showDaughters="true" visible="true"/> + <vis name="SETVis" alpha="1.0" r="0.8" g="0.8" b="0.4" showDaughters="true" visible="false"/> + <vis name="ECALVis" alpha="1.0" r="0.2" g="0.6" b="0" showDaughters="true" visible="true"/> + <vis name="HCALVis" alpha="1.0" r="0.078" g="0.01176" b="0.588" showDaughters="true" visible="true"/> + <vis name="SOLVis" alpha="1.0" r="0.4" g="0.4" b="0.4" showDaughters="true" visible="true"/> + <vis name="YOKEVis" alpha="1.0" r="0.6" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="LCALVis" alpha="1.0" r="0.25" g="0.88" b="0.81" showDaughters="true" visible="true"/> + <vis name="SupportVis" alpha="1.0" r="0.2" g="0.2" b="0.2" showDaughters="true" visible="true"/> + + <vis name="WhiteVis" alpha="0.0" r=".96" g=".96" b=".96" showDaughters="true" visible="true"/> + <vis name="LightGrayVis" alpha="0.0" r=".75" g=".75" b=".75" showDaughters="true" visible="true"/> + <vis name="Invisible" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="false" visible="false"/> + <vis name="SeeThrough" alpha="0.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="false"/> + <vis name="RedVis" alpha="1.0" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GreenVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlueVis" alpha="1.0" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="CyanVis" alpha="1.0" r="0.0" g="1.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="MagentaVis" alpha="1.0" r="1.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="YellowVis" alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlackVis" alpha="1.0" r="0.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="GrayVis" alpha="1.0" r="0.5" g="0.5" b="0.5" showDaughters="true" visible="true"/> + </display> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml new file mode 100644 index 0000000000000000000000000000000000000000..8c584bd311e6e22b1dc18bd8864fab67b20fe630 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v02" + title="CepC reference detctor with coil inside Hcal, pixel SIT" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v02"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_02.xml"/> + + <include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SimpleStaggered_v01_02.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/SET_SimplePlanar_v01_02.xml"/> + <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> + <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Hcal_Rpc_EndcapRing_v01_01.xml"/--> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/--> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/compact/README.md b/Detector/DetCRD/compact/README.md index 3ca82e71804c4139861744be371791a2b1464e23..e28392fe7297e747bba016a292c8d2c1b8486f21 100644 --- a/Detector/DetCRD/compact/README.md +++ b/Detector/DetCRD/compact/README.md @@ -5,11 +5,12 @@ The following CRD detector models are available in CEPCSW | Model | Description | MainTracker | Ecal | Hcal | Status | | ------------- | -----------------------------|------------ |---------|------|----------------| | CRD_o1_v01 | coil inside simulation model | DC | crystal | RPC | developing | +| CRD_o1_v02 | pixel SIT | DC | crystal | RPC | developing | | ------------- | -----------------------------|-------------|---------|------|----------------| ## Details -### CRD_o1_v01 (first preliminary import, to update) +### CRD_o1_v01 (to update) - coil inside CRD model - BeamPipe - with center pipe + crotch link to doubly-pipe @@ -29,12 +30,23 @@ The following CRD detector models are available in CEPCSW - Ecal - with crystal - Detector/DetCRD/src/Calorimeter/CRDEcal.cpp - - Hcal (TODO) - - with scintillator **and** RPC readout + - Endcap (TODO) + - Hcal + - with RPC readout - creates two sets of hit collections - - Coil (TODO) - - Yoke (TODO) + - Coil + - CEPC_v4 like + - Yoke + - CEPC_v4 like - compact files: - [./CRD_o1_v01/CRD_o1_v01.xml](./CRD_o1_v01/CRD_o1_v01.xml) - +### CRD_o1_v02 (to update) + - based on CRD_o1_v01 + - SIT: strip -> pixel + - SIT12->SIT1: r = 152.90 -> 140.00 mm (pixel SIT1) + - SIT34->SIT2: between DCs -> 225.00 mm (pixel SIT2) + - SET12: outside DC -> between DCs + - SET34: outside DC (added) + - compact files: + - [./CRD_o1_v02/CRD_o1_v02.xml](./CRD_o1_v02/CRD_o1_v02.xml) diff --git a/Detector/DetInterface/include/DetInterface/IGeomSvc.h b/Detector/DetInterface/include/DetInterface/IGeomSvc.h index 7fe1255dd64c0fb24fd543e66b5079f41de15859..d4f508b99779f44e6b30811f4296ac722d8cf9c8 100644 --- a/Detector/DetInterface/include/DetInterface/IGeomSvc.h +++ b/Detector/DetInterface/include/DetInterface/IGeomSvc.h @@ -56,7 +56,7 @@ public: virtual const dd4hep::rec::ConicalSupportData* getBeamPipeData() =0; virtual const std::map<std::string,double>& getDetParameters(std::string s) = 0; - virtual const double getDetParameter(std::string set_name, std::string par_name) = 0; + virtual double getDetParameter(std::string set_name, std::string par_name) = 0; virtual TMaterial* getMaterial(std::string s) = 0; virtual ~IGeomSvc() {} diff --git a/Detector/GeomSvc/src/GeomSvc.cpp b/Detector/GeomSvc/src/GeomSvc.cpp index 050431b8a5359493e9c6e57413f70576a93cd0b7..878d60c81a117965f49b8139212b644f3cde95ba 100644 --- a/Detector/GeomSvc/src/GeomSvc.cpp +++ b/Detector/GeomSvc/src/GeomSvc.cpp @@ -130,7 +130,7 @@ const std::map<std::string,double>& GeomSvc::getDetParameters(std::string name){ } } -const double GeomSvc::getDetParameter(std::string set_name, std::string par_name){ +double GeomSvc::getDetParameter(std::string set_name, std::string par_name){ std::map<std::string, std::map<std::string,double> >::iterator it=m_detParameters.find(set_name); if(it!=m_detParameters.end()){ if(it->second.find(par_name)!=it->second.end()) return it->second[par_name]; diff --git a/Detector/GeomSvc/src/GeomSvc.h b/Detector/GeomSvc/src/GeomSvc.h index 20d559a790c47c5f928d8db4a094f97b8cbeded7..379d5b08e4e995a98ebfb49031967d56a6d0c69b 100644 --- a/Detector/GeomSvc/src/GeomSvc.h +++ b/Detector/GeomSvc/src/GeomSvc.h @@ -40,7 +40,7 @@ class GeomSvc: public extends<Service, IGeomSvc> { const dd4hep::rec::ConicalSupportData* getBeamPipeData() override {return m_beamPipeData;}; const std::map<std::string,double>& getDetParameters(std::string name) override; - const double getDetParameter(std::string set_name, std::string par_name) override; + double getDetParameter(std::string set_name, std::string par_name) override; TMaterial* getMaterial(std::string name); private: diff --git a/Detector/Identifier/CMakeLists.txt b/Detector/Identifier/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b2ededab37a089078e47a6e22c7e9bedc711b60b --- /dev/null +++ b/Detector/Identifier/CMakeLists.txt @@ -0,0 +1,11 @@ +################################################################################ +# Package: Identifier +################################################################################ + +gaudi_add_header_only_library(Identifier) + +install(TARGETS Identifier + EXPORT CEPCSWTargets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib + COMPONENT dev) diff --git a/Detector/Identifier/include/Identifier/CEPCConf.h b/Detector/Identifier/include/Identifier/CEPCConf.h new file mode 100644 index 0000000000000000000000000000000000000000..2dceac7e12193b6aebdbe1f3fbc746dcd5db7093 --- /dev/null +++ b/Detector/Identifier/include/Identifier/CEPCConf.h @@ -0,0 +1,49 @@ +/* CEPC conference description ID */ +#ifndef CEPCConf_H +#define CEPCConf_H + +#include <string> + +namespace CEPCConf{ + struct DetID{ // compatible for old codes from Marlin, will convert from compact file, default initial values here + static const int NOTUSED = 0; + static const int VXD = 1; + static const int SIT = 2; + static const int FTD = 3; + static const int TPC = 4; + static const int SET = 5; + static const int ETD = 6; + static const int DC = 7; + + static const int ECAL = 20; + static const int ECAL_PLUG = 21; + static const int HCAL = 22; + static const int HCAL_RING = 23; + static const int LCAL = 24; + static const int BCAL = 25; + static const int LHCAL = 26; + static const int YOKE = 27; + static const int COIL = 28; + static const int ECAL_ENDCAP = 29; + static const int HCAL_ENDCAP = 30; + static const int YOKE_ENDCAP = 31; + + static const int bwd = -1; + static const int barrel = 0; + static const int fwd = +1; + }; + + struct TrkHitTypeBit{ + static const int ONE_DIMENSIONAL = 29; + static const int COMPOSITE_SPACEPOINT = 30; + static const int PLANAR = 3; // 3 is compatible with old tracking codes, 31 or 28 is better in future to modify uniformly + }; + + struct TrkHitQualityBit{ + static const int USED_IN_FIT = 30; + static const int USED_IN_TRACK = 29; + static const int DOUBLE_HIT_CANDIDATE = 28; + static const int GOOD = 27; + }; +} +#endif diff --git a/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp b/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp index 50c742297b177932097ec179d12b07ff37043062..a38826b9d85301ed9e5990145e7a21f9b47b9ef8 100644 --- a/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp +++ b/Digitisers/G2CDArbor/src/G2CDArborAlg.cpp @@ -494,8 +494,8 @@ StatusCode G2CDArborAlg::execute() // get the DD4hep readout m_decoder = m_geosvc->getDecoder(tmp_readout); if (!m_decoder) { - error() << "Failed to get the decoder. " << endmsg; - return StatusCode::FAILURE; + error() << "Failed to get the decoder. Skip this collection:"<<m_ecalColNames.value().at(k0)<< endmsg; + continue; } } @@ -618,7 +618,7 @@ StatusCode G2CDArborAlg::execute() for(auto SimHcalhit: *Hcalcol){ // SimCalorimeterHit * SimHcalhit = dynamic_cast<SimCalorimeterHit*>( Hcalcol->getElementAt( k4 ) ) ; - cout<<"hcal"<<endl; + //cout<<"hcal"<<endl; currTime = 0; EmaxStep = 0; HitStepEn = 0; diff --git a/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp b/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp index 4a1eda3b4ac450b5ea90653ce102b8036acfc9a0..cdbcbfe22f8fb5288b23fe9ff20626087639e58c 100644 --- a/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp +++ b/Digitisers/SimHitMerge/src/SimHitMergeAlg.cpp @@ -6,6 +6,7 @@ #include "DD4hep/Detector.h" #include "DD4hep/IDDescriptor.h" #include "DD4hep/Plugins.h" +#include "DD4hep/DD4hepUnits.h" #include <string> #include <iostream> @@ -56,10 +57,11 @@ StatusCode SimHitMergeAlg::initialize() { StatusCode SimHitMergeAlg::execute() { - + for (unsigned int k0 = 0; k0 < m_inputColNames.size(); k0++) { std::map<unsigned long long, edm4hep::SimCalorimeterHit> id_hit_map; + std::map<unsigned long long, std::vector<edm4hep::SimCalorimeterHit> > test_id_hits_map; std::map<unsigned long long, std::vector<edm4hep::ConstCaloHitContribution> > id_vconb_map; edm4hep::SimCalorimeterHitCollection* mergedCol = m_OutputCollections[k0]->createAndPut(); auto col = m_InputCollections[k0]->get(); @@ -67,6 +69,7 @@ StatusCode SimHitMergeAlg::execute() for (auto Simhit: *col){ auto id = Simhit.getCellID(); if(Simhit.getEnergy() <=0 ) continue; + //std::cout<<"DD_sim_hit::ProcessHits, sp x="<<Simhit.getPosition()[0]<<", y="<<Simhit.getPosition()[1]<<", z="<<Simhit.getPosition()[2]<<",edep="<<Simhit.getEnergy()<<std::endl; if ( id_hit_map.find(id) != id_hit_map.end()) id_hit_map[id].setEnergy(id_hit_map[id].getEnergy() + Simhit.getEnergy()); else id_hit_map[id] = Simhit; std::vector<edm4hep::ConstCaloHitContribution> tmp_vconb ; @@ -81,13 +84,37 @@ StatusCode SimHitMergeAlg::execute() } else id_vconb_map[id] = tmp_vconb; + if(m_sanity_check){ + test_id_hits_map[id].push_back(Simhit); + } + + } + + if(m_sanity_check){ + for(std::map<unsigned long long, std::vector<edm4hep::SimCalorimeterHit> >::iterator iter = test_id_hits_map.begin(); iter != test_id_hits_map.end(); iter++){ + for(unsigned int i=0; i< iter->second.size(); i++){ + float pos1_x = iter->second.at(i).getPosition()[0]; + float pos1_y = iter->second.at(i).getPosition()[1]; + float pos1_z = iter->second.at(i).getPosition()[2]; + for(unsigned int j=i+1; j< iter->second.size(); j++){ + float pos2_x = iter->second.at(j).getPosition()[0]; + float pos2_y = iter->second.at(j).getPosition()[1]; + float pos2_z = iter->second.at(j).getPosition()[2]; + float dis = sqrt( (pos1_x-pos2_x)*(pos1_x-pos2_x) + (pos1_y-pos2_y)*(pos1_y-pos2_y) + (pos1_z-pos2_z)*(pos1_z-pos2_z) ); + if( dis > sqrt(m_cell_x*m_cell_x + m_cell_y*m_cell_y + m_cell_z*m_cell_z) ){ + std::cout<<"found id="<<iter->first<<",dis="<<dis<<",x1="<<pos1_x<<",y1="<<pos1_y<<",z1="<<pos1_z<<",x2="<<pos2_x<<",y2="<<pos2_y<<",z2="<<pos2_z<<std::endl; + } + } + } + } } - + + for(std::map<unsigned long long, edm4hep::SimCalorimeterHit>::iterator iter = id_hit_map.begin(); iter != id_hit_map.end(); iter++) { edm4hep::SimCalorimeterHit Simhit = iter->second ; dd4hep::Position position = m_cellIDConverter->position(Simhit.getCellID());//cm - edm4hep::Vector3f hitPos(position.x()*10, position.y()*10, position.z()*10);//to mm + edm4hep::Vector3f hitPos(position.x()/(dd4hep::mm), position.y()/(dd4hep::mm), position.z()/(dd4hep::mm));//to mm //std::cout<<"id="<<Simhit.getCellID()<<",hitPos.x="<<hitPos[0]<<",y="<<hitPos[1]<<",z="<<hitPos[2]<<",ori x="<<Simhit.getPosition()[0]<<",y="<<Simhit.getPosition()[1]<<",z="<<Simhit.getPosition()[2]<<std::endl; auto Mergedhit = mergedCol->create(); Mergedhit.setCellID (Simhit.getCellID()); diff --git a/Digitisers/SimHitMerge/src/SimHitMergeAlg.h b/Digitisers/SimHitMerge/src/SimHitMergeAlg.h index d91de40f0a111a99d9c0ca36f2e9177703e8ff96..04b74aa08f60a7d3841676bfbf6e8ed68b6023a1 100644 --- a/Digitisers/SimHitMerge/src/SimHitMergeAlg.h +++ b/Digitisers/SimHitMerge/src/SimHitMergeAlg.h @@ -44,6 +44,10 @@ protected: Gaudi::Property<std::vector<std::string>> m_outputColNames{this, "OutputCollections", {"ECALBarrel", "ECALEndcap", "ECALOther"}, "Name of merged Hit Collections"}; std::vector<SimCaloType*> m_InputCollections; std::vector<SimCaloType*> m_OutputCollections; + Gaudi::Property< bool > m_sanity_check{this, "sanity_check", false, "sanity check"}; + Gaudi::Property< float > m_cell_x{this, "cell_x", 10, ""};//mm + Gaudi::Property< float > m_cell_y{this, "cell_y", 10, ""};//mm + Gaudi::Property< float > m_cell_z{this, "cell_z", 10, ""};//mm SmartIF<IGeomSvc> m_geosvc; dd4hep::Detector* m_dd4hep_geo; diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp index 482082a064e982a0452b93e4a945b5e2d35d13f7..4a5b1f311a48586f0388d67ed9d5d956ab1b0fdc 100644 --- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp +++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp @@ -1,5 +1,6 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ #include "PlanarDigiAlg.h" +#include "DataHelper/TrackerHitHelper.h" #include "GearSvc/IGearSvc.h" #include "EventSeeder/IEventSeeder.h" #include "TrackSystemSvc/ITrackSystemSvc.h" @@ -16,7 +17,7 @@ #include "UTIL/CellIDEncoder.h" #include <UTIL/Operators.h> */ - +#include "Identifier/CEPCConf.h" #include "UTIL/ILDConf.h" // STUFF needed for GEAR @@ -174,7 +175,7 @@ StatusCode PlanarDigiAlg::execute() int module = encoder[lcio::ILDCellID0::module]; int sensor = encoder[lcio::ILDCellID0::sensor]; - debug() << "Hit = "<< i << " has celId " << celId << endmsg; + debug() << "Hit = " << i << " has celId " << celId << endmsg; debug() << "side = " << side << endmsg; debug() << "layerNumber = " << layer << endmsg; debug() << "moduleNumber = " << module << endmsg; @@ -307,15 +308,16 @@ StatusCode PlanarDigiAlg::execute() debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1] << " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1] << endmsg ; - // fucd - std::array<float, 6> cov; - cov[0] = u_direction[0]; - cov[1] = u_direction[1]; - cov[2] = resU; - cov[3] = v_direction[0]; - cov[4] = v_direction[1]; - cov[5] = resV; - trkHit.setCovMatrix(cov); + // fucd: next TODO: cov[0] = resU*reU, cov[2] = resV*resV, cov[5] = 0 + if(_usePlanarTag){ + std::array<float, 6> cov; + cov[0] = u_direction[0]; + cov[1] = u_direction[1]; + cov[2] = resU; + cov[3] = v_direction[0]; + cov[4] = v_direction[1]; + cov[5] = resV; + trkHit.setCovMatrix(cov); /* zoujh: TODO - generate TrackerHitPlane with podio trkHit->setU( u_direction ) ; trkHit->setV( v_direction ) ; @@ -325,11 +327,17 @@ StatusCode PlanarDigiAlg::execute() if( _isStrip ) trkHit->setdV( 0 ); // no error in v direction for strip hits as there is no meesurement information in v direction else trkHit->setdV( resV ) ; */ - trkHit.setType(8); - if( _isStrip || (resU!=0&&resV==0) ){ - trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ; + std::bitset<32> type; + type.set(CEPCConf::TrkHitTypeBit::PLANAR); + trkHit.setType((int)type.to_ulong()); + } + else{ + trkHit.setCovMatrix(CEPC::ConvertToCovXYZ(resU, u_direction[0], u_direction[1], resV, v_direction[0], v_direction[1])); } + if( _isStrip || (resU!=0&&resV==0) ){ + trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ; + } trkHit.setEDep( SimTHit.getEDep() ); // make the relation diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h index 668333f29db62fadc13ed8619c212ef0c2ab9d0c..10ddd9dd4bc3216348518ea0df14ebe9cb000684 100644 --- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h +++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h @@ -79,6 +79,9 @@ protected: Gaudi::Property<FloatVec> _resV{ this, "ResolutionV", {0.0040} }; // whether hits are 1D strip hits Gaudi::Property<bool> _isStrip{ this, "IsStrip", false }; + // whether use Planar tag for type and cov, if true, CEPCConf::TrkHitTypeBit::PLANAR bit is set as true + // cov[0]=thetaU, cov[1]=phiU, cov[2]=resU, cov[0]=thetaV, cov[1]=phiV, cov[2]=resV + Gaudi::Property<bool> _usePlanarTag{ this, "UsePlanarTag", true }; // Input collections DataHandle<edm4hep::EventHeaderCollection> _headerCol{"EventHeaderCol", Gaudi::DataHandle::Reader, this}; diff --git a/Examples/options/tut_analysis_TotalInvMass.py b/Examples/options/tut_analysis_TotalInvMass.py index eb7faebb30a6907790371ff4677735c2ece03b11..3698df526fc1d638dc50ab2e42672e31424a59a3 100644 --- a/Examples/options/tut_analysis_TotalInvMass.py +++ b/Examples/options/tut_analysis_TotalInvMass.py @@ -6,8 +6,8 @@ from Configurables import k4DataSvc dsvc = k4DataSvc("EventDataSvc") # read LCIO files -from Configurables import k4LCIOInput -lcioinput = k4LCIOInput("k4LCIOInput") +from Configurables import LCIOInput +lcioinput = LCIOInput("LCIOInput") import glob diff --git a/Examples/options/tut_detsim.py b/Examples/options/tut_detsim.py index 27622a1671527fe2cc78e2844aee201fc47104b8..ededb9965cfeb4b78a928de4633b20d8952f8bbd 100644 --- a/Examples/options/tut_detsim.py +++ b/Examples/options/tut_detsim.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import os -print(os.environ["DD4HEP_LIBRARY_PATH"]) import sys # sys.exit(0) @@ -12,13 +11,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -100,6 +101,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed # detsimalg.VisMacs = ["vis.mac"] @@ -133,5 +135,5 @@ from Configurables import ApplicationMgr ApplicationMgr( TopAlg = [genalg, detsimalg, out], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], ) diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py index d040cbd404134e03eda3f52604e6dcf3eb3b0e0b..268e317b2a206775ceea32e72b8bd566143b5cd2 100644 --- a/Examples/options/tut_detsim_SDT.py +++ b/Examples/options/tut_detsim_SDT.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import os -print(os.environ["DD4HEP_LIBRARY_PATH"]) import sys # sys.exit(0) @@ -12,13 +11,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -110,6 +111,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed if int(os.environ.get("VIS", 0)): detsimalg.VisMacs = ["vis.mac"] @@ -173,5 +175,5 @@ from Configurables import ApplicationMgr ApplicationMgr( TopAlg = [genalg, detsimalg, out], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], ) diff --git a/Examples/options/tut_detsim_digi_SDT.py b/Examples/options/tut_detsim_digi_SDT.py index df2f7672f93691a0fb23521e8a589d13d582f770..1dfd75ec1872c0300903afe6d1cdf5fd30318445 100644 --- a/Examples/options/tut_detsim_digi_SDT.py +++ b/Examples/options/tut_detsim_digi_SDT.py @@ -12,13 +12,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed if int(os.environ.get("VIS", 0)): detsimalg.VisMacs = ["vis.mac"] @@ -183,7 +186,7 @@ from Configurables import ApplicationMgr ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, out], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], HistogramPersistency = "ROOT", OutputLevel=INFO ) diff --git a/Examples/options/tut_detsim_digi_fit_DC.py b/Examples/options/tut_detsim_digi_fit_DC.py index 770bf4267256f540decd991517a4afb37634e57d..aec8695f5714de62ab4413f5ef9fc90d397dde7e 100644 --- a/Examples/options/tut_detsim_digi_fit_DC.py +++ b/Examples/options/tut_detsim_digi_fit_DC.py @@ -12,13 +12,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed if int(os.environ.get("VIS", 0)): detsimalg.VisMacs = ["vis.mac"] @@ -193,7 +196,7 @@ ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg, recGenfitAlgDC,out], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc, ntsvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, ntsvc], HistogramPersistency = "ROOT", OutputLevel=ERROR ) diff --git a/Examples/options/tut_detsim_digi_truthTracker_SDT.py b/Examples/options/tut_detsim_digi_truthTracker_SDT.py index a5fd439aa790627b439c51e0146b233b5069399a..cbef316570dd61d203d7dfc4885eb5be2af070f0 100644 --- a/Examples/options/tut_detsim_digi_truthTracker_SDT.py +++ b/Examples/options/tut_detsim_digi_truthTracker_SDT.py @@ -12,13 +12,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -112,6 +114,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed if int(os.environ.get("VIS", 0)): detsimalg.VisMacs = ["vis.mac"] @@ -176,7 +179,7 @@ dCHDigiAlg.WriteAna = True from Configurables import TruthTrackerAlg truthTrackerAlg = TruthTrackerAlg("TruthTrackerAlg") truthTrackerAlg.DCHitAssociationCollection="DCHAssociationCollectio" -truthTrackerAlg.debug = 1 +# truthTrackerAlg.debug = 1 ############################################################################## # POD I/O @@ -194,7 +197,7 @@ from Configurables import ApplicationMgr ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg, out], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], HistogramPersistency = "ROOT", OutputLevel=INFO ) diff --git a/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py b/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py index 892572df60aac3d093d145135c7872e4506e9409..84bf326d6d3a887ca7515f6dc3a4cd61e3b65964 100644 --- a/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py +++ b/Examples/options/tut_detsim_digi_truthTracker_SDT_dedx.py @@ -12,13 +12,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed -# rndmgensvc = RndmGenSvc("RndmGenSvc") -# rndmgensvc.Engine = rndmengine.name() +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## @@ -113,6 +115,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed #detsimalg.RunMacs = ["Examples/options/noDecay.mac"] #detsimalg.RunCmds = ["Examples/options/noDecay.mac"] @@ -216,7 +219,7 @@ from Configurables import ApplicationMgr ApplicationMgr( TopAlg = [genalg, detsimalg, dCHDigiAlg, truthTrackerAlg, dedxAlg], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc], HistogramPersistency = "ROOT", OutputLevel=INFO ) diff --git a/Examples/options/tut_detsim_pan_matrix.py b/Examples/options/tut_detsim_pan_matrix.py index ccc5b3e1cc277f535e3b566181f24f5067d2ada0..7340454f1055e011ad561f40be130acba0acc4f6 100644 --- a/Examples/options/tut_detsim_pan_matrix.py +++ b/Examples/options/tut_detsim_pan_matrix.py @@ -11,9 +11,14 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +seed = [42] + +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed + +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## # Event Data Svc @@ -87,7 +92,9 @@ from Configurables import DetSimSvc detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") -detsimalg.VisMacs = ["Examples/options/vis.mac"] +detsimalg.RandomSeeds = seed + +# detsimalg.VisMacs = ["Examples/options/vis.mac"] detsimalg.RunCmds = [ # "/tracking/verbose 1", ] @@ -173,6 +180,6 @@ ApplicationMgr( #TopAlg = [genalg, detsimalg, example_CaloDigiAlg, pandoralg], EvtSel = 'NONE', EvtMax = 50, - ExtSvc = [rndmengine, dsvc, geosvc, gearSvc,detsimsvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, gearSvc,detsimsvc], OutputLevel=INFO ) diff --git a/Examples/options/tut_detsim_pandora.py b/Examples/options/tut_detsim_pandora.py index 2768ea499d7259f85fdf03099d593c82e81ed895..d6be9779536ca104ede45df6114aece9411b5625 100644 --- a/Examples/options/tut_detsim_pandora.py +++ b/Examples/options/tut_detsim_pandora.py @@ -11,10 +11,15 @@ from Gaudi.Configuration import * ############################################################################## from Configurables import RndmGenSvc, HepRndm__Engine_CLHEP__RanluxEngine_ +seed = [42] + # rndmengine = HepRndm__Engine_CLHEP__RanluxEngine_() # The default engine in Gaudi -rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_() # The default engine in Geant4 +rndmengine = HepRndm__Engine_CLHEP__HepJamesRandom_("RndmGenSvc.Engine") # The default engine in Geant4 rndmengine.SetSingleton = True -rndmengine.Seeds = [42] +rndmengine.Seeds = seed + +rndmgensvc = RndmGenSvc("RndmGenSvc") +rndmgensvc.Engine = rndmengine.name() ############################################################################## # Event Data Svc @@ -90,6 +95,7 @@ detsimsvc = DetSimSvc("DetSimSvc") from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") +detsimalg.RandomSeeds = seed # detsimalg.VisMacs = ["vis.mac"] @@ -217,7 +223,7 @@ ApplicationMgr( TopAlg = [genalg, detsimalg, simHitMerge, caloDigi, pandoralg, write], EvtSel = 'NONE', EvtMax = 10, - ExtSvc = [rndmengine, dsvc, geosvc, gearSvc,detsimsvc], + ExtSvc = [rndmengine, rndmgensvc, dsvc, geosvc, gearSvc,detsimsvc], HistogramPersistency = "ROOT", OutputLevel=INFO ) diff --git a/Generator/src/GenEvent.cpp b/Generator/src/GenEvent.cpp index 3e40c65b8476c83a48e98fc4b596e60d15bcab5f..8d8c254253f641fa3a54be063a1a39e210117179 100644 --- a/Generator/src/GenEvent.cpp +++ b/Generator/src/GenEvent.cpp @@ -1,7 +1,7 @@ #include "GenEvent.h" #include "edm4hep/MCParticleCollection.h"//plico -using namespace std; +// using namespace std; namespace MyHepMC{ @@ -17,7 +17,7 @@ GenEvent::GenEvent(edm4hep::MCParticleCollection& mcCol) } GenEvent::~GenEvent(){} -void GenEvent::SetEventHeader(long event_id_, long run_id_, float time_, string det_name_){ +void GenEvent::SetEventHeader(long event_id_, long run_id_, float time_, const std::string& det_name_){ m_event_id = event_id_; m_run_id = run_id_; m_time = time_; @@ -28,8 +28,9 @@ void GenEvent::SetMCCollection(edm4hep::MCParticleCollection vec_){ m_mc_vec = vec_; } */ -edm4hep::MCParticleCollection GenEvent::getMCVec(){ -return m_mc_vec; + +edm4hep::MCParticleCollection& GenEvent::getMCVec(){ + return m_mc_vec; } long GenEvent::getID(){ diff --git a/Generator/src/GenEvent.h b/Generator/src/GenEvent.h index 72895413a5d06438fcffe72495ef56b646921c5c..fd1dbe557e0afac14a3397c53c3978b2c66d7a55 100644 --- a/Generator/src/GenEvent.h +++ b/Generator/src/GenEvent.h @@ -10,17 +10,18 @@ class GenEvent{ //GenEvent(); GenEvent(edm4hep::MCParticleCollection& mcCol); ~GenEvent(); - void SetEventHeader(long event_id_, long run_id_, float time_, std::string det_name_); + void SetEventHeader(long event_id_, long run_id_, float time_, const std::string& det_name_); //void SetMCCollection(edm4hep::MCParticleCollection vec_); long getID(); long getRun(); long getTime(); void ReSet(); std::string getName(); - edm4hep::MCParticleCollection getMCVec(); + edm4hep::MCParticleCollection& getMCVec(); edm4hep::MCParticleCollection& m_mc_vec; //edm4hep::MCParticleCollection m_mc_vec; private: + long m_event_id; long m_run_id; float m_time; diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h index 442a356b05b90fe2dbf8999159e08aa6fac7872a..7a7620155704acc69cabb7f33ddc28b3c382fb77 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h +++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/GeometryCreator.h @@ -97,6 +97,7 @@ private: * @param subDetectorNameMap the sub detector name map (for smaller sub detectors, identified uniquely only by name) */ void SetAdditionalSubDetectorParameters(SubDetectorNameMap &subDetectorNameMap) const; + void SetAdditionalSubDetectorParametersDD(SubDetectorNameMap &subDetectorNameMap) const; /** * @brief Set sub detector parameters to their gear default values diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h index a74b8a77297e8facbbf6aee29c6916d35c0497c8..6a7a1bacfe9a26b462c645215dcc63370707d35a 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h +++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/PandoraPFAlg.h @@ -279,6 +279,8 @@ protected: NTuple::Array<float> m_mc_charge; + Gaudi::Property<int> m_max_mc {this, "max_mc", 1000,""}; + Gaudi::Property<int> m_max_rec {this, "max_rec", 1000,""}; Gaudi::Property<bool> m_debug {this, "debug", false,"if do debug"}; diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h b/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h index ed30bf2f653d59b6cbff735caafc451943bc293d..aa70ea794f68a872745eb4caada0a8482b4fbefe 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h +++ b/Reconstruction/PFA/Pandora/GaudiPandora/include/Utility.h @@ -9,7 +9,7 @@ #include "DD4hep/DetectorSelector.h" namespace PanUtil{ std::string Convert (float number); - dd4hep::rec::LayeredCalorimeterData * getExtension(unsigned int includeFlag, unsigned int excludeFlag) ; + dd4hep::rec::LayeredCalorimeterData * getExtension(unsigned int includeFlag, unsigned int excludeFlag=0) ; void line_a_b(float x1, float y1, float x2, float y2, float& a, float& b); float getPhi(float x, float y); int partition(float x, float y); diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp index 7e0836c9330ad81423000b6c6beebd22ee2cb1cd..e3bd6e3c3e9812a2fe75637c9ca3a0782c7b3933 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/CaloHitCreator.cpp @@ -54,45 +54,155 @@ CaloHitCreator::CaloHitCreator(const Settings &settings, const pandora::Pandora if (!sc) throw "Failed to find GeomSvc."; } if(m_settings.m_use_dd4hep_geo){ - const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), - ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); - m_eCalBarrelOuterZ = eCalBarrelExtension->extent[3]/dd4hep::mm; - m_eCalBarrelInnerPhi0 = eCalBarrelExtension->inner_phi0/dd4hep::rad; - m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry; + const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); + if(eCalBarrelExtension){ + m_eCalBarrelOuterZ = eCalBarrelExtension->extent[3]/dd4hep::mm; + m_eCalBarrelInnerPhi0 = eCalBarrelExtension->inner_phi0/dd4hep::rad; + m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry; + } + else{ + /* + std::cout<<"CaloHitCreator:WARNING, Can't get ECAL geo info from dd4hep, set it to dummy value. "<<std::endl; + m_eCalBarrelOuterZ = 2400; + m_eCalBarrelInnerPhi0 = 0; + m_eCalBarrelInnerSymmetry = 8; + */ + std::cout<<"CaloHitCreator:WARNING, Can't get ECAL geo info from dd4hep, get it from Gear. "<<std::endl; + m_eCalBarrelOuterZ = (_GEAR->getEcalBarrelParameters().getExtent()[3]); + m_eCalBarrelInnerPhi0 = (_GEAR->getEcalBarrelParameters().getPhi0()); + m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder()); + } + //Get HCal Barrel extension by type, ignore plugs and rings + const dd4hep::rec::LayeredCalorimeterData * hCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); + //Get HCal Endcap extension by type, ignore plugs and rings + const dd4hep::rec::LayeredCalorimeterData * hCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); + if(hCalBarrelExtension){ + m_hCalBarrelOuterZ = hCalBarrelExtension->extent[3]/dd4hep::mm; + m_hCalBarrelInnerPhi0 = hCalBarrelExtension->inner_phi0/dd4hep::rad; + m_hCalBarrelInnerSymmetry = hCalBarrelExtension->inner_symmetry; + m_hCalBarrelOuterR = hCalBarrelExtension->extent[1]/dd4hep::mm; + m_hCalBarrelOuterPhi0 = hCalBarrelExtension->outer_phi0/dd4hep::rad; + m_hCalBarrelOuterSymmetry = hCalBarrelExtension->outer_symmetry; + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& barrelLayers= hCalBarrelExtension->layers; + //Take thicknesses from last layer (was like that before with gear) + m_hCalBarrelLayerThickness =(barrelLayers.back().inner_thickness+barrelLayers.back().outer_thickness)/dd4hep::mm; + } + else{ + /* + std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Barrel geo info from dd4hep, set it to dummy value. "<<std::endl; + m_hCalBarrelOuterZ = 0; + m_hCalBarrelInnerPhi0 = 0; + m_hCalBarrelInnerSymmetry = 0; + m_hCalBarrelOuterR = 0; + m_hCalBarrelOuterPhi0 = 0; + m_hCalBarrelOuterSymmetry = 0; + m_hCalBarrelLayerThickness = 1; + */ + std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Barrel geo info from dd4hep, get it from Gear"<<std::endl; + m_hCalBarrelOuterZ = (_GEAR->getHcalBarrelParameters().getExtent()[3]); + m_hCalBarrelInnerPhi0 = (_GEAR->getHcalBarrelParameters().getPhi0()); + m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder()); + m_hCalBarrelOuterR = (_GEAR->getHcalBarrelParameters().getExtent()[1]); + m_hCalBarrelOuterPhi0 = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), + _GEAR->getHcalBarrelParameters().getIntKeys().end(), + "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? + _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0") + : 0)); + m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), + _GEAR->getHcalBarrelParameters().getIntKeys().end(), + "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? + _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order") + : 0)); + const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); + m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1); + } + if(hCalEndcapExtension){ + m_hCalEndCapOuterR = hCalEndcapExtension->extent[1]/dd4hep::mm; + m_hCalEndCapOuterZ = hCalEndcapExtension->extent[3]/dd4hep::mm; + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& endcapLayers= hCalEndcapExtension->layers; + //Take thicknesses from last layer (was like that before with gear) + m_hCalEndCapLayerThickness =(endcapLayers.back().inner_thickness+endcapLayers.back().outer_thickness)/dd4hep::mm; + } + else{ + /* + std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Endcap geo info from dd4hep, set it to dummy value. "<<std::endl; + m_hCalEndCapOuterR = 0; + m_hCalEndCapOuterZ = 0; + m_hCalEndCapLayerThickness = 1; + */ + std::cout<<"CaloHitCreator:WARNING, Can't get HCAL Endcap geo info from dd4hep, get it from Gear. "<<std::endl; + m_hCalEndCapOuterR = (_GEAR->getHcalEndcapParameters().getExtent()[1]); + m_hCalEndCapOuterZ = (_GEAR->getHcalEndcapParameters().getExtent()[3]); + const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout()); + m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1); + + } + //Get Muon Barrel extension by type, ignore plugs and rings + const dd4hep::rec::LayeredCalorimeterData * muonBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); + //fg: muon endcap is not used : + //Get Muon Endcap extension by type, ignore plugs and rings + // const dd4hep::rec::LayeredCalorimeterData * muonEndcapExtension= getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY ) ); + if(muonBarrelExtension){ + m_muonBarrelOuterZ = muonBarrelExtension->extent[3]/dd4hep::mm; + m_muonBarrelInnerPhi0 = muonBarrelExtension->inner_phi0/dd4hep::rad; + m_muonBarrelInnerSymmetry = muonBarrelExtension->inner_symmetry; + } + else{ + /* + std::cout<<"CaloHitCreator:WARNING, Can't get Muon Barrel geo info from dd4hep, set it to dummy value. "<<std::endl; + m_muonBarrelOuterZ = 0; + m_muonBarrelInnerPhi0 = 0; + m_muonBarrelInnerSymmetry = 0; + */ + std::cout<<"CaloHitCreator:WARNING, Can't get Muon Barrel geo info from dd4hep, get it from Gear. "<<std::endl; + m_muonBarrelInnerPhi0 = (_GEAR->getYokeBarrelParameters().getPhi0()); + m_muonBarrelOuterZ = (_GEAR->getYokeBarrelParameters().getExtent()[3]); + m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder()); + } + //Get COIL extension + const dd4hep::rec::LayeredCalorimeterData * coilExtension= PanUtil::getExtension( ( dd4hep::DetType::COIL ) ); + if(coilExtension){ + m_coilOuterR = coilExtension->extent[1]/dd4hep::mm; + } + else{ + /* + std::cout<<"CaloHitCreator:WARNING, Can't get Coil geo info from dd4hep, set it to dummy value. "<<std::endl; + m_coilOuterR = 0; + */ + std::cout<<"CaloHitCreator:WARNING, Can't get Coil geo info from dd4hep, get it from Gear. "<<std::endl; + m_coilOuterR = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius")); + } } else{ m_eCalBarrelOuterZ = (_GEAR->getEcalBarrelParameters().getExtent()[3]); m_eCalBarrelInnerPhi0 = (_GEAR->getEcalBarrelParameters().getPhi0()); m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder()); + m_hCalBarrelOuterZ = (_GEAR->getHcalBarrelParameters().getExtent()[3]); + m_hCalBarrelInnerPhi0 = (_GEAR->getHcalBarrelParameters().getPhi0()); + m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder()); + m_hCalBarrelOuterR = (_GEAR->getHcalBarrelParameters().getExtent()[1]); + m_hCalBarrelOuterPhi0 = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), + _GEAR->getHcalBarrelParameters().getIntKeys().end(), + "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? + _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0") + : 0)); + m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), + _GEAR->getHcalBarrelParameters().getIntKeys().end(), + "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? + _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order") + : 0)); + const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); + m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1); + m_hCalEndCapOuterR = (_GEAR->getHcalEndcapParameters().getExtent()[1]); + m_hCalEndCapOuterZ = (_GEAR->getHcalEndcapParameters().getExtent()[3]); + const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout()); + m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1); + m_coilOuterR = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius")); + m_muonBarrelInnerPhi0 = (_GEAR->getYokeBarrelParameters().getPhi0()); + m_muonBarrelOuterZ = (_GEAR->getYokeBarrelParameters().getExtent()[3]); + m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder()); } - - m_hCalBarrelOuterZ = (_GEAR->getHcalBarrelParameters().getExtent()[3]); - m_muonBarrelOuterZ = (_GEAR->getYokeBarrelParameters().getExtent()[3]); - m_coilOuterR = (_GEAR->getGearParameters("CoilParameters").getDoubleVal("Coil_cryostat_outer_radius")); - m_hCalBarrelInnerPhi0 = (_GEAR->getHcalBarrelParameters().getPhi0()); - m_hCalBarrelInnerSymmetry = (_GEAR->getHcalBarrelParameters().getSymmetryOrder()); - m_muonBarrelInnerPhi0 = (_GEAR->getYokeBarrelParameters().getPhi0()); - m_muonBarrelInnerSymmetry = (_GEAR->getYokeBarrelParameters().getSymmetryOrder()); - m_hCalEndCapOuterR = (_GEAR->getHcalEndcapParameters().getExtent()[1]); - m_hCalEndCapOuterZ = (_GEAR->getHcalEndcapParameters().getExtent()[3]); - m_hCalBarrelOuterR = (_GEAR->getHcalBarrelParameters().getExtent()[1]); - m_hCalBarrelOuterPhi0 =((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), - _GEAR->getHcalBarrelParameters().getIntKeys().end(), - "Hcal_outer_polygon_phi0") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? - _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_phi0") - : 0)); - m_hCalBarrelOuterSymmetry = ((std::find(_GEAR->getHcalBarrelParameters().getIntKeys().begin(), - _GEAR->getHcalBarrelParameters().getIntKeys().end(), - "Hcal_outer_polygon_order") != _GEAR->getHcalBarrelParameters().getIntKeys().end() ? - _GEAR->getHcalBarrelParameters().getIntVal("Hcal_outer_polygon_order") - : 0)); - - - const gear::LayerLayout &hCalEndCapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout()); - const gear::LayerLayout &hCalBarrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); - m_hCalEndCapLayerThickness = hCalEndCapLayerLayout.getThickness(hCalEndCapLayerLayout.getNLayers() - 1); - m_hCalBarrelLayerThickness = hCalBarrelLayerLayout.getThickness(hCalBarrelLayerLayout.getNLayers() - 1); if ((m_hCalEndCapLayerThickness < std::numeric_limits<float>::epsilon()) || (m_hCalBarrelLayerThickness < std::numeric_limits<float>::epsilon())) throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER); @@ -126,7 +236,7 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col for (unsigned int k = 0; k < m_settings.m_eCalCaloHitCollections.size(); k++) { std::string tmp_col_name = m_settings.m_eCalCaloHitCollections.at(k); - if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<tmp_col_name<<std::endl; continue;} + if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;} try { if(m_settings.m_debug) std::cout<<"CaloHitCreator for "<<tmp_col_name<<std::endl; @@ -136,8 +246,6 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col if (0 == nElements) continue; - const gear::LayerLayout &endcapLayerLayout(_GEAR->getEcalEndcapParameters().getLayerLayout()); - const gear::LayerLayout &barrelLayerLayout(_GEAR->getEcalBarrelParameters().getLayerLayout()); ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str); const std::string layerCodingString(m_encoder_str); @@ -150,6 +258,18 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col m_decoder = m_geosvc->getDecoder(name_readout); if (!m_decoder) throw "Failed to get the decoder. "; } + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr; + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr; + const gear::LayerLayout* barrelLayerLayout=nullptr; + const gear::LayerLayout* endcapLayerLayout=nullptr; + if(m_settings.m_use_dd4hep_geo){ + barrelLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers); + endcapLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers); + } + else{ + barrelLayerLayout = &(_GEAR->getEcalBarrelParameters().getLayerLayout()); + endcapLayerLayout = &(_GEAR->getEcalEndcapParameters().getLayerLayout()); + } for (int i = 0; i < nElements; ++i) { @@ -214,27 +334,15 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col if (std::fabs(pCaloHit->getPosition()[2]) < m_eCalBarrelOuterZ) { - if(m_settings.m_use_dd4hep_geo){ - const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& barrelLayers= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers; - this->GetBarrelCaloHitProperties(pCaloHit, barrelLayers, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, - Stave, caloHitParameters, absorberCorrection); - } - else{ - this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, - Stave, caloHitParameters, absorberCorrection); - } - + if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection); + else this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_eCalBarrelInnerSymmetry, m_eCalBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection); caloHitParameters.m_hadronicEnergy = eCalToHadGeVBarrel * pCaloHit->getEnergy(); } else { - if(m_settings.m_use_dd4hep_geo){ - const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>& endcapLayers= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers; - this->GetEndCapCaloHitProperties(pCaloHit, endcapLayers, caloHitParameters, absorberCorrection); - } - else{ - this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection); - } + if(m_settings.m_use_dd4hep_geo) this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers, caloHitParameters, absorberCorrection); + + else this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection); caloHitParameters.m_hadronicEnergy = eCalToHadGeVEndCap * pCaloHit->getEnergy(); } @@ -280,25 +388,42 @@ pandora::StatusCode CaloHitCreator::CreateECalCaloHits(const CollectionMaps& col pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& collectionMaps) { - for (StringVector::const_iterator iter = m_settings.m_hCalCaloHitCollections.begin(), iterEnd = m_settings.m_hCalCaloHitCollections.end(); - iter != iterEnd; ++iter) + for (unsigned int k = 0; k < m_settings.m_hCalCaloHitCollections.size(); k++) { - if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;} + std::string tmp_col_name = m_settings.m_hCalCaloHitCollections.at(k); + if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) { if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;} try { - const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second; + const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(tmp_col_name))->second; const int nElements(pCaloHitCollection.size()); if (0 == nElements) continue; - const gear::LayerLayout &endcapLayerLayout(_GEAR->getHcalEndcapParameters().getLayerLayout()); - const gear::LayerLayout &barrelLayerLayout(_GEAR->getHcalBarrelParameters().getLayerLayout()); ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str); const std::string layerCodingString(m_encoder_str); const std::string layerCoding(this->GetLayerCoding(layerCodingString)); const std::string staveCoding(this->GetStaveCoding(layerCodingString)); + // get the DD4hep readout + const std::string name_readout = m_settings.m_hCalCaloReadOuts.at(k); + if(m_settings.m_debug) std::cout<<"readout= "<<name_readout<<std::endl; + if( m_settings.m_use_dd4hep_decoder ){ + m_decoder = m_geosvc->getDecoder(name_readout); + if (!m_decoder) throw "Failed to get the decoder. "; + } + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr; + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr; + const gear::LayerLayout* barrelLayerLayout=nullptr; + const gear::LayerLayout* endcapLayerLayout=nullptr; + if(m_settings.m_use_dd4hep_geo){ + barrelLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers); + endcapLayers= &(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )->layers); + } + else{ + barrelLayerLayout = &(_GEAR->getHcalBarrelParameters().getLayerLayout()); + endcapLayerLayout = &(_GEAR->getHcalEndcapParameters().getLayerLayout()); + } for (int i = 0; i < nElements; ++i) { @@ -313,20 +438,43 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col PandoraApi::CaloHit::Parameters caloHitParameters; caloHitParameters.m_hitType = pandora::HCAL; caloHitParameters.m_isDigital = false;// if it is DHCAL or AHCAL - caloHitParameters.m_layer = cellIdDecoder(pCaloHit)[layerCoding.c_str()]; + caloHitParameters.m_layer = m_settings.m_use_dd4hep_decoder == false ? cellIdDecoder(pCaloHit)[layerCoding.c_str()]+1 : m_decoder->get(pCaloHit->getCellID(), "layer");//from 1 to 40 + //std::cout<<"HCAL layer="<<caloHitParameters.m_layer.Get()<<std::endl; caloHitParameters.m_isInOuterSamplingLayer = (this->GetNLayersFromEdge(pCaloHit) <= m_settings.m_nOuterSamplingLayers); this->GetCommonCaloHitProperties(pCaloHit, caloHitParameters); + int Stave = 0 ; + if (m_settings.m_use_dd4hep_decoder == false){ + Stave = cellIdDecoder(pCaloHit)[ staveCoding]; + } + else{ + Stave = m_decoder->get(pCaloHit->getCellID(), "stave"); + Stave = Stave ==0 ? Stave+7 : Stave-1 ;//correct, same with LCIO + /* + 1 0 + **** **** + 2 * * 0 1 * * 7 + * * * * + 3* * 7 ---> 2* * 6 + * * * * + 4 * * 6 3 * * 5 + **** **** + 5 4 + + + */ + } float absorberCorrection(1.); if (std::fabs(pCaloHit->getPosition()[2]) < m_hCalBarrelOuterZ) { - this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0, - m_hCalBarrelInnerSymmetry - int(cellIdDecoder(pCaloHit)[ staveCoding] / 2), caloHitParameters, absorberCorrection); + if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0, m_hCalBarrelInnerSymmetry - int(Stave / 2), caloHitParameters, absorberCorrection); + else this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_hCalBarrelInnerSymmetry, m_hCalBarrelInnerPhi0, m_hCalBarrelInnerSymmetry - int(Stave / 2), caloHitParameters, absorberCorrection); } else { - this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection); + if(m_settings.m_use_dd4hep_geo) this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers, caloHitParameters, absorberCorrection); + else this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection); } //caloHitParameters.m_mipEquivalentEnergy = pCaloHit->getEnergy() * m_settings.m_hCalToMip * absorberCorrection; @@ -353,7 +501,7 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col } catch (...) { - std::cout << "Failed to extract hcal calo hit collection: " << *iter << std::endl; + std::cout << "Failed to extract hcal calo hit collection: " << tmp_col_name << std::endl; } } @@ -364,26 +512,44 @@ pandora::StatusCode CaloHitCreator::CreateHCalCaloHits(const CollectionMaps& col pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& collectionMaps) { - for (StringVector::const_iterator iter = m_settings.m_muonCaloHitCollections.begin(), iterEnd = m_settings.m_muonCaloHitCollections.end(); - iter != iterEnd; ++iter) + for (unsigned int k = 0; k < m_settings.m_muonCaloHitCollections.size(); k++) { - if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;} + std::string tmp_col_name = m_settings.m_muonCaloHitCollections.at(k); + if(collectionMaps.collectionMap_CaloHit.find(tmp_col_name) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug) std::cout<<"not find "<<tmp_col_name<<std::endl; continue;} try { - const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second; + const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(tmp_col_name))->second; const int nElements(pCaloHitCollection.size()); if (0 == nElements) continue; - const gear::LayerLayout &endcapLayerLayout(_GEAR->getYokeEndcapParameters().getLayerLayout()); - const gear::LayerLayout &barrelLayerLayout(_GEAR->getYokeBarrelParameters().getLayerLayout()); - const gear::LayerLayout &plugLayerLayout(_GEAR->getYokePlugParameters().getLayerLayout()); ID_UTIL::CellIDDecoder<const edm4hep::CalorimeterHit> cellIdDecoder(m_encoder_str_MUON); const std::string layerCodingString(m_encoder_str_MUON); const std::string layerCoding(this->GetLayerCoding(layerCodingString)); const std::string staveCoding(this->GetStaveCoding(layerCodingString)); + // get the DD4hep readout + const std::string name_readout = m_settings.m_muonCalCaloReadOuts.at(k); + if(m_settings.m_debug) std::cout<<"readout= "<<name_readout<<std::endl; + if( m_settings.m_use_dd4hep_decoder ){ + m_decoder = m_geosvc->getDecoder(name_readout); + if (!m_decoder) throw "Failed to get the decoder. "; + } + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* barrelLayers=nullptr; + const std::vector<dd4hep::rec::LayeredCalorimeterStruct::Layer>* endcapLayers=nullptr; + const gear::LayerLayout* barrelLayerLayout=nullptr; + const gear::LayerLayout* plugLayerLayout=nullptr; + const gear::LayerLayout* endcapLayerLayout=nullptr; + if(m_settings.m_use_dd4hep_geo){ + barrelLayers= &(PanUtil::getExtension(( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ))->layers); + endcapLayers = &(PanUtil::getExtension(( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ))->layers); + } + else{ + plugLayerLayout= &(_GEAR->getYokePlugParameters().getLayerLayout()); + barrelLayerLayout = &(_GEAR->getYokeBarrelParameters().getLayerLayout()); + endcapLayerLayout = &(_GEAR->getYokeEndcapParameters().getLayerLayout()); + } for (int i = 0; i < nElements; ++i) { @@ -397,9 +563,28 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col PandoraApi::CaloHit::Parameters caloHitParameters; caloHitParameters.m_hitType = pandora::MUON; - caloHitParameters.m_layer = cellIdDecoder(pCaloHit)[layerCoding.c_str()] + 1; + caloHitParameters.m_layer = m_settings.m_use_dd4hep_decoder == false ? cellIdDecoder(pCaloHit)[layerCoding.c_str()] + 1 : m_decoder->get(pCaloHit->getCellID(), "layer"); + //std::cout<<"Muon layer="<<caloHitParameters.m_layer.Get()<<std::endl; caloHitParameters.m_isInOuterSamplingLayer = true; this->GetCommonCaloHitProperties(pCaloHit, caloHitParameters); + int Stave = 0 ; + if (m_settings.m_use_dd4hep_decoder == false){ + Stave = cellIdDecoder(pCaloHit)[ staveCoding]; + /* + float tmp_x = pCaloHit->getPosition()[0]; + float tmp_y = pCaloHit->getPosition()[1]; + float tmp_z = pCaloHit->getPosition()[2]; + float tmp_phi = atan(tmp_y/tmp_x)*180/acos(-1); + if(tmp_x<0) tmp_phi += 180; + if(tmp_x>0 && tmp_y<0) tmp_phi += 360; + if(abs(tmp_z) < 2000 )std::cout<<"Muon ILC Stave="<<Stave<<",phi="<<tmp_phi<<std::endl; + */ + } + else{ + Stave = m_decoder->get(pCaloHit->getCellID(), "stave"); + Stave = 12 - Stave ;//correct to be same with LCIO + if(Stave<0) throw("throw wrong stave number?"); + } const float radius(std::sqrt(pCaloHit->getPosition()[0] * pCaloHit->getPosition()[0] + pCaloHit->getPosition()[1] * pCaloHit->getPosition()[1])); @@ -411,16 +596,17 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col if (isInBarrelRegion && isWithinCoil) { - this->GetEndCapCaloHitProperties(pCaloHit, plugLayerLayout, caloHitParameters, absorberCorrection); + if(m_settings.m_use_dd4hep_geo) std::cout<<"BIG WARNING: CANNOT HANDLE PLUG HITS (no plug), DO NOTHING!"<<std::endl; + else this->GetEndCapCaloHitProperties(pCaloHit, *plugLayerLayout, caloHitParameters, absorberCorrection); } else if (isInBarrelRegion) - { - this->GetBarrelCaloHitProperties(pCaloHit, barrelLayerLayout, m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0, - cellIdDecoder(pCaloHit)[ staveCoding ], caloHitParameters, absorberCorrection); + { if(m_settings.m_use_dd4hep_geo) this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayers , m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection); + else this->GetBarrelCaloHitProperties(pCaloHit, *barrelLayerLayout, m_muonBarrelInnerSymmetry, m_muonBarrelInnerPhi0, Stave, caloHitParameters, absorberCorrection); } else { - this->GetEndCapCaloHitProperties(pCaloHit, endcapLayerLayout, caloHitParameters, absorberCorrection); + if(m_settings.m_use_dd4hep_geo) this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayers , caloHitParameters, absorberCorrection); + else this->GetEndCapCaloHitProperties(pCaloHit, *endcapLayerLayout, caloHitParameters, absorberCorrection); } if (m_settings.m_muonDigitalHits > 0) @@ -455,7 +641,7 @@ pandora::StatusCode CaloHitCreator::CreateMuonCaloHits(const CollectionMaps& col } catch (...) { - std::cout << "Failed to extract muon hit collection: " << *iter << std::endl; + std::cout << "Failed to extract muon hit collection: " << tmp_col_name << std::endl; } } @@ -469,7 +655,7 @@ pandora::StatusCode CaloHitCreator::CreateLCalCaloHits(const CollectionMaps& col for (StringVector::const_iterator iter = m_settings.m_lCalCaloHitCollections.begin(), iterEnd = m_settings.m_lCalCaloHitCollections.end(); iter != iterEnd; ++iter) { - if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;} + if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug)std::cout<<"not find "<<(*iter)<<std::endl; continue;} try { const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second; @@ -542,7 +728,7 @@ pandora::StatusCode CaloHitCreator::CreateLHCalCaloHits(const CollectionMaps& co for (StringVector::const_iterator iter = m_settings.m_lHCalCaloHitCollections.begin(), iterEnd = m_settings.m_lHCalCaloHitCollections.end(); iter != iterEnd; ++iter) { - if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) { std::cout<<"not find "<<(*iter)<<std::endl; continue;} + if(collectionMaps.collectionMap_CaloHit.find(*iter) == collectionMaps.collectionMap_CaloHit.end()) {if(m_settings.m_debug) std::cout<<"not find "<<(*iter)<<std::endl; continue;} try { const std::vector<edm4hep::CalorimeterHit>& pCaloHitCollection = (collectionMaps.collectionMap_CaloHit.find(*iter))->second; @@ -793,7 +979,7 @@ void CaloHitCreator::GetBarrelCaloHitProperties(const edm4hep::CalorimeterHit *c const int physicalLayer(std::min(static_cast<int>(caloHitParameters.m_layer.Get()), static_cast<int>(layers.size()-1))); caloHitParameters.m_cellSize0 = layers[physicalLayer].cellSize0/dd4hep::mm; caloHitParameters.m_cellSize1 = layers[physicalLayer].cellSize1/dd4hep::mm; - //std::cout<<"DD m_cellSize0="<<caloHitParameters.m_cellSize0.Get()<<",m_cellSize1="<<caloHitParameters.m_cellSize1.Get()<<std::endl; + if(m_settings.m_debug) std::cout<<"DD m_cellSize0="<<caloHitParameters.m_cellSize0.Get()<<",m_cellSize1="<<caloHitParameters.m_cellSize1.Get()<<std::endl; double thickness = (layers[physicalLayer].inner_thickness+layers[physicalLayer].sensitive_thickness/2.0)/dd4hep::mm; double nRadLengths = layers[physicalLayer].inner_nRadiationLengths; double nIntLengths = layers[physicalLayer].inner_nInteractionLengths; diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp index 7a9a74cfe3ce2de993ba4c6a68a48bf00ab2ba00..a69feb3682b4671978392f57196c98410d562360 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/GeometryCreator.cpp @@ -16,6 +16,7 @@ #include "GeometryCreator.h" #include "Utility.h" + GeometryCreator::GeometryCreator(const Settings &settings, const pandora::Pandora *const pPandora) : m_settings(settings), m_pPandora(pPandora) @@ -47,7 +48,8 @@ pandora::StatusCode GeometryCreator::CreateGeometry(ISvcLocator* svcloc) this->SetMandatorySubDetectorParameters(subDetectorTypeMap); SubDetectorNameMap subDetectorNameMap; - this->SetAdditionalSubDetectorParameters(subDetectorNameMap); + if(m_settings.m_use_dd4hep_geo) this->SetAdditionalSubDetectorParametersDD(subDetectorNameMap); + else this->SetAdditionalSubDetectorParameters (subDetectorNameMap); if (std::string::npos != _GEAR->getDetectorName().find("ILD")) this->SetILDSpecificGeometry(subDetectorTypeMap, subDetectorNameMap); @@ -71,23 +73,62 @@ pandora::StatusCode GeometryCreator::CreateGeometry(ISvcLocator* svcloc) void GeometryCreator::SetMandatorySubDetectorParameters(SubDetectorTypeMap &subDetectorTypeMap) const { - std::cout << "Begin SetMandatorySubDetectorParameters:" << std::endl; - PandoraApi::Geometry::SubDetector::Parameters eCalBarrelParameters, eCalEndCapParameters, hCalBarrelParameters, hCalEndCapParameters, - muonBarrelParameters, muonEndCapParameters; + std::cout << "GeometryCreator SetMandatorySubDetectorParameters:" << std::endl; + PandoraApi::Geometry::SubDetector::Parameters eCalBarrelParameters, eCalEndCapParameters, hCalBarrelParameters, hCalEndCapParameters, muonBarrelParameters, muonEndCapParameters; + if(m_settings.m_use_dd4hep_geo){ - std::cout << "Use dd4hep geo info for ECAL" << std::endl; - this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters); - this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) )), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters); + std::cout << "Use dd4hep geo info for ECAL, HCAL and Muon" << std::endl; + dd4hep::rec::LayeredCalorimeterData* layer_ecal_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ) ); + if(layer_ecal_barrel) this->SetDefaultSubDetectorParameters(*layer_ecal_barrel, "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters); + else{ + std::cout << "GeometryCreator:Do not find ECAL Barrel geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getEcalBarrelParameters(), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters); + } + + dd4hep::rec::LayeredCalorimeterData* layer_ecal_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ) ); + if(layer_ecal_endcap) this->SetDefaultSubDetectorParameters(*layer_ecal_endcap, "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters); + else{ + std::cout << "GeometryCreator:Do not find ECAL Endcap geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getEcalEndcapParameters(), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters); + } + + dd4hep::rec::LayeredCalorimeterData* layer_hcal_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ) ); + if(layer_hcal_barrel) this->SetDefaultSubDetectorParameters(*layer_hcal_barrel, "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters); + else{ + std::cout << "GeometryCreator:Do not find HCAL Barrel geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters); + } + + dd4hep::rec::LayeredCalorimeterData* layer_hcal_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ) ); + if(layer_hcal_endcap) this->SetDefaultSubDetectorParameters(*layer_hcal_endcap, "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters); + else{ + std::cout << "GeometryCreator:Do not find HCAL Endcap geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters); + } + + dd4hep::rec::LayeredCalorimeterData * layer_muon_barrel = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::BARREL),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ) ); + if(layer_muon_barrel) this->SetDefaultSubDetectorParameters(*layer_muon_barrel, "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters); + else{ + std::cout << "GeometryCreator:Do not find Muon Barrel geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters); + } + + dd4hep::rec::LayeredCalorimeterData* layer_muon_endcap = const_cast<dd4hep::rec::LayeredCalorimeterData*>(PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY ) ) ); + if(layer_muon_endcap) this->SetDefaultSubDetectorParameters(*layer_muon_endcap, "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters); + else{ + std::cout << "GeometryCreator:Do not find Muon Endcap geo info from dd4hep, Try to get it from Gear" << std::endl; + this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters); + } } else{ this->SetDefaultSubDetectorParameters(_GEAR->getEcalBarrelParameters(), "ECalBarrel", pandora::ECAL_BARREL, eCalBarrelParameters); this->SetDefaultSubDetectorParameters(_GEAR->getEcalEndcapParameters(), "ECalEndCap", pandora::ECAL_ENDCAP, eCalEndCapParameters); + this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters); + this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters); + this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters); + this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters); } - this->SetDefaultSubDetectorParameters(_GEAR->getHcalBarrelParameters(), "HCalBarrel", pandora::HCAL_BARREL, hCalBarrelParameters); - this->SetDefaultSubDetectorParameters(_GEAR->getHcalEndcapParameters(), "HCalEndCap", pandora::HCAL_ENDCAP, hCalEndCapParameters); - this->SetDefaultSubDetectorParameters(_GEAR->getYokeBarrelParameters(), "MuonBarrel", pandora::MUON_BARREL, muonBarrelParameters); - this->SetDefaultSubDetectorParameters(_GEAR->getYokeEndcapParameters(), "MuonEndCap", pandora::MUON_ENDCAP, muonEndCapParameters); subDetectorTypeMap[pandora::ECAL_BARREL] = eCalBarrelParameters; subDetectorTypeMap[pandora::ECAL_ENDCAP] = eCalEndCapParameters; @@ -141,10 +182,67 @@ void GeometryCreator::SetMandatorySubDetectorParameters(SubDetectorTypeMap &subD } //------------------------------------------------------------------------------------------------------------------------------------------ +void GeometryCreator::SetAdditionalSubDetectorParametersDD(SubDetectorNameMap &subDetectorNameMap) const +{ + + dd4hep::Detector & mainDetector = dd4hep::Detector::getInstance(); + const std::vector< dd4hep::DetElement>& theECalOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::AUXILIARY ) ; + for (std::vector< dd4hep::DetElement>::const_iterator iter = theECalOtherDetectors.begin(), iterEnd = theECalOtherDetectors.end();iter != iterEnd; ++iter){ + try + { + const dd4hep::DetElement& theDetector = *iter; + const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>(); + + PandoraApi::Geometry::SubDetector::Parameters parameters; + this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters); + subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters; + } + catch (std::runtime_error &exception) + { + std::cout << "pandora geometry creator during Other ECal construction: " << exception.what() << std::endl; + } + } + + const std::vector< dd4hep::DetElement>& theHCalOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::AUXILIARY ) ; + for (std::vector< dd4hep::DetElement>::const_iterator iter = theHCalOtherDetectors.begin(), iterEnd = theHCalOtherDetectors.end();iter != iterEnd; ++iter){ + try + { + const dd4hep::DetElement& theDetector = *iter; + const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>(); + + PandoraApi::Geometry::SubDetector::Parameters parameters; + this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters); + subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters; + } + catch (std::runtime_error &exception) + { + std::cout << "pandora geometry creator during Other HCal construction: " << exception.what() << std::endl; + } + } + + const std::vector< dd4hep::DetElement>& theMuonOtherDetectors = dd4hep::DetectorSelector(mainDetector).detectors(dd4hep::DetType::CALORIMETER | dd4hep::DetType::MUON| dd4hep::DetType::AUXILIARY ) ; + for (std::vector< dd4hep::DetElement>::const_iterator iter = theMuonOtherDetectors.begin(), iterEnd = theMuonOtherDetectors.end();iter != iterEnd; ++iter){ + try + { + const dd4hep::DetElement& theDetector = *iter; + const dd4hep::rec::LayeredCalorimeterData * theExtension = theDetector.extension<dd4hep::rec::LayeredCalorimeterData>(); + + PandoraApi::Geometry::SubDetector::Parameters parameters; + this->SetDefaultSubDetectorParameters(*const_cast<dd4hep::rec::LayeredCalorimeterData*>(theExtension),theDetector.name(), pandora::SUB_DETECTOR_OTHER, parameters); + subDetectorNameMap[parameters.m_subDetectorName.Get()] = parameters; + } + catch (std::runtime_error &exception) + { + std::cout << "pandora geometry creator during Other Muon construction: " << exception.what() << std::endl; + } + } + +} + void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &subDetectorNameMap) const { - std::cout << "Begin SetAdditionalSubDetectorParameters:" << std::endl; + std::cout << "SetAdditionalSubDetectorParameters:" << std::endl; try { PandoraApi::Geometry::SubDetector::Parameters parameters; @@ -164,7 +262,7 @@ void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &sub } catch (gear::Exception &exception) { - std::cout<< "warning pandora geometry creator: " << exception.what() << std::endl; + std::cout << "warning pandora geometry creator: " << exception.what() << std::endl; } try @@ -192,7 +290,29 @@ void GeometryCreator::SetAdditionalSubDetectorParameters(SubDetectorNameMap &sub } //------------------------------------------------------------------------------------------------------------------------------------------ +/* +void GeometryCreator::SetDummySubDetectorParameters(const std::map<std::string, float>& para_map, const std::string &subDetectorName, + const pandora::SubDetectorType subDetectorType, PandoraApi::Geometry::SubDetector::Parameters ¶meters) const +{ + parameters.m_subDetectorName = subDetectorName; + parameters.m_subDetectorType = subDetectorType; + parameters.m_innerRCoordinate = para_map["innerRCoordinate"]; + parameters.m_innerZCoordinate = para_map["innerZCoordinate"]; + parameters.m_innerPhiCoordinate = para_map["innerPhiCoordinate"]; + parameters.m_innerSymmetryOrder = para_map["innerSymmetryOrder"]; + parameters.m_outerRCoordinate = para_map["outerRCoordinate"]; + parameters.m_outerZCoordinate = para_map["outerZCoordinate"]; + parameters.m_outerPhiCoordinate = para_map["outerPhiCoordinate"]; + parameters.m_outerSymmetryOrder = para_map["outerSymmetryOrder"]; + parameters.m_isMirroredInZ = true; + PandoraApi::Geometry::LayerParameters layerParameters; + layerParameters.m_closestDistanceToIp = para_map["closestDistanceToIp"]; + layerParameters.m_nRadiationLengths = 1; + layerParameters.m_nInteractionLengths = 1; + parameters.m_layerParametersVector.push_back(layerParameters); +} +*/ void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterParameters &inputParameters, const std::string &subDetectorName, const pandora::SubDetectorType subDetectorType, PandoraApi::Geometry::SubDetector::Parameters ¶meters) const { @@ -211,6 +331,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterPar parameters.m_isMirroredInZ = true; parameters.m_nLayers = layerLayout.getNLayers(); + std::cout <<"Gear m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl; // ATTN Not always going to be correct for any optional subdetectors, but impact of this is negligible for ILD const float radiationLength(((pandora::ECAL_BARREL == subDetectorType) || (pandora::ECAL_ENDCAP == subDetectorType)) ? m_settings.m_absorberRadLengthECal : ((pandora::HCAL_BARREL == subDetectorType) || (pandora::HCAL_ENDCAP == subDetectorType)) ? m_settings.m_absorberRadLengthHCal : m_settings.m_absorberRadLengthOther); @@ -224,6 +345,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const gear::CalorimeterPar layerParameters.m_nRadiationLengths = radiationLength * layerLayout.getAbsorberThickness(i); layerParameters.m_nInteractionLengths = interactionLength * layerLayout.getAbsorberThickness(i); parameters.m_layerParametersVector.push_back(layerParameters); + std::cout <<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<std::endl; } } @@ -244,7 +366,7 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const dd4hep::rec::Layered parameters.m_isMirroredInZ = true; parameters.m_nLayers = layers.size(); - std::cout<<"DD m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl; + std::cout <<"DD m_subDetectorName="<<subDetectorName<<",m_subDetectorType="<<subDetectorType<<",m_innerRCoordinate="<<parameters.m_innerRCoordinate.Get()<<",m_innerZCoordinate="<<parameters.m_innerZCoordinate.Get()<<",m_innerPhiCoordinate="<<parameters.m_innerPhiCoordinate.Get()<<",m_innerSymmetryOrder="<<parameters.m_innerSymmetryOrder.Get()<<",m_outerRCoordinate="<<parameters.m_outerRCoordinate.Get()<<",m_outerZCoordinate="<<parameters.m_outerZCoordinate.Get()<<",m_outerPhiCoordinate="<<parameters.m_outerPhiCoordinate.Get()<<",m_outerSymmetryOrder="<<parameters.m_outerSymmetryOrder.Get()<<",m_nLayers="<<parameters.m_nLayers.Get()<<std::endl; for (size_t i = 0; i< layers.size(); i++) { const dd4hep::rec::LayeredCalorimeterStruct::Layer & theLayer = layers.at(i); @@ -260,13 +382,13 @@ void GeometryCreator::SetDefaultSubDetectorParameters(const dd4hep::rec::Layered totalNumberOfIntLengths += layers.at(i-1).outer_nInteractionLengths; } - + std::cout <<"layer="<<i<<",theLayer.distance="<<theLayer.distance<<std::endl; layerParameters.m_closestDistanceToIp = (theLayer.distance+theLayer.inner_thickness)/dd4hep::mm; //Distance to center of sensitive element layerParameters.m_nRadiationLengths = totalNumberOfRadLengths; layerParameters.m_nInteractionLengths = totalNumberOfIntLengths; parameters.m_layerParametersVector.push_back(layerParameters); - std::cout<<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<",outer_thickness="<<theLayer.outer_thickness<<",inner_thickness="<<theLayer.inner_thickness<<",sensitive_thickness="<<theLayer.sensitive_thickness<<std::endl; + std::cout <<"layer="<<i<<",m_closestDistanceToIp="<<layerParameters.m_closestDistanceToIp.Get()<<",m_nRadiationLengths="<<layerParameters.m_nRadiationLengths.Get()<<",m_nInteractionLengths="<<layerParameters.m_nInteractionLengths.Get()<<",outer_thickness="<<theLayer.outer_thickness<<",inner_thickness="<<theLayer.inner_thickness<<",sensitive_thickness="<<theLayer.sensitive_thickness<<std::endl; } } //------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp index 9d94a93931dd76458ac5da6cdc49a4762ad2ba59..18030dbdb33cf0a5f62876fe64e237e550753855 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/PandoraPFAlg.cpp @@ -109,8 +109,8 @@ StatusCode PandoraPFAlg::initialize() else { m_tuple = ntupleSvc()->book( "MyTuples/Pan_reco_evt", CLID_ColumnWiseTuple, "Pan_reco_evt" ); if ( m_tuple ) { - m_tuple->addItem( "N_mc" , m_n_mc , 0, 1000 ).ignore(); - m_tuple->addItem( "N_rec", m_n_rec, 0, 1000 ).ignore(); + m_tuple->addItem( "N_mc" , m_n_mc , 0, m_max_mc.value() ).ignore(); + m_tuple->addItem( "N_rec", m_n_rec, 0, m_max_rec.value()).ignore(); m_tuple->addItem( "m_pReco_PID" , m_n_rec, m_pReco_PID ).ignore(); m_tuple->addItem( "m_pReco_mass" , m_n_rec, m_pReco_mass ).ignore(); m_tuple->addItem( "m_pReco_energy", m_n_rec, m_pReco_energy ).ignore(); @@ -220,10 +220,10 @@ StatusCode PandoraPFAlg::initialize() // Name of PFO collection written by GaudiPandora m_pfoCreatorSettings.m_debug = m_debug; - m_pfoCreatorSettings.m_clusterCollectionName = m_ClusterCollectionName;// not used - m_pfoCreatorSettings.m_pfoCollectionName = m_PFOCollectionName;// - m_pfoCreatorSettings.m_startVertexCollectionName = m_StartVertexCollectionName; // - m_pfoCreatorSettings.m_startVertexAlgName = m_StartVertexAlgorithmName;// + m_pfoCreatorSettings.m_clusterCollectionName = m_ClusterCollectionName; + m_pfoCreatorSettings.m_pfoCollectionName = m_PFOCollectionName; + m_pfoCreatorSettings.m_startVertexCollectionName = m_StartVertexCollectionName; + m_pfoCreatorSettings.m_startVertexAlgName = m_StartVertexAlgorithmName; m_pfoCreatorSettings.m_emStochasticTerm = m_EMStochasticTerm; m_pfoCreatorSettings.m_hadStochasticTerm = m_HadStochasticTerm; @@ -283,6 +283,7 @@ StatusCode PandoraPFAlg::initialize() // Additional geometry parameters + m_geometryCreatorSettings.m_use_dd4hep_geo = m_use_dd4hep_geo; m_geometryCreatorSettings.m_eCalEndCapInnerSymmetryOrder = m_ECalEndCapInnerSymmetryOrder; m_geometryCreatorSettings.m_eCalEndCapInnerPhiCoordinate = m_ECalEndCapInnerPhiCoordinate; m_geometryCreatorSettings.m_eCalEndCapOuterSymmetryOrder = m_ECalEndCapOuterSymmetryOrder; @@ -295,8 +296,15 @@ StatusCode PandoraPFAlg::initialize() m_geometryCreatorSettings.m_hCalRingInnerPhiCoordinate = m_HCalRingInnerPhiCoordinate; m_geometryCreatorSettings.m_hCalRingOuterSymmetryOrder = m_HCalRingOuterSymmetryOrder; m_geometryCreatorSettings.m_hCalRingOuterPhiCoordinate = m_HCalRingOuterPhiCoordinate; - m_geometryCreatorSettings.m_use_dd4hep_geo = m_use_dd4hep_geo; - + if(m_use_dd4hep_geo){ + std::cout<<"get hCalEndCapInner geo info from dd4hep."<<std::endl; + //Get HCal Endcap extension by type, ignore plugs and rings + const dd4hep::rec::LayeredCalorimeterData * hCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::HADRONIC | dd4hep::DetType::ENDCAP),( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); + if(hCalEndcapExtension){ + m_geometryCreatorSettings.m_hCalEndCapInnerSymmetryOrder = hCalEndcapExtension->inner_symmetry; + m_geometryCreatorSettings.m_hCalEndCapInnerPhiCoordinate = hCalEndcapExtension->inner_phi0/dd4hep::rad; + } + } // For Strip Splitting method and also for hybrid ECAL m_caloHitCreatorSettings.m_stripSplittingOn = m_StripSplittingOn; m_caloHitCreatorSettings.m_useEcalScLayers = m_UseEcalScLayers; @@ -474,11 +482,12 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::MCParticle> v_mc; m_CollectionMaps->collectionMap_MC [v.first] = v_mc; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_MC [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug()<<"saved col name="<<v.first<<endmsg; } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else if(m_collections[v.first]=="CalorimeterHit"){ auto handle = dynamic_cast<DataHandle<edm4hep::CalorimeterHitCollection>*> (v.second); @@ -487,11 +496,12 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::CalorimeterHit> v_cal; m_CollectionMaps->collectionMap_CaloHit[v.first] = v_cal ; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_CaloHit [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug()<<"saved col name="<<v.first<<endmsg; } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else if(m_collections[v.first]=="Track"){ auto handle = dynamic_cast<DataHandle<edm4hep::TrackCollection>*> (v.second); @@ -500,12 +510,13 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::Track> v_cal; m_CollectionMaps->collectionMap_Track[v.first] = v_cal ; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_Track [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug() <<"saved col name="<<v.first<<endmsg; m_marlinTrack = po->size(); } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else if(m_collections[v.first]=="Vertex"){ auto handle = dynamic_cast<DataHandle<edm4hep::VertexCollection>*> (v.second); @@ -514,11 +525,12 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::Vertex> v_cal; m_CollectionMaps->collectionMap_Vertex[v.first] = v_cal ; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_Vertex [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug() <<"saved col name="<<v.first<<endmsg; } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else if(m_collections[v.first]=="MCRecoCaloAssociation"){ auto handle = dynamic_cast<DataHandle<edm4hep::MCRecoCaloAssociationCollection>*> (v.second); @@ -527,11 +539,12 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::MCRecoCaloAssociation> v_cal; m_CollectionMaps->collectionMap_CaloRel[v.first] = v_cal ; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_CaloRel [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug() <<"saved col name="<<v.first<<endmsg; } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else if(m_collections[v.first]=="MCRecoTrackerAssociation"){ auto handle = dynamic_cast<DataHandle<edm4hep::MCRecoTrackerAssociationCollection>*> (v.second); @@ -540,19 +553,20 @@ StatusCode PandoraPFAlg::updateMap() std::vector<edm4hep::MCRecoTrackerAssociation> v_cal; m_CollectionMaps->collectionMap_TrkRel[v.first] = v_cal ; for(unsigned int i=0 ; i< po->size(); i++) m_CollectionMaps->collectionMap_TrkRel [v.first].push_back(po->at(i)); - std::cout<<"saved col name="<<v.first<<std::endl; + debug() <<"saved col name="<<v.first<<endmsg; } else{ - std::cout<<"don't find col name="<<v.first<<std::endl; + debug()<<"don't find col name="<<v.first<<endmsg; } + } else{ std::cout<<"wrong type name for col :"<<v.first<<std::endl; } }//try catch(...){ - std::cout<<"don't find "<<v.first<<"in event"<<std::endl; - std::cout<<"don't find col name="<<v.first<<",with type="<<m_collections[v.first]<<" in this event"<<std::endl; + debug() <<"don't find "<<v.first<<" in event"<<endmsg; + debug() <<"don't find col name="<<v.first<<",with type="<<m_collections[v.first]<<" in this event"<<endmsg; } } return StatusCode::SUCCESS; @@ -569,6 +583,7 @@ StatusCode PandoraPFAlg::Ana() const edm4hep::MCRecoParticleAssociationCollection* reco_associa_col = m_MCRecoParticleAssociation_w.get(); for(int i=0; i<reco_col->size();i++) { + if( m_n_rec >= m_max_rec) break; const edm4hep::ReconstructedParticle pReco = reco_col->at(i); const float px = pReco.getMomentum()[0]; const float py = pReco.getMomentum()[1]; @@ -585,11 +600,11 @@ StatusCode PandoraPFAlg::Ana() m_pReco_py [m_n_rec]=py; m_pReco_pz [m_n_rec]=pz; m_n_rec ++ ; - if(m_debug) std::cout<<"rec type="<<type<<",energy="<<energy<<std::endl; + debug() <<"rec type="<<type<<",energy="<<energy<<endmsg; for(int j=0; j < reco_associa_col->size(); j++) { if(reco_associa_col->at(j).getRec().id() != pReco.id() ) continue; - if(m_debug) std::cout<<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<std::endl; + debug() <<"MC pid ="<<reco_associa_col->at(j).getSim().getPDG()<<",weight="<<reco_associa_col->at(j).getWeight()<<", px="<<reco_associa_col->at(j).getSim().getMomentum()[0]<<", py="<<reco_associa_col->at(j).getSim().getMomentum()[1]<<",pz="<<reco_associa_col->at(j).getSim().getMomentum()[2]<<endmsg; } } const edm4hep::MCParticleCollection* MCParticle = nullptr; @@ -598,6 +613,8 @@ StatusCode PandoraPFAlg::Ana() { for(unsigned int i=0 ; i< MCParticle->size(); i++) { + if( m_n_mc >= m_max_mc) break; + if( MCParticle->at(i).parents_size() !=0 ) continue;// only save primary m_mc_p_size[m_n_mc] = MCParticle->at(i).parents_size(); m_mc_pid [m_n_mc] = MCParticle->at(i).getPDG(); m_mc_mass [m_n_mc] = MCParticle->at(i).getMass(); @@ -606,7 +623,7 @@ StatusCode PandoraPFAlg::Ana() m_mc_pz [m_n_mc] = MCParticle->at(i).getMomentum()[2]; m_mc_charge[m_n_mc] = MCParticle->at(i).getCharge(); float mc_E = sqrt( MCParticle->at(i).getMass()*MCParticle->at(i).getMass() + MCParticle->at(i).getMomentum()[0]*MCParticle->at(i).getMomentum()[0] + MCParticle->at(i).getMomentum()[1]*MCParticle->at(i).getMomentum()[1] + MCParticle->at(i).getMomentum()[2]*MCParticle->at(i).getMomentum()[2]); - if(m_debug) std::cout<<"mc type="<<MCParticle->at(i).getPDG()<<",energy="<<mc_E<<std::endl; + //debug() <<"mc type="<<MCParticle->at(i).getPDG()<<",energy="<<mc_E<<",m_mc_p_size="<<m_mc_p_size->size()<<endmsg; m_n_mc ++ ; if (MCParticle->at(i).getPDG() != 22) continue; int hasEm = 0; diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp index f9fd064f1a7195bb046ebcb4efcf5d24895e69e2..4b67db277fcb73218e559c6acd1521b7a28a637f 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/TrackCreator.cpp @@ -42,16 +42,45 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con { + IGearSvc* iSvc = 0; + StatusCode sc = svcloc->service("GearSvc", iSvc, false); + if ( !sc ) throw "Failed to find GearSvc ..."; + _GEAR = iSvc->getGearMgr(); + if(m_settings.m_use_dd4hep_geo){ m_bField = PanUtil::getFieldFromCompact(); const dd4hep::rec::LayeredCalorimeterData * eCalBarrelExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::BARREL), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); const dd4hep::rec::LayeredCalorimeterData * eCalEndcapExtension= PanUtil::getExtension( ( dd4hep::DetType::CALORIMETER | dd4hep::DetType::ELECTROMAGNETIC | dd4hep::DetType::ENDCAP), ( dd4hep::DetType::AUXILIARY | dd4hep::DetType::FORWARD ) ); - m_eCalBarrelInnerPhi0 = eCalBarrelExtension->inner_phi0/dd4hep::rad; - m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry; - m_eCalBarrelInnerR = eCalBarrelExtension->extent[0]/dd4hep::mm; - m_eCalEndCapInnerZ = eCalEndcapExtension->extent[2]/dd4hep::mm; + if(eCalBarrelExtension){ + m_eCalBarrelInnerPhi0 = eCalBarrelExtension->inner_phi0/dd4hep::rad; + m_eCalBarrelInnerSymmetry = eCalBarrelExtension->inner_symmetry; + m_eCalBarrelInnerR = eCalBarrelExtension->extent[0]/dd4hep::mm; + } + else{ + /* + std::cout<<"TrackCreator:WARNING: can get ECAL barrel info from dd4hep, set it to dummy"<<std::endl; + m_eCalBarrelInnerPhi0 = 0; + m_eCalBarrelInnerSymmetry = 0; + m_eCalBarrelInnerR = 1850; + */ + std::cout<<"TrackCreator:WARNING: can get ECAL barrel info from dd4hep, get it from Gear"<<std::endl; + m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder()); + m_eCalBarrelInnerPhi0 = (_GEAR->getEcalBarrelParameters().getPhi0()); + m_eCalBarrelInnerR = (_GEAR->getEcalBarrelParameters().getExtent()[0]); + } + if(eCalEndcapExtension){ + m_eCalEndCapInnerZ = eCalEndcapExtension->extent[2]/dd4hep::mm; + } + else{ + /* + std::cout<<"TrackCreator:WARNING: can get ECAL endcap info from dd4hep, set it to dummy"<<std::endl; + m_eCalEndCapInnerZ = 100; + */ + std::cout<<"TrackCreator:WARNING: can get ECAL endcap info from dd4hep, get it from Gear"<<std::endl; + m_eCalEndCapInnerZ = (_GEAR->getEcalEndcapParameters().getExtent()[2]); + } dd4hep::Detector & mainDetector = dd4hep::Detector::getInstance(); try{ @@ -68,25 +97,56 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con m_tpcMaxRow = theExtension->maxRow; std::cout<<"DD4HEP m_tpcInnerR="<<m_tpcInnerR<<",m_tpcOuterR="<<m_tpcOuterR<<",m_tpcMaxRow="<<m_tpcMaxRow<<",m_tpcZmax="<<m_tpcZmax<<std::endl; } - else{ + else{ + /* m_tpcInnerR = 100 ; m_tpcOuterR = 1800; m_tpcMaxRow = 100 ; m_tpcZmax = 2500; std::cout<<"TrackCreator WARNING:Does not find TPC parameter from dd4hep and set it to dummy value"<<std::endl; + */ + std::cout<<"TrackCreator WARNING:Does not find TPC parameter from dd4hep and get it from Gear"<<std::endl; + m_tpcInnerR = (_GEAR->getTPCParameters().getPadLayout().getPlaneExtent()[0]); + m_tpcOuterR = (_GEAR->getTPCParameters().getPadLayout().getPlaneExtent()[1]); + m_tpcMaxRow = (_GEAR->getTPCParameters().getPadLayout().getNRows()); + m_tpcZmax = (_GEAR->getTPCParameters().getMaxDriftLength()); } - } + } catch (std::runtime_error &exception){ std::cout<<"TrackCreator WARNING:exception during TPC parameter construction:"<<exception.what()<<std::endl; } //Instead of gear, loop over a provided list of forward (read: endcap) tracking detectors. const std::vector< dd4hep::DetElement>& endcapDets = dd4hep::DetectorSelector(mainDetector).detectors( ( dd4hep::DetType::TRACKER | dd4hep::DetType::ENDCAP )) ; if(endcapDets.size()==0){ + /* m_ftdInnerRadii.push_back(100); m_ftdOuterRadii.push_back(200); m_ftdZPositions.push_back(2000); m_nFtdLayers = 1; std::cout<<"TrackCreator WARNING:Does not find forward tracking parameter from dd4hep, so set it to dummy value"<<std::endl; + */ + std::cout<<"TrackCreator WARNING:Does not find forward tracking parameter from dd4hep, so get it from Gear"<<std::endl; + try{ + m_ftdInnerRadii = _GEAR->getGearParameters("FTD").getDoubleVals("FTDInnerRadius"); + m_ftdOuterRadii = _GEAR->getGearParameters("FTD").getDoubleVals("FTDOuterRadius"); + m_ftdZPositions = _GEAR->getGearParameters("FTD").getDoubleVals("FTDZCoordinate"); + m_nFtdLayers = m_ftdZPositions.size(); + } + catch (gear::UnknownParameterException &){ + const gear::FTDLayerLayout &ftdLayerLayout(_GEAR->getFTDParameters().getFTDLayerLayout()); + std::cout << " Filling FTD parameters from gear::FTDParameters - n layers: " << ftdLayerLayout.getNLayers() << std::endl; + for(unsigned int i = 0, N = ftdLayerLayout.getNLayers(); i < N; ++i) + { + // Create a disk to represent even number petals front side + m_ftdInnerRadii.push_back(ftdLayerLayout.getSensitiveRinner(i)); + m_ftdOuterRadii.push_back(ftdLayerLayout.getMaxRadius(i)); + // Take the mean z position of the staggered petals + const double zpos(ftdLayerLayout.getZposition(i)); + m_ftdZPositions.push_back(zpos); + std::cout << "Gear: layer " << i << " - mean z position = " << zpos << std::endl; + } + m_nFtdLayers = m_ftdZPositions.size() ; + } } for (std::vector< dd4hep::DetElement>::const_iterator iter = endcapDets.begin(), iterEnd = endcapDets.end();iter != iterEnd; ++iter){ try{ @@ -121,10 +181,10 @@ TrackCreator::TrackCreator(const Settings &settings, const pandora::Pandora *con }// if m_use_dd4hep_geo else{ - IGearSvc* iSvc = 0; - StatusCode sc = svcloc->service("GearSvc", iSvc, false); - if ( !sc ) throw "Failed to find GearSvc ..."; - _GEAR = iSvc->getGearMgr(); + //IGearSvc* iSvc = 0; + //StatusCode sc = svcloc->service("GearSvc", iSvc, false); + //if ( !sc ) throw "Failed to find GearSvc ..."; + //_GEAR = iSvc->getGearMgr(); m_bField = (_GEAR->getBField().at(gear::Vector3D(0., 0., 0.)).z()); m_eCalBarrelInnerSymmetry = (_GEAR->getEcalBarrelParameters().getSymmetryOrder()); m_eCalBarrelInnerPhi0 = (_GEAR->getEcalBarrelParameters().getPhi0()); diff --git a/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp b/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp index 83edea103d7fab42363d57e7076ba8b4c7829177..3f054df12ae7fc59912e142d67610672a1992d0a 100644 --- a/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp +++ b/Reconstruction/PFA/Pandora/GaudiPandora/src/Utility.cpp @@ -35,7 +35,7 @@ std::vector<double> PanUtil::getTrackingRegionExtent(){ return extent; } -dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int includeFlag, unsigned int excludeFlag=0) { +dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int includeFlag, unsigned int excludeFlag) { dd4hep::rec::LayeredCalorimeterData * theExtension = 0; @@ -50,12 +50,12 @@ dd4hep::rec::LayeredCalorimeterData * PanUtil::getExtension(unsigned int include if( theDetectors.size() != 1 ){ std::stringstream es ; - es << " getExtension: selection is not unique (or empty) includeFlag: " << dd4hep::DetType( includeFlag ) << " excludeFlag: " << dd4hep::DetType( excludeFlag ) - << " --- found detectors : " ; + es << "return nullptr! getExtension: selection is not unique (or empty) includeFlag: " << dd4hep::DetType( includeFlag ) << " excludeFlag: " << dd4hep::DetType( excludeFlag ) << " --- found detectors : " ; for( unsigned i=0, N= theDetectors.size(); i<N ; ++i ){ es << theDetectors.at(i).name() << ", " ; } - throw std::runtime_error( es.str() ) ; + //throw std::runtime_error( es.str() ) ; + return nullptr; } theExtension = theDetectors.at(0).extension<dd4hep::rec::LayeredCalorimeterData>(); diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h index 708c33e38ba282c92f5d0f8ef579fde688d150f4..422ffd0fdcbe39fa4bb9bd3ca5bd85868494e8ec 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h +++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h @@ -55,26 +55,26 @@ namespace dd4hep { class GenfitTrack { friend int GenfitFitter::processTrack( - GenfitTrack* track, bool resort=false); + GenfitTrack* track, bool resort); friend int GenfitFitter::processTrackWithRep( - GenfitTrack* track, int repID=0, bool resort=false); + GenfitTrack* track, int repID, bool resort); friend double GenfitFitter::extrapolateToHit(TVector3& poca, TVector3& pocaDir, TVector3& pocaOnWire, double& doca, const GenfitTrack* track, TVector3 pos, TVector3 mom, TVector3 end0, TVector3 end1, int debug, - int repID=0, bool stopAtBoundary=false, bool calcJacobianNoise=false); + int repID, bool stopAtBoundary, bool calcJacobianNoise); friend double GenfitFitter::extrapolateToCylinder(TVector3& pos, TVector3& mom, GenfitTrack* track, double radius, const TVector3 linePoint, - const TVector3 lineDirection, int hitID =0, int repID=0, - bool stopAtBoundary=false, bool calcJacobianNoise=false); + const TVector3 lineDirection, int hitID, int repID, + bool stopAtBoundary, bool calcJacobianNoise); friend double GenfitFitter::extrapolateToPoint(TVector3& pos, TVector3& mom, - const GenfitTrack* genfitTrack, const TVector3& point, int repID=0, - bool stopAtBoundary = false, bool calcJacobianNoise = false) const; + const GenfitTrack* genfitTrack, const TVector3& point, int repID, + bool stopAtBoundary, bool calcJacobianNoise) const; public: GenfitTrack(const GenfitField* field, diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp index a84e074e7cc38232e9d4b7887c7ddacae87bf61b..655d921c2742cd2b066000275f79baa1113cc558 100644 --- a/Simulation/DetSimCore/src/DetSimAlg.cpp +++ b/Simulation/DetSimCore/src/DetSimAlg.cpp @@ -2,12 +2,14 @@ #include "GaudiKernel/IEventProcessor.h" #include "GaudiKernel/IAppMgrUI.h" #include "GaudiKernel/GaudiException.h" +#include "GaudiKernel/IRndmEngine.h" #include "G4RunManager.hh" #include "G4UImanager.hh" #include "G4VisExecutive.hh" #include "G4UIExecutive.hh" +#include "Randomize.hh" #include "DetectorConstruction.h" #include "G4PhysListFactory.hh" #include "G4EmParameters.hh" @@ -30,6 +32,15 @@ DetSimAlg::initialize() { info() << "Initialize DetSimAlg... " << endmsg; + // Initialize random seed + if (not m_randomSeeds.empty()) { + randSvc()->engine()->setSeeds( m_randomSeeds ); + } + + info() << "Random Seed is initialized to " + << G4Random::getTheSeed() + << " in Geant4" << endmsg; + m_detsimsvc = service("DetSimSvc"); if (!m_detsimsvc) { error() << "Failed to find DetSimSvc. " << endmsg; diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h index 36646d9e8b449058aa7588cc8bbe89d3acff5342..bb4571c74ad2dceddab2fea70a551bea292ddea7 100644 --- a/Simulation/DetSimCore/src/DetSimAlg.h +++ b/Simulation/DetSimCore/src/DetSimAlg.h @@ -31,6 +31,8 @@ private: private: + Gaudi::Property<std::vector<long>> m_randomSeeds{this, "RandomSeeds", {}}; + Gaudi::Property<std::vector<std::string>> m_run_macs{this, "RunMacs"}; Gaudi::Property<std::vector<std::string>> m_run_cmds{this, "RunCmds"}; Gaudi::Property<std::vector<std::string>> m_vis_macs{this, "VisMacs"}; diff --git a/Utilities/DataHelper/CMakeLists.txt b/Utilities/DataHelper/CMakeLists.txt index 0583b24bdabbbe3328ac3c8d357502ba2115fe9c..c2d23702b687d3aa123186e8ec348b10543ca825 100644 --- a/Utilities/DataHelper/CMakeLists.txt +++ b/Utilities/DataHelper/CMakeLists.txt @@ -15,10 +15,12 @@ gaudi_add_library(DataHelperLib src/TrackerHitExtended.cc src/TrackExtended.cc src/TrackHitPair.cc + src/TrackerHitHelper.cpp LINK EDM4HEP::edm4hep EDM4HEP::edm4hepDict ${GSL_LIBRARIES} ${CLHEP_LIBRARIES} + Identifier ) install(TARGETS DataHelperLib diff --git a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h new file mode 100644 index 0000000000000000000000000000000000000000..fcd9dd146b9268b581eb2246f89b1615fc3fb6db --- /dev/null +++ b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h @@ -0,0 +1,14 @@ +#ifndef TrackerHitHelper_H +#define TrackerHitHelper_H + +#include "edm4hep/TrackerHit.h" +#include <array> + +namespace CEPC{ + std::array<float, 6> GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePointerBuilderMethod = false); + float GetResolutionRPhi(edm4hep::TrackerHit& hit); + float GetResolutionZ(edm4hep::TrackerHit& hit); + std::array<float, 6> ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod = false); +} + +#endif diff --git a/Utilities/DataHelper/src/TrackerHitHelper.cpp b/Utilities/DataHelper/src/TrackerHitHelper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e12eb886c5aa7863f320b1157d278948cf21c880 --- /dev/null +++ b/Utilities/DataHelper/src/TrackerHitHelper.cpp @@ -0,0 +1,117 @@ +#include "DataHelper/TrackerHitHelper.h" +#include "Identifier/CEPCConf.h" + +#include "TMatrixF.h" +#include "CLHEP/Matrix/SymMatrix.h" +#include "CLHEP/Matrix/Matrix.h" +#include "CLHEP/Vector/ThreeVector.h" +#include "CLHEP/Vector/Rotation.h" +#include <bitset> + +std::array<float,6> CEPC::GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePointBuilderMethod){ + if(hit.isAvailable()){ + int type = hit.getType(); + if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){ + return hit.getCovMatrix(); + } + else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){ + float thetaU = hit.getCovMatrix(0); + float phiU = hit.getCovMatrix(1); + float dU = hit.getCovMatrix(2); + float thetaV = hit.getCovMatrix(3); + float phiV = hit.getCovMatrix(4); + float dV = hit.getCovMatrix(5); + return ConvertToCovXYZ(dU, thetaU, phiU, dV, thetaV, phiV, useSpacePointBuilderMethod); + } + else{ + std::cout << "Warning: not SpacePoint and Planar, return original cov matrix preliminaryly." << std::endl; + return hit.getCovMatrix(); + } + } + std::array<float,6> cov{0.,0.,0.,0.,0.,0.}; + return cov; +} + +float CEPC::GetResolutionRPhi(edm4hep::TrackerHit& hit){ + if(hit.isAvailable()){ + int type = hit.getType(); + if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){ + return sqrt(hit.getCovMatrix(0)+hit.getCovMatrix(2)); + } + else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){ + return hit.getCovMatrix(2); + } + else{ + std::cout << "Warning: not SpacePoint and Planar, return value from original cov matrix preliminaryly." << std::endl; + return sqrt(hit.getCovMatrix(0)+hit.getCovMatrix(2)); + } + } + return 0.; +} + +float CEPC::GetResolutionZ(edm4hep::TrackerHit& hit){ + if(hit.isAvailable()){ + int type = hit.getType(); + if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::COMPOSITE_SPACEPOINT]){ + return sqrt(hit.getCovMatrix(5)); + } + else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){ + return hit.getCovMatrix(5); + } + else{ + std::cout << "Warning: not SpacePoint and Planar, return value from original cov matrix preliminaryly." << std::endl; + return sqrt(hit.getCovMatrix(5)); + } + } + return 0.; +} + +std::array<float, 6> CEPC::ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod){ + std::array<float,6> cov{0.,0.,0.,0.,0.,0.}; + if(!useSpacePointBuilderMethod){ + TMatrixF diffs(2,3); + TMatrixF diffsT(3,2); + diffs(0,0) = sin(thetaU)*cos(phiU); + diffs(0,1) = sin(thetaU)*sin(phiU); + diffs(0,2) = cos(thetaU); + diffs(1,0) = sin(thetaV)*cos(phiV); + diffs(1,1) = sin(thetaV)*sin(phiV); + diffs(1,2) = cos(thetaV); + + diffsT.Transpose(diffs); + + TMatrixF covMatrixUV(2,2); + covMatrixUV(0,0) = dU*dU; + covMatrixUV(0,1) = 0; + covMatrixUV(1,0) = 0; + covMatrixUV(1,1) = dV*dV; + + TMatrixF covMatrixXYZ(3,3); + covMatrixXYZ = diffsT*covMatrixUV*diffs; + cov[0] = covMatrixXYZ(0,0); + cov[1] = covMatrixXYZ(1,0); + cov[2] = covMatrixXYZ(1,1); + cov[3] = covMatrixXYZ(2,0); + cov[4] = covMatrixXYZ(2,1); + cov[5] = covMatrixXYZ(2,2); + } + else{ // Method used in SpacePointBuilder, results are almost same with above + CLHEP::Hep3Vector u_sensor(sin(thetaU)*cos(phiU), sin(thetaU)*sin(phiU), cos(thetaU)); + CLHEP::Hep3Vector v_sensor(sin(thetaV)*cos(phiV), sin(thetaV)*sin(phiV), cos(thetaV)); + CLHEP::Hep3Vector w_sensor = u_sensor.cross(v_sensor); + CLHEP::HepRotation rot_sensor(u_sensor, v_sensor, w_sensor); + CLHEP::HepMatrix rot_sensor_matrix; + rot_sensor_matrix = rot_sensor; + CLHEP::HepSymMatrix cov_plane(3,0); + cov_plane(1,1) = dU*dU; + cov_plane(2,2) = dV*dV; + CLHEP::HepSymMatrix cov_xyz= cov_plane.similarity(rot_sensor_matrix); + cov[0] = cov_xyz[0][0]; + cov[1] = cov_xyz[1][0]; + cov[2] = cov_xyz[1][1]; + cov[3] = cov_xyz[2][0]; + cov[4] = cov_xyz[2][1]; + cov[5] = cov_xyz[2][2]; + } + return cov; +} diff --git a/cmake/CEPCSWConfig.cmake b/cmake/CEPCSWConfig.cmake index 4f9445ac3683765653b333811ce5ca8803cec5c6..c008c2f82eae85e547b939a54d87cb190073bdfa 100644 --- a/cmake/CEPCSWConfig.cmake +++ b/cmake/CEPCSWConfig.cmake @@ -2,6 +2,7 @@ include(CMakeFindDependencyMacro) find_dependency(podio REQUIRED) find_dependency(Gaudi REQUIRED) find_dependency(k4FWCore REQUIRED) +find_dependency(k4LCIOReader REQUIRED) find_dependency(EDM4HEP REQUIRED) find_dependency(ROOT REQUIRED) diff --git a/cmake/FindHepMC.cmake b/cmake/FindHepMC.cmake new file mode 100644 index 0000000000000000000000000000000000000000..5e5714c9a6e9a3a19ca6adb48ea47d66de044870 --- /dev/null +++ b/cmake/FindHepMC.cmake @@ -0,0 +1,36 @@ +# - Locate HepMC library +# Defines: +# +# HEPMC_FOUND +# HEPMC_INCLUDE_DIR +# HEPMC_INCLUDE_DIRS (not cached) +# HEPMC_<component>_LIBRARY +# HEPMC_LIBRARIES (not cached) +# HEPMC_LIBRARY_DIRS (not cached) + +find_path(HEPMC_INCLUDE_DIR HepMC/GenEvent.h + HINTS ${HEPMC_ROOT_DIR}/include $ENV{HEPMC_ROOT_DIR}/include) +set(HEPMC_INCLUDE_DIRS ${HEPMC_INCLUDE_DIR}) + +if(NOT HepMC_FIND_COMPONENTS) + set(HepMC_FIND_COMPONENTS HepMC) +endif() +foreach(component ${HepMC_FIND_COMPONENTS}) + find_library(HEPMC_${component}_LIBRARY + NAMES HepMC${component} ${component} + HINTS ${HEPMC_ROOT_DIR}/lib $ENV{HEPMC_ROOT_DIR}/lib) + mark_as_advanced(HEPMC_${component}_LIBRARY) + list(APPEND HEPMC_LIBRARIES ${HEPMC_${component}_LIBRARY}) + get_filename_component(_comp_dir ${HEPMC_${component}_LIBRARY} PATH) + list(APPEND HEPMC_LIBRARY_DIRS ${_comp_dir}) +endforeach() +if(HEPMC_LIBRARY_DIRS) + list(REMOVE_DUPLICATES HEPMC_LIBRARY_DIRS) +endif() + +# handle the QUIETLY and REQUIRED arguments and set HEPMC_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(HepMC DEFAULT_MSG HEPMC_INCLUDE_DIR HEPMC_LIBRARIES) + +mark_as_advanced(HEPMC_FOUND HEPMC_INCLUDE_DIR)