diff --git a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp index 01bd3572b8d3fdf99fd4068d8f14999ea8fa31ea..51aaaabe534bcf50aac95705ae7b7b4126a3e297 100644 --- a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp +++ b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp @@ -126,7 +126,11 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h dd4hep::Material sensitiveMat = theDetector.material(db->fetchString("sensitive_mat")); dd4hep::Material supportMat = theDetector.material(db->fetchString("support_mat")); - + db = XMLHandlerDB( x_det.child( _Unicode( display ) ) ) ; + std::string ladderVis = db->fetchString("ladder"); + std::string supportVis = db->fetchString("support"); + std::string sensEnvVis = db->fetchString("sens_env"); + std::string sensVis = db->fetchString("sens"); // // // setup the encoder // // UTIL::BitField64 encoder( LCTrackerCellID::encoding_string() ) ; @@ -286,7 +290,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h layer_geom.ladder_width / 2.0, layer_geom.half_z); - dd4hep::Volume sitLadderLogical( dd4hep::_toString( layer_id,"SIT_LadderLogical_%02d"), sitLadderSolid, air ) ; + dd4hep::Volume sitLadderLogical( name + dd4hep::_toString( layer_id,"_LadderLogical_%02d"), sitLadderSolid, air ) ; // now create an envelope volume to represent the sensitive area, which will be divided up into individual sensors @@ -295,7 +299,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h layer_geom.half_z); //fixme: material ??? Volume sitSenEnvelopeLogical( _toString( layer_id,"SIT_SenEnvelopeLogical_%02d"), sitSenEnvelopeSolid, sensitiveMat ) ; - dd4hep::Volume sitSenEnvelopeLogical( dd4hep::_toString( layer_id,"SIT_SenEnvelopeLogical_%02d"), + dd4hep::Volume sitSenEnvelopeLogical( name + dd4hep::_toString( layer_id,"_SenEnvelopeLogical_%02d"), sitSenEnvelopeSolid, air ) ; // create the sensor volumes and place them in the senstive envelope volume @@ -304,7 +308,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h layer_geom.ladder_width / 2.0, (layer_geom.sensor_length / 2.0 ) - 1.e-06 * dd4hep::mm ); // added tolerance to avoid false overlap detection - dd4hep::Volume sitSenLogical( dd4hep::_toString( layer_id,"SIT_SenLogical_%02d"), sitSenSolid,sensitiveMat ) ; + dd4hep::Volume sitSenLogical( name + dd4hep::_toString( layer_id,"_SenLogical_%02d"), sitSenSolid,sensitiveMat ) ; sitSenLogical.setSensitiveDetector(sens); @@ -371,10 +375,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h pvV[isensor] = pv ; } - sit.setVisAttributes(theDetector, "SeeThrough", sitLadderLogical ) ; - sit.setVisAttributes(theDetector, "SeeThrough", sitSenEnvelopeLogical ) ; + sit.setVisAttributes(theDetector, ladderVis, sitLadderLogical ) ; + sit.setVisAttributes(theDetector, sensEnvVis, sitSenEnvelopeLogical ) ; - sit.setVisAttributes(theDetector, "BlueVis", sitSenLogical ) ; + sit.setVisAttributes(theDetector, sensVis, sitSenLogical ) ; // encoder.reset() ; // reset to 0 @@ -398,10 +402,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h layer_geom.ladder_width / 2.0, layer_geom.half_z); - Volume sitSupLogical( _toString( layer_id,"SIT_SupLogical_%02d"), sitSupSolid, supportMat ) ; + Volume sitSupLogical( name + _toString( layer_id,"_SupLogical_%02d"), sitSupSolid, supportMat ) ; - sit.setVisAttributes(theDetector, "RedVis", sitSupLogical ) ; + sit.setVisAttributes(theDetector, supportVis, sitSupLogical ) ; pv = sitLadderLogical.placeVolume( sitSupLogical, Transform3D( RotationY( 0.), @@ -472,6 +476,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h //-------------------------------------- sit.setVisAttributes( theDetector, x_det.visStr(), envelope ); + + if ( x_det.hasAttr(_U(combineHits)) ) { + sit.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } return sit; } diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt index 55e3317890aa2f7420ac0b7298a9bcb66b631004..4a92fed45c70d5483398dc43e4e8abecd79ef302 100644 --- a/Detector/DetCRD/CMakeLists.txt +++ b/Detector/DetCRD/CMakeLists.txt @@ -16,8 +16,10 @@ find_package(ROOT COMPONENTS MathCore GenVector Geom REQUIRED) # install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/compact DESTINATION Detector/DetCRD) gaudi_add_module(DetCRD - SOURCES src/Calorimeter/CRDEcal.cpp + SOURCES src/Calorimeter/CRDEcal_v01.cpp src/Other/CRDBeamPipe_v01_geo.cpp + src/Tracker/SiTrackerSkewRing_v01_geo.cpp + LINK ${DD4hep_COMPONENT_LIBRARIES} ) diff --git a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml index 6d3b3a7fd640577efeb8d5b56930e0ea551d06a7..99930c35d8b086bf160b5e53c925eb1589a1d342 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml @@ -12,7 +12,7 @@ </regions> <detectors> - <detector id="DetID_ECAL" name="CaloDetector" type="CRDEcalBarrel" readout="EcalBarrelCollection" vis="Invisible" sensitive="true" region="EcalBarrelRegion"> + <detector id="DetID_ECAL" name="CaloDetector" type="CRDEcalBarrel_v01" readout="EcalBarrelCollection" vis="Invisible" sensitive="true" region="EcalBarrelRegion"> <!-- Use cm as unit if you want to use Pandora for reconstruction --> </detector> </detectors> @@ -25,7 +25,7 @@ grid_size_x="1*cm" grid_size_y="1*cm" grid_size_z="1*cm"/--> - <id>system:4,layer:6,block:8,bar:10</id> + <id>system:5,module:3,stave:4,dlayer:5,part:3,slayer:32:2,bar:6</id> </readout> </readouts> diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..bb9f361b4ae675201e9a5aeb4d35ab4ead476576 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml @@ -0,0 +1,54 @@ +<lccdd> + <define> + <constant name="SiliconThickness" value="0.2*mm"/> + <constant name="SupportThickness" value="1.0*mm"/> + <constant name="ModuleZGap" value="1.0*mm"/> + <constant name="ModuleRPhiGap" value="-10*mm"/> + </define> + + <detectors> + <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true"> + <envelope> + <shape type="Assembly"/> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> + + <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/> + + <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="4" z="SiTracker_endcap_z5" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z5*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius5" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + + </detector> + </detectors> + + <readouts> + <readout name="FTDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..198426b4266fdfe0cfcdf4e530b2b83162e3dc0a --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml @@ -0,0 +1,49 @@ +<lccdd> + <define> + <constant name="SiliconThickness" value="0.2*mm"/> + <constant name="SupportThickness" value="1.0*mm"/> + <constant name="ModuleZGap" value="1.0*mm"/> + <constant name="ModuleRPhiGap" value="-10*mm"/> + </define> + + <detectors> + <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true"> + <envelope> + <shape type="Assembly"/> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> + + <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/> + + <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4" + phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough"> + <component material="G4_Si" thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/> + <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/> + </layer> + + </detector> + </detectors> + + <readouts> + <readout name="FTDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml new file mode 100644 index 0000000000000000000000000000000000000000..f40a2f2286171dcc90791c7613c29d34afde7c95 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml @@ -0,0 +1,43 @@ +<lccdd> + <define> + <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0--> + <constant name="SET_sensitive_thickness" value="0.17*mm"/> + <constant name="SET_support_thickness" value="1.0*mm"/> + <constant name="SET_sensor_length" value="92*mm"/> + <constant name="SET_ladder_number" value="2*pi*SET_inner_radius/SIT_sensor_length"/> + <constant name="SET_outer_radius" value="(SET_inner_radius+SET_sensitive_thickness+SET_support_thickness)/cos(pi/SET_ladder_number) + env_safety"/> + <constant name="SET_half_length" value="OuterTracker_half_length"/> + <!--constant name="SET_distance_from_tpc" value="SET_inner_radius-OuterTracker_outer_radius+0.5*SET_sensitive_thickness"/--> + </define> + + <detectors> + <!--detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true"--> + <detector id="DetID_SET" name="SET" type="SIT_Simple_Pixel" vis="SETVis" readout="SETCollection" insideTrackingVolume="true"> + <envelope> + <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length" material = "Air" /> + </envelope> + + <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_PIXEL "/> + + <reconstruction strip_width="0." strip_length="0." strip_pitch="0." strip_angle="0*deg" /> + + <global sensitive_thickness="SET_sensitive_thickness" support_thickness="SET_support_thickness" sensor_length="SIT_sensor_length" sensitive_mat="G4_Si" + support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> + <display ladder="SeeThrough" support="SETSupportVis" sens_env="SeeThrough" sens="SETSensitiveVis" /> + + <!--layer layer_id="0" sensitive_distance_from_tpc="SET_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="1.0" + n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1" /--> + <layer layer_id="0" sensitive_radius="SET_inner_radius+0.5*SET_sensitive_thickness" n_sensors_per_ladder="SET_half_length*2/SIT_sensor_length" + n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="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/SET_SimplePlanar_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml index 82071ac2591c17718373cb53e88abbb6313702bd..1c9ec38ccd46841dde89ef090ab4ab9dee316751 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml @@ -1,34 +1,31 @@ <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="DC_half_length"/> + <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0--> + <constant name="SET_sensitive_thickness" value="0.17*mm"/> + <constant name="SET_support_thickness" value="1.0*mm"/> + <constant name="SET_ladder_number" value="24"/> + <constant name="SET_outer_radius" value="(SET_inner_radius+SET_sensitive_thickness*2+SET_support_thickness*2)/cos(pi/SET_ladder_number) + env_safety"/> + <constant name="SET_half_length" value="OuterTracker_half_length"/> + <constant name="SET_distance_from_tpc" value="SET_inner_radius-OuterTracker_outer_radius+0.5*SET_sensitive_thickness"/> </define> <detectors> <detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true"> - <envelope vis="SETVis"> - <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length" material = "Air" /> + <envelope> + <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length" material = "Air" /> </envelope> <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/> - <!-- database : set_simple_planar_sensors_01 --> - - <!-- SQL command: "select * from extended_reconstruction_parameters;" --> <reconstruction strip_width="0.0125*mm" strip_length="92*mm" strip_pitch="0.05*mm" strip_angle="7*deg" /> - <!-- SQL command: "select * from global;" --> - <global sensitive_thickness="0.2*mm" support_thickness="1*mm" sensor_length="92*mm" sensitive_mat="G4_Si" + <global sensitive_thickness="SET_sensitive_thickness" support_thickness="SET_support_thickness" sensor_length="92*mm" sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> - <!-- SQL command: "select * from set_layers;" --> - - <layer layer_id="0" 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="1" 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" /> + <layer layer_id="0" sensitive_distance_from_tpc="SET_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="1.0" + n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1" /> + <layer layer_id="1" sensitive_distance_from_tpc="SET_distance_from_tpc+SET_support_thickness*2+SET_sensitive_thickness" coverage_of_TPC_Ecal_Hcal_barrel="1.0" + n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="0" /> </detector> 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 index 02a49d5eaa5a5fd32f68e2d51987d7c64505680f..92dd20c92d72dea5686e258a334253743347ec86 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml @@ -1,42 +1,46 @@ <lccdd> <define> - <constant name="SIT_sensitive_thickness" value="0.2*mm"/> - <constant name="SIT_inner_radius" value="SIT1_inner_radius"/> + <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0--> + <constant name="SIT_sensitive_thickness" value="0.17*mm"/> + <constant name="SIT_support_thickness" value="1*mm"/> + <constant name="SIT_sensor_length" value="92*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="OuterTracker_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"/> + <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" > + <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Pixel" vis="SITVis" readout="SITCollection" insideTrackingVolume="true"> + <envelope> + <shape type="Assembly"/> + <!--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> + </shape--> </envelope> - <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/> + <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_PIXEL "/> - <!-- 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="0." 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" + <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="SIT_support_thickness" sensor_length="SIT_sensor_length" sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> + <display ladder="SeeThrough" support="SITSupportVis" sens_env="SeeThrough" sens="SITSensitiveVis" /> - <!-- 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="0" sensitive_radius="SIT1_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT1_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT1_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0" /> + <layer layer_id="1" sensitive_radius="SIT2_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT2_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT2_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1" /> + <layer layer_id="2" sensitive_radius="SIT3_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT3_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT3_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0" /> + <layer layer_id="3" sensitive_radius="SIT4_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT4_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT4_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" 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> diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml new file mode 100644 index 0000000000000000000000000000000000000000..01b0759976b96223fb1938c4679d728d386891d3 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml @@ -0,0 +1,51 @@ +<lccdd> + <define> + <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0--> + <constant name="SIT_sensitive_thickness" value="0.17*mm"/> + <constant name="SIT_support_thickness" value="1*mm"/> + <constant name="SIT_sensor_length" value="92*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="OuterTracker_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_Pixel" vis="SITVis" readout="SITCollection" insideTrackingVolume="true"> + <envelope> + <shape type="Assembly"/> + <!--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_PIXEL "/> + + <reconstruction strip_width="0." strip_length="0." strip_pitch="0." strip_angle="0*deg" /> + + <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="SIT_support_thickness" sensor_length="SIT_sensor_length" + sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV" /> + <display ladder="SeeThrough" support="SITSupportVis" sens_env="SeeThrough" sens="SITSensitiveVis" /> + + <layer layer_id="0" sensitive_radius="SIT1_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT1_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT1_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0" /> + <layer layer_id="1" sensitive_radius="SIT2_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT2_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT2_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1" /> + <layer layer_id="2" sensitive_radius="SIT3_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT3_half_length*2/SIT_sensor_length" + n_ladders="2*pi*SIT3_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0" /> + + </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/src/Calorimeter/CRDEcal_v01.cpp b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f75648822cdf44352cd3cec502d292c1157b7d2c --- /dev/null +++ b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp @@ -0,0 +1,193 @@ +//==================================================================== +// Detector description for CEPC Reference Detector ECal Barrel. +//-------------------------------------------------------------------- +// +// Author: Fangyi Guo email: guofangyi@ihep.ac.cn +// Ecal cosists of long crystal bar 1cm*1cm*~40cm +// 8 parts cover 2pi phi range. Inner radius, height, z-length can change from xml. +// In each part, crystal bar crosses in odd-even layer. +// +// v0r0: nothing but BGO crystal +// v01: use double-layer as basic block, for cross-location in reconstruction. +// layout: 8 module +// ->14 double-layer(dlayer) in R-direction +// ->10 part along Z-direction +// ->4 block along phi-direction (4*10*14 blocks in each module). +// ->2 sub-layer (bars in 0 sub-layer along phi direction, in 1 sub-layer along z direction). +// ->N bar. +//==================================================================== +#include "DD4hep/DetFactoryHelper.h" +#include "XML/Layering.h" +#include "XML/Utilities.h" +#include "DDRec/DetectorData.h" +#include "DDSegmentation/Segmentation.h" + +#define MYDEBUG(x) std::cout << __FILE__ << ":" << __LINE__ << ": " << x << std::endl; +#define MYDEBUGVAL(x) std::cout << __FILE__ << ":" << __LINE__ << ": " << #x << ": " << x << std::endl; + +using dd4hep::rec::LayeredCalorimeterData; +using namespace dd4hep; +using namespace std; +static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, + xml_h e, + dd4hep::SensitiveDetector sens) { + + xml_det_t x_det = e; + + std::string det_name = x_det.nameStr(); + std::string det_type = x_det.typeStr(); + MYDEBUGVAL(det_name); + MYDEBUGVAL(det_type); + int detid = x_det.id(); + + //Global geometry + double R0 = theDetector.constant<double>("ecalbarrel_inner_radius"); + double h0 = theDetector.constant<double>("ecalbarrel_thickness"); + double Z0 = theDetector.constant<double>("ecalbarrel_zlength"); + double barx = theDetector.constant<double>("bar_x"); //Crystal size in R direction. + double bary = theDetector.constant<double>("bar_y"); //Crystal size in z/phi direction (z for odd layer, phi for even layer). + + double dim_x1 = R0*tan(22.5*degree) + sqrt(2)*h0/2.; + double dim_x2 = dim_x1 - h0; + double dim_y = Z0/2.; + double dim_z = h0/2.; + double dx = dim_x1 - R0*tan(22.5*degree); //transport distance in x-axis + double r0 = R0+h0/2.; //rotation radius + + //Crystal bar size + int Nlayers = (int)h0/(2*barx); //14 double-layers. + int Nblock_z = 11; //block number in z direction + int Nblock_phi = 4; //block number in phi direction + double barz_s0; //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. + double barz_s1 = Z0/Nblock_z; //Crystal bar lenghth in sub-layer 1(z direction, 46cm). + int Nbar_phi; //Crystal bar number in each block, in phi direction. + int Nbar_z = (int)barz_s1/bary; //Crystal bar number in each block, in z direction. + + //Define detector and motherVolume(world) + dd4hep::DetElement ECAL(det_name, detid); + dd4hep::Volume motherVol = theDetector.pickMotherVolume(ECAL); + + // Create a Tube-like envelope representing the whole detector volume + dd4hep::PolyhedraRegular envelope(8, 22.5*degree, R0, (R0+h0), Z0); + dd4hep::Material air(theDetector.material("Air")); + dd4hep::Volume envelopeVol(det_name, envelope, air); + dd4hep::PlacedVolume envelopePlv = motherVol.placeVolume(envelopeVol, Position(0,0,0)); + envelopePlv.addPhysVolID("system",x_det.id()); + envelopeVol.setVisAttributes(theDetector, "InvisibleWithChildren" ); + ECAL.setPlacement(envelopePlv); + + //Define specific material and volumen for detElement + dd4hep::Material mat_BGO(theDetector.material("G4_BGO")); + dd4hep::Trapezoid trap(dim_x1, dim_x2, dim_y, dim_y, dim_z); + dd4hep::Volume det_vol("trap_vol", trap, mat_BGO); + det_vol.setVisAttributes(theDetector, "InvisibleWithChildren"); + + dd4hep::Trapezoid subtrap(dim_x1, dim_x2, dim_y/Nblock_z, dim_y/Nblock_z, dim_z); + dd4hep::Volume det_stave("stave_vol", subtrap, mat_BGO); + det_stave.setVisAttributes(theDetector, "InvisibleWithChildren"); + + // Create extension objects for reconstruction + LayeredCalorimeterData* caloData = new LayeredCalorimeterData ; + for(int il=0;il<Nlayers; il++){ + //used for reconstruction, so write a 1*1*2 layer cell size. No absorber or dead-meaterial. + dd4hep::rec::LayeredCalorimeterData::Layer _caloLayer; + _caloLayer.distance = R0+il*2*barx; + _caloLayer.phi0 = 0; + _caloLayer.absorberThickness = 0; + _caloLayer.inner_nRadiationLengths = 0.01; + _caloLayer.inner_nInteractionLengths = 0.01; + _caloLayer.outer_nRadiationLengths = 0.01; + _caloLayer.outer_nInteractionLengths = 0.01; + _caloLayer.inner_thickness = barx; //1cm + _caloLayer.outer_thickness = barx; //1cm + _caloLayer.sensitive_thickness = 2*barx; //2cm + _caloLayer.cellSize0 = barx; //1cm + _caloLayer.cellSize1 = barx; //1cm + caloData->layers.push_back(_caloLayer); + } + + caloData->layoutType = LayeredCalorimeterData::BarrelLayout ; + caloData->inner_symmetry = 8 ; + caloData->outer_symmetry = 8 ; + caloData->phi0 = 0 ; // hardcoded + + // extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm. + caloData->extent[0] = R0 ; + caloData->extent[1] = R0+h0; + caloData->extent[2] = 0. ; + caloData->extent[3] = Z0 ; + + + //Loop to place crystalls in one part + //Outer loop: layer (odd layer). + dd4hep::Volume bar_s1("bar_s1", dd4hep::Box(bary/2, barz_s1/2, barx/2), mat_BGO); + bar_s1.setVisAttributes(theDetector, "VisibleRed"); + bar_s1.setSensitiveDetector(sens); + + dd4hep::DetElement stavedet(ECAL, "trap",detid); + for(int ilayer=1; ilayer<=Nlayers; ilayer++){ + double lx = dim_x1 - ilayer*2*barx; + barz_s0 = floor(2*lx/Nblock_phi); + Nbar_phi = (int)barz_s0/bary; + dd4hep::Volume bar_s0("bar_s0", dd4hep::Box(barz_s0/2, bary/2, barx/2), mat_BGO); + bar_s0.setVisAttributes(theDetector, "VisibleGreen"); + bar_s0.setSensitiveDetector(sens); + for(int iphi=1; iphi<=Nblock_phi; iphi++){ + dd4hep::Volume block("block", dd4hep::Box(barz_s0/2, barz_s1/2, barx), mat_BGO); + block.setVisAttributes(theDetector, "VisibleGreen"); + //std::string blockname = "Block_"+std::to_string(ilayer)+"_"+std::to_string(iphi)+"_"+std::to_string(iz); + std::string blockname = "Block_"+std::to_string(ilayer)+"_"+std::to_string(iphi); + dd4hep::DetElement sd(stavedet, blockname, detid); + + //sub-layer 0: bars along phi. length=barz_s0. Bar num=Nbar_z + for(int ibar0=1;ibar0<=Nbar_z;ibar0++){ + dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0,(2*ibar0-1)*bary/2-barz_s1/2, -barx/2)); + plv_bar0.addPhysVolID("slayer",0).addPhysVolID("bar",ibar0); + std::string barname0 = "CrystalBar_s0_"+std::to_string(ibar0); + dd4hep::DetElement bardet0(sd, barname0, detid); + bardet0.setPlacement(plv_bar0); + } + + //sub-layer1 + for(int ibar1=1;ibar1<=Nbar_phi;ibar1++){ + dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position((2*ibar1-1)*bary/2-barz_s0/2, 0, barx/2)); + plv_bar1.addPhysVolID("slayer",1).addPhysVolID("bar",ibar1); + std::string barname1 = "CrystalBar_s1_"+std::to_string(ibar1); + dd4hep::DetElement bardet1(sd, barname1, detid); + bardet1.setPlacement(plv_bar1); + } + + //dd4hep::PlacedVolume plv = det_vol.placeVolume(block, Position(lx-(2*iphi-1)*barz_s0/2, (2*iz-1)*barz_s1/2-dim_y, (2*ilayer-1)*bary-dim_z)); + dd4hep::PlacedVolume plv = det_stave.placeVolume(block, Position(lx-(2*iphi-1)*barz_s0/2, 0, (2*ilayer-1)*bary-dim_z)); + plv.addPhysVolID("dlayer", ilayer).addPhysVolID("part", iphi); + sd.setPlacement(plv); + + } + } + + for(int iz=1; iz<=Nblock_z; iz++){ + dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, (2*iz-1)*barz_s1/2-dim_y, 0) ); + plv.addPhysVolID("stave", iz); + DetElement sd(stavedet, _toString(iz,"stave%3d"), detid); + sd.setPlacement(plv); + } + + for(int i=0;i<8;i++){ + double rotAngle = 45*i*degree; + double posx = -r0*sin(rotAngle) - dx*cos(rotAngle); + double posy = r0*cos(rotAngle) - dx*sin(rotAngle); + dd4hep::Transform3D transform(dd4hep::RotationZ(rotAngle)*dd4hep::RotationX(-90*degree), dd4hep::Position(posx, posy, 0.)); + dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform); + plv.addPhysVolID("module", i); + DetElement sd(ECAL, _toString(i,"trap%3d"), detid); + sd.setPlacement(plv); + } + + sens.setType("calorimeter"); + ECAL.addExtension< LayeredCalorimeterData >( caloData ) ; + + MYDEBUG("create_detector DONE. "); + return ECAL; +} + +DECLARE_DETELEMENT(CRDEcalBarrel_v01, create_detector) diff --git a/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp b/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f768ac8ef312b020f5f1b6f0bb023cabc470a4d --- /dev/null +++ b/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp @@ -0,0 +1,227 @@ +// $Id: $ +//========================================================================== +// Detector description implementation for CEPC +//-------------------------------------------------------------------------- +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : FU Chengdong +//========================================================================== +// Specialized generic detector constructor for skew planar +// _______________ +// \ | / +// \ | / +// \ | / +// \ | / +// \__|__/ +// center +// +// z : z position at maximum radius of center +// dz : z gap between odd and even modules +// gap : rphi gap between neighbouring modules +// rmin : minimum radius at center +// rmax : maximum radius at center +// phi0 : start phi for #0 module +// skew : skew angle +// nmodules: module number at phi direction +// is_pixel: pixel tag for reconstruction +//========================================================================== +#include <DD4hep/Detector.h> +#include "DD4hep/DetFactoryHelper.h" +#include "XML/Utilities.h" +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "Math/AxisAngle.h" + +#include <map> + +using namespace std; + +using dd4hep::DetElement; +using dd4hep::Detector; +using dd4hep::Material; +using dd4hep::PlacedVolume; +using dd4hep::SensitiveDetector; +using dd4hep::Volume; +using dd4hep::Trap; +using dd4hep::_toString; +using dd4hep::Position; +using dd4hep::Transform3D; +using dd4hep::Rotation3D; +using dd4hep::RotationZYX; + +static dd4hep::Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens){ + typedef vector<PlacedVolume> Placements; + xml_det_t x_det = e; + Material air = description.air(); + int det_id = x_det.id(); + string name = x_det.nameStr(); + bool reflect = x_det.reflect(false); + DetElement tracker(name, det_id); + + Volume envelope = dd4hep::xml::createPlacedEnvelope(description, e, tracker); + dd4hep::xml::setDetectorTypeFlag(e, tracker) ; + if(description.buildType()==dd4hep::BUILD_ENVELOPE) return tracker; + envelope.setVisAttributes(description.visAttributes("SeeThrough")); + + sens.setType("tracker"); + std::cout << " ** building SiTrackerEndcapRing_v01 ..." << std::endl ; + + dd4hep::rec::ZDiskPetalsData* zDiskPetalsData = new dd4hep::rec::ZDiskPetalsData; + + PlacedVolume pv; + + for(xml_coll_t li(x_det,_U(layer)); li; ++li) { + xml_comp_t x_layer(li); + int layer_id = x_layer.id(); + + double zstart = x_layer.z(); + double dz = x_layer.dz(); + double rmin = x_layer.inner_r(); + double rmax = x_layer.outer_r(); + double phi0 = x_layer.phi0(0); + double skew = x_layer.skew(0); + double gap = x_layer.gap(); + bool is_pixel = x_layer.attr<bool>(_Unicode(is_pixel)); + int nmodules = x_layer.nmodules(); + + double dphi = 2*M_PI/nmodules; + double phi = phi0; + double x1 = rmin*tan(0.5*dphi) - 0.5*gap; + double x2 = rmax*tan(0.5*dphi) - 0.5*gap; + double half_width = (rmax-rmin)/2/cos(skew); + double rpos = (rmax+rmin)/2; + double zpos = zstart + half_width*sin(skew); + + double layer_thickness = 0.; + double sensitive_thickness[2] = {0.,0.}; + double support_thickness = 0.; + int nsensor = 0; + for(xml_coll_t ci(x_layer,_U(component)); ci; ++ci){ + xml_comp_t c = ci; + double thickness = c.thickness(); + layer_thickness += thickness; + if(c.isSensitive()){ + sensitive_thickness[nsensor] = thickness; + nsensor++; + } + else support_thickness += thickness; + } + double half_thickness = layer_thickness/2; + double zshift_support = dz + 0.5*(sensitive_thickness[0] + sensitive_thickness[1] + support_thickness); + + //std::cout << " ****Layer: " << layer_id << " nmodules = " << nmodules << " z = " << zpos << " zshift = " << zshift_support + // << " rmin = " << rmin << " rmax = " << rmax << " x1 = " << x1 << " x2 = " << x2 << " thickness = " << layer_thickness << std::endl; + + Trap moduleSolid(half_thickness, 0, 0, half_width, x1, x2, 0, half_width, x1, x2, 0); + Volume moduleVol(_toString(layer_id,"layer%d"), moduleSolid, air); + moduleVol.setVisAttributes(description.visAttributes(x_layer.visStr())); + + Placements sensitives; + int sensor_id = 1; + int c_id = 0; + double c_pos = -half_thickness; + for(xml_coll_t ci(x_layer,_U(component)); ci; ++ci, c_id++){ + xml_comp_t c = ci; + double c_thickness = c.thickness(); + Material c_mat = description.material(c.materialStr()); + string c_name = _toString(c_id,"component%d"); + Trap c_solid(c_thickness/2, 0, 0, half_width, x1, x2, 0, half_width, x1, x2, 0); + Volume c_vol(c_name, c_solid, c_mat); + c_vol.setVisAttributes(description.visAttributes(c.visStr())); + pv = moduleVol.placeVolume(c_vol,Position(0,0,c_pos+c_thickness/2)); + if(c.isSensitive()){ + tracker.check(sensor_id > 2," fromCompact: "+c_name+" Max of 2 modules allowed!"); + pv.addPhysVolID("sensor", sensor_id); + c_vol.setSensitiveDetector(sens); + sensitives.push_back(pv); + ++sensor_id; + } + c_pos += c_thickness; + } + + for(int module_id=0; module_id<nmodules; module_id++){ + + string m_base = _toString(layer_id,"layer%d") + _toString(module_id,"_module%d"); + + double x = rpos*std::cos(phi); + double y = rpos*std::sin(phi); + double zshift_layer = zshift_support - 0.5*sensitive_thickness[0] + 0.5*sensitive_thickness[1]; + //std::cout << "****** module_id = " << module_id << " phi = " << phi << " x = " << x << " y = " << y + // << " zsup = " << zpos+zshift_support << " zsens = " << zpos+zshift_support-0.5*sensitive_thickness[0]-0.5*support_thickness << std::endl; + DetElement module(tracker, m_base+"_pos", det_id); + Rotation3D rot = Rotation3D(ROOT::Math::AxisAngle(dd4hep::PositionPolar(1,M_PI/2,-M_PI/2+phi),-skew))*Rotation3D(RotationZYX(-M_PI/2+phi,0,0)); + pv = envelope.placeVolume(moduleVol, Transform3D(rot, Position(x,y,zpos+zshift_layer))); + pv.addPhysVolID("side",1).addPhysVolID("layer", layer_id).addPhysVolID("module",module_id); + module.setPlacement(pv); + for(size_t ic=0; ic<sensitives.size(); ++ic) { + PlacedVolume sens_pv = sensitives[ic]; + DetElement comp_elt(module, sens_pv.volume().name(), module_id); + comp_elt.setPlacement(sens_pv); + } + + if(reflect){ + Rotation3D rotRef = Rotation3D(ROOT::Math::AxisAngle(dd4hep::PositionPolar(1,M_PI/2,-M_PI/2+phi),skew))*Rotation3D(RotationZYX(M_PI/2-phi,M_PI,0)); + pv = envelope.placeVolume(moduleVol, Transform3D(rotRef, Position(x,y,-zpos-zshift_layer))); + pv.addPhysVolID("side",-1).addPhysVolID("layer",layer_id).addPhysVolID("module",module_id); + DetElement r_module(tracker, m_base+"_neg", det_id); + r_module.setPlacement(pv); + for(size_t ic=0; ic<sensitives.size(); ++ic) { + PlacedVolume sens_pv = sensitives[ic]; + DetElement comp_elt(r_module, sens_pv.volume().name(), module_id); + comp_elt.setPlacement(sens_pv); + } + } + zshift_support = -zshift_support; + phi += dphi; + } + + dd4hep::rec::ZDiskPetalsData::LayerLayout thisLayer; + thisLayer.typeFlags[ dd4hep::rec::ZDiskPetalsData::SensorType::DoubleSided ] = bool(sensor_id>2); + thisLayer.typeFlags[ dd4hep::rec::ZDiskPetalsData::SensorType::Pixel ] = is_pixel; + thisLayer.petalHalfAngle = dphi/2; + thisLayer.alphaPetal = skew; + thisLayer.zPosition = zpos; + thisLayer.petalNumber = nmodules; + thisLayer.sensorsPerPetal = sensor_id-1; + thisLayer.phi0 = phi0; + thisLayer.zOffsetSupport = fabs(zshift_support); + thisLayer.distanceSupport = rmin; + thisLayer.thicknessSupport = support_thickness; + thisLayer.widthInnerSupport = 2.*x1; + thisLayer.widthOuterSupport = 2.*x2; + thisLayer.lengthSupport = 2.*half_width; + thisLayer.zOffsetSensitive = fabs(zshift_support) - 0.5*support_thickness - 0.5*sensitive_thickness[0]; + thisLayer.distanceSensitive = rmin; + thisLayer.thicknessSensitive = sensitive_thickness[0]; + thisLayer.widthInnerSensitive = 2.*x1; + thisLayer.widthOuterSensitive = 2.*x2; + thisLayer.lengthSensitive = 2.*half_width; + + zDiskPetalsData->layers.push_back(thisLayer); + } + + dd4hep::xml::Component recPar = x_det.child(_Unicode(reconstruction)); + const double strip_width = recPar.attr< double >(_Unicode(strip_width)); + const double strip_length = recPar.attr< double >(_Unicode(strip_length)); + const double strip_pitch = recPar.attr< double >(_Unicode(strip_pitch)); + const double strip_angle = recPar.attr< double >(_Unicode(strip_angle)); + + zDiskPetalsData->widthStrip = strip_width; + zDiskPetalsData->lengthStrip = strip_length; + zDiskPetalsData->pitchStrip = strip_pitch; + zDiskPetalsData->angleStrip = strip_angle; + + std::cout << (*zDiskPetalsData) << std::endl; + tracker.addExtension<dd4hep::rec::ZDiskPetalsData>( zDiskPetalsData ); + + if ( x_det.hasAttr(_U(combineHits)) ) { + tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens); + } + + return tracker; +} + +DECLARE_DETELEMENT(SiTrackerSkewRing_v01, create_detector) diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp index cd161c13aeee0397eb925fc055a8b7f993fbe39e..30d5dccff6ac7c11754147fbeed747688e80d3e8 100644 --- a/Detector/DetSegmentation/src/GridDriftChamber.cpp +++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp @@ -128,6 +128,5 @@ double GridDriftChamber::distanceTrackWire(const CellID& cID, const TVector3& hi } -REGISTER_SEGMENTATION(GridDriftChamber) } } diff --git a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp index 06822bb910b8138d387f1a85e24aebf690941e8b..88d71d3c05c70a4e57d64454cc8f2ed7847d44e3 100644 --- a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp +++ b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp @@ -3,6 +3,7 @@ #include "EventSeeder/IEventSeeder.h" #include "TrackSystemSvc/ITrackSystemSvc.h" #include "DataHelper/Navigation.h" +#include "DataHelper/TrackerHitHelper.h" #include "edm4hep/MCParticle.h" #include "edm4hep/TrackerHit.h" //#include "edm4hep/TrackerHitPlane.h" @@ -420,7 +421,7 @@ int SiliconTrackingAlg::InitialiseFTD() { } catch ( GaudiException &e ) { debug() << "Collection " << _inFTDPixelColHdl.fullKey() << " is unavailable in event " << _nEvt << endmsg; - success = 0; + //success = 0; } if(hitFTDPixelCol){ @@ -520,7 +521,7 @@ int SiliconTrackingAlg::InitialiseFTD() { } catch ( GaudiException &e ) { debug() << "Collection " << _inFTDSpacePointColHdl.fullKey() << " is unavailable in event " << _nEvt << endmsg; - success = 0; + //success = 0; } const edm4hep::TrackerHitCollection* rawHitCol = nullptr; @@ -626,6 +627,8 @@ int SiliconTrackingAlg::InitialiseFTD() { } } + if(hitFTDPixelCol==nullptr&&hitFTDSpacePointCol==nullptr) success = 0; + debug() << "FTD initialized" << endmsg; return success; } @@ -771,7 +774,6 @@ int SiliconTrackingAlg::InitialiseVTX() { // v) Must be standard TrackerHit //const edm4hep::ConstTrackerHit trkhit = hitSITCol->at(ielem); - int layer = getLayerID(trkhit); // VXD and SIT are treated as one system so SIT layers start from _nLayersVTX @@ -2671,7 +2673,7 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) { // check if the hit has been rejected as being on the same layer and further from the helix lh==0 if (lh[i] == 1) { edm4hep::ConstTrackerHit trkHit = hitVec[i]->getTrackerHit(); - debug() << "TrackerHit " << i << " address = " << trkHit << endmsg; + debug() << "TrackerHit " << i << " id = " << trkHit.id() << endmsg; nFit++; if(trkHit.isAvailable()) { trkHits.push_back(trkHit); @@ -2791,7 +2793,7 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) { marlinTrk->getHitsInFit(hits_in_fit); for ( unsigned ihit = 0; ihit < hits_in_fit.size(); ++ihit) { - debug() << "Hit address=" << hits_in_fit[ihit].first << endmsg; + debug() << "Hit id =" << hits_in_fit[ihit].first.id() << endmsg; edm4hep::ConstTrackerHit trk = hits_in_fit[ihit].first; all_hits.push_back(trk);//hits_in_fit[ihit].first); } diff --git a/Service/GearSvc/CMakeLists.txt b/Service/GearSvc/CMakeLists.txt index 248cf3dfebc8ce42bca6f4e45c1803293989f853..a70dae702f0d31a63bd831d083bde979ad2e31eb 100644 --- a/Service/GearSvc/CMakeLists.txt +++ b/Service/GearSvc/CMakeLists.txt @@ -8,6 +8,7 @@ gaudi_add_module(GearSvcPlugins ${GEAR_LIBRARIES} ${DD4hep_COMPONENT_LIBRARIES} DetInterface + DetSegmentation ) install(TARGETS GearSvc GearSvcPlugins diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp index 274479f5d47ec58bae73034a6596cd50ba91ac3d..5e4f21754ade341c5b4f241891f185fef2618ba2 100644 --- a/Service/GearSvc/src/GearSvc.cpp +++ b/Service/GearSvc/src/GearSvc.cpp @@ -1,5 +1,7 @@ #include "GearSvc.h" #include "DetInterface/IGeomSvc.h" +#include "DetSegmentation/GridDriftChamber.h" + #include "gearxml/GearXML.h" #include "gearimpl/GearMgrImpl.h" #include "gearimpl/ConstantBField.h" @@ -93,6 +95,9 @@ StatusCode GearSvc::initialize() else if(it->first=="TPC"){ sc = convertTPC(sub); } + else if(it->first=="DriftChamber"){ + sc = convertDC(sub); + } else if(it->first=="SET"){ sc = convertSET(sub); } @@ -101,6 +106,7 @@ StatusCode GearSvc::initialize() } if(sc==StatusCode::FAILURE) return sc; } + gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1847.415655, 2350., 8, 0.); gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2088.8, 2450., 2, 0.); for(int i=0;i<29;i++){ @@ -200,7 +206,7 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){ double phi0=0; helpLayer thisLadder; double beryllium_ladder_block_length=0,end_electronics_half_z=0,side_band_electronics_width=0; - double rAlu, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx; + double rAlu=0, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx; double VXDSupportDensity, VXDSupportZeff, VXDSupportAeff, VXDSupportRadLen, VXDSupportIntLen=0; double styDensity, styZeff, styAeff, styRadLen, styIntLen; dd4hep::Volume vxd_vol = vxd.volume(); @@ -558,14 +564,17 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){ << helpSensitives[i].thickness*2 << ", " << helpSensitives[i].length << ", " << helpSensitives[i].width*2 << ", " << helpSensitives[i].radLength << endmsg; } m_gearMgr->setVXDParameters(vxdParameters) ; - gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl; - //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ - gearParameters->setDoubleVal("CryostatAlRadius", rAlu); - gearParameters->setDoubleVal("CryostatAlThickness", drAlu); - gearParameters->setDoubleVal("CryostatAlInnerR", rInner); - gearParameters->setDoubleVal("CryostatAlZEndCap", aluEndcapZ = dzSty+drSty+drAlu/2); - gearParameters->setDoubleVal("CryostatAlHalfZ", dzSty+drSty); - m_gearMgr->setGearParameters("VXDInfra", gearParameters); + if(rAlu!=0){ + // rAlu=0, denote no cryostat + gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl; + //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ + gearParameters->setDoubleVal("CryostatAlRadius", rAlu); + gearParameters->setDoubleVal("CryostatAlThickness", drAlu); + gearParameters->setDoubleVal("CryostatAlInnerR", rInner); + gearParameters->setDoubleVal("CryostatAlZEndCap", aluEndcapZ = dzSty+drSty+drAlu/2); + gearParameters->setDoubleVal("CryostatAlHalfZ", dzSty+drSty); + m_gearMgr->setGearParameters("VXDInfra", gearParameters); + } //effective A different with what in Mokka, fix them as Mokka's gear::SimpleMaterialImpl* VXDFoamShellMaterial_old = new gear::SimpleMaterialImpl("VXDFoamShellMaterial_old", 1.043890843e+01, 5.612886646e+00, 2.500000000e+01, 1.751650267e+04, 0); m_gearMgr->registerSimpleMaterial(VXDFoamShellMaterial_old); @@ -721,6 +730,149 @@ StatusCode GearSvc::convertTPC(dd4hep::DetElement& tpc){ return StatusCode::SUCCESS; } +StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ + dd4hep::rec::FixedPadSizeTPCData* dcData = nullptr; + try{ + dcData = dc.extension<dd4hep::rec::FixedPadSizeTPCData>(); + } + catch(std::runtime_error& e){ + warning() << e.what() << " " << dcData << ", to search volume" << endmsg; + // before extension ready, force to convert from volumes + auto geomSvc = service<IGeomSvc>("GeomSvc"); + dd4hep::Readout readout = geomSvc->lcdd()->readout("DriftChamberHitsCollection"); + dd4hep::Segmentation seg = readout.segmentation(); + dd4hep::DDSegmentation::GridDriftChamber* grid = dynamic_cast< dd4hep::DDSegmentation::GridDriftChamber* > ( seg.segmentation() ) ; + + dcData = new dd4hep::rec::FixedPadSizeTPCData; + dcData->rMinReadout = 99999; + dcData->rMaxReadout = 0; + std::vector<double> innerRadiusWalls,outerRadiusWalls; + bool is_convert = true; + dd4hep::Volume dc_vol = dc.volume(); + for(int i=0;i<dc_vol->GetNdaughters();i++){ + TGeoNode* daughter = dc_vol->GetNode(i); + std::string nodeName = daughter->GetName(); + //info << nodeName << endmsg; + if(nodeName.find("chamber_vol")!=-1||nodeName.find("assembly")!=-1){ + if(grid){ + // if more than one chamber, just use the outer, TODO + dcData->rMinReadout = grid->DC_outer_rbegin(); + dcData->rMaxReadout = grid->DC_outer_rend(); + dcData->driftLength = grid->detectorLength(); + dcData->maxRow = grid->DC_outer_layer_number(); + dcData->padHeight = grid->layer_width(); + dcData->padWidth = dcData->padHeight; + } + else{ + TGeoNode* next = daughter; + if(nodeName.find("assembly")!=-1){ + // if more than one chamber, just use the outer, TODO + next = daughter->GetDaughter(1); + std::string s = next->GetName(); + if(s.find("chamber_vol")==-1){ + error() << s << " not chamber_vol" << endmsg; + is_convert = false; + } + } + + //info() << next->GetName() << endmsg; + + const TGeoShape* chamber_shape = next->GetVolume()->GetShape(); + if(chamber_shape->TestShapeBit(TGeoTube::kGeoTube)){ + const TGeoTube* tube = (const TGeoTube*) chamber_shape; + double innerRadius = tube->GetRmin(); + double outerRadius = tube->GetRmax(); + double halfLength = tube->GetDz(); + dcData->driftLength = halfLength; + } + else{ + error() << next->GetName() << " not TGeoTube::kGeoTube" << endmsg; + is_convert = false; + } + + dcData->maxRow = next->GetNdaughters(); + if(dcData->maxRow>512){ + error() << " layer number > 512, something wrong!" << endmsg; + is_convert = false; + } + for(int i=0;i<next->GetNdaughters();i++){ + TGeoNode* layer = next->GetDaughter(i); + const TGeoShape* shape = layer->GetVolume()->GetShape(); + if(shape->TestShapeBit(TGeoTube::kGeoTube)){ + const TGeoTube* tube = (const TGeoTube*) shape; + double innerRadius = tube->GetRmin(); + double outerRadius = tube->GetRmax(); + double halfLength = tube->GetDz(); + if(innerRadius<dcData->rMinReadout) dcData->rMinReadout = innerRadius; + if(outerRadius>dcData->rMaxReadout) dcData->rMaxReadout = outerRadius; + } + else{ + error() << layer->GetName() << " not TGeoTube::kGeoTube" << endmsg; + is_convert = false; + } + } + dcData->padHeight = (dcData->rMaxReadout-dcData->rMinReadout)/dcData->maxRow; + dcData->padWidth = dcData->padHeight; + } + } + else if(nodeName.find("wall_vol")!=-1){ + const TGeoShape* wall_shape = daughter->GetVolume()->GetShape(); + if(wall_shape->TestShapeBit(TGeoTube::kGeoTube)){ + const TGeoTube* tube = (const TGeoTube*) wall_shape; + double innerRadius = tube->GetRmin(); + double outerRadius = tube->GetRmax(); + double halfLength = tube->GetDz(); + innerRadiusWalls.push_back(innerRadius); + outerRadiusWalls.push_back(outerRadius); + } + else{ + error() << nodeName << " not TGeoTube::kGeoTube" << endmsg; + is_convert = false; + } + } + } + if(innerRadiusWalls.size()<2||outerRadiusWalls.size()<2){ + error() << "wall number < 2" << endmsg; + is_convert = false; + } + if(!is_convert){ + error() << "Cannot convert DC volume to extension data!" << endmsg; + delete dcData; + return StatusCode::FAILURE; + } + if(innerRadiusWalls[0]<innerRadiusWalls[innerRadiusWalls.size()-1]){ + dcData->rMin = innerRadiusWalls[0]; + dcData->rMax = outerRadiusWalls[outerRadiusWalls.size()-1]; + dcData->innerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0]; + dcData->outerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1]; + } + else{ + dcData->rMin = innerRadiusWalls[innerRadiusWalls.size()-1]; + dcData->rMax = outerRadiusWalls[0]; + dcData->innerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1]; + dcData->outerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0]; + } + info() << (*dcData) << endmsg; + } + + // regard as TPCParameters, TODO: drift chamber parameters + gear::TPCParametersImpl *tpcParameters = new gear::TPCParametersImpl(); + gear::PadRowLayout2D *padLayout = new gear::FixedPadSizeDiskLayout(dcData->rMinReadout*CLHEP::cm, dcData->rMaxReadout*CLHEP::cm, + dcData->padHeight*CLHEP::cm, dcData->padWidth*CLHEP::cm, dcData->maxRow, 0.0); + tpcParameters->setPadLayout(padLayout); + tpcParameters->setMaxDriftLength(dcData->driftLength*CLHEP::cm); + tpcParameters->setDriftVelocity( 0.0); + tpcParameters->setReadoutFrequency( 0.0); + tpcParameters->setDoubleVal( "tpcOuterRadius" , dcData->rMax*CLHEP::cm ) ; + tpcParameters->setDoubleVal( "tpcInnerRadius", dcData->rMin*CLHEP::cm ) ; + tpcParameters->setDoubleVal( "tpcInnerWallThickness", dcData->innerWallThickness*CLHEP::cm ) ; + tpcParameters->setDoubleVal( "tpcOuterWallThickness", dcData->outerWallThickness*CLHEP::cm ) ; + + m_gearMgr->setTPCParameters(tpcParameters); + + return StatusCode::SUCCESS; +} + StatusCode GearSvc::convertSET(dd4hep::DetElement& set){ dd4hep::rec::ZPlanarData* setData = nullptr; try{ @@ -773,7 +925,7 @@ TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name){ for(int i=0;i<mother->GetNdaughters();i++){ TGeoNode* daughter = mother->GetDaughter(i); std::string s = daughter->GetName(); - //info() << "current: " << s << " search for" << name << endmsg; + //info() << "current: " << s << " search for" << name << endmsg; if(s.find(name)!=-1){ next = daughter; break; diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h index fcd5bcc8a63bb6710221f31a4dacf0bfe26e17f5..ad0e82b68a1ed605f06487d78b9a63ac519defb2 100644 --- a/Service/GearSvc/src/GearSvc.h +++ b/Service/GearSvc/src/GearSvc.h @@ -23,6 +23,7 @@ class GearSvc : public extends<Service, IGearSvc> StatusCode convertVXD(dd4hep::DetElement& vxd); StatusCode convertSIT(dd4hep::DetElement& sit); StatusCode convertTPC(dd4hep::DetElement& tpc); + StatusCode convertDC (dd4hep::DetElement& dc); StatusCode convertSET(dd4hep::DetElement& set); StatusCode convertFTD(dd4hep::DetElement& ftd); TGeoNode* FindNode(TGeoNode* mother, char* name); diff --git a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp index 9d12dde315b8f45e1deb2606999598e69c0161c2..4300de813cb9adc29b3be2ac3da555d5eafb2118 100644 --- a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp +++ b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp @@ -1,6 +1,5 @@ #include "DetSimSD/DDG4SensitiveDetector.h" -#include "DDG4/Geant4SensitiveDetector.h" #include "DDG4/Geant4Converter.h" #include "DDG4/Geant4Hits.h" #include "DD4hep/Segmentations.h"