diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml index 5ae78d9b320c95859b8f8465c27905aea5662940..bdc66337e19e134179c27a99fca82325c26d0572 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml @@ -26,7 +26,7 @@ <detectors> <detector id="DetID_OTKBarrel" name="OTKBarrel" type="SiTracker_otkbarrel_v02" vis="OTKBarrelVis" - readout="OTKBarrelCollection" insideTrackingVolume="true"> + readout="OTKBarrelCollection" combineHits="true" insideTrackingVolume="true"> <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/> <envelope vis="SeeThrough"> <shape type="Tube" rmin="OTKBarrel_inner_radius" rmax="OTKBarrel_outer_radius" @@ -40,23 +40,23 @@ <module name="OTKBarrel_module" thickness="OTKBarrel_module_thickness" repeat="4" width="OTKBarrel_module_width" length_inner="OTKBarrel_module_length_inner" length_outer="OTKBarrel_module_length_outer" vis="SeeThrough"> - <layer name="glue" width="100.40*mm" thickness="300*um" material="Air" vis="BlackVis"/> - <layer name="carbon_fiber_plane_inner" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/> - <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="6000*um" material="CarbonFiber" vis="BlackVis"/> + <layer name="carbon_fiber_plane_inner" width="100.40*mm" thickness="0.3*mm" material="CF_ITK" vis="BlackVis"/> + <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="6000*um" material="GraphiteFoam_OTK" vis="BlackVis"/> <layer name="cooling_fluid" width="100.40*mm" thickness="35.76*0.105*100*um" material="G4_WATER" vis="BlackVis"/> <layer name="cooling_tube_wall" width="100.40*mm" thickness="3.560*0.169*100*um" material="G4_Ti" vis="BlackVis"/> - <layer name="carbon_fiber_plane_outer" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/> - <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/> - <layer name="glue_2" width="100.40*mm" thickness="100*um" material="Air" vis="BlackVis"/> - <layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/> - <layer name="pcb_insulating_layers" width="100.40*mm" thickness="28.41*0.07*100*um" material="Polyimide" vis="BlackVis"/> + <layer name="carbon_fiber_plane_outer" width="100.40*mm" thickness="0.3*mm" material="CF_ITK" vis="BlackVis"/> + <layer name="glue" width="100.40*mm" thickness="300*um" material="CER_ITK" vis="BlackVis"/> + <layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/> + <layer name="glue_2" width="100.40*mm" thickness="100*um" material="CER_ITK" vis="BlackVis"/> + <layer name="pcb_insulating_layers" width="100.40*mm" thickness="28.41*0.07*100*um" material="Polyimide_ITK" vis="BlackVis"/> <layer name="pcb_metal_layers" width="100.40*mm" thickness="1.436*0.2*100*um" material="G4_Cu" vis="BlackVis"/> - <data_aggregation name="first_data_aggregation" width="104*mm" thickness="0*mm" length="7.0*mm" vis="SeeThrough"> - <layer name="PCB" thickness="0*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/> - <DC name="DC-DC" thickness="0*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/> + <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/> + <data_aggregation name="first_data_aggregation" width="104*mm" thickness="2*mm" length="7.0*mm" vis="SeeThrough"> + <layer name="PCB" thickness="1*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/> + <DC name="DC-DC" thickness="1*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/> </data_aggregation> </module> - <data_aggregation name="second_data_aggregation" thickness="0*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/> + <data_aggregation name="second_data_aggregation" thickness="1*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/> </ladder> </stave> </detector> @@ -64,7 +64,7 @@ <readouts> <readout name="OTKBarrelCollection"> - <id>system:5,side:-2,layer:4,module:8,iladder:3,oladder:-4,mmodule:-6</id> + <id>system:5,side:-2,layer:9,module:8,iladder:32:4,oladder:-4,mmodule:-6</id> </readout> </readouts> -</lccdd> \ No newline at end of file +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml index 6990e85f50077516b26159f5fd745dc47e559c4d..d79d5cedb6e3aba841f031e29600ebf676d092a6 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml @@ -9,16 +9,16 @@ <comment>CepC Outer Tracker</comment> </info> <define> - <constant name="OTKEndcap_inner_radius" value="400*mm"/> + <!--constant name="OTKEndcap_inner_radius" value="400*mm"/> <constant name="OTKEndcap_outer_radius" value="1820*mm"/> <constant name="OTKEndcap_zmin" value="2910*mm"/> - <constant name="OTKEndcap_zmax" value="2930*mm"/> + <constant name="OTKEndcap_zmax" value="2930*mm"/--> </define> <detectors> <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> <detector id="DetID_OTKEndcap" name="OTKEndcap" type="SiTracker_otkendcap_v02" vis="OTKEndcapVis" - readout="OTKEndcapCollection" insideTrackingVolume="true"> + readout="OTKEndcapCollection" combineHits="true" insideTrackingVolume="true"> <type_flags type="DetType_TRACKER + DetType_ENDCAP "/> <envelope vis="SeeThrough"> <shape type="BooleanShape" operation="Subtraction" material="Air"> @@ -44,24 +44,24 @@ <ring name="D4" inner_radius="1668*mm" outer_radius="(1816-0.2)*mm" repeat="16*14" aggregation="2" vis="SeeThrough"/> </rings> <layers thickness="11.4*mm"> + <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/> <layer name="PCB_metal_layers" thickness="1.436*0.2*100*um" material="G4_Cu" vis="FTDSupportVis"/> - <layer name="PCB_insulating_layers" thickness="28.41*0.07*100*um" material="Polyimide" vis="FTDSupportVis"/> + <layer name="PCB_insulating_layers" thickness="28.41*0.07*100*um" material="Polyimide_ITK" vis="FTDSupportVis"/> + <layer name="glue_1" thickness="100*um" material="CER_ITK" vis="FTDSupportVis"/> <layer name="sensor" sensitive="True" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/> - <layer name="glue_1" thickness="100*um" material="Air" vis="FTDSupportVis"/> - <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/> - <layer name="carbon_fiber_plane" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/> + <layer name="glue_2" thickness="200*um" material="Polyimide_ITK" vis="FTDSupportVis"/> + <layer name="carbon_fiber_plane" thickness="0.3*mm" material="CF_ITK" vis="FTDSupportVis"/> <layer name="cooling_tube_wall" thickness="3.560*0.169*100*um" material="G4_Ti" vis="FTDSupportVis"/> <layer name="cooling_fluid" thickness="35.76*0.105*100*um" material="G4_WATER" vis="FTDSupportVis"/> - <layer name="graphite_foam_Honeycom" thickness="6000*um" material="Air" vis="FTDSupportVis"/> - <layer name="carbon_fiber_back_plate" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/> - <layer name="glue_2" thickness="200*um" material="Air" vis="FTDSupportVis"/> + <layer name="graphite_foam_Honeycom" thickness="6000*um" material="GraphiteFoam_OTK" vis="FTDSupportVis"/> + <layer name="carbon_fiber_back_plate" thickness="0.3*mm" material="CF_ITK" vis="FTDSupportVis"/> </layers> </detector> </detectors> <readouts> <readout name="OTKEndcapCollection"> - <id>system:5,side:-2,layer:4,module:8,sensor:13</id> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> </readout> </readouts> -</lccdd> \ No newline at end of file +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml index 16f918abbf357e0d5f83c08f20f8117f83cffe91..11318e835f77396b4f25ce21f8d0cf8bc5558c28 100644 --- a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml +++ b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml @@ -9,56 +9,54 @@ <comment>CepC Inner Tracker EndCap</comment> </info> <define> - <constant name="SiliconThickness" value="400*um"/> - <constant name="SupportThickness" value="3.5*mm"/> <constant name="ITKModuleLengthPhi" value="40.1*mm"/> </define> <detectors> - <detector id="DetID_ITKEndCap" name="ITK_EndCap" type="ITK_EndCap_v01" vis="FTDVis" readout="ITKEndcapCollection" insideTrackingVolume="true" reflect="true"> + <detector id="DetID_ITKEndcap" name="ITKEndcap" type="ITK_EndCap_v01" vis="FTDVis" readout="ITKEndcapCollection" combineHits="true" insideTrackingVolume="true" reflect="true"> <envelope> <shape type="Assembly"/> </envelope> <type_flags type="DetType_TRACKER + DetType_ENDCAP + DetType_PIXEL "/> - <support thickness="SupportThickness"> - <slice name="Carbon_fiber_front" material="CarbonFiber" thickness="150*um" vis="GrayVis"/> + <support> + <slice name="Carbon_fiber_front" material="CF_ITK" thickness="150*um" vis="GrayVis"/> <slice name="Cooling_tube_wall" material="G4_Ti" thickness="3.560*0.013*100*um" vis="GrayVis"/> <slice name="Cooling_fluid" material="G4_WATER" thickness="35.76*0.105*100*um" vis="GrayVis"/> - <slice name="Graphite_foam_Honeycomb" material="Air" thickness="2000*um" vis="YellowVis"/> - <slice name="Carbon_fiber_back" material="CarbonFiber" thickness="150*um" vis="GrayVis"/> - <slice name="Glue" material="Air" thickness="200*um" vis="YellowVis"/> - <slice name="Other_electronics" material="Kapton" thickness="32.6437*0.05*100*um" vis="SeeThrough"/> + <slice name="Graphite_foam_Honeycomb" material="GraphiteFoam_OTK" thickness="2000*um" vis="YellowVis"/> + <slice name="Carbon_fiber_back" material="CF_ITK" thickness="150*um" vis="GrayVis"/> </support> - <sensor thickness="SiliconThickness"> - <slice name="Glue" material="Air" thickness="100*um" vis="SeeThrough"/> + <sensor> + <slice name="GlueF" material="CER_ITK" thickness="200*um" vis="YellowVis"/> <slice name="Sensor" material="G4_Si" thickness="150*um" sensitive="true" vis="GreenVis"/> - <slice name="FPC_Insulating_layers" material="Polyimide" thickness="100*um" vis="SeeThrough"/> + <slice name="GlueB" material="CER_ITK" thickness="100*um" vis="SeeThrough"/> + <slice name="FPC_Insulating_layers" material="Polyimide_ITK" thickness="100*um" vis="SeeThrough"/> <slice name="FPC_metal_layer" material="G4_Al" thickness="50*um" vis="SeeThrough"/> + <slice name="Other_electronics" material="Kapton" thickness="32.6437*0.05*100*um" vis="SeeThrough"/> </sensor> <layers> - <layer id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="245*mm" vis="SeeThrough"> - <ring id="0" inner_r="81.5*mm" outer_r="(163.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="13" vis="SeeThrough" /> - <ring id="1" inner_r="163.4*mm" outer_r="245*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="20" vis="SeeThrough"/> - </layer> - <layer id="1" z="718.5*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="110.5*mm" outer_r="355*mm" vis="SeeThrough"> - <ring id="0" inner_r="110.5*mm" outer_r="(192.2-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="16" vis="SeeThrough"/> - <ring id="1" inner_r="192.2*mm" outer_r="(273.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> - <ring id="2" inner_r="273.4*mm" outer_r="355*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="28" vis="SeeThrough"/> - </layer> - <layer id="2" z="1000.3*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="160.5*mm" outer_r="565*mm" vis="SeeThrough"> - <ring id="0" inner_r="160.5*mm" outer_r="(282-0.1)*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> - <ring id="1" inner_r="282*mm" outer_r="(423.4-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> - <ring id="2" inner_r="423.4*mm" outer_r="565*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> - </layer> - <layer id="3" z="1489*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="220.3*mm" outer_r="565*mm" vis="SeeThrough"> - <ring id="0" inner_r="220.3*mm" outer_r="(301.6-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> - <ring id="1" inner_r="301.6*mm" outer_r="(443.1-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> - <ring id="2" inner_r="443.1*mm" outer_r="565*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> - </layer> + <layer id="0" z="505*mm" inner_r="81.5*mm" outer_r="245*mm" phi0="90*degree" vis="SeeThrough"> + <ring id="0" inner_r="81.5*mm" outer_r="(163.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="13" vis="SeeThrough" /> + <ring id="1" inner_r="163.4*mm" outer_r="245*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="20" vis="SeeThrough"/> + </layer> + <layer id="1" z="718.5*mm" inner_r="110.5*mm" outer_r="355*mm" phi0="90*degree" vis="SeeThrough"> + <ring id="0" inner_r="110.5*mm" outer_r="(192.2-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="16" vis="SeeThrough"/> + <ring id="1" inner_r="192.2*mm" outer_r="(273.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="2" inner_r="273.4*mm" outer_r="355*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="28" vis="SeeThrough"/> + </layer> + <layer id="2" z="1000.3*mm" inner_r="160.5*mm" outer_r="565*mm" phi0="90*degree" vis="SeeThrough"> + <ring id="0" inner_r="160.5*mm" outer_r="(282-0.1)*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="1" inner_r="282*mm" outer_r="(423.4-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> + <ring id="2" inner_r="423.4*mm" outer_r="565*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> + </layer> + <layer id="3" z="1489*mm" inner_r="220.3*mm" outer_r="565*mm" phi0="90*degree" vis="SeeThrough"> + <ring id="0" inner_r="220.3*mm" outer_r="(301.6-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/> + <ring id="1" inner_r="301.6*mm" outer_r="(443.1-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/> + <ring id="2" inner_r="443.1*mm" outer_r="565*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/> + </layer> </layers> </detector> diff --git a/Detector/DetCRD/compact/CRD_common_v02/materials.xml b/Detector/DetCRD/compact/CRD_common_v02/materials.xml index e30604a0373f7e3e8f6cfbd691807c960e5e8297..8f2954d596cf23b7ea42d9990b4cef6fb0c3d4f7 100644 --- a/Detector/DetCRD/compact/CRD_common_v02/materials.xml +++ b/Detector/DetCRD/compact/CRD_common_v02/materials.xml @@ -867,6 +867,13 @@ <D type="density" value="2" unit="g/cm3"/> <fraction n="1.0" ref="G4_WATER"/> </material> + + <material name="GraphiteFoam_OTK"> + <D type="density" value="0.113776" unit="g/cm3"/> + <fraction n="1.0" ref="Graphite_ITK"/> + <fraction n="1.0" ref="CF_ITK"/> + </material> + Graphite_ITK </materials> <surfaces> diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml index 3d1d7cec9456717dc9be6194ae01879ca50d8c9f..d004669fdb53742918229c37c235bad75a699f61 100644 --- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml +++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml @@ -35,7 +35,7 @@ <constant name="DetID_SET" value=" 5"/> <constant name="DetID_ETD" value=" 6"/> <constant name="DetID_ITKBarrel" value=" 2"/> - <constant name="DetID_ITKEndCap" value=" 3"/> + <constant name="DetID_ITKEndcap" value=" 3"/> <constant name="DetID_OTKBarrel" value=" 5"/> <constant name="DetID_OTKEndcap" value=" 6"/> @@ -130,20 +130,25 @@ <constant name="ITKBarrel1_inner_radius" value="235*mm"/> <constant name="ITKBarrel2_inner_radius" value="345*mm"/> <constant name="ITKBarrel3_inner_radius" value="555.6*mm"/> - <constant name="ITKBarrel1_half_length" value="500.5*mm"/> - <constant name="ITKBarrel2_half_length" value="715*mm"/> - <constant name="ITKBarrel3_half_length" value="1001*mm"/> + <constant name="ITKBarrel1_half_length" value="493.3*mm"/> + <constant name="ITKBarrel2_half_length" value="704.8*mm"/> + <constant name="ITKBarrel3_half_length" value="986.6*mm"/> <!-- Parameters of time of flight tracker --> <constant name="OTKBarrel_inner_radius" value="1800*mm"/> <constant name="OTKBarrel_outer_radius" value="1830*mm"/> - <!--constant name="OTKBarrel_half_length" value="2940*mm"/--><!--reach Ecal edge, wait mechanical design update--> <constant name="OTKBarrel_half_length" value="2930*mm"/> <constant name="OTKBarrelLayer1_half_length" value="OTKBarrel_half_length"/> <constant name="OTKBarrelLayer2_half_length" value="OTKBarrel_half_length"/> <constant name="OTKBarrel1_inner_radius" value="1805*mm"/> <constant name="OTKBarrel2_inner_radius" value="1820*mm"/> + <constant name="OTKEndcap_zmin" value="2910*mm"/> + <constant name="OTKEndcap_zmax" value="2930*mm"/> + <constant name="OTKEndcap_outer_radius" value="1820*mm"/> + <constant name="OTKEndcap_inner_radius" value="400*mm"/> + + <!-- obselete --> <constant name="SET_inner_radius" value="1800*mm"/> <constant name="SiTracker_endcap_barrel_zgap" value="5*mm"/> diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml index 85bfb00dc61a5135d49efdc1b43fe8fd10231e24..6089c532a61e803eec7068752ea583920879efa9 100644 --- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml +++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml @@ -30,17 +30,19 @@ <!--preliminary vertex and tracker, to update/--> <!--include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/--> <include ref="../CRD_common_v02/VXD_Composite_v01_02.xml"/> - <include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/> + <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_09.xml"/--> <!--include ref="../CRD_common_v02/SIT_SimplePixel_v01_04.xml"/--> <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/--> <include ref="../CRD_common_v02/ITK_StaggeredStave_v03_01.xml"/> + <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/> <!--include ref="../CRD_common_v01/TPC_Simple_v10_02.xml"/--> <!-- use 10 rows clustering version--> <include ref="../CRD_common_v02/TPC_ModularEndcap_o1_v02.xml"/> <!--include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/--> - <include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/> - + <!--include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/--> + <include ref="../CRD_common_v01/OTKBarrel_v02.xml"/> <!--include ref="../CRD_common_v01/OTKEndcap_v01_01.xml"/--> + <include ref="../CRD_common_v01/OTKEndcap_v02.xml"/> <fields> <field name="InnerSolenoid" type="solenoid" diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml index b71b5dffe28db7b801a2c8157b9f10aaa2eefe92..b862ef97adf01852f3a8479ab20f04deb4e0a27e 100644 --- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml +++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml @@ -31,16 +31,19 @@ <!--preliminary vertex and tracker, to update/--> <!--include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/--> <include ref="../CRD_common_v02/VXD_Composite_v01_02.xml"/> - <include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/> + <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/--> <!--include ref="../CRD_common_v02/SIT_SimplePixel_v01_04.xml"/--> <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/--> <include ref="../CRD_common_v02/ITK_StaggeredStave_v03_01.xml"/> + <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/> <!--include ref="../CRD_common_v01/TPC_Simple_v10_02.xml"/--> - <!--use 10 rows clustering version/--> + <!-- use 10 rows clustering version--> <include ref="../CRD_common_v02/TPC_ModularEndcap_o1_v02.xml"/> <!--include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/--> - <include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/--> + <include ref="../CRD_common_v01/OTKBarrel_v02.xml"/> <!--include ref="../CRD_common_v01/OTKEndcap_v01_01.xml"/--> + <include ref="../CRD_common_v01/OTKEndcap_v02.xml"/> <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v02_02.xml"/> <include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v02_01.xml"/> diff --git a/Detector/DetCRD/scripts/TDR_o1_v01/sim.py b/Detector/DetCRD/scripts/TDR_o1_v01/sim.py index 75d5e97c2399877d441b7550127b12a90491d456..fa0e1eadfdff61dff65657f4ff9718898cba56b0 100644 --- a/Detector/DetCRD/scripts/TDR_o1_v01/sim.py +++ b/Detector/DetCRD/scripts/TDR_o1_v01/sim.py @@ -66,6 +66,11 @@ genalg.GenTools = ["GtGunTool"] from Configurables import DetSimSvc detsimsvc = DetSimSvc("DetSimSvc") +from Configurables import Edm4hepWriterAnaElemTool +edm4hep_writer = Edm4hepWriterAnaElemTool("Edm4hepWriterAnaElemTool") +#edm4hep_writer.TrackerCollections = ["VXD", "ITKBarrel", "ITKEndcap", "TPC", "TPCLowPt", "TPCSpacePoint", +# "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap"] + from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") detsimalg.RandomSeeds = seed @@ -83,7 +88,7 @@ detsimalg.RootDetElem = "WorldDetElemTool" from Configurables import TimeProjectionChamberSensDetTool tpc_sensdettool = TimeProjectionChamberSensDetTool("TimeProjectionChamberSensDetTool") tpc_sensdettool.TypeOption = 1 -tpc_sensdettool.DoHeedSim = True +tpc_sensdettool.DoHeedSim = False #True dedxoption = "TrackHeedSimTool" tpc_sensdettool.DedxSimTool = dedxoption diff --git a/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py b/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py index 15c8e1c942aa69ff3d61edc1b4f03a1461c179d0..2341b085a0758d8b07e4302e5fc2446aab9e15b3 100644 --- a/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py +++ b/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py @@ -50,9 +50,10 @@ podioinput = PodioInput("PodioReader", collections=[ "MCParticle", "VXDCollection", "ITKBarrelCollection", + "ITKEndcapCollection", "TPCCollection", "OTKBarrelCollection", - "FTDCollection", + "OTKEndcapCollection", "MuonBarrelCollection", "MuonEndcapCollection" ]) @@ -65,11 +66,10 @@ podioinput = PodioInput("PodioReader", collections=[ ## Config ## vxdhitname = "VXDTrackerHits" sithitname = "ITKBarrelTrackerHits" +ftdhitname = "ITKEndcapTrackerHits" gashitname = "TPCTrackerHits" sethitname = "OTKBarrelTrackerHits" -setspname = "OTKBarrelSpacePoints" -ftdhitname = "FTDTrackerHits" -ftdspname = "FTDSpacePoints" +etdhitname = "OTKEndcapTrackerHits" from Configurables import SmearDigiTool,SiTrackerDigiAlg ## VXD ## @@ -98,6 +98,19 @@ digiITKB.TrackerHitAssociationCollection = "ITKBarrelTrackerHitAssociation" digiITKB.DigiTool = "SmearDigiTool/ITKBarrel" #digiITKB.OutputLevel = DEBUG +## ITKEndcap ## +itketool = SmearDigiTool("ITKEndcap") +itketool.ResolutionU = [0.008] +itketool.ResolutionV = [0.040] +#itketool.OutputLevel = DEBUG + +digiITKE = SiTrackerDigiAlg("ITKEndcapDigi") +digiITKE.SimTrackHitCollection = "ITKEndcapCollection" +digiITKE.TrackerHitCollection = ftdhitname +digiITKE.TrackerHitAssociationCollection = "ITKEndcapTrackerHitAssociation" +digiITKE.DigiTool = "SmearDigiTool/ITKEndcap" +#digiITKE.OutputLevel = DEBUG + ## OTKBarrel ## otkbtool = SmearDigiTool("OTKBarrel") otkbtool.ResolutionU = [0.010] @@ -111,18 +124,18 @@ digiOTKB.TrackerHitAssociationCollection = "OTKBarrelTrackerHitAssociation" digiOTKB.DigiTool = "SmearDigiTool/OTKBarrel" #digiOTKB.OutputLevel = DEBUG -## FTD ## -ftdtool = SmearDigiTool("FTD") -ftdtool.ResolutionU = [0.0072] -ftdtool.ResolutionV = [0.086] -#ftdtool.OutputLevel = DEBUG +## OTKEndcap ## +otketool = SmearDigiTool("OTKEndcap") +otketool.ResolutionU = [0.010] +otketool.ResolutionV = [1.000] +#otketool.OutputLevel = DEBUG -digiFTD = SiTrackerDigiAlg("FTDDigi") -digiFTD.SimTrackHitCollection = "FTDCollection" -digiFTD.TrackerHitCollection = ftdhitname -digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation" -digiFTD.DigiTool = "SmearDigiTool/FTD" -#digiFTD.OutputLevel = DEBUG +digiOTKE = SiTrackerDigiAlg("OTKEndcapDigi") +digiOTKE.SimTrackHitCollection = "OTKEndcapCollection" +digiOTKE.TrackerHitCollection = etdhitname +digiOTKE.TrackerHitAssociationCollection = "OTKEndcapTrackerHitAssociation" +digiOTKE.DigiTool = "SmearDigiTool/OTKEndcap" +#digiOTKE.OutputLevel = DEBUG ## TPC ## from Configurables import TPCDigiAlg @@ -195,7 +208,6 @@ tracking.HeaderCol = "EventHeader" tracking.VTXHitCollection = vxdhitname tracking.SITHitCollection = sithitname tracking.FTDPixelHitCollection = ftdhitname -tracking.FTDSpacePointCollection = ftdspname tracking.SITRawHitCollection = "NotNeedForPixelSIT" tracking.FTDRawHitCollection = ftdhitname tracking.UseSIT = True @@ -217,7 +229,7 @@ tracking.Chi2WZSeptet = 0.1 from Configurables import ForwardTrackingAlg forward = ForwardTrackingAlg("ForwardTracking") forward.FTDPixelHitCollection = ftdhitname -forward.FTDSpacePointCollection = ftdspname +#forward.FTDSpacePointCollection = ftdspname forward.FTDRawHitCollection = ftdhitname forward.Chi2ProbCut = 0.0 forward.HitsPerTrackMin = 3 @@ -232,7 +244,7 @@ forward.CriteriaMax = [30, 1.02, 10, 1.015, 20, 1.3, 1.0, 150, 1.08, 99999999, from Configurables import TrackSubsetAlg subset = TrackSubsetAlg("TrackSubset") subset.TrackInputCollections = ["ForwardTracks", "SiTracks"] -subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname, ftdspname] +subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname] subset.TrackSubsetCollection = "SubsetTracks" #subset.FitterTool = "KalTestTool/KalTest111" #subset.OutputLevel = DEBUG @@ -249,7 +261,8 @@ full.SITTrackerHits = sithitname full.TPCTrackerHits = gashitname full.SETTrackerHits = sethitname full.FTDPixelTrackerHits = ftdhitname -full.FTDSpacePoints = ftdspname +#full.FTDSpacePoints = ftdspname +full.ETDTrackerHits = etdhitname full.SITRawHits = "NotNeedForPixelSIT" full.SETRawHits = "NotNeedForPixelSET" full.FTDRawHits = ftdhitname @@ -259,6 +272,7 @@ full.OutputTracks = "CompleteTracks" # default name full.FTDHitToTrackDistance = 5. full.SITHitToTrackDistance = 3. full.SETHitToTrackDistance = 5. +full.ETDHitToTrackDistance = 15. full.MinChi2ProbForSiliconTracks = 0 full.MaxChi2PerHit = 200 full.ForceSiTPCMerging = True @@ -277,7 +291,8 @@ from Configurables import TrackParticleRelationAlg tpr = TrackParticleRelationAlg("Track2Particle") tpr.MCParticleCollection = "MCParticle" tpr.TrackList = ["CompleteTracks"] -tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation"] +tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation", + "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation"] #tpr.OutputLevel = DEBUG @@ -285,7 +300,8 @@ from Configurables import TrueMuonTagAlg tmt = TrueMuonTagAlg("TrueMuonTag") tmt.MCParticleCollection = "MCParticle" tmt.TrackList = ["CompleteTracks"] -tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation", "TPCTrackerHitAss"] +tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation", + "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation", "TPCTrackerHitAss"] tmt.MuonTagEfficiency = 0.95 # muon true tag efficiency, default is 1.0 (100%) tmt.MuonDetTanTheta = 1.2 # muon det barrel/endcap separation tan(theta) #tmt.OutputLevel = DEBUG @@ -299,7 +315,7 @@ out.outputCommands = ["keep *"] # ApplicationMgr from Configurables import ApplicationMgr mgr = ApplicationMgr( - TopAlg = [podioinput, digiVXD, digiITKB, digiOTKB, digiFTD, digiTPC, digiMuon, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tof, tmt, out], + TopAlg = [podioinput, digiVXD, digiITKB, digiITKE, digiOTKB, digiOTKE, digiTPC, digiMuon, tracking, clupatra, full, tpr, tpc_dndx, tof, tmt, out], EvtSel = 'NONE', EvtMax = 50, ExtSvc = [rndmengine, rndmgensvc, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc, pidsvc], diff --git a/Detector/DetCRD/scripts/TDR_o1_v02/sim.py b/Detector/DetCRD/scripts/TDR_o1_v02/sim.py index c1e91891d6b60fd78f065731e9721e3901253c08..034f7ef93b68c6a4e527d387fb0cf6494f758c96 100644 --- a/Detector/DetCRD/scripts/TDR_o1_v02/sim.py +++ b/Detector/DetCRD/scripts/TDR_o1_v02/sim.py @@ -64,6 +64,11 @@ genalg.GenTools = ["GtGunTool"] from Configurables import DetSimSvc detsimsvc = DetSimSvc("DetSimSvc") +from Configurables import Edm4hepWriterAnaElemTool +edm4hep_writer = Edm4hepWriterAnaElemTool("Edm4hepWriterAnaElemTool") +edm4hep_writer.TrackerCollections = ["VXD", "SIT", "FTD", "TPC", "TPCLowPt", "TPCSpacePoint", + "SET", "COIL", "MuonBarrel", "MuonEndcap"] + from Configurables import DetSimAlg detsimalg = DetSimAlg("DetSimAlg") detsimalg.RandomSeeds = seed diff --git a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp index 1074364c98c85391e15c44e82a867779733b7e3d..52215d513fdbe261ed83a38329a4d9bfffba4ed5 100644 --- a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp +++ b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp @@ -2,7 +2,7 @@ #include "DD4hep/DetFactoryHelper.h" #include "XML/Utilities.h" #include "DDRec/Surface.h" -#include "DDRec/DetectorData.h" +#include "DetIdentifier/CEPCDetectorData.h" #include "Math/AxisAngle.h" #include <map> @@ -34,29 +34,50 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s } std::cout << " ** building ITK_EndCap_v01 ... " << sens.type() << std::endl; + dd4hep::rec::MultiRingsZDiskData* diskData = new dd4hep::rec::MultiRingsZDiskData; + + const xml::Component supports = x_det.child("support"); + const xml::Component sensor = x_det.child("sensor"); + const xml::Component layers_xml = x_det.child("layers"); for (xml_coll_t layer(layers_xml, "layer"); layer; ++layer) { + dd4hep::rec::MultiRingsZDiskData::LayerLayout disk; //id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="242.5*mm" vis="SeeThrough" const auto layer_id = layer.attr<std::string>("id"); - const auto dz = layer.attr<double>("dz"); + //const auto dz = layer.attr<double>("dz"); const auto inner_r = layer.attr<double>("inner_r"); const auto outer_r = layer.attr<double>("outer_r"); + const auto phi0 = layer.attr<double>("phi0"); const auto layer_vis = layer.attr<std::string>("vis"); const auto z = layer.attr<double>("z"); - std::string layer_name = name + "_layer_" + layer_id; + std::string layer_name = "layer" + layer_id; - const auto SiliconThickness = description.constant<double>("SiliconThickness"); - const auto SupportThickness = description.constant<double>("SupportThickness"); + double SiliconThickness = 0; + double SupportThickness = 0; + for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer) + { + const auto slice_thickness = sensor_layer.attr<double>("thickness"); + SiliconThickness += slice_thickness; + } + for (xml_coll_t support(supports, "slice"); support; ++support) + { + const auto slice_thickness = support.attr<double>("thickness"); + SupportThickness += slice_thickness; + } + const auto dz = 2*SiliconThickness + SupportThickness; Tube layer_tube(inner_r, outer_r, dz / 2.0, 0.0, 2 * M_PI); - Volume layer_vol(layer_name, layer_tube, air); - DetElement layer_det(layer_name, det_id); - layer_vol = layer_vol.setVisAttributes(description.visAttributes(layer_vis)); + Volume layer_vol(layer_name + "P", layer_tube, air); + Volume layerNeg_vol(layer_name + "N", layer_tube, air); + DetElement layer_det(layer_name + "P", det_id); + DetElement layerNeg_det(layer_name + "N", det_id); + layer_vol.setVisAttributes(description.visAttributes(layer_vis)); + layerNeg_vol.setVisAttributes(description.visAttributes(layer_vis)); // populate support double support_z = -SupportThickness / 2.0; - const xml::Component supports = x_det.child("support"); + //const xml::Component supports = x_det.child("support"); for (xml_coll_t support(supports, "slice"); support; ++support) { const auto support_name = support.attr<std::string>("name"); @@ -67,19 +88,22 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s Tube support_tube(inner_r, outer_r, support_thickness / 2.0, 0.0, 2 * M_PI); Volume support_vol(support_vol_name, support_tube, description.material(support_material)); DetElement support_det(support_vol_name, det_id); + DetElement supportNeg_det(support_vol_name + "N", det_id); support_vol = support_vol.setVisAttributes(description.visAttributes(support_vis)); support_det.setPlacement(layer_vol.placeVolume(support_vol, Position(0, 0, support_z + support_thickness / 2.0))); + supportNeg_det.setPlacement(layerNeg_vol.placeVolume(support_vol, Position(0, 0, - support_z - support_thickness / 2.0))); support_z += support_thickness; layer_det.add(support_det); + layerNeg_det.add(supportNeg_det); rec::Vector3D u(1., 0., 0.); - rec::Vector3D v(0., 0., 1.); - rec::Vector3D n(0., 1., 0.); - rec::VolPlane surf(support_vol, rec::SurfaceType::Plane, support_thickness / 2.0, support_thickness / 2.0, u, v, + rec::Vector3D v(0., 1., 0.); + rec::Vector3D n(0., 0., 1.); + rec::VolPlane surf(support_vol, rec::SurfaceType::Helper, support_thickness / 2.0, support_thickness / 2.0, u, v, n); - rec::volSurfaceList(layer_det)->push_back(surf); + rec::volSurfaceList(support_det)->push_back(surf); + rec::volSurfaceList(supportNeg_det)->push_back(surf); } - // populate sensor for (xml_coll_t ring(layer, "ring"); ring; ++ring) { @@ -91,19 +115,32 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s const auto nmodule = ring.attr<double>("nmodule"); const auto vis = ring.attr<std::string>("vis"); - std::string ring_vol_name = layer_name + "_ring_" + ring_id; + std::string ring_vol_name = layer_name + "_ring" + ring_id; Tube ring_tube(ring_inner_r, ring_outer_r, SiliconThickness / 2.0, 0.0, 2 * M_PI); - Volume ring_vol(ring_vol_name, ring_tube, air); - DetElement ring_det(ring_vol_name, det_id); - ring_vol = ring_vol.setVisAttributes(description.visAttributes(vis)); + Volume ringPosF_vol(ring_vol_name + "PF", ring_tube, air); + Volume ringPosR_vol(ring_vol_name + "PR", ring_tube, air); + Volume ringNegF_vol(ring_vol_name + "NF", ring_tube, air); + Volume ringNegR_vol(ring_vol_name + "NR", ring_tube, air); + DetElement ringPosF_det(ring_vol_name + "PF", det_id); + DetElement ringPosR_det(ring_vol_name + "PR", det_id); + DetElement ringNegF_det(ring_vol_name + "NF", det_id); + DetElement ringNegR_det(ring_vol_name + "NR", det_id); + ringPosF_vol.setVisAttributes(description.visAttributes(vis)); + ringPosR_vol.setVisAttributes(description.visAttributes(vis)); + ringNegF_vol.setVisAttributes(description.visAttributes(vis)); + ringNegR_vol.setVisAttributes(description.visAttributes(vis)); // populate sensor Box sensor_box(module_dr / 2.0, module_dphi / 2.0, SiliconThickness / 2.0); - std::string sensor_name = ring_vol_name + "_sensor"; + std::string sensor_name = ring_vol_name + "_petal"; Volume sensor_vol(sensor_name, sensor_box, air); DetElement sensor_det(sensor_name, det_id); sensor_vol = sensor_vol.setVisAttributes(description.visAttributes("SeeThrough")); - const xml::Component sensor = x_det.child("sensor"); + + double sensitive_thickness = 0; + double glue_thickness = 0; + double service_thickness = 0; + //const xml::Component sensor = x_det.child("sensor"); double sensor_z = -SiliconThickness / 2.0; for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer) { @@ -122,72 +159,163 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s { sensor_layer_vol = sensor_layer_vol.setSensitiveDetector(sens); surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive,rec::SurfaceType::Plane); + sensitive_thickness += sensor_layer_thickness; } else { surf_type = rec::SurfaceType(rec::SurfaceType::Helper,rec::SurfaceType::Plane); + if (sensitive_thickness==0) glue_thickness += sensor_layer_thickness; + else service_thickness += sensor_layer_thickness; } sensor_layer_det.setPlacement( sensor_vol.placeVolume(sensor_layer_vol, Position(0, 0, sensor_z + sensor_layer_thickness / 2.0))); sensor_z += sensor_layer_thickness; sensor_det.add(sensor_layer_det); - rec::Vector3D u(1., 0., 0.); - rec::Vector3D v(0., 1., 0.); + rec::Vector3D u(0.,-1., 0.); + rec::Vector3D v(1., 0., 0.); rec::Vector3D n(0., 0., 1.); rec::VolPlane surf(sensor_layer_vol, surf_type, sensor_layer_thickness / 2.0, sensor_layer_thickness / 2.0, u, v, n); - rec::volSurfaceList(sensor_det)->push_back(surf); + rec::volSurfaceList(sensor_layer_det)->push_back(surf); } + PlacedVolume pv; // place all the sensors into ring + double r_offset = ring_inner_r + module_dr / 2.0; for (int i = 0; i < nmodule; ++i) { - double angle = i * 2 * M_PI / nmodule; - double r_offset = ring_inner_r + module_dr / 2.0; - double rotated_x = r_offset * cos(angle); - double rotated_y = r_offset * sin(angle); - auto transform = Transform3D( - RotationZ(angle), - Position(rotated_x, rotated_y, 0)); - - DetElement rotated_sensor_det = sensor_det.clone(sensor_name + "_rotated_" + std::to_string(i)); - rotated_sensor_det.setPlacement( - ring_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", i)); - ring_det.add(rotated_sensor_det); + double angle = phi0 - i * 2 * M_PI / nmodule; + double rotated_x = r_offset * cos(angle); + double rotated_y = r_offset * sin(angle); + auto transform = Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0)); + + DetElement negative_even_sensor_det = i > 0 ? sensor_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i)) : sensor_det; + pv = ringNegF_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i); + negative_even_sensor_det.setPlacement(pv); + ringNegF_det.add(negative_even_sensor_det); + + transform = Transform3D(RotationZYX(-angle, 0, M_PI), Position(rotated_x, rotated_y, 0)); + DetElement positive_even_sensor_det = sensor_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i)); + pv = ringPosF_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i); + positive_even_sensor_det.setPlacement(pv); + ringPosF_det.add(positive_even_sensor_det); + + angle -= M_PI / nmodule; + rotated_x = r_offset * cos(angle); + rotated_y = r_offset * sin(angle); + transform = Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0)); + + DetElement positive_odd_sensor_det = sensor_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i)); + pv = ringPosR_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i + 1); + positive_odd_sensor_det.setPlacement(pv); + ringPosR_det.add(positive_odd_sensor_det); + + transform = Transform3D(RotationZYX(-angle, 0, M_PI), Position(rotated_x, rotated_y, 0)); + DetElement negative_odd_sensor_det = sensor_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i)); + pv = ringNegR_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i + 1); + negative_odd_sensor_det.setPlacement(pv); + ringNegR_det.add(negative_odd_sensor_det); } // place ring into layer - ring_det.setPlacement( - layer_vol.placeVolume(ring_vol, Position(0, 0, (SupportThickness + SiliconThickness) / 2.0)).addPhysVolID("sensor", 2*std::stoi(ring_id))); - layer_det.add(ring_det); + pv = layer_vol.placeVolume(ringPosR_vol, Position(0, 0, +(SupportThickness + SiliconThickness) / 2.0)); + pv = pv.addPhysVolID("sensor", std::stoi(ring_id)); + ringPosR_det.setPlacement(pv); + layer_det.add(ringPosR_det); + + pv = layer_vol.placeVolume(ringPosF_vol, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0)); + pv = pv.addPhysVolID("sensor", std::stoi(ring_id)); + ringPosF_det.setPlacement(pv); + layer_det.add(ringPosF_det); + + pv = layerNeg_vol.placeVolume(ringNegR_vol, Position(0, 0, +(SupportThickness + SiliconThickness) / 2.0)); + pv = pv.addPhysVolID("sensor", std::stoi(ring_id)); + ringNegR_det.setPlacement(pv); + layerNeg_det.add(ringNegR_det); + + pv = layerNeg_vol.placeVolume(ringNegF_vol, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0)); + pv = pv.addPhysVolID("sensor", std::stoi(ring_id)); + ringNegF_det.setPlacement(pv); + layerNeg_det.add(ringNegF_det); // rotate and reflect ring + // fucd: error while use Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1) + // Geant4VolumeManager INFO +++ Bad volume Geant4 Path + /* std::string reflect_ring_name = ring_vol_name + "_reflect"; - auto reflect_ring_det = ring_det.clone(reflect_ring_name); + auto reflect_ring_det = ring_det.clone(reflect_ring_name, det_id); reflect_ring_det.setPlacement(layer_vol.placeVolume( ring_vol, Transform3D(RotationZ(M_PI / nmodule) * Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1) , - Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0))).addPhysVolID("sensor", 2*std::stoi(ring_id)+1)); + Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0))) + .addPhysVolID("sensor", std::stoi(ring_id)).addPhysVolID("face", 1)); layer_det.add(reflect_ring_det); + */ + // fucd: also error + /* + std::pair<DetElement,Volume> reflected_ring = ring_det.reflect(ring_vol_name + "_reflect"); + auto pv = layer_vol.placeVolume(reflected_ring.second, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0)) + .addPhysVolID("sensor", std::stoi(ring_id)) + .addPhysVolID("face", 1); + reflected_ring.first.setPlacement(pv); + layer_det.add(reflected_ring.first); + */ + dd4hep::rec::MultiRingsZDiskData::Ring ringData; + ringData.petalNumber = 2 * nmodule; + ringData.sensorsPerPetal = 1; + ringData.phi0 = phi0; + ringData.phiOffsetOdd = 2 * M_PI / nmodule; + ringData.distance = ring_inner_r; + ringData.widthInner = module_dphi; + ringData.widthOuter = module_dphi; + ringData.length = module_dr; + ringData.thicknessSensitive = SiliconThickness - glue_thickness - service_thickness; + ringData.thicknessGlue = glue_thickness; + ringData.thicknessService = service_thickness; + disk.rings.push_back(ringData); } - // put layer into envelope - layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z)). - addPhysVolID("side", 1).addPhysVolID("layer", std::stoi(layer_id))); + layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z)) + .addPhysVolID("layer", std::stoi(layer_id)).addPhysVolID("side", 1)); tracker.add(layer_det); // copy layer_vol and put reflect if (reflect) { + /* std::string reflect_layer_name = layer_name + "_reflect"; - auto reflect_layer_det = layer_det.clone(reflect_layer_name); + auto reflect_layer_det = layer_det.clone(reflect_layer_name, det_id); reflect_layer_det.setPlacement( envelope.placeVolume(layer_vol, Transform3D(Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1), Position(0, 0, -z))).addPhysVolID("side", -1). addPhysVolID("layer", std::stoi(layer_id))); tracker.add(reflect_layer_det); + */ + /* + std::pair<DetElement,Volume> reflected_layer = layer_det.reflect(layer_name + "_reflect"); + auto pv = envelope.placeVolume(reflected_layer.second, Position(0, 0, -z)) + .addPhysVolID("side", -1).addPhysVolID("layer", std::stoi(layer_id)); + reflected_layer.first.setPlacement(pv); + tracker.add(reflected_layer.first); + */ + layerNeg_det.setPlacement(envelope.placeVolume(layerNeg_vol, Position(0, 0, -z)) + .addPhysVolID("layer", std::stoi(layer_id)).addPhysVolID("side", -1)); + tracker.add(layerNeg_det); } + + disk.typeFlags[dd4hep::rec::MultiRingsZDiskData::SensorType::DoubleSided] = 1; + disk.typeFlags[dd4hep::rec::MultiRingsZDiskData::SensorType::Pixel] = 1; + disk.alphaPetal = 0; + disk.zPosition = z; + disk.zOffsetSupport = 0; + disk.rminSupport = inner_r; + disk.rmaxSupport = outer_r; + disk.thicknessSupport = SupportThickness; + diskData->layers.push_back(disk); } + std::cout << (*diskData) << std::endl; + tracker.addExtension<dd4hep::rec::MultiRingsZDiskData>(diskData); + if (x_det.hasAttr(_U(combineHits))) { tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens); diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp index b0aebb608bf8ebfcd451dca4f29ee4cbd7181037..511a34d7bfd034960645bcb0a8831ef221be0c2b 100644 --- a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp +++ b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp @@ -202,7 +202,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se } else { - thickness_support += layer_thickness; + if (thickness_sensitive == 0) thickness_support += layer_thickness; surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane, rec::SurfaceType::ParallelToZ); } @@ -307,7 +307,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se double z_position = -ladder_length_inner * (ladder_repeat_inner / 2.0) - (i + 0.5) * ladder_length_outer; Position pos(0, 0, z_position); auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(-i - 1)); - cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("module", i)); + cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("oladder", -i - 1)); stave_det.add(cloned_outer_ladder_det); } @@ -327,28 +327,26 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se envelope.placeVolume(stave_vol, Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0.0))). addPhysVolID("module", i)); otk_barrel.add(cloned_stave_det); - - rec::ZPlanarData::LayerLayout otk_barrel_layer; - otk_barrel_layer.phi0 = angle; - otk_barrel_layer.ladderNumber = ladder_repeat_outer + ladder_repeat_inner; - otk_barrel_layer.thicknessSensitive = thickness_sensitive; - otk_barrel_layer.thicknessSupport = thickness_support; - otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support; - otk_barrel_layer.distanceSupport = otk_inner_radius; - otk_barrel_layer.offsetSensitive = stave_y_offset; - otk_barrel_layer.offsetSupport = stave_y_offset; - otk_barrel_layer.widthSensitive = module_width; - otk_barrel_layer.widthSupport = module_width; - otk_barrel_layer.sensorsPerLadder = module_repeat * 4; - double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer / - 2.0; - otk_barrel_layer.zHalfSensitive = z_half; - otk_barrel_layer.zHalfSupport = z_half; - z_planar_data->layers.push_back(otk_barrel_layer); } - + rec::ZPlanarData::LayerLayout otk_barrel_layer; + otk_barrel_layer.phi0 = 0; + otk_barrel_layer.ladderNumber = stave_repeat; + otk_barrel_layer.thicknessSensitive = thickness_sensitive; + otk_barrel_layer.thicknessSupport = thickness_support; + otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support; + otk_barrel_layer.distanceSupport = otk_inner_radius; + otk_barrel_layer.offsetSensitive = stave_y_offset; + otk_barrel_layer.offsetSupport = stave_y_offset; + otk_barrel_layer.widthSensitive = module_width; + otk_barrel_layer.widthSupport = module_width; + otk_barrel_layer.sensorsPerLadder = module_repeat * 4; + double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer / 2.0; + otk_barrel_layer.zHalfSensitive = z_half; + otk_barrel_layer.zHalfSupport = z_half; + z_planar_data->layers.push_back(otk_barrel_layer); // check_det_element(otk_barrel); + std::cout << (*z_planar_data) << std::endl; otk_barrel.addExtension<rec::ZPlanarData>(z_planar_data); if (x_det.hasAttr(_U(combineHits))) { diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp index 12c866acd437ecc4a6769f8159c48ee6eaa80947..c68a93b4ecf3f14aaba2987d4fe4c9b8c451f9a3 100644 --- a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp +++ b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp @@ -96,14 +96,23 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se const double trapezoid_height = ring_outer_radius - ring_inner_radius; const double trapezoid_inner_length = calculate_polygon_side_length(ring_inner_radius, repeat); const double trapezoid_outer_length = calculate_polygon_side_length(ring_outer_radius, repeat); - const auto layers_thickness = layers_xml.attr<double>("thickness"); - const double layers_base_thickness = layers_thickness; + + double layers_base_thickness = 0; + for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers) + { + const xml::Component layer = xml::Handle_t(layers); + const auto layer_thickness = layer.attr<double>("thickness"); + layers_base_thickness += layer_thickness; + } Trapezoid layer_base_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0, layers_base_thickness / 2.0, layers_base_thickness / 2.0, trapezoid_height / 2.0); Volume layer_base_vol(ring_name, layer_base_shape, air); layer_base_vol = layer_base_vol.setVisAttributes(theDetector, ring.attr<std::string>("vis")); + double sensitive_thickness = 0; + double support_thickness = 0; + double service_thickness = 0; double y_offset = -layers_base_thickness / 2.0; for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers) { @@ -124,10 +133,13 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se { layer_vol = layer_vol.setSensitiveDetector(sens); surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive, rec::SurfaceType::Plane); + sensitive_thickness += layer_thickness; } else { surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane); + if (sensitive_thickness==0) service_thickness += layer_thickness; + else support_thickness += layer_thickness; } rec::Vector3D u(1., 0., 0.); rec::Vector3D v(0., 0., 1.); @@ -163,30 +175,37 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se auto cloned_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(i + 1)); auto cloned_neg_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(-(i + 1))); auto pv = envelope.placeVolume(layer_base_vol, transform).addPhysVolID("side", 1).addPhysVolID("module", i) - .addPhysVolID("sensor", ring_num); + .addPhysVolID("layer", ring_num); auto neg_pv = envelope.placeVolume(layer_base_vol, neg_transform).addPhysVolID("side", -1). - addPhysVolID("module", i).addPhysVolID("sensor", ring_num); + addPhysVolID("module", i).addPhysVolID("layer", ring_num); cloned_ring_piece_det.setPlacement(pv); cloned_neg_ring_piece_det.setPlacement(neg_pv); otk_endcaps.add(cloned_ring_piece_det); otk_endcaps.add(cloned_neg_ring_piece_det); } + + rec::ZDiskPetalsData::LayerLayout otk_endcap_layer; + otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::DoubleSided] = false; + otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::Pixel] = true; + otk_endcap_layer.phi0 = angle_step / 2.0; + otk_endcap_layer.distanceSupport = ring_inner_radius; + otk_endcap_layer.distanceSensitive = ring_inner_radius; + otk_endcap_layer.lengthSupport = trapezoid_height; + otk_endcap_layer.lengthSensitive = trapezoid_height; + otk_endcap_layer.thicknessSensitive = sensitive_thickness; + otk_endcap_layer.thicknessSupport = service_thickness; // front regard as support in KF, ignore rear material + otk_endcap_layer.widthInnerSupport = trapezoid_inner_length; + otk_endcap_layer.widthInnerSensitive = trapezoid_inner_length; + otk_endcap_layer.widthOuterSupport = trapezoid_outer_length; + otk_endcap_layer.widthOuterSensitive = trapezoid_outer_length; + otk_endcap_layer.zPosition = zmax - support_thickness - 0.5*sensitive_thickness; + otk_endcap_layer.sensorsPerPetal = 1; + otk_endcap_layer.petalNumber = repeat; + otk_endcap_layer.petalHalfAngle = angle_step / 2.0; + zDiskPetalsData->layers.push_back(otk_endcap_layer); } - rec::ZDiskPetalsData::LayerLayout otk_endcap_layer; - otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::DoubleSided] = false; - otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::Pixel] = true; - otk_endcap_layer.phi0 = 0; - otk_endcap_layer.distanceSupport = 406 * mm; - otk_endcap_layer.distanceSensitive = 406 * mm; - otk_endcap_layer.lengthSupport = 1410 * mm; - otk_endcap_layer.lengthSensitive = 1410 * mm; - otk_endcap_layer.thicknessSensitive = 0.3 * mm; - otk_endcap_layer.thicknessSupport = 3.6 * mm; - otk_endcap_layer.zPosition = zmax - 3.6 * mm; - otk_endcap_layer.sensorsPerPetal = 127; - otk_endcap_layer.petalNumber = 16; - zDiskPetalsData->layers.push_back(otk_endcap_layer); + std::cout << (*zDiskPetalsData) << std::endl; otk_endcaps.addExtension<rec::ZDiskPetalsData>(zDiskPetalsData); // #ifdef DET_ELEMENT_DEBUG @@ -196,6 +215,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se { otk_endcaps.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens); } + return otk_endcaps; } diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h index 6de9c474f3bff216ffdc4edc9229027fbdc8162d..d2bc8272d6e872d8734bc34d68f48cb2cde86de4 100644 --- a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h +++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h @@ -56,6 +56,14 @@ namespace CEPCConf{ static const int GOOD = 27; }; + struct DetCellID{ + static const int system = 0; + static const int side = 1; + static const int layer = 2; + static const int module = 3; + static const int sensor = 4; + }; + struct DetEncoderString{ static const int system = 5; static const int side = -2; diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h index b466c10cfa3ed9f293727546673aa02d60dc7591..a790a2a156c5c9f23934b5f32ab19826170875c2 100644 --- a/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h +++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h @@ -191,6 +191,136 @@ namespace dd4hep { return io; }; + /** Simple data structure with key parameters for + * zdisk by multi rings + * + * @author + * @date Feb, 26, 2025 + * @version $Id: $ + */ + struct MultiRingsZDiskStruct { + /// width of the strips (if applicable ) + double widthStrip; + /// length of the strips (if applicable ) + double lengthStrip; + /// strip pitch (if applicable ) + double pitchStrip; + /// strip stereo angle (if applicable ) + double angleStrip; + + /// enum for encoding the sensor type in typeFlags + struct SensorType{ + enum { + DoubleSided=0, + Pixel + }; + }; + + /** Internal helper struct for defining the layer layout. Layers are defined + * with a sensitive part, flex/cable/service part and a support part. + */ + struct Ring { + Ring() : + petalNumber(0), + sensorsPerPetal(0), + phi0(0), + phiOffsetOdd(0), + distance(0), + widthInner(0), + widthOuter(0), + length(0), + thicknessSensitive(0), + thicknessGlue(0), + thicknessService(0) { + } + + int petalNumber; + int sensorsPerPetal; + double phi0; + double phiOffsetOdd; + double distance; + double widthInner; + double widthOuter; + double length; + double thicknessSensitive; + double thicknessGlue; + double thicknessService; + }; + + struct LayerLayout { + LayerLayout() : + typeFlags(0), + alphaPetal(0), + zPosition(0), + zOffsetSupport(0), + rminSupport(0), + rmaxSupport(0), + thicknessSupport(0) { + } + std::bitset<32> typeFlags; + double alphaPetal; + double zPosition; + double zOffsetSupport; + double rminSupport; + double rmaxSupport; + double thicknessSupport; + + std::vector<Ring> rings; + }; + + std::vector<LayerLayout> layers; + }; + typedef StructExtension<MultiRingsZDiskStruct> MultiRingsZDiskData; + + static std::ostream& operator<<( std::ostream& io , const MultiRingsZDiskData& d ) { + boost::io::ios_base_all_saver ifs(io); + + io << " -- MultiRingsZDiskData: " << std::scientific << std::endl; + io << " widthStrip : " << d.widthStrip << std::endl; + io << " lengthStrip : " << d.lengthStrip << std::endl; + io << " pitchStrip : " << d.pitchStrip << std::endl; + io << " angleStrip : " << d.angleStrip << std::endl; + + std::vector<MultiRingsZDiskData::LayerLayout> layers = d.layers; + io << " Layers : alphaPetal zPosition d p zOffsetSup rminSupport rmaxSupport thicknessSupport nRing" << std::endl; + io << " np ns phi0 phiOffsetOdd distance widthInner widthOuter length thicknessSensitive thicknessGlue thicknessService" << std::endl; + + for (unsigned i=0,N=layers.size(); i<N; ++i) { + MultiRingsZDiskData::LayerLayout l = layers[i]; + + std::vector<MultiRingsZDiskData::Ring> rings = l.rings; + io << " " << l.alphaPetal + << " " << l.zPosition + << " " << l.typeFlags[ MultiRingsZDiskData::SensorType::DoubleSided ] + << " " << l.typeFlags[ MultiRingsZDiskData::SensorType::Pixel ] + << " " << l.zOffsetSupport + << " " << l.rminSupport + << " " << l.rmaxSupport + << " " << l.thicknessSupport + << " " << rings.size() + << std::endl; + + for (unsigned ir=0,NR=rings.size(); ir<NR; ++ir) { + MultiRingsZDiskData::Ring r = rings[ir]; + + io << " " << r.petalNumber + << " " << r.sensorsPerPetal + << " " << r.phi0 + << " " << r.phiOffsetOdd + << " " << r.distance + << " " << r.widthInner + << " " << r.widthOuter + << " " << r.length + << " " << r.thicknessSensitive + << " " << r.thicknessGlue + << " " << r.thicknessService + << std::endl; + } + } + + return io; + }; + /** Simple data structure with key parameters for * reconstruction of long crystal bar ECAL * diff --git a/Digitization/DigiSimple/src/SmearDigiTool.cpp b/Digitization/DigiSimple/src/SmearDigiTool.cpp index 64e52e6a28c4d5f35f143d1c3790d4c015e01bc9..6362ae3d4bce8f2a650dab4398c7ee35e4473a9c 100644 --- a/Digitization/DigiSimple/src/SmearDigiTool.cpp +++ b/Digitization/DigiSimple/src/SmearDigiTool.cpp @@ -94,11 +94,11 @@ StatusCode SmearDigiTool::Call(edm4hep::SimTrackerHit simhit, edm4hep::TrackerHi auto t = simhit.getTime(); auto cellId = simhit.getCellID(); - int system = m_decoder->get(cellId, "system"); - int side = m_decoder->get(cellId, "side" ); - int layer = m_decoder->get(cellId, "layer" ); - int module = m_decoder->get(cellId, "module"); - int sensor = m_decoder->get(cellId, "sensor"); + int system = m_decoder->get(cellId, CEPCConf::DetCellID::system); + int side = m_decoder->get(cellId, CEPCConf::DetCellID::side); + int layer = m_decoder->get(cellId, CEPCConf::DetCellID::layer); + int module = m_decoder->get(cellId, CEPCConf::DetCellID::module); + int sensor = m_decoder->get(cellId, CEPCConf::DetCellID::sensor); auto& pos = simhit.getPosition(); auto& mom = simhit.getMomentum(); @@ -277,6 +277,7 @@ StatusCode SmearDigiTool::Call(edm4hep::SimTrackerHit simhit, edm4hep::TrackerHi << localPointSmeared.u()/dd4hep::mm << " " << localPointSmeared.v()/dd4hep::mm << ")" << endmsg; auto outhit = hitCol->create(); + outhit.setCellID(cellId); edm4hep::Vector3d smearedPos(globalPointSmeared.x()/dd4hep::mm, diff --git a/Reconstruction/RecPFACyber/script/digi.py b/Reconstruction/RecPFACyber/script/digi.py index 78c790b0eb166cd0ec3f1f2b5c725f00e33da10c..3a7f2ae76c43612f8abcfcaddc04d780d5fc5733 100644 --- a/Reconstruction/RecPFACyber/script/digi.py +++ b/Reconstruction/RecPFACyber/script/digi.py @@ -159,9 +159,10 @@ out.outputCommands = ["drop *", "keep MCParticle", "keep VXDCollection", "keep ITKBarrelCollection", + "keep ITKEndcapCollection", "keep TPCCollection", "keep OTKBarrelCollection", - "keep FTDCollection", + "keep OTKEndcapCollection", "keep MuonBarrelCollection", "keep MuonEndcapCollection", "keep ECALBarrel", diff --git a/Reconstruction/RecPFACyber/script/tracking.py b/Reconstruction/RecPFACyber/script/tracking.py index 1ee381d1303dd91a6e86d53f60a350b2e707ca86..deedf267ed48d611b94ff83475287542dbff5990 100644 --- a/Reconstruction/RecPFACyber/script/tracking.py +++ b/Reconstruction/RecPFACyber/script/tracking.py @@ -50,9 +50,10 @@ podioinput = PodioInput("PodioReader", collections=[ "MCParticle", "VXDCollection", "ITKBarrelCollection", + "ITKEndcapCollection", "TPCCollection", "OTKBarrelCollection", - "FTDCollection", + "OTKEndcapCollection", "MuonBarrelCollection", "MuonEndcapCollection" ]) @@ -65,11 +66,10 @@ podioinput = PodioInput("PodioReader", collections=[ ## Config ## vxdhitname = "VXDTrackerHits" sithitname = "ITKBarrelTrackerHits" +ftdhitname = "ITKEndcapTrackerHits" gashitname = "TPCTrackerHits" sethitname = "OTKBarrelTrackerHits" -setspname = "OTKBarrelSpacePoints" -ftdhitname = "FTDTrackerHits" -ftdspname = "FTDSpacePoints" +etdhitname = "OTKEndcapTrackerHits" from Configurables import SmearDigiTool,SiTrackerDigiAlg ## VXD ## @@ -98,6 +98,19 @@ digiITKB.TrackerHitAssociationCollection = "ITKBarrelTrackerHitAssociation" digiITKB.DigiTool = "SmearDigiTool/ITKBarrel" #digiITKB.OutputLevel = DEBUG +## ITKEndcap ## +itketool = SmearDigiTool("ITKEndcap") +itketool.ResolutionU = [0.008] +itketool.ResolutionV = [0.040] +#itketool.OutputLevel = DEBUG + +digiITKE = SiTrackerDigiAlg("ITKEndcapDigi") +digiITKE.SimTrackHitCollection = "ITKEndcapCollection" +digiITKE.TrackerHitCollection = ftdhitname +digiITKE.TrackerHitAssociationCollection = "ITKEndcapTrackerHitAssociation" +digiITKE.DigiTool = "SmearDigiTool/ITKEndcap" +#digiITKE.OutputLevel = DEBUG + ## OTKBarrel ## otkbtool = SmearDigiTool("OTKBarrel") otkbtool.ResolutionU = [0.010] @@ -111,18 +124,18 @@ digiOTKB.TrackerHitAssociationCollection = "OTKBarrelTrackerHitAssociation" digiOTKB.DigiTool = "SmearDigiTool/OTKBarrel" #digiOTKB.OutputLevel = DEBUG -## FTD ## -ftdtool = SmearDigiTool("FTD") -ftdtool.ResolutionU = [0.0072] -ftdtool.ResolutionV = [0.086] -#ftdtool.OutputLevel = DEBUG +## OTKEndcap ## +otketool = SmearDigiTool("OTKEndcap") +otketool.ResolutionU = [0.010] +otketool.ResolutionV = [1.000] +#otketool.OutputLevel = DEBUG -digiFTD = SiTrackerDigiAlg("FTDDigi") -digiFTD.SimTrackHitCollection = "FTDCollection" -digiFTD.TrackerHitCollection = ftdhitname -digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation" -digiFTD.DigiTool = "SmearDigiTool/FTD" -#digiFTD.OutputLevel = DEBUG +digiOTKE = SiTrackerDigiAlg("OTKEndcapDigi") +digiOTKE.SimTrackHitCollection = "OTKEndcapCollection" +digiOTKE.TrackerHitCollection = etdhitname +digiOTKE.TrackerHitAssociationCollection = "OTKEndcapTrackerHitAssociation" +digiOTKE.DigiTool = "SmearDigiTool/OTKEndcap" +#digiOTKE.OutputLevel = DEBUG ## TPC ## from Configurables import TPCDigiAlg @@ -149,6 +162,10 @@ digiMuon.MuonBarrelTrackerHits = "MuonBarrelTrackerHits" digiMuon.MuonEndcapTrackerHits = "MuonEndcapTrackerHits" digiMuon.WriteNtuple = 0 digiMuon.OutFileName = "Digi_MUON.root" +digiMuon.SiPMEff = 1 +digiMuon.EdepMin = 0.0001 +digiMuon.HitEdepMin = 0.000001 +digiMuon.HitEdepMax = 0.1 ######################################### ################ @@ -191,7 +208,6 @@ tracking.HeaderCol = "EventHeader" tracking.VTXHitCollection = vxdhitname tracking.SITHitCollection = sithitname tracking.FTDPixelHitCollection = ftdhitname -tracking.FTDSpacePointCollection = ftdspname tracking.SITRawHitCollection = "NotNeedForPixelSIT" tracking.FTDRawHitCollection = ftdhitname tracking.UseSIT = True @@ -213,7 +229,7 @@ tracking.Chi2WZSeptet = 0.1 from Configurables import ForwardTrackingAlg forward = ForwardTrackingAlg("ForwardTracking") forward.FTDPixelHitCollection = ftdhitname -forward.FTDSpacePointCollection = ftdspname +#forward.FTDSpacePointCollection = ftdspname forward.FTDRawHitCollection = ftdhitname forward.Chi2ProbCut = 0.0 forward.HitsPerTrackMin = 3 @@ -228,7 +244,7 @@ forward.CriteriaMax = [30, 1.02, 10, 1.015, 20, 1.3, 1.0, 150, 1.08, 99999999, from Configurables import TrackSubsetAlg subset = TrackSubsetAlg("TrackSubset") subset.TrackInputCollections = ["ForwardTracks", "SiTracks"] -subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname, ftdspname] +subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname] subset.TrackSubsetCollection = "SubsetTracks" #subset.FitterTool = "KalTestTool/KalTest111" #subset.OutputLevel = DEBUG @@ -245,7 +261,8 @@ full.SITTrackerHits = sithitname full.TPCTrackerHits = gashitname full.SETTrackerHits = sethitname full.FTDPixelTrackerHits = ftdhitname -full.FTDSpacePoints = ftdspname +#full.FTDSpacePoints = ftdspname +full.ETDTrackerHits = etdhitname full.SITRawHits = "NotNeedForPixelSIT" full.SETRawHits = "NotNeedForPixelSET" full.FTDRawHits = ftdhitname @@ -255,6 +272,7 @@ full.OutputTracks = "CompleteTracks" # default name full.FTDHitToTrackDistance = 5. full.SITHitToTrackDistance = 3. full.SETHitToTrackDistance = 5. +full.ETDHitToTrackDistance = 15. full.MinChi2ProbForSiliconTracks = 0 full.MaxChi2PerHit = 200 full.ForceSiTPCMerging = True @@ -273,7 +291,8 @@ from Configurables import TrackParticleRelationAlg tpr = TrackParticleRelationAlg("Track2Particle") tpr.MCParticleCollection = "MCParticle" tpr.TrackList = ["CompleteTracks"] -tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation"] +tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation", + "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation"] #tpr.OutputLevel = DEBUG @@ -281,7 +300,8 @@ from Configurables import TrueMuonTagAlg tmt = TrueMuonTagAlg("TrueMuonTag") tmt.MCParticleCollection = "MCParticle" tmt.TrackList = ["CompleteTracks"] -tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation", "TPCTrackerHitAss"] +tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation", + "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation", "TPCTrackerHitAss"] tmt.MuonTagEfficiency = 0.95 # muon true tag efficiency, default is 1.0 (100%) tmt.MuonDetTanTheta = 1.2 # muon det barrel/endcap separation tan(theta) #tmt.OutputLevel = DEBUG @@ -295,7 +315,7 @@ out.outputCommands = ["keep *"] # ApplicationMgr from Configurables import ApplicationMgr mgr = ApplicationMgr( - TopAlg = [podioinput, digiVXD, digiITKB, digiOTKB, digiFTD, digiTPC, digiMuon, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tof, tmt, out], + TopAlg = [podioinput, digiVXD, digiITKB, digiITKE, digiOTKB, digiOTKE, digiTPC, digiMuon, tracking, clupatra, full, tpr, tpc_dndx, tof, tmt, out], EvtSel = 'NONE', EvtMax = 10, ExtSvc = [rndmengine, rndmgensvc, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc, pidsvc], diff --git a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp index 831aa8c8be3a5ba2b41950129bbf6e6778eb57b4..2bef32666ab54fc3c2a1f334f0b7fbb05caf6770 100644 --- a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp +++ b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp @@ -28,6 +28,7 @@ #include "gear/FTDLayerLayout.h" #else #include "DetInterface/IGeomSvc.h" +#include "DetIdentifier/CEPCDetectorData.h" #endif //----From KiTrack----------------------------- @@ -172,19 +173,39 @@ StatusCode ForwardTrackingAlg::initialize(){ int nLayers(0), nModules(0), nSensors(0); try { - auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); - auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>(); - auto ftdlayers = ftdData->layers; + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>(); + auto& ftdlayers = ftdData->layers; nLayers = ftdlayers.size() + 1; - for (int layer = 0; layer < ftdlayers.size(); layer++) { + for (int layer = 0, N = ftdlayers.size(); layer < N; layer++) { auto& ftdlayer = ftdlayers[layer]; if (ftdlayer.petalNumber > nModules) nModules = ftdlayer.petalNumber; if (ftdlayer.sensorsPerPetal > nSensors) nSensors = ftdlayer.sensorsPerPetal; } } catch(std::runtime_error& e) { - fatal() << e.what() << endmsg; - return StatusCode::FAILURE; + info() << e.what() << endmsg; + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>(); + auto& ftdlayers = ftdData->layers; + + nLayers = ftdlayers.size() + 1; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + auto& ftdlayer = ftdlayers[layer]; + auto& rings = ftdlayer.rings; + int ns = 0; + for (int iring = 0, N = rings.size(); iring < N; iring++) { + auto& ring = rings[iring]; + if (ring.petalNumber > nModules) nModules = ring.petalNumber; + ns += ring.sensorsPerPetal; + } + if (ns > nSensors) nSensors = ns; + } + } catch(std::runtime_error& e) { + fatal() << e.what() << endmsg; + return StatusCode::FAILURE; + } } #endif diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp index f5316ac5f45d68ff8c551c7933c35831df36c2e8..4839b7eaf2c1bc6b77b444589db3e770e5aa87c9 100644 --- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp +++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp @@ -3204,8 +3204,29 @@ StatusCode SiliconTrackingAlg::setupGeom() { } } _nlayersFTD =_zLayerFTD.size(); - } catch(std::runtime_error& e){ - warning() << e.what() << endmsg; + } catch(std::runtime_error& e1){ + info() << "try ZDiskPetalsData: " << e1.what() << endmsg; + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>(); + auto ftdlayers = ftdData->layers; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer]; + auto& ring = ftdlayer.rings[0]; + // front petal even numbered + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm - 0.5*ftdlayer.thicknessSupport/dd4hep::mm + - ring.thicknessGlue/dd4hep::mm - 0.5*ring.thicknessSensitive/dd4hep::mm); + if (ring.petalNumber > 0) { + // front petal odd numbered + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm + 0.5*ftdlayer.thicknessSupport/dd4hep::mm + + ring.thicknessGlue/dd4hep::mm + 0.5*ring.thicknessSensitive/dd4hep::mm); + _petalBasedFTDWithOverlaps = true; + } + } + _nlayersFTD =_zLayerFTD.size(); + } catch(std::runtime_error& e2) { + warning() << "try MultiRingsZDiskData: " << e2.what() << endmsg; + } } #endif diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp index 001971edfbba00611f1319dd1237153fd0ac48b1..a5e8f1038152cd8d2bff3f57fa63e57cf0b946f5 100755 --- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp +++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp @@ -483,10 +483,14 @@ fitstart: else { error_code = m_fitTool->Fit(track, trkHits, covMatrix, maxChi2PerHit, fit_backwards); } + } catch (std::runtime_error& e) { + error() << e.what() << endmsg; + throw std::runtime_error("Need more check"); + } catch (MarlinTrk::Exception& e) { + error() << e.what() << endmsg; + throw std::runtime_error("Need more check"); } catch (...) { - // delete track; - // delete marlinTrk; - error() << "exception happened while createFinalisedLCIOTrack!" << endmsg; + error() << "unknown exception happened while createFinalisedLCIOTrack!" << endmsg; throw std::runtime_error("Need more check"); } debug() << "createFinalisedLCIOTrack finished" << endmsg; @@ -3516,7 +3520,7 @@ void FullLDCTrackingAlg::AddNotAssignedHits() { } for (int iL=0; iL<_nLayersETD; ++iL) { // loop over ETD layers TrackerHitExtendedVec hitVec = ETDHits[iL]; - int refit = 0; + int refit = 1; if (hitVec.empty() == false) AssignOuterHitsToTracks(hitVec, _distCutForETDHits, refit); } } @@ -3719,7 +3723,7 @@ void FullLDCTrackingAlg::CleanUpExtrapolations() { void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, float dcut, int refit) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks dcut = " << dcut << endmsg; + debug() << " AssignOuterHitsToTracks dcut = " << dcut << endmsg; // get the number of hits to try, and the number of final tracks to which the tracks will be attached int nHits = int(hitVec.size()); @@ -3763,25 +3767,22 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f // skip if the extrapolations failed if (helix==0) { - debug() << "helix extrapolation failed for trkExt" << endmsg; + debug() << " **helix extrapolation failed for trkExt" << endmsg; continue; } float distance = helix->getDistanceToPoint(pos,dcut); - debug() << "for helix extrapolation " << helix << " distance = " << distance << endmsg; + debug() << " **for helix extrapolation " << helix << " distance = " << distance << endmsg; // check the distance is less than the steerable cut ... if (distance<dcut) { - debug() << "for helix extrapolation " << helix << " distance = " << distance << endmsg; - // ... if so create the association and flag the hit and track TrackHitPair * trkHitPair = new TrackHitPair(trkExt,trkHitExt,distance); pairs.push_back(trkHitPair); flagTrack[trkExt] = true; flagHit[trkHitExt] = true; - } } } @@ -3789,7 +3790,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f int nPairs = int(pairs.size()); - debug() << "AssignOuterHitsToTracks : Number of track hit pairs to try = " << nPairs << endmsg; + debug() << " AssignOuterHitsToTracks : Number of track hit pairs to try = " << nPairs << endmsg; if (nPairs>0) { @@ -3881,7 +3882,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f trkHits.push_back(it->second); } - debug() << "AssignOuterHitsToTracks: Start Fitting: AddHits: number of hits to fit " << trkHits.size() << endmsg; + debug() << " **Start Fitting: AddHits: number of hits to fit " << trkHits.size() << endmsg; MarlinTrk::IMarlinTrack* marlin_trk = _trksystem->createTrack(); //std::auto_ptr<MarlinTrk::IMarlinTrack> marlin_trk_autop(_trksystem->createTrack()); @@ -3914,11 +3915,11 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f covMatrix[14] = ( _initialTrackError_tanL ); //sigma_tanl^2 pre_fit.covMatrix = covMatrix; - debug() << "AssignOuterHitsToTracks: before createFit " << pre_fit << endmsg; + debug() << " **createFit from pre_fit TrackState " << pre_fit << endmsg; int error = MarlinTrk::createFit( trkHits, marlin_trk, &pre_fit, _bField, IMarlinTrack::forward/*backward*/, _maxChi2PerHit ); - debug() << "AssignOuterHitsToTracks: after createFit" << endmsg; + debug() << " **createFit finished, error code = " << error << endmsg; if ( error != IMarlinTrack::success ) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: creation of fit fails with error " << error << endmsg; + debug() << " **creation of fit fails with error " << MarlinTrk::errorCode(error) << endmsg; delete marlin_trk ; continue ; @@ -3929,14 +3930,14 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f float outlier_pct = outliers.size()/float(trkHits.size()) ; - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: percentage of outliers " << outlier_pct << endmsg; + debug() << " **percentage of outliers " << outlier_pct << endmsg; if ( outlier_pct > _maxAllowedPercentageOfOutliersForTrackCombination) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg; + debug() << " **percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg; delete marlin_trk ; continue ; } - debug() << "AssignOuterHitsToTracks: before propagate" << endmsg; + debug() << " **before propagate" << endmsg; std::vector<std::pair<edm4hep::TrackerHit, double> > hitsInFit; marlin_trk->getHitsInFit(hitsInFit); auto firstHit = hitsInFit.begin()->first; @@ -3948,21 +3949,21 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f return_code = marlin_trk->propagate(point, firstHit, trkState, chi2_D, ndf); delete marlin_trk ; - debug() << "AssignOuterHitsToTracks: after delete" << endmsg; + debug() << " **after delete" << endmsg; if ( error != IMarlinTrack::success ) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: propagate to IP fails with error " << error << endmsg; + debug() << " **propagate to IP fails with error " << MarlinTrk::errorCode(error) << endmsg; continue ; } if ( ndf < 0 ) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: Fit failed : NDF is less that zero " << ndf << endmsg; + debug() << " **Fit failed : NDF is less that zero " << ndf << endmsg; continue ; } float chi2Fit = chi2_D/float(ndf); if ( chi2Fit > _chi2FitCut ) { - debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " << chi2Fit << endmsg; + debug() << " **track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " << chi2Fit << endmsg; //why not continue? FIXME, by fucd return ; } @@ -3990,7 +3991,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f flagTrack[trkExt] = false; flagHit[trkHitExt] = false; - debug() << "AssignOuterHitsToTracks: Hit " << trkHitExt << " successfully assigned to track " << trkExt << endmsg; + debug() << " **Hit " << trkHitExt << " successfully assigned to track " << trkExt << endmsg; } } } @@ -4006,7 +4007,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) { - debug() << "FullLDCTrackingAlg::GetExtrapolationHelix called for track " << track << endmsg; + debug() << "GetExtrapolationHelix called for track " << track << endmsg; HelixClass * helix = 0; @@ -4021,7 +4022,7 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) { ts_at_calo.location = -1; float z_ref_max = 0; - debug() << "FullLDCTrackingAlg::GetExtrapolationHelix number of tracks associated = " << trk_vec.size() << endmsg; + debug() << "GetExtrapolationHelix number of tracks associated = " << trk_vec.size() << endmsg; for (unsigned itrk=0; itrk<trk_vec.size(); ++itrk) { @@ -4030,19 +4031,23 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) { if (trk_lcio.isAvailable()) { // use the tracks state at the calorimeter because that will have accounted for energy loss already - if (hasTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter)) { - - TrackState ts_at_last_hit = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtLastHit); - float z_ref = ts_at_last_hit.referencePoint[2]; - - // make sure we use the one closest to the calo face - if ( fabs(z_ref) > z_ref_max) { - z_ref_max = fabs(z_ref); - ts_at_calo = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter); - - debug() << "GetExtrapolationHelix set ts_at_calo with ref_z = " << z_ref << endmsg; - debug() << "TrackState at calo: " << ts_at_calo << endmsg; + edm4hep::TrackState ts = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter); + edm4hep::TrackState ts_at_last_hit = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtLastHit); + float z_ref = ts_at_last_hit.referencePoint[2]; + // make sure we use the one closest to the calo face + // fucd FIXME: why use ts_at_calo not ts_at_last_hit + if ( fabs(z_ref) > z_ref_max) { + z_ref_max = fabs(z_ref); + + if (ts.omega!=0) { + ts_at_calo = ts; + } + else if (ts_at_calo.location!=edm4hep::TrackState::AtCalorimeter) { + ts_at_calo = ts_at_last_hit; } + + debug() << "GetExtrapolationHelix set ts_at_calo with ref_z = " << z_ref << endmsg; + debug() << "TrackState at calo: " << ts_at_calo << endmsg; } } } @@ -4064,7 +4069,7 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) { ts_at_calo_forIP.tanLambda, _bField); - debug() << "FullLDCTrackingAlg::GetExtrapolationHelix helix created at IP" << endmsg; + debug() << "GetExtrapolationHelix helix created at IP, TrackState " << ts_at_calo_forIP << endmsg; } return helix; @@ -4434,7 +4439,7 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec, int error = MarlinTrk::createFit( trkHits, marlin_trk, &pre_fit, _bField, !IMarlinTrack::backward , _maxChi2PerHit ); if ( error != IMarlinTrack::success ) { - debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: creation of fit fails with error " << error << endmsg; + debug() << "AssignSiHitsToTracks: creation of fit fails with error " << error << endmsg; delete marlin_trk ; continue ; @@ -4445,10 +4450,10 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec, float outlier_pct = outliers.size()/float(trkHits.size()); - debug()<< "FullLDCTrackingAlg::AssignSiHitsToTracks: percentage of outliers " << outlier_pct << endmsg; + debug()<< "AssignSiHitsToTracks: percentage of outliers " << outlier_pct << endmsg; if ( outlier_pct > _maxAllowedPercentageOfOutliersForTrackCombination) { - debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg; + debug() << "AssignSiHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg; delete marlin_trk ; continue ; @@ -4463,19 +4468,19 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec, delete marlin_trk ; if ( error != IMarlinTrack::success ) { - debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: propagate to IP fails with error " << error << endmsg; + debug() << "AssignSiHitsToTracks: propagate to IP fails with error " << error << endmsg; continue ; } if ( ndf < 0 ) { - debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: Fit failed : NDF is less that zero " << ndf << endmsg; + debug() << "AssignSiHitsToTracks: Fit failed : NDF is less that zero " << ndf << endmsg; continue ; } float chi2Fit = chi2_D/float(ndf); if ( chi2Fit > _chi2FitCut ) { - debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " << chi2Fit << endmsg; + debug() << "AssignSiHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " << chi2Fit << endmsg; continue ; } @@ -5005,7 +5010,7 @@ int FullLDCTrackingAlg::SegmentRadialOverlap(TrackExtended* first, TrackExtended bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended* secondTrackExt){ - debug() << "FullLDCTrackingAlg::VetoMerge called for " << firstTrackExt << " and " << secondTrackExt << endmsg; + debug() << "VetoMerge called for " << firstTrackExt << " and " << secondTrackExt << endmsg; const float d0First = firstTrackExt->getD0(); const float z0First = firstTrackExt->getZ0(); @@ -5034,7 +5039,7 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended* const float pSecond = sqrt(pxSecond*pxSecond+pySecond*pySecond+pzSecond*pzSecond); if(pFirst<_vetoMergeMomentumCut || pSecond<_vetoMergeMomentumCut) { - debug() << "FullLDCTrackingAlg::VetoMerge do not veto as below momentum cut of 2.5 : pFirst = " << pFirst << " pSecond = " << pSecond << endmsg; + debug() << "VetoMerge do not veto as below momentum cut of 2.5 : pFirst = " << pFirst << " pSecond = " << pSecond << endmsg; return false; } @@ -5046,7 +5051,7 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended* if(combinedTrack!=NULL){ //SJA:FIXME hardcoded cut: here the check is that no more than 7 hits have been rejected in the combined fit. if( combinedTrack->getNDF()+15 < firstTrackExt->getNDF() + secondTrackExt->getNDF()+5 ) { - debug() << "FullLDCTrackingAlg::VetoMerge fails NDF cut " << endmsg; + debug() << "VetoMerge fails NDF cut " << endmsg; veto=true ; } @@ -5055,12 +5060,12 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended* } else { - debug() << "FullLDCTrackingAlg::VetoMerge fails CombineTracks(firstTrackExt,secondTrackExt,true) test" << endmsg; + debug() << "VetoMerge fails CombineTracks(firstTrackExt,secondTrackExt,true) test" << endmsg; veto = true; } if(SegmentRadialOverlap(firstTrackExt,secondTrackExt)>10) { - debug() << "FullLDCTrackingAlg::VetoMerge fails SegmentRadialOverlap test " << endmsg; + debug() << "VetoMerge fails SegmentRadialOverlap test " << endmsg; veto=true; } @@ -5129,7 +5134,7 @@ StatusCode FullLDCTrackingAlg::setupGeom(){ _nLayersSIT = SIT_r.size(); if (_nLayersSIT != SIT_r.size() || _nLayersSIT != SIT_hl.size()) { - fatal() << "FullLDCTrackingAlg Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__ << endmsg; + fatal() << "Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__ << endmsg; exit(1); } } @@ -5189,7 +5194,7 @@ StatusCode FullLDCTrackingAlg::setupGeom(){ _nLayersSET = SET_r.size() ; if (_nLayersSET != SET_r.size() || _nLayersSET != SET_hl.size()) { - fatal() << "FullLDCTrackingAlg Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__ << endmsg; + fatal() << "Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__ << endmsg; exit(1); } } @@ -5334,8 +5339,29 @@ StatusCode FullLDCTrackingAlg::setupGeom(){ } } _nLayersFTD =_zLayerFTD.size(); - } catch(std::runtime_error& e){ - warning() << e.what() << endmsg; + } catch(std::runtime_error& e1) { + info() << "try ZDiskPetalsData: " << e1.what() << endmsg; + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>(); + auto ftdlayers = ftdData->layers; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer]; + auto& ring = ftdlayer.rings[0]; + // front petal even numbered + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm - 0.5*ftdlayer.thicknessSupport/dd4hep::mm + - ring.thicknessGlue/dd4hep::mm - 0.5*ring.thicknessSensitive/dd4hep::mm); + if (ring.petalNumber > 0) { + // front petal odd numbered + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm + 0.5*ftdlayer.thicknessSupport/dd4hep::mm + + ring.thicknessGlue/dd4hep::mm + 0.5*ring.thicknessSensitive/dd4hep::mm); + _petalBasedFTDWithOverlaps = true; + } + } + _nLayersFTD =_zLayerFTD.size(); + } catch(std::runtime_error& e2) { + warning() << "try MultiRingsZDiskData: " << e2.what() << endmsg; + } } _nLayersETD = 0; diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp index 9de3f481170a69256f9059ac0f2eb73e13d6d69d..267a6c6c9bd2510347c01a6b1bea78185cc716ec 100644 --- a/Service/GearSvc/src/GearSvc.cpp +++ b/Service/GearSvc/src/GearSvc.cpp @@ -92,6 +92,10 @@ StatusCode GearSvc::initialize() } else if(it->first=="FTD" || it->first=="ITKEndcap"){ sc = convertFTD(sub); + if (sc.isRecoverable()) sc = convertMultiRingsZDisk(sub); + if (!sc.isSuccess()) { + error() << it->first << " extension not read" << endmsg; + } } else if(it->first=="SIT" || it->first=="ITKBarrel"){ sc = convertSIT(sub); @@ -125,7 +129,7 @@ StatusCode GearSvc::initialize() } catch (...) { info() << "EcalBarrelParameters not create! create fake parameters (big size) now" << endmsg; - gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(2500, 4500, 8, 0.); + gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1860, 2900, 32, 0.); barrelParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1); m_gearMgr->setEcalBarrelParameters(barrelParam); } @@ -134,7 +138,7 @@ StatusCode GearSvc::initialize() } catch (...) { info() << "EcalEndcapsParameters not create! create fake parameters (big size) now" << endmsg; - gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 3000, 4510, 2, 0.); + gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2500, 2930, 2, 0.); endcapParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1); m_gearMgr->setEcalEndcapParameters(endcapParam); } @@ -178,7 +182,7 @@ StatusCode GearSvc::convertBeamPipe(dd4hep::DetElement& pipe){ std::vector<double> gearValROuter; std::vector<double> gearValZ; const std::vector<dd4hep::rec::ConicalSupportData::Section>& sections = beamPipeData->sections; - for(int i=0;i<sections.size();i++){ + for (unsigned i=0;i<sections.size();i++) { gearValZ.push_back(sections[i].zPos*CLHEP::cm ); gearValRInner.push_back(sections[i].rInner*CLHEP::cm ); gearValROuter.push_back(sections[i].rOuter*CLHEP::cm ); @@ -235,7 +239,7 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){ } info() << vxdData->rInnerShell << " " << vxdData->rOuterShell << " " << vxdData->zHalfShell << " " << vxdData->gapShell << endmsg; - for(int i=0,n=vxdData->layers.size(); i<n; i++){ + for (unsigned i=0,n=vxdData->layers.size(); i<n; i++) { const dd4hep::rec::ZPlanarData::LayerLayout& thisLayer = vxdData->layers[i]; info() << i << ": " << thisLayer.ladderNumber << "," << thisLayer.phi0 << "," << thisLayer.distanceSupport/dd4hep::mm << "," << thisLayer.offsetSupport/dd4hep::mm << "," << thisLayer.thicknessSupport/dd4hep::mm << "," @@ -395,7 +399,7 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){ } catch(std::runtime_error& e){ warning() << e.what() << " " << ftdData << endmsg; - return StatusCode::FAILURE; + return StatusCode::RECOVERABLE; } std::vector<dd4hep::rec::ZDiskPetalsData::LayerLayout>& ftdlayers = ftdData->layers; @@ -406,7 +410,7 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){ ftdParam->setDoubleVal("strip_length_mm", ftdData->lengthStrip*CLHEP::cm); ftdParam->setDoubleVal("strip_pitch_mm", ftdData->pitchStrip*CLHEP::cm); ftdParam->setDoubleVal("strip_angle_deg", ftdData->angleStrip*rad_to_deg); - for(int layer = 0; layer < nLayers; layer++){ + for (int layer = 0; layer < nLayers; layer++) { dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer]; int nPetals = ftdlayer.petalNumber; double dphi = CLHEP::twopi/nPetals; @@ -443,6 +447,118 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){ return StatusCode::SUCCESS; } +StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) { + dd4hep::rec::MultiRingsZDiskData* ftdData = nullptr; + try{ + ftdData = ftd.extension<dd4hep::rec::MultiRingsZDiskData>(); + } + catch(std::runtime_error& e){ + warning() << e.what() << " " << ftdData << endmsg; + return StatusCode::FAILURE; + } + + std::vector<dd4hep::rec::MultiRingsZDiskData::LayerLayout>& ftdlayers = ftdData->layers; + int nLayers = ftdlayers.size(); + + gear::GearParametersImpl* ftdParam = new gear::GearParametersImpl(); + ftdParam->setDoubleVal("strip_width_mm", ftdData->widthStrip*CLHEP::cm); + ftdParam->setDoubleVal("strip_length_mm", ftdData->lengthStrip*CLHEP::cm); + ftdParam->setDoubleVal("strip_pitch_mm", ftdData->pitchStrip*CLHEP::cm); + ftdParam->setDoubleVal("strip_angle_deg", ftdData->angleStrip*rad_to_deg); + + std::vector<double> alphaPetals, zPositions, zOffsetSupports, rminSupports, rmaxSupports, thicknessSupports; + std::vector<double> thicknessSensitives, thicknessGlues, thicknessServices; + std::vector<std::string> petalParNames, phi0ParNames, distanceParNames, widthInnerParNames, widthOuterParNames, lengthParNames; + for (int layer = 0; layer < nLayers; layer++) { + dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer]; + + //std::bitset<32> typeFlags; + alphaPetals.push_back(ftdlayer.alphaPetal); + zPositions.push_back(ftdlayer.zPosition*CLHEP::cm); + zOffsetSupports.push_back(ftdlayer.zOffsetSupport*CLHEP::cm); + rminSupports.push_back(ftdlayer.rminSupport*CLHEP::cm); + rmaxSupports.push_back(ftdlayer.rmaxSupport*CLHEP::cm); + thicknessSupports.push_back(ftdlayer.thicknessSupport*CLHEP::cm); + + auto& rings = ftdlayer.rings; + + petalParNames.push_back(std::string("PetalNumber_")+std::to_string(layer)); + phi0ParNames.push_back(std::string("PetalPhi0_")+std::to_string(layer)); + distanceParNames.push_back(std::string("PetalDistance_")+std::to_string(layer)); + widthInnerParNames.push_back(std::string("PetalInnerWidth_")+std::to_string(layer)); + widthOuterParNames.push_back(std::string("PetalOuterWidth_")+std::to_string(layer)); + lengthParNames.push_back(std::string("PetalLength_")+std::to_string(layer)); + + std::vector<int> petalNumbers; + std::vector<double> phi0s, distances, widthInners, widthOuters, lengths; + for (unsigned iring = 0; iring < rings.size(); iring++) { + auto& ring = rings[iring]; + + petalNumbers.push_back(ring.petalNumber); + //int sensorsPerPetal; + phi0s.push_back(ring.phi0); + //double phiOffsetOdd; + distances.push_back(ring.distance*CLHEP::cm); + widthInners.push_back(ring.widthInner*CLHEP::cm); + widthOuters.push_back(ring.widthOuter*CLHEP::cm); + lengths.push_back(ring.length*CLHEP::cm); + + if (iring==0) { + thicknessSensitives.push_back(ring.thicknessSensitive*CLHEP::cm); + thicknessGlues.push_back(ring.thicknessGlue*CLHEP::cm); + thicknessServices.push_back(ring.thicknessService*CLHEP::cm); + } + } + ftdParam->setIntVals(std::string("PetalNumber_")+std::to_string(layer), petalNumbers); + ftdParam->setDoubleVals(std::string("PetalPhi0_")+std::to_string(layer), phi0s); + ftdParam->setDoubleVals(std::string("PetalDistance_")+std::to_string(layer), distances); + ftdParam->setDoubleVals(std::string("PetalInnerWidth_")+std::to_string(layer), widthInners); + ftdParam->setDoubleVals(std::string("PetalOuterWidth_")+std::to_string(layer), widthOuters); + ftdParam->setDoubleVals(std::string("PetalLength_")+std::to_string(layer), lengths); + + if (layer == 0) { + double zpos = ftdlayer.zPosition; + double zmin = zpos - 0.5*ftdlayer.thicknessSupport - rings[0].thicknessGlue - rings[0].thicknessSensitive - rings[0].thicknessService; + + dd4hep::rec::Vector3D a1(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin); + dd4hep::rec::Vector3D b1(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin+rings[0].thicknessService); + gear::SimpleMaterialImpl* serviceMaterial = CreateGearMaterial(a1, b1, "ITKEndcapServiceMaterial"); + m_gearMgr->registerSimpleMaterial(serviceMaterial); + + zmin += rings[0].thicknessService + rings[0].thicknessSensitive; + dd4hep::rec::Vector3D a2(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin); + dd4hep::rec::Vector3D b2(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin+rings[0].thicknessGlue); + gear::SimpleMaterialImpl* glueMaterial = CreateGearMaterial(a2, b2, "ITKEndcapGlueMaterial"); + m_gearMgr->registerSimpleMaterial(glueMaterial); + + zmin += rings[0].thicknessGlue; + dd4hep::rec::Vector3D a3(0.5*(ftdlayer.rminSupport + ftdlayer.rmaxSupport), 0, zmin); + dd4hep::rec::Vector3D b3(0.5*(ftdlayer.rminSupport + ftdlayer.rmaxSupport), 0, zmin+ftdlayer.thicknessSupport); + gear::SimpleMaterialImpl* supportMaterial = CreateGearMaterial(a3, b3, "ITKEndcapSupportMaterial"); + m_gearMgr->registerSimpleMaterial(supportMaterial); + } + } + ftdParam->setDoubleVals("AlphaPetals", alphaPetals); + ftdParam->setDoubleVals("ZPositions", zPositions); + ftdParam->setDoubleVals("ZOffsetSupport", zOffsetSupports); + ftdParam->setDoubleVals("RMinSupports", rminSupports); + ftdParam->setDoubleVals("RMaxSupports", rmaxSupports); + ftdParam->setDoubleVals("ThicknessSupports", thicknessSupports); + ftdParam->setDoubleVals("ThicknessSensitives", thicknessSensitives); + ftdParam->setDoubleVals("ThicknessGlues", thicknessGlues); + ftdParam->setDoubleVals("ThicknessServices", thicknessServices); + ftdParam->setStringVals("PetalNumberNames", petalParNames); + ftdParam->setStringVals("PetalPhi0Names", phi0ParNames); + ftdParam->setStringVals("PetalDistanceNames", distanceParNames); + ftdParam->setStringVals("PetalInnerWidthNames", widthInnerParNames); + ftdParam->setStringVals("PetalOuterWidthNames", widthOuterParNames); + ftdParam->setStringVals("PetalLengthNames", lengthParNames); + + m_gearMgr->setGearParameters("ITKEndcapParameters", ftdParam); + info() << "nftd = " << nLayers << endmsg; + return StatusCode::SUCCESS; +} + StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){ dd4hep::rec::ZDiskPetalsData* etdData = nullptr; try{ @@ -464,7 +580,7 @@ StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){ std::vector<int> nPetals, nSensors; std::vector<double> petalangles, phi0s, alphas, zpositions, zoffsets, supRinners, supThicknesss, supHeights, senRinners, senThicknesss, senHeights; - for(int layer = 0; layer < nLayers; layer++){ + for (int layer = 0; layer < nLayers; layer++) { dd4hep::rec::ZDiskPetalsData::LayerLayout& etdlayer = etdlayers[layer]; nPetals.push_back(etdlayer.petalNumber); petalangles.push_back(etdlayer.petalHalfAngle*2); @@ -504,7 +620,7 @@ StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){ m_gearMgr->registerSimpleMaterial(ETDSupportMaterial); m_gearMgr->setGearParameters("ETDParameters", etdParam); - info() << "nftd = " << nLayers << endmsg; + info() << "netd = " << nLayers << endmsg; return StatusCode::SUCCESS; } @@ -699,7 +815,7 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ 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(nodeName.find("chamber_vol")!=std::string::npos||nodeName.find("assembly")!=std::string::npos){ if(grid){ // if more than one chamber, just use the outer, TODO dcData->rMinReadout = grid->DC_rbegin(); @@ -710,11 +826,11 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ } else{ TGeoNode* next = daughter; - if(nodeName.find("assembly")!=-1){ + if(nodeName.find("assembly")!=std::string::npos){ // 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){ + if(s.find("chamber_vol")==std::string::npos){ error() << s << " not chamber_vol" << endmsg; is_convert = false; } @@ -760,7 +876,7 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){ dcData->padWidth = dcData->padHeight; } } - else if(nodeName.find("wall_vol")!=-1){ + else if(nodeName.find("wall_vol")!=std::string::npos){ const TGeoShape* wall_shape = daughter->GetVolume()->GetShape(); if(wall_shape->TestShapeBit(TGeoTube::kGeoTube)){ const TGeoTube* tube = (const TGeoTube*) wall_shape; @@ -837,6 +953,12 @@ StatusCode GearSvc::convertSET(dd4hep::DetElement& set){ setParams->setDoubleVal("strip_length_mm", setData->lengthStrip*CLHEP::cm); setParams->setDoubleVal("strip_pitch_mm", setData->pitchStrip*CLHEP::cm); setParams->setDoubleVal("strip_angle_deg", strip_angle_deg); + if (set.path().find("OTKBarrel") != std::string::npos) { + m_presentSensorOTK = false; + setParams->setIntVal("OTKBarrel", 1); + } + else m_presentSensorOTK = true; + std::vector<int> n_sensors_per_ladder; for( int layer=0; layer < nLayers; layer++){ dd4hep::rec::ZPlanarData::LayerLayout& layout = setlayers[layer]; @@ -853,7 +975,7 @@ StatusCode GearSvc::convertSET(dd4hep::DetElement& set){ double senThickness = layout.thicknessSensitive*CLHEP::cm; double senHalfLength = layout.zHalfSensitive*CLHEP::cm; double senWidth = layout.widthSensitive*CLHEP::cm; - int nSensorsPerLadder = layout.sensorsPerLadder; + int nSensorsPerLadder = m_presentSensorOTK ? layout.sensorsPerLadder : 1; double stripAngle = strip_angle_deg*CLHEP::degree; n_sensors_per_ladder.push_back(nSensorsPerLadder); @@ -912,25 +1034,25 @@ StatusCode GearSvc::convertCal(dd4hep::DetElement& cal) { param->layerLayout().positionLayer(0, thickness, cellsize0, cellsize1, absorberThickness); } if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::BarrelLayout) { - if (name.find("Ecal")!=-1) m_gearMgr->setEcalBarrelParameters(param); - else if (name.find("Hcal")!=-1) m_gearMgr->setHcalBarrelParameters(param); - else if (name.find("Yoke")!=-1) m_gearMgr->setYokeBarrelParameters(param); + if (name.find("Ecal")!=std::string::npos) m_gearMgr->setEcalBarrelParameters(param); + else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalBarrelParameters(param); + else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokeBarrelParameters(param); else m_gearMgr->setGearParameters("CoilParameters", param); info() << "BarrelParameters set " << name << endmsg; } else if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::EndcapLayout) { if (name.find("Endcap")) { - if (name.find("Ecal")!=-1) m_gearMgr->setEcalEndcapParameters(param); - else if (name.find("Hcal")!=-1) m_gearMgr->setHcalEndcapParameters(param); - else if (name.find("Yoke")!=-1) m_gearMgr->setYokeEndcapParameters(param); + if (name.find("Ecal")!=std::string::npos) m_gearMgr->setEcalEndcapParameters(param); + else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalEndcapParameters(param); + else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokeEndcapParameters(param); info() << "EndcapParameters set" << name << endmsg; } else { - if (name.find("Ecal")!=-1) m_gearMgr->setEcalPlugParameters(param); - else if (name.find("Hcal")!=-1) m_gearMgr->setHcalRingParameters(param); - else if (name.find("Yoke")!=-1) m_gearMgr->setYokePlugParameters(param); + if (name.find("Ecal")!=std::string::npos) m_gearMgr->setEcalPlugParameters(param); + else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalRingParameters(param); + else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokePlugParameters(param); info() << "Plug(Ring)Parameters set" << name << endmsg; } @@ -950,7 +1072,7 @@ TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name) { TGeoNode* daughter = mother->GetDaughter(i); std::string s = daughter->GetName(); //info() << "current: " << s << " search for" << name << endmsg; - if(s.find(name)!=-1){ + if(s.find(name)!=std::string::npos){ next = daughter; break; } @@ -968,15 +1090,15 @@ gear::SimpleMaterialImpl* GearSvc::CreateGearMaterial(const dd4hep::rec::Vector3 dd4hep::rec::MaterialManager matMgr( dd4hep::Detector::getInstance().world().volume() ); // 0.0005 mm make sure don't loss material because of precision - dd4hep::rec::Vector3D safe_env = (a.z() == b.z()) ? dd4hep::rec::Vector3D(0.0005*dd4hep::mm, 0, 0) : dd4hep::rec::Vector3D(0, 0, 0.0005*dd4hep::mm); + dd4hep::rec::Vector3D safe_env = (a.z() == b.z()) ? dd4hep::rec::Vector3D(0.0005*dd4hep::mm, 0, 0) : dd4hep::rec::Vector3D(0, 0, 0.0001*dd4hep::mm); const dd4hep::rec::MaterialVec& materials = matMgr.materialsBetween(a-safe_env, b+safe_env); dd4hep::rec::MaterialData mat = (materials.size() > 1) ? matMgr.createAveragedMaterial(materials) : materials[0].first; - debug() << " ####### found materials between points : " << a << " and " << b << " ######" << endmsg; + debug() << "#### found materials between points : " << a << " and " << b << " ####" << endmsg; for (unsigned i=0,n=materials.size(); i<n; ++i) { - debug() << materials[i].first.name() << " [" << materials[i].second << "]" << endmsg; + debug() << " " << materials[i].first.name() << " [" << materials[i].second << "]" << endmsg; } - debug() << " averaged material : " << mat << endmsg; + debug() << " -> averaged material : " << mat << endmsg; gear::SimpleMaterialImpl* gearMaterial = new gear::SimpleMaterialImpl(name.c_str(), mat.A(), mat.Z(), mat.density()/(dd4hep::kg/(dd4hep::g*dd4hep::m3)), mat.radiationLength()/dd4hep::mm, diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h index eb15e19b5ebaffa5cc83453d08862f1e0bd5fe93..5af9be6469b4f679274e9f114e0743e0c7059c02 100644 --- a/Service/GearSvc/src/GearSvc.h +++ b/Service/GearSvc/src/GearSvc.h @@ -10,35 +10,37 @@ class TGeoNode; class GearSvc : public extends<Service, IGearSvc> { - public: - GearSvc(const std::string& name, ISvcLocator* svc); - virtual ~GearSvc(); - - gear::GearMgr* getGearMgr() override; - - StatusCode initialize() override; - StatusCode finalize() override; - - private: - StatusCode convertBeamPipe(dd4hep::DetElement& pipe); - StatusCode convertVXD(dd4hep::DetElement& vxd); - StatusCode convertStitching(dd4hep::DetElement& vtx); - StatusCode convertComposite(dd4hep::DetElement& vtx); - 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); - StatusCode convertETD(dd4hep::DetElement& etd); - StatusCode convertCal(dd4hep::DetElement& cal); - TGeoNode* FindNode(TGeoNode* mother, char* name); - gear::SimpleMaterialImpl* CreateGearMaterial(const dd4hep::rec::Vector3D& a, const dd4hep::rec::Vector3D& b, const std::string name); - - Gaudi::Property<std::string> m_gearFile{this, "GearXMLFile", ""}; - Gaudi::Property<std::string> m_outputFile{this, "GearOutput", ""}; - Gaudi::Property<float> m_field{this, "MagneticField", 0}; - - gear::GearMgr* m_gearMgr; +public: + GearSvc(const std::string& name, ISvcLocator* svc); + virtual ~GearSvc(); + + gear::GearMgr* getGearMgr() override; + + StatusCode initialize() override; + StatusCode finalize() override; + +private: + StatusCode convertBeamPipe(dd4hep::DetElement& pipe); + StatusCode convertVXD(dd4hep::DetElement& vxd); + StatusCode convertStitching(dd4hep::DetElement& vtx); + StatusCode convertComposite(dd4hep::DetElement& vtx); + 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); + StatusCode convertMultiRingsZDisk(dd4hep::DetElement& ftd); + StatusCode convertETD(dd4hep::DetElement& etd); + StatusCode convertCal(dd4hep::DetElement& cal); + TGeoNode* FindNode(TGeoNode* mother, char* name); + gear::SimpleMaterialImpl* CreateGearMaterial(const dd4hep::rec::Vector3D& a, const dd4hep::rec::Vector3D& b, const std::string name); + + Gaudi::Property<std::string> m_gearFile{this, "GearXMLFile", ""}; + Gaudi::Property<std::string> m_outputFile{this, "GearOutput", ""}; + Gaudi::Property<float> m_field{this, "MagneticField", 0}; + Gaudi::Property<bool> m_presentSensorOTK{this, "PresentSensor", false}; + + gear::GearMgr* m_gearMgr; }; #endif diff --git a/Service/TrackSystemSvc/src/MarlinKalTest.cc b/Service/TrackSystemSvc/src/MarlinKalTest.cc index 8ff54501a3850f0f1c8386ac7a336b518a1248a3..36ba7c15b22d7410b00ba628b6eced2556f2ebea 100644 --- a/Service/TrackSystemSvc/src/MarlinKalTest.cc +++ b/Service/TrackSystemSvc/src/MarlinKalTest.cc @@ -12,6 +12,7 @@ #include "kaldet/CEPCVTXKalDetector.h" #include "kaldet/ILDSITKalDetector.h" #include "kaldet/CEPCITKKalDetector.h" +#include "kaldet/CEPCITKEndcapKalDetector.h" #include "kaldet/ILDSITCylinderKalDetector.h" #include "kaldet/ILDSETKalDetector.h" #include "kaldet/CEPCOTKKalDetector.h" @@ -37,7 +38,7 @@ #include <utility> -//#include "streamlog/streamlog.h" +#include "streamlog/streamlog.h" #include "kaldet/ILDMeasurementSurfaceStoreFiller.h" @@ -48,7 +49,7 @@ namespace MarlinTrk{ _gearMgr( &gearMgr ), _geoSvc(geoSvc){ - //streamlog_out( DEBUG4 ) << " MarlinKalTest - initializing the detector ..." << std::endl ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - initializing the detector ..." << std::endl ; _det = new TKalDetCradle ; // from kaltest. TKalDetCradle inherits from TObjArray ... _det->SetOwner( true ) ; // takes care of deleting subdetector in the end ... @@ -57,9 +58,7 @@ namespace MarlinTrk{ this->registerOptions() ; - //streamlog_out( DEBUG4 ) << " MarlinKalTest - established " << std::endl ; - - + streamlog_out( DEBUG4 ) << " MarlinKalTest - established " << std::endl ; } MarlinKalTest::~MarlinKalTest(){ @@ -74,8 +73,7 @@ namespace MarlinTrk{ void MarlinKalTest::init() { - //std::cout << "debug: MarlinKalTest - call this init " << std::endl ; - //ILDSITKalDetector* sitdet = new ILDSITKalDetector( *_gearMgr, _geoSvc ) ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - call this init " << std::endl ; MeasurementSurfaceStore& surfstore = _gearMgr->getMeasurementSurfaceStore(); @@ -83,12 +81,13 @@ namespace MarlinTrk{ if( surfstore.isFilled() == false ) { ILDMeasurementSurfaceStoreFiller filler( *_gearMgr ); - //streamlog_out( DEBUG4 ) << " MarlinKalTest - set up gear surface store using " << filler.getName() << std::endl ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - set up gear surface store using " << filler.getName() << std::endl ; surfstore.FillStore(&filler); } else { - //std::cout << "debug: MarlinKalTest - MeasurementSurfaceStore is already full. Using store as filled by MeasurementSurfaceStoreFiller " << surfstore.getFillerName() << std::endl ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - MeasurementSurfaceStore is already full. Using store as filled by MeasurementSurfaceStoreFiller " + << surfstore.getFillerName() << std::endl ; } if (_gearMgr -> getDetectorName() == "LPTPC") { @@ -99,7 +98,7 @@ namespace MarlinTrk{ _det->Install( *tpcdet ) ; } catch( gear::UnknownParameterException& e){ - //streamlog_out( MESSAGE ) << " MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ; + streamlog_out( MESSAGE ) << " MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ; } } else { @@ -113,7 +112,7 @@ namespace MarlinTrk{ _det->Install( *supportdet ) ; } catch( gear::UnknownParameterException& e){ - std::cout << "Error: " << "MarlinKalTest - Support Material missing in gear file: Cannot proceed as propagations and extrapolations for cannonical track states are impossible: exit(1) called" << std::endl ; + streamlog_out( ERROR ) << " MarlinKalTest - Support Material missing in gear file: Cannot proceed as propagations and extrapolations for cannonical track states are impossible: exit(1) called" << std::endl ; exit(1); } @@ -125,7 +124,7 @@ namespace MarlinTrk{ _det->Install( *vxddet ) ; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - VXD missing in gear file: VXD Material Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - VXD missing in gear file: VXD Material Not Built " << std::endl ; } bool SIT_found = false ; @@ -138,7 +137,7 @@ namespace MarlinTrk{ SIT_found = true ; } catch( gear::UnknownParameterException& e){ - //streamlog_out( MESSAGE ) << " MarlinKalTest - SIT missing in gear file: SIT Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - SIT missing in gear file: SIT Not Built " << std::endl ; } if( ! SIT_found ){ @@ -149,19 +148,32 @@ namespace MarlinTrk{ _det->Install( *sitdet ) ; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - Simple Cylinder Based SIT missing in gear file: Simple Cylinder Based SIT Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - Simple Cylinder Based SIT missing in gear file: Simple Cylinder Based SIT Not Built " << std::endl ; } } + bool SET_found = false; try{ - //ILDSETKalDetector* setdet = new ILDSETKalDetector( *_gearMgr, _geoSvc ); CEPCOTKKalDetector* setdet = new CEPCOTKKalDetector(*_gearMgr, _geoSvc); // store the measurement layer id's for the active layers this->storeActiveMeasurementModuleIDs(setdet); _det->Install( *setdet ) ; + SET_found = true; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - SET missing in gear file: SET Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - OTKBarrel missing in gear file: Not Built " << std::endl ; + } + + if(!SET_found) { + try { + ILDSETKalDetector* setdet = new ILDSETKalDetector( *_gearMgr, _geoSvc ); + this->storeActiveMeasurementModuleIDs(setdet); + _det->Install( *setdet ) ; + SET_found = true; + } + catch( gear::UnknownParameterException& e){ + streamlog_out( WARNING ) << " MarlinKalTest - SET missing in gear file: SET Not Built " << std::endl ; + } } bool FTD_found = false ; @@ -173,7 +185,18 @@ namespace MarlinTrk{ FTD_found = true ; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - Petal Based FTD missing in gear file: Petal Based FTD Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - Petal Based FTD missing in gear file: Petal Based FTD Not Built " << std::endl ; + } + + try{ + CEPCITKEndcapKalDetector* ftddet = new CEPCITKEndcapKalDetector(*_gearMgr, _geoSvc); + // store the measurement layer id's for the active layers + this->storeActiveMeasurementModuleIDs(ftddet); + _det->Install(*ftddet); + FTD_found = true; + } + catch( gear::UnknownParameterException& e){ + streamlog_out( WARNING ) << " MarlinKalTest - Multi Ring Based Discs missing in gear file: ITKEncap Not Built " << std::endl ; } if( ! FTD_found ){ @@ -184,7 +207,7 @@ namespace MarlinTrk{ _det->Install( *ftddet ) ; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - Simple Disc Based FTD missing in gear file: Simple Disc Based FTD Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - All three type FTD missing in gear file: FTD Not Built " << std::endl; } } @@ -195,7 +218,7 @@ namespace MarlinTrk{ _det->Install(*etddet); } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - ETD missing in gear file: Petal Based ETD Not Built " << std::endl; + streamlog_out( WARNING ) << " MarlinKalTest - ETD missing in gear file: Petal Based ETD Not Built " << std::endl; } try{ @@ -205,7 +228,7 @@ namespace MarlinTrk{ _det->Install( *tpcdet ) ; } catch( gear::UnknownParameterException& e){ - std::cout << "Warning: " << " MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ; + streamlog_out( WARNING ) << " MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ; } } @@ -213,20 +236,18 @@ namespace MarlinTrk{ _det->Close() ; // close the cradle _det->Sort() ; // sort meas. layers from inside to outside - //streamlog_out( DEBUG4 ) << " MarlinKalTest - number of layers = " << _det->GetEntriesFast() << std::endl ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - number of layers = " << _det->GetEntriesFast() << std::endl ; - //streamlog_out( DEBUG4 ) << "Options: " << std::endl << this->getOptions() << std::endl ; + streamlog_out( DEBUG4 ) << "Options: " << std::endl << this->getOptions() << std::endl ; this->includeMultipleScattering( getOption(IMarlinTrkSystem::CFG::useQMS) ) ; this->includeEnergyLoss( getOption(IMarlinTrkSystem::CFG::usedEdx) ) ; - is_initialised = true; - } MarlinTrk::IMarlinTrack* MarlinKalTest::createTrack() { - //std::cout << "fucd " << "creatTrack" << std::endl; + if ( ! is_initialised ) { std::stringstream errorMsg; errorMsg << "MarlinKalTest::createTrack: Fitter not initialised. MarlinKalTest::init() must be called before MarlinKalTest::createTrack()" << std::endl ; @@ -268,16 +289,13 @@ namespace MarlinTrk{ } - //streamlog_out( DEBUG0 ) << "MarlinKalTest::getSensitiveMeasurementModulesForLayer: layerID = " << layerID << std::endl; + streamlog_out( DEBUG0 ) << "MarlinKalTest::getSensitiveMeasurementModulesForLayer: layerID = " << layerID << std::endl; std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator it; //Iterator to be used along with ii - - - // for(it = _active_measurement_modules_by_layer.begin(); it != _active_measurement_modules_by_layer.end(); ++it) { - // streamlog_out( DEBUG0 ) << "Key = "<< ttdecodeILD(it->first) <<" Value = "<<it->second << std::endl ; - // } - + for(it = _active_measurement_modules_by_layer.begin(); it != _active_measurement_modules_by_layer.end(); ++it) { + streamlog_out( DEBUG0 ) << "Key = "<< it->first <<" Value = "<<it->second << std::endl ; + } std::pair<std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator, std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator> ii; @@ -291,7 +309,7 @@ namespace MarlinTrk{ ii = this->_active_measurement_modules_by_layer.equal_range(layerID); // set the first and last entry in ii; for(it = ii.first; it != ii.second; ++it) { - // streamlog_out( DEBUG0 ) <<"Key = "<< it->first <<" Value = "<<it->second << std::endl ; + streamlog_out( DEBUG0 ) <<"Key = "<< it->first <<" Value = "<<it->second << std::endl ; measmodules.push_back( it->second ) ; } @@ -314,7 +332,7 @@ namespace MarlinTrk{ for(it = ii.first; it != ii.second; ++it) { - // std::cout<<"Key = "<<it->first<<" Value = "<<it->second << std::endl ; + streamlog_out( DEBUG0 ) <<"Key = "<<it->first<<" Value = "<<it->second << std::endl ; measmodules.push_back( it->second ) ; } } @@ -374,8 +392,8 @@ namespace MarlinTrk{ int mode = isfwd ? -1 : +1 ; - // streamlog_out( DEBUG4 ) << " MarlinKalTest - getLastMeasLayer deflection to point = " << deflection_to_point << " kappa = " << helix.GetKappa() << " mode = " << mode << std::endl ; - // streamlog_out( DEBUG4 ) << " Point to move to:" << std::endl; + streamlog_out( DEBUG4 ) << " MarlinKalTest - getLastMeasLayer deflection to point = " << deflection_to_point << " kappa = " << helix.GetKappa() << " mode = " << mode << std::endl ; + streamlog_out( DEBUG4 ) << " Point to move to:" << std::endl; // point.Print(); int nsufaces = _det->GetEntriesFast(); @@ -401,17 +419,17 @@ namespace MarlinTrk{ if( deflection < min_deflection ) { - // streamlog_out( DEBUG4 ) << " MarlinKalTest - crossing found for suface = " << ml.GetMLName() - // << std::endl - // << " min_deflection = " << min_deflection - // << " deflection = " << deflection - // << " deflection angle = " << defection_angle - // << std::endl - // << " x = " << crossing_point.X() - // << " y = " << crossing_point.Y() - // << " z = " << crossing_point.Z() - // << " r = " << crossing_point.Perp() - // << std::endl ; + streamlog_out( DEBUG4 ) << " MarlinKalTest - crossing found for suface = " << ml.GetName() + << std::endl + << " min_deflection = " << min_deflection + << " deflection = " << deflection + << " deflection angle = " << defection_angle + << std::endl + << " x = " << crossing_point.X() + << " y = " << crossing_point.Y() + << " z = " << crossing_point.Z() + << " r = " << crossing_point.Perp() + << std::endl ; min_deflection = deflection ; ml_retval = &ml ; @@ -496,24 +514,22 @@ namespace MarlinTrk{ } if( ! surf_found ){ // print out debug info - /* + streamlog_out(DEBUG1) << "MarlinKalTest::findMeasLayer point not found to be on any surface matching moduleID = " - << detElementID - << ": x = " << point.x() - << " y = " << point.y() - << " z = " << point.z() - << std::endl ; - */ + << detElementID + << ": x = " << point.x() + << " y = " << point.y() + << " z = " << point.z() + << std::endl ; } else{ - /* + streamlog_out(DEBUG1) << "MarlinKalTest::findMeasLayer point found to be on surface matching moduleID = " - << detElementID - << ": x = " << point.x() - << " y = " << point.y() - << " z = " << point.z() - << std::endl ; - */ + << detElementID + << ": x = " << point.x() + << " y = " << point.y() + << " z = " << point.z() + << std::endl ; } } diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h index 78ea5973add29bed6a9bd2ccd1621ad3baf81fc0..e98a208abcf19f5dc7f1e77b245194a38913a401 100644 --- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h +++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h @@ -63,8 +63,9 @@ private: // the name here is without suffix "Collection" Gaudi::Property<std::vector<std::string>> m_trackerColNames{this, "TrackerCollections", - {"VXD", "FTD", "SIT", "TPC", "TPCLowPt", "TPCSpacePoint", "SET", - "ITKBarrel", "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap"}, + {"VXD", "ITKBarrel", "ITKEndcap", "TPC", "TPCLowPt", "TPCSpacePoint", + "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap", + "SIT", "SET", "FTD"}, "Names of the Tracker collections (without suffix Collection)"}; Gaudi::Property<std::vector<std::string>> m_calorimeterColNames{this, "CalorimeterCollections", diff --git a/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h b/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h new file mode 100644 index 0000000000000000000000000000000000000000..2889dd9b9c2906adacc35e5389aaa0771cf15dfb --- /dev/null +++ b/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h @@ -0,0 +1,40 @@ +#ifndef __CEPCITKENDCAPDETECTOR__ +#define __CEPCITKENDCAPDETECTOR__ + +/** Multi rings by petals in each layer + * WARNING: Still very experimental + * + * @author C.D.Fu IHEP + */ + +#include "kaltest/TVKalDetector.h" +#include "DetIdentifier/CEPCDetectorData.h" + +class IGeomSvc; + +namespace gear{ + class GearMgr ; +} + +class CEPCITKEndcapKalDetector : public TVKalDetector { + public: + /** Initialize the ITKEndcap from GEAR or GeomSvc*/ + CEPCITKEndcapKalDetector(const gear::GearMgr& gearMgr, IGeomSvc* geoSvc); + + private: + + void build(); + + /** + * @param zpos the z position of the center of support + */ + void create_segmented_disk_layers(int idisk, int iring, int nsegments, bool even_petals, double phi0, double zpos); + + void setupGearGeom(const gear::GearMgr& gearMgr); + void setupGearGeom(IGeomSvc* geoSvc); + + double _bZ; + + dd4hep::rec::MultiRingsZDiskData _disksData; +}; +#endif diff --git a/Utilities/KalDet/src/ild/common/MaterialDataBase.cc b/Utilities/KalDet/src/ild/common/MaterialDataBase.cc index 35281e92cc8ac7ce184e491e22d7b2e9f81b27c6..49f04a4234588ee8721f465d51f93b21bb464133 100644 --- a/Utilities/KalDet/src/ild/common/MaterialDataBase.cc +++ b/Utilities/KalDet/src/ild/common/MaterialDataBase.cc @@ -324,6 +324,32 @@ void MaterialDataBase::createMaterials(const gear::GearMgr& gearMgr, IGeomSvc* g catch( gear::UnknownParameterException& e){ std::cout << "Warning! cannot get material ITKEndcapSupportMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl; } + try { + const gear::SimpleMaterial& itk_glue_mat = gearMgr.getSimpleMaterial("ITKEndcapGlueMaterial"); + A = itk_glue_mat.getA(); + Z = itk_glue_mat.getZ(); + density = itk_glue_mat.getDensity() * kg_m3TOg_cm3; + radlen = itk_glue_mat.getRadLength() * mmTOcm; + name = itk_glue_mat.getName() ; + TMaterial &itkglue = *new TMaterial(name.c_str(), "", A, Z, density, radlen, 0.); + this->addMaterial(&itkglue, name); + } + catch( gear::UnknownParameterException& e){ + std::cout << "Warning! cannot get material ITKEndcapGlueMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl; + } + try { + const gear::SimpleMaterial& itk_service_mat = gearMgr.getSimpleMaterial("ITKEndcapServiceMaterial"); + A = itk_service_mat.getA(); + Z = itk_service_mat.getZ(); + density = itk_service_mat.getDensity() * kg_m3TOg_cm3; + radlen = itk_service_mat.getRadLength() * mmTOcm; + name = itk_service_mat.getName() ; + TMaterial &itkservice = *new TMaterial(name.c_str(), "", A, Z, density, radlen, 0.); + this->addMaterial(&itkservice, name); + } + catch( gear::UnknownParameterException& e){ + std::cout << "Warning! cannot get material ITKEndcapServiceMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl; + } try { const gear::SimpleMaterial& otk_support_mat = gearMgr.getSimpleMaterial("OTKBarrelSupportMaterial"); A = otk_support_mat.getA(); diff --git a/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc new file mode 100644 index 0000000000000000000000000000000000000000..bb4b4c28bfebbeace3048dfdec6e12c0f414b94b --- /dev/null +++ b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc @@ -0,0 +1,261 @@ + +#include "kaldet/CEPCITKEndcapKalDetector.h" +#include "kaldet/MaterialDataBase.h" + +#include <sstream> + +#include "DetInterface/IGeomSvc.h" +#include "DD4hep/Detector.h" +#include "DD4hep/DD4hepUnits.h" +#include "DDSegmentation/BitField64.h" + +#include "DetIdentifier/CEPCConf.h" + +#include "gear/GEAR.h" +#include "gear/BField.h" +#include "gearimpl/Util.h" + +#include "kaldet/ILDSegmentedDiscMeasLayer.h" +#include "kaldet/ILDDiscMeasLayer.h" + +#include "streamlog/streamlog.h" +#include "CLHEP/Units/SystemOfUnits.h" +#include "TVector3.h" + +CEPCITKEndcapKalDetector::CEPCITKEndcapKalDetector( const gear::GearMgr& gearMgr, IGeomSvc* geoSvc ) : +TVKalDetector(300) { + streamlog_out(DEBUG1) << "CEPCITKEndcapKalDetector building ITKEndcap detector using GEAR " << std::endl; + + MaterialDataBase::Instance().registerForService(gearMgr, geoSvc); + if(geoSvc){ + setupGearGeom(geoSvc); + } + else{ + setupGearGeom(gearMgr); + } + + this->build(); + + SetOwner(); +} + +void CEPCITKEndcapKalDetector::build() { + streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::build " << std::endl; + + double eps = 1e-9; + + int ndisks = _disksData.layers.size(); + for (int idisk = 0; idisk < ndisks; idisk++) { + streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::build disk " << idisk << std::endl; + + auto& disk = _disksData.layers[idisk]; + auto& rings = disk.rings; + + double alphaPetal = disk.alphaPetal; + double zPosition = disk.zPosition; + double zOffset = disk.zOffsetSupport; + double rminSupport = disk.rminSupport; + double rmaxSupport = disk.rmaxSupport; + double thicknessSupport = disk.thicknessSupport; + int nrings = rings.size(); + for (int iring = 0; iring < nrings; iring++) { + auto& ring = rings[iring]; + + int npetals = ring.petalNumber; + double phi0 = ring.phi0; + double distance = ring.distance; + double widthInner = ring.widthInner; + double widthOuter = ring.widthOuter; + double length = ring.length; + + int nsegments = npetals/2; + this->create_segmented_disk_layers(idisk, iring, nsegments, true, phi0, zPosition); + this->create_segmented_disk_layers(idisk, iring, nsegments, true, phi0, -zPosition); + + // odd segements + // update phi0 by the angular distance of one petal + phi0 -= 2.0 * M_PI / npetals; + this->create_segmented_disk_layers(idisk, iring, nsegments, false, phi0, zPosition); + this->create_segmented_disk_layers(idisk, iring, nsegments, false, phi0, -zPosition); + } + + TMaterial& air = *MaterialDataBase::Instance().getMaterial("air"); + TMaterial& support = *MaterialDataBase::Instance().getMaterial("ITKEndcapSupportMaterial"); + + Bool_t dummy = false; + + double z0 = zPosition - 0.5*thicknessSupport + eps; + + streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::create air support disk at " << z0 << " sort_policy = " << fabs(z0) << std::endl; + + TVector3 xc0_fwd(0.0, 0.0, z0); + TVector3 normal0_fwd(xc0_fwd); + normal0_fwd.SetMag(1.0); + Add(new ILDDiscMeasLayer(air, support, xc0_fwd, normal0_fwd, _bZ, fabs(z0), rminSupport, rmaxSupport, dummy, -1, "ITKEAirSupportDiscPositiveZ")); + + TVector3 xc0_bwd(0.0, 0.0, -z0); + TVector3 normal0_bwd(xc0_bwd); + normal0_bwd.SetMag(1.0); + Add(new ILDDiscMeasLayer(support, air, xc0_bwd, normal0_bwd, _bZ, fabs(z0), rminSupport, rmaxSupport, dummy, -1, "ITKEAirSupportDiscNegativeZ")); + + double z1 = zPosition + 0.5*thicknessSupport - eps; + + TVector3 xc1_fwd(0.0, 0.0, z1); + TVector3 normal1_fwd(xc1_fwd); + normal1_fwd.SetMag(1.0); + Add(new ILDDiscMeasLayer(air, support, xc1_fwd, normal1_fwd, _bZ, fabs(z1), rminSupport, rmaxSupport, dummy, -1, "ITKESupportAirDiscPositiveZ")); + + TVector3 xc1_bwd(0.0, 0.0, -z1); + TVector3 normal1_bwd(xc1_bwd); + normal1_bwd.SetMag(1.0); + Add(new ILDDiscMeasLayer(support, air, xc1_bwd, normal1_bwd, _bZ, fabs(z1), rminSupport, rmaxSupport, dummy, -1, "ITKESupportAirDiscNegativeZ")); + } + +} + +void CEPCITKEndcapKalDetector::create_segmented_disk_layers(int idisk, int iring, int nsegments, bool even_petals, double phi0, double zpos) { + streamlog_out(DEBUG1) << "create_segmented_disk_layers idisk = " << idisk << " iring = " << iring << " nsegments = " << nsegments + << " even = " << even_petals << " zpos = " << zpos << std::endl; + Bool_t active = true; + Bool_t dummy = false; + + TMaterial& air = *MaterialDataBase::Instance().getMaterial("air"); + TMaterial& silicon = *MaterialDataBase::Instance().getMaterial("silicon"); + TMaterial& service = *MaterialDataBase::Instance().getMaterial("ITKEndcapServiceMaterial"); + TMaterial& glue = *MaterialDataBase::Instance().getMaterial("ITKEndcapGlueMaterial"); + + int zsign = zpos > 0 ? 1 : -1; + int start_index = even_petals ? 0 : 1; + + dd4hep::DDSegmentation::BitField64 encoder("system:5,side:-2,layer:9,module:8,sensor:8"); + encoder.reset(); + encoder[CEPCConf::DetCellID::system] = CEPCConf::DetID::ITKEndcap; + encoder[CEPCConf::DetCellID::side] = zsign; + encoder[CEPCConf::DetCellID::layer] = idisk; + encoder[CEPCConf::DetCellID::sensor] = iring; + + std::vector<int> module_ids; + for (int i = 0; i < nsegments; i++) { + encoder[CEPCConf::DetCellID::module] = even_petals ? 2*i : 2*i+1; + module_ids.push_back(encoder.lowWord()); + } + + // create segmented disk + + double eps1 = 1.0e-04; // ring + double eps2 = 1.0e-05; // odd or even + double eps3 = 1.0e-06; // layer in disk + double eps4 = 1.0e-08; // forward or backwards + //double sort_policy = fabs(z); + //double sort_policy = rInner+height + eps1 * idisk + eps3 * 1 ; + double sort_policy = eps1 * iring; + if (!even_petals) sort_policy += eps2; + if (zpos < 0) sort_policy += eps4; + + double tSupport = _disksData.layers[idisk].thicknessSupport; + double tSensitive = _disksData.layers[idisk].rings[iring].thicknessSensitive; + double tGlue = _disksData.layers[idisk].rings[iring].thicknessGlue; + double tService = _disksData.layers[idisk].rings[iring].thicknessService; + double rInner = _disksData.layers[idisk].rings[iring].distance; + double height = _disksData.layers[idisk].rings[iring].length; + double widthInner = _disksData.layers[idisk].rings[iring].widthInner; + double widthOuter = _disksData.layers[idisk].rings[iring].widthOuter; + + double tFront = even_petals ? tService : tGlue; + double tRear = even_petals ? tGlue : tService; + TMaterial& front = even_petals ? service : glue; + TMaterial& rear = even_petals ? glue : service; + + double z = even_petals ? zpos - zsign*(0.5*tSupport + tRear + tSensitive + tFront) : zpos + zsign*(0.5*tSupport); + streamlog_out(DEBUG1) << "CEPCITKEndcapKalDetector::create_segmented_disk add front face of sensitive at " << z << " sort_policy = " << fabs(z)+sort_policy << std::endl; + + const char *name1 = z > 0 ? "ITKEFrontFacePositiveZ" : "ITKEFrontFaceNegativeZ"; + Add(new ILDSegmentedDiscMeasLayer(air, front, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name1)); + + z += zsign*tFront; + const char *name2 = z > 0 ? "ITKEFrontPositiveZ" : "ITKEFrontNegativeZ"; + Add(new ILDSegmentedDiscMeasLayer(front, silicon, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name2)); + + z += zsign*0.5*tSensitive; + const char *name3 = z > 0 ? "ITKESenPositiveZ" : "ITKESenNegativeZ"; + Add( new ILDSegmentedDiscMeasLayer(silicon, silicon, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, active, module_ids, name3)); + + z += zsign*0.5*tSensitive; + const char *name4 = z > 0 ? "ITKERearPositiveZ" : "ITKERearNegativeZ"; + Add( new ILDSegmentedDiscMeasLayer(silicon, rear, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name4)); + + z += zsign*tRear; + const char *name5 = z > 0 ? "ITKERearFacePositiveZ" : "ITKERearFaceNegativeZ"; + Add(new ILDSegmentedDiscMeasLayer(rear, air, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name5)); +} + +void CEPCITKEndcapKalDetector::setupGearGeom(const gear::GearMgr& gearMgr) { + + const gear::GearParameters& params = gearMgr.getGearParameters("ITKEndcapParameters"); + streamlog_out(DEBUG) << params << std::endl; + + _bZ = gearMgr.getBField().at(gear::Vector3D(0.,0.,0.)).z(); + try { + std::vector<double> alphas = params.getDoubleVals("AlphaPetals"); + std::vector<double> zpositions = params.getDoubleVals("ZPositions"); + std::vector<double> zoffsets = params.getDoubleVals("ZOffsetSupport"); + std::vector<double> rminSups = params.getDoubleVals("RMinSupports"); + std::vector<double> rmaxSups = params.getDoubleVals("RMaxSupports"); + std::vector<double> tSupports = params.getDoubleVals("ThicknessSupports"); + std::vector<double> tSensitives = params.getDoubleVals("ThicknessSensitives"); + std::vector<double> tGlues = params.getDoubleVals("ThicknessGlues"); + std::vector<double> tServices = params.getDoubleVals("ThicknessServices"); + std::vector<std::string> petalParNames = params.getStringVals("PetalNumberNames"); + std::vector<std::string> phi0ParNames = params.getStringVals("PetalPhi0Names"); + std::vector<std::string> distanceParNames = params.getStringVals("PetalDistanceNames"); + std::vector<std::string> widthInnerParNames = params.getStringVals("PetalInnerWidthNames"); + std::vector<std::string> widthOuterParNames = params.getStringVals("PetalOuterWidthNames"); + std::vector<std::string> lengthParNames = params.getStringVals("PetalLengthNames"); + + for (int idisk = 0, N = alphas.size(); idisk < N; idisk++) { + dd4hep::rec::MultiRingsZDiskData::LayerLayout disk;// = _disksData.layers[idisk]; + disk.alphaPetal = alphas[idisk]; + disk.zPosition = zpositions[idisk]; + disk.zOffsetSupport = zoffsets[idisk]; + disk.rminSupport = rminSups[idisk]; + disk.rmaxSupport = rmaxSups[idisk]; + disk.thicknessSupport = tSupports[idisk]; + //std::string petalParName = petalParNames[idisk]; + //std::string phi0ParName = phi0ParNames[idisk]; + //std::string distanceParName = distanceParNames[idisk]; + //std::string widthInnerParName = widthInnerParNames[idisk]; + //std::string widthOuterParName = widthOuterParNames[idisk]; + //std::string lengthParName = lengthParNames[idisk]; + std::vector<int> petals = params.getIntVals(petalParNames[idisk]); + std::vector<double> phi0s = params.getDoubleVals(phi0ParNames[idisk]); + std::vector<double> distances = params.getDoubleVals(distanceParNames[idisk]); + std::vector<double> widthInners = params.getDoubleVals(widthInnerParNames[idisk]); + std::vector<double> widthOuters = params.getDoubleVals(widthOuterParNames[idisk]); + std::vector<double> lengths = params.getDoubleVals(lengthParNames[idisk]); + int nrings = petals.size(); + for (int iring = 0; iring < nrings; iring++) { + dd4hep::rec::MultiRingsZDiskData::Ring ring; + ring.petalNumber = petals[iring]; + ring.phi0 = phi0s[iring]; + ring.distance = distances[iring]; + ring.widthInner = widthInners[iring]; + ring.widthOuter = widthOuters[iring]; + ring.length = lengths[iring]; + ring.thicknessSensitive = tSensitives[idisk]; + ring.thicknessGlue = tGlues[idisk]; + ring.thicknessService = tServices[idisk]; + disk.rings.push_back(ring); + } + _disksData.layers.push_back(disk); + } + } catch (gear::UnknownParameterException& e) { + std::cout << e.what() << std::endl; + } + + streamlog_out(DEBUG) << _disksData << std::endl; +} + +void CEPCITKEndcapKalDetector::setupGearGeom(IGeomSvc* geoSvc) { + std::cout << "CEPCITKEndcapKalDetector::setupGearGeom(IGeomSvc* geoSvc) TODO" << std::endl; + exit(1); +} diff --git a/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc b/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc index b2848bd24b2405f41726cc2773276e63f5536b5a..9e56613e42c7dc95d846fab8f3053e54decf5778 100644 --- a/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc +++ b/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc @@ -208,6 +208,8 @@ void CEPCOTKKalDetector::setupGearGeom( const gear::GearMgr& gearMgr ){ const gear::ZPlanarParameters& pOTKDetMain = gearMgr.getSETParameters(); const gear::ZPlanarLayerLayout& pOTKLayerLayout = pOTKDetMain.getZPlanarLayerLayout(); + + int hasOTKBarrel = pOTKDetMain.getIntVal("OTKBarrel"); _bZ = gearMgr.getBField().at( gear::Vector3D( 0.,0.,0.) ).z() ;