From 03326f500e65596eabd024545dbdb1dcbd9f7276 Mon Sep 17 00:00:00 2001 From: Frank Gaede <frank.gaede@desy.de> Date: Thu, 5 Sep 2013 15:18:43 +0000 Subject: [PATCH] - cleaned up version of old example ILDExDet - is now build standalone - needs proper setting of (DY)LD_LIBRARY_PATH --- examples/ILDExDet/CMakeLists.txt | 70 ++ examples/ILDExDet/compact/ILDEx.xml | 271 ++++++ examples/ILDExDet/compact/elements.xml | 884 ++++++++++++++++++ examples/ILDExDet/compact/materials.xml | 149 +++ examples/ILDExDet/include/TPCData.h | 27 + examples/ILDExDet/include/VXDData.h | 40 + .../src/AhcalBarrelCalorimeter_geo.cpp | 252 +++++ .../src/AhcalEndcapCalorimeter_geo.cpp | 286 ++++++ examples/ILDExDet/src/ILDExSIT_geo.cpp | 78 ++ examples/ILDExDet/src/ILDExTPC_geo.cpp | 172 ++++ examples/ILDExDet/src/ILDExVXD_geo.cpp | 147 +++ 11 files changed, 2376 insertions(+) create mode 100644 examples/ILDExDet/CMakeLists.txt create mode 100644 examples/ILDExDet/compact/ILDEx.xml create mode 100644 examples/ILDExDet/compact/elements.xml create mode 100644 examples/ILDExDet/compact/materials.xml create mode 100644 examples/ILDExDet/include/TPCData.h create mode 100644 examples/ILDExDet/include/VXDData.h create mode 100644 examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp create mode 100644 examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp create mode 100644 examples/ILDExDet/src/ILDExSIT_geo.cpp create mode 100644 examples/ILDExDet/src/ILDExTPC_geo.cpp create mode 100644 examples/ILDExDet/src/ILDExVXD_geo.cpp diff --git a/examples/ILDExDet/CMakeLists.txt b/examples/ILDExDet/CMakeLists.txt new file mode 100644 index 000000000..38ae53f2a --- /dev/null +++ b/examples/ILDExDet/CMakeLists.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR) + +set( PackageName ILDExDet ) +project(${PackageName}) + +# project version +SET( ${PackageName}_VERSION_MAJOR 0 ) +SET( ${PackageName}_VERSION_MINOR 0 ) +SET( ${PackageName}_VERSION_PATCH 1 ) + +SET( ${PackageName}_VERSION "${${PackageName}_VERSION_MAJOR}.${${PackageName}_VERSION_MINOR}" ) +SET( ${PackageName}_SOVERSION "${${PackageName}_VERSION_MAJOR}.${${PackageName}_VERSION_MINOR}" ) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake ) +set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + +#------------- set the default installation directory to be the source directory + +IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + SET( CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR} CACHE PATH + "install prefix path - overwrite with -D CMAKE_INSTALL_PREFIX = ..." + FORCE ) + MESSAGE(STATUS "CMAKE_INSTALL_PREFIX is ${CMAKE_INSTALL_PREFIX} - overwrite with -D CMAKE_INSTALL_PREFIX" ) +ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + + + +#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +find_package( DD4hep ) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${DD4hep_ROOT}/cmake ) +include( DD4hep ) + +find_package( ROOT REQUIRED ) +#find_package( ROOT REQUIRED COMPONENTS Geom Reflex) + +set( ROOT_COMPONENT_LIBRARIES Geom Reflex) + +include_directories( ${CMAKE_SOURCE_DIR}/include + ${DD4hep_INCLUDE_DIRS} + ${ROOT_INCLUDE_DIR} + ) + +file(GLOB sources src/*.cpp ) +file(GLOB headers include/*.h) + +include(DD4hep_XML_setup) + +if(DD4HEP_USE_PYROOT) + ROOT_GENERATE_DICTIONARY(G__ILDEx ${headers} LINKDEF include/ROOT/LinkDef.h) + list(APPEND sources G__ILDEx.cxx) +endif() + +add_library(${PackageName} SHARED ${sources}) + +target_link_libraries(${PackageName} ${DD4hep_LIBRARIES} ${ROOT_LIBRARIES} ${ROOT_COMPONENT_LIBRARIES} ) + +#---Rootmap generation-------------------------------------------------------------- +dd4hep_generate_rootmap(${PackageName} ) + +#--- install target------------------------------------- + +install(TARGETS ${PackageName} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ) +# to do: add corresponding uninstall... +#------------------------------------------------------- \ No newline at end of file diff --git a/examples/ILDExDet/compact/ILDEx.xml b/examples/ILDExDet/compact/ILDEx.xml new file mode 100644 index 000000000..b11ade565 --- /dev/null +++ b/examples/ILDExDet/compact/ILDEx.xml @@ -0,0 +1,271 @@ +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + + <info name="ILD_toy_v01" + title="ILD Detector Toy model" + author="F. Gaede" + url="http://ilcsoft.desy.de" + status="development" + version="$Id: ILDEx.xml 676 2013-08-06 11:12:53Z gaede $"> + <comment>The compact format for the ILD Detector - toy model </comment> + </info> + + <includes> + <gdmlFile ref="elements.xml"/> + <gdmlFile ref="materials.xml"/> + <pyBuilder ref="../drivers"/> + </includes> + + <define> + <constant name="world_side" value="10*m"/> + <constant name="world_x" value="world_side/2"/> + <constant name="world_y" value="world_side/2"/> + <constant name="world_z" value="world_side/2"/> + <constant name="CrossingAngle" value="0.014"/> + + <constant name="VXD_inner_radius" value="15*mm"/> + <constant name="VXD_outer_radius" value="80*mm"/> + <constant name="VXD_zhalf" value="130*mm"/> + + <constant name="SIT_inner_radius" value="150*mm"/> + <constant name="SIT_outer_radius" value="330*mm"/> + <constant name="SIT_zhalf" value="660*mm"/> + + <constant name="TPC_zhalf" value="2500*mm"/> + <constant name="TPC_outer_radius" value="1800*mm"/> + <constant name="TPC_inner_radius" value="350*mm"/> + <constant name="TPC_inner_thickness" value="2*mm"/> + <constant name="TPC_outer_thickness" value="3*mm"/> + <constant name="TPC_endcap_thickness" value="3*mm"/> + + <constant name="tracking_region_radius" value="TPC_outer_radius + 1.0*m"/> + <constant name="tracking_region_zmax" value="TPC_zhalf + 1.0*m"/> + <constant name="SolenoidCoilOuterZ" value="TPC_zhalf + 0.3*m"/> + + <constant name="HcalBarrel_rmin" value="2058.0*mm"/> + <constant name="Hcal_outer_radius" value="3395.46*mm"/> + <!-- rmax is 2410.0*mm--> + <constant name="TPC_Ecal_Hcal_barrel_halfZ" value="2350*mm"/> + <constant name="HcalBarrel_zmax" value="TPC_Ecal_Hcal_barrel_halfZ"/> + <constant name="HcalBarrel_staves" value="8"/> + <constant name="HcalBarrel_layers" value="(int) 48"/> + <constant name="Hcal_chamber_thickness" value="6.5*mm"/> + <constant name="Hcal_radiator_thickness" value="20.0*mm"/> + <!--constant name="HcalBarrel_layer_thickness" value="20.0*mm + 6.5*mm"/--> + <constant name="HcalBarrel_layer_thickness" value="Hcal_radiator_thickness+Hcal_chamber_thickness"/> + <constant name="Hcal_back_plate_thickness" value="19.0*mm"/> + <constant name="Hcal_lateral_structure_thickness" value="15.0*mm"/> + <constant name="Hcal_layer_air_gap" value="2.0*mm"/> + <!-- Hcal Barrel roration angle M_PI/8.0 --> + <!-- constant name="Hcal_Barrel_rotation" value="0.392699075"/--> + <constant name="Hcal_Barrel_rotation" value="0."/> + + <constant name="Hcal_endcap_modules" value="16"/> + <constant name="Hcal_endcap_layers" value="(int) 48"/> + <constant name="Hcal_endcap_zmin" value="2650*mm"/> + + <constant name="SolenoidalFieldRadius" value="Hcal_outer_radius+10.0*mm"/> + </define> + + <materials> + <material name="Graphite"> + <D value="1.7" unit="g/cm3"/> + <composite n="1" ref="C"/> + </material> + </materials> + + <limits> + <limitset name="cal_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + <limitset name="TPC_limits"> + <limit name="step_length_max" particles="*" value="10.0" unit="mm" /> + </limitset> + <limitset name="Tracker_limits"> + <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> + </limitset> + </limits> + + <display> + <vis name="TPCVis" alpha="1.0" r="0" g="1.0" b="0.7" showDaughters="true" visible="false"/> + <vis name="TPCSupportVis" alpha="1.0" r="0" g="0.4" b="0.4" showDaughters="false" visible="true"/> + <vis name="TPCGasVis" alpha="1.0" r="0.7" g="0" b="0" showDaughters="false" visible="false"/> + <vis name="VXDLayerVis" alpha="1.0" r="0.5" g=".5" b=".5" showDaughters="true" visible="true"/> + <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.3" b="0.7" showDaughters="true" visible="true"/> + <vis name="SITLayerVis" alpha="1.0" r="0.0" g="0.7" b="0.3" showDaughters="true" visible="true"/> + <vis name="SupportVis" r="0.5" g="0.1" b="0.99" showDaughters="false" visible="true"/> + <vis name="LumiCalVis" showDaughters="false" visible="true"/> + + <vis name="HcalBarrelVis" alpha="1" r="1" g="1" b="0.1" showDaughters="true" visible="true"/> + <vis name="HcalBarrelStavesVis" alpha="1" r="1" g="0" b="0.3" showDaughters="true" visible="false"/> + <vis name="HcalBarrelLayerVis" alpha="1" r="1" g="0" b="0.5" showDaughters="true" visible="false"/> + <vis name="HcalBarrelSensorVis" alpha="1" r="1" g="1" b="0.7" showDaughters="true" visible="false"/> + + <vis name="HcalEndcapVis" alpha="1" r="1" g="1" b="0.1" showDaughters="true" visible="true"/> + <vis name="HcalEndcapStavesVis" alpha="1" r="1" g="0" b="0.3" showDaughters="true" visible="false"/> + <vis name="HcalEndcapLayerVis" alpha="1" r="1" g="0" b="0.5" showDaughters="true" visible="false"/> + <vis name="HcalEndcapSensorVis" alpha="1" r="1" g="1" b="0.7" showDaughters="true" visible="false"/> + <vis name="HcalEndcapAirVis" alpha="1" r="1" g="0" b="0" showDaughters="true" visible="false"/> + + </display> + + <detectors> + <comment>Trackers</comment> + + <detector name="VXD" type="ILDExVXD" vis="VXDVis" id="1" limits="Tracker_limits" readout="VXDCollection" insideTrackingVolume="true"> + <tubs rmin="VXD_inner_radius" rmax="VXD_outer_radius" zhalf="VXD_zhalf"/> + <layer id="0" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="65*mm" radius="1.595000000e+01*mm" width="1.100000000e+01*mm" offset="-1.874869853e+00*mm" thickness="0.05*mm" material="Silicon" number="10"/> + </layer> + <layer id="1" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="65*mm" radius="18*mm" width="1.100000000e+01*mm" offset="-1.874869853e+00*mm" thickness="0.05*mm" material="Silicon" number="10"/> + </layer> + <layer id="2" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="125*mm" radius="3.695000000e+01*mm" width="2.200000000e+01*mm" offset="-1.837940563e+00*mm" thickness="0.05*mm" material="Silicon" number="11"/> + </layer> + <layer id="3" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="125*mm" radius="39*mm" width="2.200000000e+01*mm" offset="-1.837940563e+00*mm" thickness="0.05*mm" material="Silicon" number="11"/> + </layer> + <layer id="4" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="125*mm" radius="5.795000000e+01*mm" width="2.200000000e+01*mm" offset="-2.636744400e+00*mm" thickness="0.05*mm" material="Silicon" number="17"/> + </layer> + <layer id="5" vis="VXDLayerVis" phi0="-1.570796327e+00"> + <support thickness=".1*mm" material="Carbon" vis="VXDSupportVis"/> + <ladder zhalf="125*mm" radius="60*mm" width="2.200000000e+01*mm" offset="-2.636744400e+00*mm" thickness="0.05*mm" material="Silicon" number="17"/> + </layer> + </detector> + + <detector name="SIT" type="ILDExSIT" vis="SITVis" id="2" limits="Tracker_limits" readout="SITCollection" insideTrackingVolume="true"> + <tubs rmin="SIT_inner_radius" rmax="SIT_outer_radius" zhalf="SIT_zhalf"/> + <layer id="0" vis="SITLayerVis"> + <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/> + <ladder thickness="0.1*mm" zhalf="370*mm" radius="155*mm" material="Silicon" number="10" /> + </layer> + <layer id="1" vis="SITLayerVis"> + <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/> + <ladder thickness="0.1*mm" zhalf="650*mm" radius="300*mm" material="Silicon" number="19" /> + </layer> + </detector> + + + <detector name="TPC" type="ILDExTPC" vis="TPCVis" id="3" limits="TPC_limits" readout="TPCCollection" insideTrackingVolume="true"> + <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/> + + <!-- GEAR Data--> + <driftlength value="TPC_zhalf*0.9"/> + <!-- End of GEAR Data--> + <material name="Air"/> + + <detector name="TPC_InnerWall" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="2"> + <material name="Carbon"/> + <tubs rmin="TPC_inner_radius" rmax="TPC_inner_radius+TPC_inner_thickness" zhalf="TPC_zhalf"/> + <position x="0" y="0" z="0"/> + <rotation x="0" y="0" z="0"/> + </detector> + + <detector name="TPC_OuterWall" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="3"> + <material name="Carbon" /> + <tubs rmin="TPC_outer_radius - TPC_outer_thickness" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/> + <position x="0" y="0" z="0"/> + <rotation x="0" y="0" z="0"/> + </detector> + + <detector name="TPC_EndPlate" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="0"> + <material name="Carbon" /> + <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/> + <position x="0" y="0" z="TPC_zhalf-0.5*TPC_endcap_thickness"/> + <rotation x="0" y="0" z="0"/> + </detector> + + + <detector name="TPC_GasVolume" type="TubeSegment" reflect="true" vis="TPCGasVis" id="4"> + <material name="Argon"/> + <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="TPC_zhalf-TPC_endcap_thickness"/> + <layer number="220" ecut="0.0"/> + <position x="0" y="0" z="0"/> + <rotation x="0" y="0" z="0"/> + </detector> + </detector> + + <comment>Calorimeters</comment> + <detector id="7" name="HcalBarrel" type="AhcalBarrelCalorimeter" readout="HcalBarrelHits" vis="HcalBarrelVis" calorimeterType="HAD_BARREL" gap="10.*mm"> + <comment>Hadron Calorimeter Barrel</comment> + + <material name="Steel235"/> + + <dimensions numsides="(int) HcalBarrel_staves" rmin="HcalBarrel_rmin" z="HcalBarrel_zmax"/> + <layer repeat="(int) HcalBarrel_layers"> + <slice material = "Polystyrene" thickness = "3.0*mm" sensitive = "yes" limits="cal_limits" vis="HcalBarrelSensorVis"/> + <slice material = "FR4" thickness = "0.7*mm" /> + <slice material = "Cu" thickness = "0.1*mm" /> + <slice material = "Air" thickness = "2.7*mm" vis="HcalBarrelAirVis" /> + </layer> + </detector> + <detector id="8" name="HcalEndcap" type="AhcalEndcapCalorimeter" readout="HcalEndcapHits" calorimeterType="HAD_ENDCAP" gap="15.*mm"> + <comment>Hadron Calorimeter Endcap</comment> + + <material name="Steel235"/> + + <layer repeat="(int) Hcal_endcap_layers"> + <slice material = "Polystyrene" thickness = "3.0*mm" sensitive = "yes" limits="cal_limits" vis="HcalEndcapSensorVis"/> + <slice material = "FR4" thickness = "0.7*mm" /> + <slice material = "Cu" thickness = "0.1*mm" /> + <slice material = "Air" thickness = "2.7*mm" vis="HcalEndcapAirVis" /> + </layer> + + <dimensions numsides="(int) Hcal_endcap_modules" rmin="362.0*mm" z="Hcal_endcap_zmin"> + <dimensions id="1" y_offset= "543.5" dim_x="375.0" dim_y="1287.0" dim_z="1087.0"/> + <dimensions id="2" y_offset= "905.5" dim_x="375.0" dim_y="1287.0" dim_z="1811.0"/> + <dimensions id="3" y_offset="1086.5" dim_x="375.0" dim_y="1287.0" dim_z="2173.0"/> + <dimensions id="4" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="5" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="6" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/> + <dimensions id="7" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/> + <dimensions id="8" y_offset="1630.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="9" y_offset="1630.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="10" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/> + <dimensions id="11" y_offset="1449.0" dim_x="375.0" dim_y="1287.0" dim_z="2898.0"/> + <dimensions id="12" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="13" y_offset="1268.0" dim_x="375.0" dim_y="1287.0" dim_z="2536.0"/> + <dimensions id="14" y_offset="1086.5" dim_x="375.0" dim_y="1287.0" dim_z="2173.0"/> + <dimensions id="15" y_offset= "905.5" dim_x="375.0" dim_y="1287.0" dim_z="1811.0"/> + <dimensions id="16" y_offset= "543.5" dim_x="375.0" dim_y="1287.0" dim_z="1087.0"/> + </dimensions> + </detector> + </detectors> + + <readouts> + <readout name="VXDCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + <readout name="SITCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + <readout name="TPCCollection"> + <id>system:5,side:-2,layer:9,module:8,sensor:8</id> + </readout> + + <readout name="HcalBarrelHits"> + <segmentation type="RegularNgonCartesianGridXY" gridSizeY="30.0*mm" gridSizeZ="30.0*mm" /> + <id>system:6,stave:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> + </readout> + <readout name="HcalEndcapHits"> + <segmentation type="GlobalGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" /> + <id>system:6,stave:1,module:1,endcapID:5,layer:8,slice:5,x:32:-16,y:-16</id> + </readout> + + </readouts> + <fields> + <field type="solenoid" name="GlobalSolenoid" inner_field="3.5*tesla" + outer_field="-1.5*tesla" zmax="SolenoidCoilOuterZ" + inner_radius="SolenoidalFieldRadius" + outer_radius="world_side" /> + </fields> +</lccdd> diff --git a/examples/ILDExDet/compact/elements.xml b/examples/ILDExDet/compact/elements.xml new file mode 100644 index 000000000..e714c3a5c --- /dev/null +++ b/examples/ILDExDet/compact/elements.xml @@ -0,0 +1,884 @@ +<materials> + <element Z="89" formula="Ac" name="Ac" > + <atom type="A" unit="g/mol" value="227.028" /> + </element> + <material formula="Ac" name="Actinium" state="solid" > + <RL type="X0" unit="cm" value="0.601558" /> + <NIL type="lambda" unit="cm" value="21.2048" /> + <D type="density" unit="g/cm3" value="10.07" /> + <composite n="1" ref="Ac" /> + </material> + <element Z="47" formula="Ag" name="Ag" > + <atom type="A" unit="g/mol" value="107.868" /> + </element> + <material formula="Ag" name="Silver" state="solid" > + <RL type="X0" unit="cm" value="0.854292" /> + <NIL type="lambda" unit="cm" value="15.8546" /> + <D type="density" unit="g/cm3" value="10.5" /> + <composite n="1" ref="Ag" /> + </material> + <element Z="13" formula="Al" name="Al" > + <atom type="A" unit="g/mol" value="26.9815" /> + </element> + <material formula="Al" name="Aluminum" state="solid" > + <RL type="X0" unit="cm" value="8.89632" /> + <NIL type="lambda" unit="cm" value="38.8766" /> + <D type="density" unit="g/cm3" value="2.699" /> + <composite n="1" ref="Al" /> + </material> + <element Z="95" formula="Am" name="Am" > + <atom type="A" unit="g/mol" value="243.061" /> + </element> + <material formula="Am" name="Americium" state="solid" > + <RL type="X0" unit="cm" value="0.42431" /> + <NIL type="lambda" unit="cm" value="15.9812" /> + <D type="density" unit="g/cm3" value="13.67" /> + <composite n="1" ref="Am" /> + </material> + <element Z="18" formula="Ar" name="Ar" > + <atom type="A" unit="g/mol" value="39.9477" /> + </element> + <material formula="Ar" name="Argon" state="gas" > + <RL type="X0" unit="cm" value="11762.1" /> + <NIL type="lambda" unit="cm" value="71926" /> + <D type="density" unit="g/cm3" value="0.00166201" /> + <composite n="1" ref="Ar" /> + </material> + <element Z="33" formula="As" name="As" > + <atom type="A" unit="g/mol" value="74.9216" /> + </element> + <material formula="As" name="Arsenic" state="solid" > + <RL type="X0" unit="cm" value="2.0838" /> + <NIL type="lambda" unit="cm" value="25.7324" /> + <D type="density" unit="g/cm3" value="5.73" /> + <composite n="1" ref="As" /> + </material> + <element Z="85" formula="At" name="At" > + <atom type="A" unit="g/mol" value="209.987" /> + </element> + <material formula="At" name="Astatine" state="solid" > + <RL type="X0" unit="cm" value="0.650799" /> + <NIL type="lambda" unit="cm" value="22.3202" /> + <D type="density" unit="g/cm3" value="9.32" /> + <composite n="1" ref="At" /> + </material> + <element Z="79" formula="Au" name="Au" > + <atom type="A" unit="g/mol" value="196.967" /> + </element> + <material formula="Au" name="Gold" state="solid" > + <RL type="X0" unit="cm" value="0.334436" /> + <NIL type="lambda" unit="cm" value="10.5393" /> + <D type="density" unit="g/cm3" value="19.32" /> + <composite n="1" ref="Au" /> + </material> + <element Z="5" formula="B" name="B" > + <atom type="A" unit="g/mol" value="10.811" /> + </element> + <material formula="B" name="Boron" state="solid" > + <RL type="X0" unit="cm" value="22.2307" /> + <NIL type="lambda" unit="cm" value="32.2793" /> + <D type="density" unit="g/cm3" value="2.37" /> + <composite n="1" ref="B" /> + </material> + <element Z="56" formula="Ba" name="Ba" > + <atom type="A" unit="g/mol" value="137.327" /> + </element> + <material formula="Ba" name="Barium" state="solid" > + <RL type="X0" unit="cm" value="2.37332" /> + <NIL type="lambda" unit="cm" value="51.6743" /> + <D type="density" unit="g/cm3" value="3.5" /> + <composite n="1" ref="Ba" /> + </material> + <element Z="4" formula="Be" name="Be" > + <atom type="A" unit="g/mol" value="9.01218" /> + </element> + <material formula="Be" name="Beryllium" state="solid" > + <RL type="X0" unit="cm" value="35.276" /> + <NIL type="lambda" unit="cm" value="39.4488" /> + <D type="density" unit="g/cm3" value="1.848" /> + <composite n="1" ref="Be" /> + </material> + <element Z="83" formula="Bi" name="Bi" > + <atom type="A" unit="g/mol" value="208.98" /> + </element> + <material formula="Bi" name="Bismuth" state="solid" > + <RL type="X0" unit="cm" value="0.645388" /> + <NIL type="lambda" unit="cm" value="21.3078" /> + <D type="density" unit="g/cm3" value="9.747" /> + <composite n="1" ref="Bi" /> + </material> + <element Z="97" formula="Bk" name="Bk" > + <atom type="A" unit="g/mol" value="247.07" /> + </element> + <material formula="Bk" name="Berkelium" state="solid" > + <RL type="X0" unit="cm" value="0.406479" /> + <NIL type="lambda" unit="cm" value="15.6902" /> + <D type="density" unit="g/cm3" value="14" /> + <composite n="1" ref="Bk" /> + </material> + <element Z="35" formula="Br" name="Br" > + <atom type="A" unit="g/mol" value="79.9035" /> + </element> + <material formula="Br" name="Bromine" state="gas" > + <RL type="X0" unit="cm" value="1615.12" /> + <NIL type="lambda" unit="cm" value="21299" /> + <D type="density" unit="g/cm3" value="0.0070721" /> + <composite n="1" ref="Br" /> + </material> + <element Z="6" formula="C" name="C" > + <atom type="A" unit="g/mol" value="12.0107" /> + </element> + <material formula="C" name="Carbon" state="solid" > + <RL type="X0" unit="cm" value="21.3485" /> + <NIL type="lambda" unit="cm" value="40.1008" /> + <D type="density" unit="g/cm3" value="2" /> + <composite n="1" ref="C" /> + </material> + <element Z="20" formula="Ca" name="Ca" > + <atom type="A" unit="g/mol" value="40.078" /> + </element> + <material formula="Ca" name="Calcium" state="solid" > + <RL type="X0" unit="cm" value="10.4151" /> + <NIL type="lambda" unit="cm" value="77.3754" /> + <D type="density" unit="g/cm3" value="1.55" /> + <composite n="1" ref="Ca" /> + </material> + <element Z="48" formula="Cd" name="Cd" > + <atom type="A" unit="g/mol" value="112.411" /> + </element> + <material formula="Cd" name="Cadmium" state="solid" > + <RL type="X0" unit="cm" value="1.03994" /> + <NIL type="lambda" unit="cm" value="19.46" /> + <D type="density" unit="g/cm3" value="8.65" /> + <composite n="1" ref="Cd" /> + </material> + <element Z="58" formula="Ce" name="Ce" > + <atom type="A" unit="g/mol" value="140.115" /> + </element> + <material formula="Ce" name="Cerium" state="solid" > + <RL type="X0" unit="cm" value="1.19506" /> + <NIL type="lambda" unit="cm" value="27.3227" /> + <D type="density" unit="g/cm3" value="6.657" /> + <composite n="1" ref="Ce" /> + </material> + <element Z="98" formula="Cf" name="Cf" > + <atom type="A" unit="g/mol" value="251.08" /> + </element> + <material formula="Cf" name="Californium" state="solid" > + <RL type="X0" unit="cm" value="0.568328" /> + <NIL type="lambda" unit="cm" value="22.085" /> + <D type="density" unit="g/cm3" value="10" /> + <composite n="1" ref="Cf" /> + </material> + <element Z="17" formula="Cl" name="Cl" > + <atom type="A" unit="g/mol" value="35.4526" /> + </element> + <material formula="Cl" name="Chlorine" state="gas" > + <RL type="X0" unit="cm" value="6437.34" /> + <NIL type="lambda" unit="cm" value="38723.9" /> + <D type="density" unit="g/cm3" value="0.00299473" /> + <composite n="1" ref="Cl" /> + </material> + <element Z="96" formula="Cm" name="Cm" > + <atom type="A" unit="g/mol" value="247.07" /> + </element> + <material formula="Cm" name="Curium" state="solid" > + <RL type="X0" unit="cm" value="0.428706" /> + <NIL type="lambda" unit="cm" value="16.2593" /> + <D type="density" unit="g/cm3" value="13.51" /> + <composite n="1" ref="Cm" /> + </material> + <element Z="27" formula="Co" name="Co" > + <atom type="A" unit="g/mol" value="58.9332" /> + </element> + <material formula="Co" name="Cobalt" state="solid" > + <RL type="X0" unit="cm" value="1.53005" /> + <NIL type="lambda" unit="cm" value="15.2922" /> + <D type="density" unit="g/cm3" value="8.9" /> + <composite n="1" ref="Co" /> + </material> + <element Z="24" formula="Cr" name="Cr" > + <atom type="A" unit="g/mol" value="51.9961" /> + </element> + <material formula="Cr" name="Chromium" state="solid" > + <RL type="X0" unit="cm" value="2.0814" /> + <NIL type="lambda" unit="cm" value="18.1933" /> + <D type="density" unit="g/cm3" value="7.18" /> + <composite n="1" ref="Cr" /> + </material> + <element Z="55" formula="Cs" name="Cs" > + <atom type="A" unit="g/mol" value="132.905" /> + </element> + <material formula="Cs" name="Cesium" state="solid" > + <RL type="X0" unit="cm" value="4.4342" /> + <NIL type="lambda" unit="cm" value="95.317" /> + <D type="density" unit="g/cm3" value="1.873" /> + <composite n="1" ref="Cs" /> + </material> + <element Z="29" formula="Cu" name="Cu" > + <atom type="A" unit="g/mol" value="63.5456" /> + </element> + <material formula="Cu" name="Copper" state="solid" > + <RL type="X0" unit="cm" value="1.43558" /> + <NIL type="lambda" unit="cm" value="15.5141" /> + <D type="density" unit="g/cm3" value="8.96" /> + <composite n="1" ref="Cu" /> + </material> + <element Z="66" formula="Dy" name="Dy" > + <atom type="A" unit="g/mol" value="162.497" /> + </element> + <material formula="Dy" name="Dysprosium" state="solid" > + <RL type="X0" unit="cm" value="0.85614" /> + <NIL type="lambda" unit="cm" value="22.2923" /> + <D type="density" unit="g/cm3" value="8.55" /> + <composite n="1" ref="Dy" /> + </material> + <element Z="68" formula="Er" name="Er" > + <atom type="A" unit="g/mol" value="167.256" /> + </element> + <material formula="Er" name="Erbium" state="solid" > + <RL type="X0" unit="cm" value="0.788094" /> + <NIL type="lambda" unit="cm" value="21.2923" /> + <D type="density" unit="g/cm3" value="9.066" /> + <composite n="1" ref="Er" /> + </material> + <element Z="63" formula="Eu" name="Eu" > + <atom type="A" unit="g/mol" value="151.964" /> + </element> + <material formula="Eu" name="Europium" state="solid" > + <RL type="X0" unit="cm" value="1.41868" /> + <NIL type="lambda" unit="cm" value="35.6178" /> + <D type="density" unit="g/cm3" value="5.243" /> + <composite n="1" ref="Eu" /> + </material> + <element Z="9" formula="F" name="F" > + <atom type="A" unit="g/mol" value="18.9984" /> + </element> + <material formula="F" name="Fluorine" state="gas" > + <RL type="X0" unit="cm" value="20838.2" /> + <NIL type="lambda" unit="cm" value="59094.3" /> + <D type="density" unit="g/cm3" value="0.00158029" /> + <composite n="1" ref="F" /> + </material> + <element Z="26" formula="Fe" name="Fe" > + <atom type="A" unit="g/mol" value="55.8451" /> + </element> + <material formula="Fe" name="Iron" state="solid" > + <RL type="X0" unit="cm" value="1.75749" /> + <NIL type="lambda" unit="cm" value="16.959" /> + <D type="density" unit="g/cm3" value="7.874" /> + <composite n="1" ref="Fe" /> + </material> + <element Z="87" formula="Fr" name="Fr" > + <atom type="A" unit="g/mol" value="223.02" /> + </element> + <material formula="Fr" name="Francium" state="solid" > + <RL type="X0" unit="cm" value="6.18826" /> + <NIL type="lambda" unit="cm" value="212.263" /> + <D type="density" unit="g/cm3" value="1" /> + <composite n="1" ref="Fr" /> + </material> + <element Z="31" formula="Ga" name="Ga" > + <atom type="A" unit="g/mol" value="69.7231" /> + </element> + <material formula="Ga" name="Gallium" state="solid" > + <RL type="X0" unit="cm" value="2.1128" /> + <NIL type="lambda" unit="cm" value="24.3351" /> + <D type="density" unit="g/cm3" value="5.904" /> + <composite n="1" ref="Ga" /> + </material> + <element Z="64" formula="Gd" name="Gd" > + <atom type="A" unit="g/mol" value="157.252" /> + </element> + <material formula="Gd" name="Gadolinium" state="solid" > + <RL type="X0" unit="cm" value="0.947208" /> + <NIL type="lambda" unit="cm" value="23.9377" /> + <D type="density" unit="g/cm3" value="7.9004" /> + <composite n="1" ref="Gd" /> + </material> + <element Z="32" formula="Ge" name="Ge" > + <atom type="A" unit="g/mol" value="72.6128" /> + </element> + <material formula="Ge" name="Germanium" state="solid" > + <RL type="X0" unit="cm" value="2.3013" /> + <NIL type="lambda" unit="cm" value="27.3344" /> + <D type="density" unit="g/cm3" value="5.323" /> + <composite n="1" ref="Ge" /> + </material> + <element Z="1" formula="H" name="H" > + <atom type="A" unit="g/mol" value="1.00794" /> + </element> + <material formula="H" name="Hydrogen" state="gas" > + <RL type="X0" unit="cm" value="752776" /> + <NIL type="lambda" unit="cm" value="421239" /> + <D type="density" unit="g/cm3" value="8.3748e-05" /> + <composite n="1" ref="H" /> + </material> + <element Z="2" formula="He" name="He" > + <atom type="A" unit="g/mol" value="4.00264" /> + </element> + <material formula="He" name="Helium" state="gas" > + <RL type="X0" unit="cm" value="567113" /> + <NIL type="lambda" unit="cm" value="334266" /> + <D type="density" unit="g/cm3" value="0.000166322" /> + <composite n="1" ref="He" /> + </material> + <element Z="72" formula="Hf" name="Hf" > + <atom type="A" unit="g/mol" value="178.485" /> + </element> + <material formula="Hf" name="Hafnium" state="solid" > + <RL type="X0" unit="cm" value="0.517717" /> + <NIL type="lambda" unit="cm" value="14.7771" /> + <D type="density" unit="g/cm3" value="13.31" /> + <composite n="1" ref="Hf" /> + </material> + <element Z="80" formula="Hg" name="Hg" > + <atom type="A" unit="g/mol" value="200.599" /> + </element> + <material formula="Hg" name="Mercury" state="solid" > + <RL type="X0" unit="cm" value="0.475241" /> + <NIL type="lambda" unit="cm" value="15.105" /> + <D type="density" unit="g/cm3" value="13.546" /> + <composite n="1" ref="Hg" /> + </material> + <element Z="67" formula="Ho" name="Ho" > + <atom type="A" unit="g/mol" value="164.93" /> + </element> + <material formula="Ho" name="Holmium" state="solid" > + <RL type="X0" unit="cm" value="0.822447" /> + <NIL type="lambda" unit="cm" value="21.8177" /> + <D type="density" unit="g/cm3" value="8.795" /> + <composite n="1" ref="Ho" /> + </material> + <element Z="53" formula="I" name="I" > + <atom type="A" unit="g/mol" value="126.904" /> + </element> + <material formula="I" name="Iodine" state="solid" > + <RL type="X0" unit="cm" value="1.72016" /> + <NIL type="lambda" unit="cm" value="35.6583" /> + <D type="density" unit="g/cm3" value="4.93" /> + <composite n="1" ref="I" /> + </material> + <element Z="49" formula="In" name="In" > + <atom type="A" unit="g/mol" value="114.818" /> + </element> + <material formula="In" name="Indium" state="solid" > + <RL type="X0" unit="cm" value="1.21055" /> + <NIL type="lambda" unit="cm" value="23.2468" /> + <D type="density" unit="g/cm3" value="7.31" /> + <composite n="1" ref="In" /> + </material> + <element Z="77" formula="Ir" name="Ir" > + <atom type="A" unit="g/mol" value="192.216" /> + </element> + <material formula="Ir" name="Iridium" state="solid" > + <RL type="X0" unit="cm" value="0.294142" /> + <NIL type="lambda" unit="cm" value="9.01616" /> + <D type="density" unit="g/cm3" value="22.42" /> + <composite n="1" ref="Ir" /> + </material> + <element Z="19" formula="K" name="K" > + <atom type="A" unit="g/mol" value="39.0983" /> + </element> + <material formula="K" name="Potassium" state="solid" > + <RL type="X0" unit="cm" value="20.0871" /> + <NIL type="lambda" unit="cm" value="138.041" /> + <D type="density" unit="g/cm3" value="0.862" /> + <composite n="1" ref="K" /> + </material> + <element Z="36" formula="Kr" name="Kr" > + <atom type="A" unit="g/mol" value="83.7993" /> + </element> + <material formula="Kr" name="Krypton" state="gas" > + <RL type="X0" unit="cm" value="3269.44" /> + <NIL type="lambda" unit="cm" value="43962.9" /> + <D type="density" unit="g/cm3" value="0.00347832" /> + <composite n="1" ref="Kr" /> + </material> + <element Z="57" formula="La" name="La" > + <atom type="A" unit="g/mol" value="138.905" /> + </element> + <material formula="La" name="Lanthanum" state="solid" > + <RL type="X0" unit="cm" value="1.32238" /> + <NIL type="lambda" unit="cm" value="29.441" /> + <D type="density" unit="g/cm3" value="6.154" /> + <composite n="1" ref="La" /> + </material> + <element Z="3" formula="Li" name="Li" > + <atom type="A" unit="g/mol" value="6.94003" /> + </element> + <material formula="Li" name="Lithium" state="solid" > + <RL type="X0" unit="cm" value="154.997" /> + <NIL type="lambda" unit="cm" value="124.305" /> + <D type="density" unit="g/cm3" value="0.534" /> + <composite n="1" ref="Li" /> + </material> + <element Z="71" formula="Lu" name="Lu" > + <atom type="A" unit="g/mol" value="174.967" /> + </element> + <material formula="Lu" name="Lutetium" state="solid" > + <RL type="X0" unit="cm" value="0.703651" /> + <NIL type="lambda" unit="cm" value="19.8916" /> + <D type="density" unit="g/cm3" value="9.84" /> + <composite n="1" ref="Lu" /> + </material> + <element Z="12" formula="Mg" name="Mg" > + <atom type="A" unit="g/mol" value="24.305" /> + </element> + <material formula="Mg" name="Magnesium" state="solid" > + <RL type="X0" unit="cm" value="14.3859" /> + <NIL type="lambda" unit="cm" value="58.7589" /> + <D type="density" unit="g/cm3" value="1.74" /> + <composite n="1" ref="Mg" /> + </material> + <element Z="25" formula="Mn" name="Mn" > + <atom type="A" unit="g/mol" value="54.938" /> + </element> + <material formula="Mn" name="Manganese" state="solid" > + <RL type="X0" unit="cm" value="1.96772" /> + <NIL type="lambda" unit="cm" value="17.8701" /> + <D type="density" unit="g/cm3" value="7.44" /> + <composite n="1" ref="Mn" /> + </material> + <element Z="42" formula="Mo" name="Mo" > + <atom type="A" unit="g/mol" value="95.9313" /> + </element> + <material formula="Mo" name="Molybdenum" state="solid" > + <RL type="X0" unit="cm" value="0.959107" /> + <NIL type="lambda" unit="cm" value="15.6698" /> + <D type="density" unit="g/cm3" value="10.22" /> + <composite n="1" ref="Mo" /> + </material> + <element Z="7" formula="N" name="N" > + <atom type="A" unit="g/mol" value="14.0068" /> + </element> + <material formula="N" name="Nitrogen" state="gas" > + <RL type="X0" unit="cm" value="32602.2" /> + <NIL type="lambda" unit="cm" value="72430.3" /> + <D type="density" unit="g/cm3" value="0.0011652" /> + <composite n="1" ref="N" /> + </material> + <element Z="11" formula="Na" name="Na" > + <atom type="A" unit="g/mol" value="22.9898" /> + </element> + <material formula="Na" name="Sodium" state="solid" > + <RL type="X0" unit="cm" value="28.5646" /> + <NIL type="lambda" unit="cm" value="102.463" /> + <D type="density" unit="g/cm3" value="0.971" /> + <composite n="1" ref="Na" /> + </material> + <element Z="41" formula="Nb" name="Nb" > + <atom type="A" unit="g/mol" value="92.9064" /> + </element> + <material formula="Nb" name="Niobium" state="solid" > + <RL type="X0" unit="cm" value="1.15783" /> + <NIL type="lambda" unit="cm" value="18.4846" /> + <D type="density" unit="g/cm3" value="8.57" /> + <composite n="1" ref="Nb" /> + </material> + <element Z="60" formula="Nd" name="Nd" > + <atom type="A" unit="g/mol" value="144.236" /> + </element> + <material formula="Nd" name="Neodymium" state="solid" > + <RL type="X0" unit="cm" value="1.11667" /> + <NIL type="lambda" unit="cm" value="26.6308" /> + <D type="density" unit="g/cm3" value="6.9" /> + <composite n="1" ref="Nd" /> + </material> + <element Z="10" formula="Ne" name="Ne" > + <atom type="A" unit="g/mol" value="20.18" /> + </element> + <material formula="Ne" name="Neon" state="gas" > + <RL type="X0" unit="cm" value="34504.8" /> + <NIL type="lambda" unit="cm" value="114322" /> + <D type="density" unit="g/cm3" value="0.000838505" /> + <composite n="1" ref="Ne" /> + </material> + <element Z="28" formula="Ni" name="Ni" > + <atom type="A" unit="g/mol" value="58.6933" /> + </element> + <material formula="Ni" name="Nickel" state="solid" > + <RL type="X0" unit="cm" value="1.42422" /> + <NIL type="lambda" unit="cm" value="15.2265" /> + <D type="density" unit="g/cm3" value="8.902" /> + <composite n="1" ref="Ni" /> + </material> + <element Z="93" formula="Np" name="Np" > + <atom type="A" unit="g/mol" value="237.048" /> + </element> + <material formula="Np" name="Neptunium" state="solid" > + <RL type="X0" unit="cm" value="0.289676" /> + <NIL type="lambda" unit="cm" value="10.6983" /> + <D type="density" unit="g/cm3" value="20.25" /> + <composite n="1" ref="Np" /> + </material> + <element Z="8" formula="O" name="O" > + <atom type="A" unit="g/mol" value="15.9994" /> + </element> + <material formula="O" name="Oxygen" state="gas" > + <RL type="X0" unit="cm" value="25713.8" /> + <NIL type="lambda" unit="cm" value="66233.9" /> + <D type="density" unit="g/cm3" value="0.00133151" /> + <composite n="1" ref="O" /> + </material> + <element Z="76" formula="Os" name="Os" > + <atom type="A" unit="g/mol" value="190.225" /> + </element> + <material formula="Os" name="Osmium" state="solid" > + <RL type="X0" unit="cm" value="0.295861" /> + <NIL type="lambda" unit="cm" value="8.92553" /> + <D type="density" unit="g/cm3" value="22.57" /> + <composite n="1" ref="Os" /> + </material> + <element Z="15" formula="P" name="P" > + <atom type="A" unit="g/mol" value="30.9738" /> + </element> + <material formula="P" name="Phosphorus" state="solid" > + <RL type="X0" unit="cm" value="9.63879" /> + <NIL type="lambda" unit="cm" value="49.9343" /> + <D type="density" unit="g/cm3" value="2.2" /> + <composite n="1" ref="P" /> + </material> + <element Z="91" formula="Pa" name="Pa" > + <atom type="A" unit="g/mol" value="231.036" /> + </element> + <material formula="Pa" name="Protactinium" state="solid" > + <RL type="X0" unit="cm" value="0.38607" /> + <NIL type="lambda" unit="cm" value="13.9744" /> + <D type="density" unit="g/cm3" value="15.37" /> + <composite n="1" ref="Pa" /> + </material> + <element Z="82" formula="Pb" name="Pb" > + <atom type="A" unit="g/mol" value="207.217" /> + </element> + <material formula="Pb" name="Lead" state="solid" > + <RL type="X0" unit="cm" value="0.561253" /> + <NIL type="lambda" unit="cm" value="18.2607" /> + <D type="density" unit="g/cm3" value="11.35" /> + <composite n="1" ref="Pb" /> + </material> + <element Z="46" formula="Pd" name="Pd" > + <atom type="A" unit="g/mol" value="106.415" /> + </element> + <material formula="Pd" name="Palladium" state="solid" > + <RL type="X0" unit="cm" value="0.765717" /> + <NIL type="lambda" unit="cm" value="13.7482" /> + <D type="density" unit="g/cm3" value="12.02" /> + <composite n="1" ref="Pd" /> + </material> + <element Z="61" formula="Pm" name="Pm" > + <atom type="A" unit="g/mol" value="144.913" /> + </element> + <material formula="Pm" name="Promethium" state="solid" > + <RL type="X0" unit="cm" value="1.04085" /> + <NIL type="lambda" unit="cm" value="25.4523" /> + <D type="density" unit="g/cm3" value="7.22" /> + <composite n="1" ref="Pm" /> + </material> + <element Z="84" formula="Po" name="Po" > + <atom type="A" unit="g/mol" value="208.982" /> + </element> + <material formula="Po" name="Polonium" state="solid" > + <RL type="X0" unit="cm" value="0.661092" /> + <NIL type="lambda" unit="cm" value="22.2842" /> + <D type="density" unit="g/cm3" value="9.32" /> + <composite n="1" ref="Po" /> + </material> + <element Z="59" formula="Pr" name="Pr" > + <atom type="A" unit="g/mol" value="140.908" /> + </element> + <material formula="Pr" name="Praseodymium" state="solid" > + <RL type="X0" unit="cm" value="1.1562" /> + <NIL type="lambda" unit="cm" value="27.1312" /> + <D type="density" unit="g/cm3" value="6.71" /> + <composite n="1" ref="Pr" /> + </material> + <element Z="78" formula="Pt" name="Pt" > + <atom type="A" unit="g/mol" value="195.078" /> + </element> + <material formula="Pt" name="Platinum" state="solid" > + <RL type="X0" unit="cm" value="0.305053" /> + <NIL type="lambda" unit="cm" value="9.46584" /> + <D type="density" unit="g/cm3" value="21.45" /> + <composite n="1" ref="Pt" /> + </material> + <element Z="94" formula="Pu" name="Pu" > + <atom type="A" unit="g/mol" value="244.064" /> + </element> + <material formula="Pu" name="Plutonium" state="solid" > + <RL type="X0" unit="cm" value="0.298905" /> + <NIL type="lambda" unit="cm" value="11.0265" /> + <D type="density" unit="g/cm3" value="19.84" /> + <composite n="1" ref="Pu" /> + </material> + <element Z="88" formula="Ra" name="Ra" > + <atom type="A" unit="g/mol" value="226.025" /> + </element> + <material formula="Ra" name="Radium" state="solid" > + <RL type="X0" unit="cm" value="1.22987" /> + <NIL type="lambda" unit="cm" value="42.6431" /> + <D type="density" unit="g/cm3" value="5" /> + <composite n="1" ref="Ra" /> + </material> + <element Z="37" formula="Rb" name="Rb" > + <atom type="A" unit="g/mol" value="85.4677" /> + </element> + <material formula="Rb" name="Rubidium" state="solid" > + <RL type="X0" unit="cm" value="7.19774" /> + <NIL type="lambda" unit="cm" value="100.218" /> + <D type="density" unit="g/cm3" value="1.532" /> + <composite n="1" ref="Rb" /> + </material> + <element Z="75" formula="Re" name="Re" > + <atom type="A" unit="g/mol" value="186.207" /> + </element> + <material formula="Re" name="Rhenium" state="solid" > + <RL type="X0" unit="cm" value="0.318283" /> + <NIL type="lambda" unit="cm" value="9.5153" /> + <D type="density" unit="g/cm3" value="21.02" /> + <composite n="1" ref="Re" /> + </material> + <element Z="45" formula="Rh" name="Rh" > + <atom type="A" unit="g/mol" value="102.906" /> + </element> + <material formula="Rh" name="Rhodium" state="solid" > + <RL type="X0" unit="cm" value="0.746619" /> + <NIL type="lambda" unit="cm" value="13.2083" /> + <D type="density" unit="g/cm3" value="12.41" /> + <composite n="1" ref="Rh" /> + </material> + <element Z="86" formula="Rn" name="Rn" > + <atom type="A" unit="g/mol" value="222.018" /> + </element> + <material formula="Rn" name="Radon" state="gas" > + <RL type="X0" unit="cm" value="697.777" /> + <NIL type="lambda" unit="cm" value="23532" /> + <D type="density" unit="g/cm3" value="0.00900662" /> + <composite n="1" ref="Rn" /> + </material> + <element Z="44" formula="Ru" name="Ru" > + <atom type="A" unit="g/mol" value="101.065" /> + </element> + <material formula="Ru" name="Ruthenium" state="solid" > + <RL type="X0" unit="cm" value="0.764067" /> + <NIL type="lambda" unit="cm" value="13.1426" /> + <D type="density" unit="g/cm3" value="12.41" /> + <composite n="1" ref="Ru" /> + </material> + <element Z="16" formula="S" name="S" > + <atom type="A" unit="g/mol" value="32.0661" /> + </element> + <material formula="S" name="Sulfur" state="solid" > + <RL type="X0" unit="cm" value="9.74829" /> + <NIL type="lambda" unit="cm" value="55.6738" /> + <D type="density" unit="g/cm3" value="2" /> + <composite n="1" ref="S" /> + </material> + <element Z="51" formula="Sb" name="Sb" > + <atom type="A" unit="g/mol" value="121.76" /> + </element> + <material formula="Sb" name="Antimony" state="solid" > + <RL type="X0" unit="cm" value="1.30401" /> + <NIL type="lambda" unit="cm" value="25.8925" /> + <D type="density" unit="g/cm3" value="6.691" /> + <composite n="1" ref="Sb" /> + </material> + <element Z="21" formula="Sc" name="Sc" > + <atom type="A" unit="g/mol" value="44.9559" /> + </element> + <material formula="Sc" name="Scandium" state="solid" > + <RL type="X0" unit="cm" value="5.53545" /> + <NIL type="lambda" unit="cm" value="41.609" /> + <D type="density" unit="g/cm3" value="2.989" /> + <composite n="1" ref="Sc" /> + </material> + <element Z="34" formula="Se" name="Se" > + <atom type="A" unit="g/mol" value="78.9594" /> + </element> + <material formula="Se" name="Selenium" state="solid" > + <RL type="X0" unit="cm" value="2.64625" /> + <NIL type="lambda" unit="cm" value="33.356" /> + <D type="density" unit="g/cm3" value="4.5" /> + <composite n="1" ref="Se" /> + </material> + <element Z="14" formula="Si" name="Si" > + <atom type="A" unit="g/mol" value="28.0854" /> + </element> + <material formula="Si" name="Silicon" state="solid" > + <RL type="X0" unit="cm" value="9.36607" /> + <NIL type="lambda" unit="cm" value="45.7531" /> + <D type="density" unit="g/cm3" value="2.33" /> + <composite n="1" ref="Si" /> + </material> + <element Z="62" formula="Sm" name="Sm" > + <atom type="A" unit="g/mol" value="150.366" /> + </element> + <material formula="Sm" name="Samarium" state="solid" > + <RL type="X0" unit="cm" value="1.01524" /> + <NIL type="lambda" unit="cm" value="24.9892" /> + <D type="density" unit="g/cm3" value="7.46" /> + <composite n="1" ref="Sm" /> + </material> + <element Z="50" formula="Sn" name="Sn" > + <atom type="A" unit="g/mol" value="118.71" /> + </element> + <material formula="Sn" name="Tin" state="solid" > + <RL type="X0" unit="cm" value="1.20637" /> + <NIL type="lambda" unit="cm" value="23.4931" /> + <D type="density" unit="g/cm3" value="7.31" /> + <composite n="1" ref="Sn" /> + </material> + <element Z="38" formula="Sr" name="Sr" > + <atom type="A" unit="g/mol" value="87.6166" /> + </element> + <material formula="Sr" name="Strontium" state="solid" > + <RL type="X0" unit="cm" value="4.237" /> + <NIL type="lambda" unit="cm" value="61.0238" /> + <D type="density" unit="g/cm3" value="2.54" /> + <composite n="1" ref="Sr" /> + </material> + <element Z="73" formula="Ta" name="Ta" > + <atom type="A" unit="g/mol" value="180.948" /> + </element> + <material formula="Ta" name="Tantalum" state="solid" > + <RL type="X0" unit="cm" value="0.409392" /> + <NIL type="lambda" unit="cm" value="11.8846" /> + <D type="density" unit="g/cm3" value="16.654" /> + <composite n="1" ref="Ta" /> + </material> + <element Z="65" formula="Tb" name="Tb" > + <atom type="A" unit="g/mol" value="158.925" /> + </element> + <material formula="Tb" name="Terbium" state="solid" > + <RL type="X0" unit="cm" value="0.893977" /> + <NIL type="lambda" unit="cm" value="23.0311" /> + <D type="density" unit="g/cm3" value="8.229" /> + <composite n="1" ref="Tb" /> + </material> + <element Z="43" formula="Tc" name="Tc" > + <atom type="A" unit="g/mol" value="97.9072" /> + </element> + <material formula="Tc" name="Technetium" state="solid" > + <RL type="X0" unit="cm" value="0.833149" /> + <NIL type="lambda" unit="cm" value="14.0185" /> + <D type="density" unit="g/cm3" value="11.5" /> + <composite n="1" ref="Tc" /> + </material> + <element Z="52" formula="Te" name="Te" > + <atom type="A" unit="g/mol" value="127.603" /> + </element> + <material formula="Te" name="Tellurium" state="solid" > + <RL type="X0" unit="cm" value="1.41457" /> + <NIL type="lambda" unit="cm" value="28.1797" /> + <D type="density" unit="g/cm3" value="6.24" /> + <composite n="1" ref="Te" /> + </material> + <element Z="90" formula="Th" name="Th" > + <atom type="A" unit="g/mol" value="232.038" /> + </element> + <material formula="Th" name="Thorium" state="solid" > + <RL type="X0" unit="cm" value="0.51823" /> + <NIL type="lambda" unit="cm" value="18.353" /> + <D type="density" unit="g/cm3" value="11.72" /> + <composite n="1" ref="Th" /> + </material> + <element Z="22" formula="Ti" name="Ti" > + <atom type="A" unit="g/mol" value="47.8667" /> + </element> + <material formula="Ti" name="Titanium" state="solid" > + <RL type="X0" unit="cm" value="3.5602" /> + <NIL type="lambda" unit="cm" value="27.9395" /> + <D type="density" unit="g/cm3" value="4.54" /> + <composite n="1" ref="Ti" /> + </material> + <element Z="81" formula="Tl" name="Tl" > + <atom type="A" unit="g/mol" value="204.383" /> + </element> + <material formula="Tl" name="Thallium" state="solid" > + <RL type="X0" unit="cm" value="0.547665" /> + <NIL type="lambda" unit="cm" value="17.6129" /> + <D type="density" unit="g/cm3" value="11.72" /> + <composite n="1" ref="Tl" /> + </material> + <element Z="69" formula="Tm" name="Tm" > + <atom type="A" unit="g/mol" value="168.934" /> + </element> + <material formula="Tm" name="Thulium" state="solid" > + <RL type="X0" unit="cm" value="0.754428" /> + <NIL type="lambda" unit="cm" value="20.7522" /> + <D type="density" unit="g/cm3" value="9.321" /> + <composite n="1" ref="Tm" /> + </material> + <element Z="92" formula="U" name="U" > + <atom type="A" unit="g/mol" value="238.029" /> + </element> + <material formula="U" name="Uranium" state="solid" > + <RL type="X0" unit="cm" value="0.31663" /> + <NIL type="lambda" unit="cm" value="11.4473" /> + <D type="density" unit="g/cm3" value="18.95" /> + <composite n="1" ref="U" /> + </material> + <element Z="23" formula="V" name="V" > + <atom type="A" unit="g/mol" value="50.9415" /> + </element> + <material formula="V" name="Vanadium" state="solid" > + <RL type="X0" unit="cm" value="2.59285" /> + <NIL type="lambda" unit="cm" value="21.2187" /> + <D type="density" unit="g/cm3" value="6.11" /> + <composite n="1" ref="V" /> + </material> + <element Z="74" formula="W" name="W" > + <atom type="A" unit="g/mol" value="183.842" /> + </element> + <material formula="W" name="Tungsten" state="solid" > + <RL type="X0" unit="cm" value="0.350418" /> + <NIL type="lambda" unit="cm" value="10.3057" /> + <D type="density" unit="g/cm3" value="19.3" /> + <composite n="1" ref="W" /> + </material> + <element Z="54" formula="Xe" name="Xe" > + <atom type="A" unit="g/mol" value="131.292" /> + </element> + <material formula="Xe" name="Xenon" state="gas" > + <RL type="X0" unit="cm" value="1546.2" /> + <NIL type="lambda" unit="cm" value="32477.9" /> + <D type="density" unit="g/cm3" value="0.00548536" /> + <composite n="1" ref="Xe" /> + </material> + <element Z="39" formula="Y" name="Y" > + <atom type="A" unit="g/mol" value="88.9058" /> + </element> + <material formula="Y" name="Yttrium" state="solid" > + <RL type="X0" unit="cm" value="2.32943" /> + <NIL type="lambda" unit="cm" value="34.9297" /> + <D type="density" unit="g/cm3" value="4.469" /> + <composite n="1" ref="Y" /> + </material> + <element Z="70" formula="Yb" name="Yb" > + <atom type="A" unit="g/mol" value="173.038" /> + </element> + <material formula="Yb" name="Ytterbium" state="solid" > + <RL type="X0" unit="cm" value="1.04332" /> + <NIL type="lambda" unit="cm" value="28.9843" /> + <D type="density" unit="g/cm3" value="6.73" /> + <composite n="1" ref="Yb" /> + </material> + <element Z="30" formula="Zn" name="Zn" > + <atom type="A" unit="g/mol" value="65.3955" /> + </element> + <material formula="Zn" name="Zinc" state="solid" > + <RL type="X0" unit="cm" value="1.74286" /> + <NIL type="lambda" unit="cm" value="19.8488" /> + <D type="density" unit="g/cm3" value="7.133" /> + <composite n="1" ref="Zn" /> + </material> + <element Z="40" formula="Zr" name="Zr" > + <atom type="A" unit="g/mol" value="91.2236" /> + </element> + <material formula="Zr" name="Zirconium" state="solid" > + <RL type="X0" unit="cm" value="1.56707" /> + <NIL type="lambda" unit="cm" value="24.2568" /> + <D type="density" unit="g/cm3" value="6.506" /> + <composite n="1" ref="Zr" /> + </material> +</materials> \ No newline at end of file diff --git a/examples/ILDExDet/compact/materials.xml b/examples/ILDExDet/compact/materials.xml new file mode 100644 index 000000000..907706d5a --- /dev/null +++ b/examples/ILDExDet/compact/materials.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8"?> +<materials> + + <!-- + Air by weight from + + http://www.engineeringtoolbox.com/air-composition-24_212.html + --> + <material name="FR4"> + <D type="density" unit="g/cm3" value="1.7"/> + <fraction n="0.1808" ref="Si"/> + <fraction n="0.4056" ref="O"/> + <fraction n="0.2780" ref="C"/> + <fraction n="0.0684" ref="H"/> + <fraction n="0.0671" ref="Br"/> + </material> + + <material name="Air"> + <D type="density" unit="g/cm3" value="0.0012"/> + <fraction n="0.754" ref="N"/> + <fraction n="0.234" ref="O"/> + <fraction n="0.012" ref="Ar"/> + </material> + + <material name="Vacuum"> + <D type="density" unit="g/cm3" value="0.00000001" /> + <fraction n="1" ref="H" /> + </material> + + <material name="Epoxy"> + <D type="density" value="1.3" unit="g/cm3"/> + <composite n="44" ref="H"/> + <composite n="15" ref="C"/> + <composite n="7" ref="O"/> + </material> + + <material name="Quartz"> + <D type="density" value="2.2" unit="g/cm3"/> + <composite n="1" ref="Si"/> + <composite n="2" ref="O"/> + </material> + + <material name="G10"> + <D type="density" value="1.7" unit="g/cm3"/> + <fraction n="0.08" ref="Cl"/> + <fraction n="0.773" ref="Quartz"/> + <fraction n="0.147" ref="Epoxy"/> + </material> + + <material name="Polystyrene"> + <D value="1.032" unit="g/cm3"/> + <composite n="19" ref="C"/> + <composite n="21" ref="H"/> + </material> + + <material name="Steel235"> + <D value="7.85" unit="g/cm3"/> + <fraction n="0.998" ref="Fe"/> + <fraction n=".002" ref="C"/> + </material> + + <material name="SiliconOxide"> + <D type="density" value="2.65" unit="g/cm3"/> + <composite n="1" ref="Si"/> + <composite n="2" ref="O"/> + </material> + + <material name="BoronOxide"> + <D type="density" value="2.46" unit="g/cm3"/> + <composite n="2" ref="B"/> + <composite n="3" ref="O"/> + </material> + + <material name="SodiumOxide"> + <D type="density" value="2.65" unit="g/cm3"/> + <composite n="2" ref="Na"/> + <composite n="1" ref="O"/> + </material> + + <material name="AluminumOxide"> + <D type="density" value="3.89" unit="g/cm3"/> + <composite n="2" ref="Al"/> + <composite n="3" ref="O"/> + </material> + + <material name="PyrexGlass"> + <D type="density" value="2.23" unit="g/cm3"/> + <fraction n="0.806" ref="SiliconOxide"/> + <fraction n="0.130" ref="BoronOxide"/> + <fraction n="0.040" ref="SodiumOxide"/> + <fraction n="0.023" ref="AluminumOxide"/> + </material> + + <material name="CarbonFiber"> + <D type="density" value="1.5" unit="g/cm3"/> + <fraction n="0.65" ref="C"/> + <fraction n="0.35" ref="Epoxy"/> + </material> + + <material name="CarbonFiber_50D"> + <D type="density" value="0.75" unit="g/cm3"/> + <fraction n="0.65" ref="C"/> + <fraction n="0.35" ref="Epoxy"/> + </material> + + <material name="Rohacell31"> + <D type="density" value="0.032" unit="g/cm3"/> + <composite n="9" ref="C"/> + <composite n="13" ref="H"/> + <composite n="2" ref="O"/> + <composite n="1" ref="N"/> + </material> + + <material name="Rohacell31_50D"> + <D type="density" value="0.016" unit="g/cm3"/> + <composite n="9" ref="C"/> + <composite n="13" ref="H"/> + <composite n="2" ref="O"/> + <composite n="1" ref="N"/> + </material> + + <material name="RPCGasDefault" state="gas"> + <D type="density" value="0.0037" unit="g/cm3"/> + <composite n="209" ref="C"/> + <composite n="239" ref="H"/> + <composite n="381" ref="F"/> + </material> + + <material name="PolystyreneFoam"> + <D type="density" value="0.0056" unit="g/cm3"/> + <fraction n="1.0" ref="Polystyrene"/> + </material> + + <material name="Kapton"> + <D value="1.43" unit="g/cm3" /> + <composite n="22" ref="C"/> + <composite n="10" ref="H" /> + <composite n="2" ref="N" /> + <composite n="5" ref="O" /> + </material> + + <material name="PEEK"> + <D value="1.37" unit="g/cm3" /> + <composite n="19" ref="C"/> + <composite n="12" ref="H" /> + <composite n="3" ref="O" /> + </material> + +</materials> diff --git a/examples/ILDExDet/include/TPCData.h b/examples/ILDExDet/include/TPCData.h new file mode 100644 index 000000000..8cdad52a8 --- /dev/null +++ b/examples/ILDExDet/include/TPCData.h @@ -0,0 +1,27 @@ +// $Id: TPCData.h 513 2013-04-05 14:31:53Z gaede $ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== + +#include "DD4hep/Detector.h" +#include <vector> + +namespace DD4hep { + + + struct TPCData : public Geometry::DetElement::Object { + typedef Geometry::Ref_t Ref_t; + Ref_t outerWall; + Ref_t innerWall; + Ref_t gasVolume; + Ref_t cathode; + //positive endplate + Ref_t endplate; + //negative endplate + Ref_t endplate2; + }; +} diff --git a/examples/ILDExDet/include/VXDData.h b/examples/ILDExDet/include/VXDData.h new file mode 100644 index 000000000..1e4b7589c --- /dev/null +++ b/examples/ILDExDet/include/VXDData.h @@ -0,0 +1,40 @@ +// $Id: VXDData.h 513 2013-04-05 14:31:53Z gaede $ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== + +#include "DD4hep/Detector.h" +#include <vector> + +namespace DD4hep { + + /**@class VXDData + * + * @author M.Frank + * @version 1.0 + */ + struct VXDData : public Geometry::DetElement::Object { + /// Helper class for layer properties + struct Layer { + double internalPhi0 ; + double Distance ; + double Offset ; + double Thickness ; + double Length ; + double Width ; + double RadLength ; + int NLadders ; + }; + typedef std::vector<Layer> LayerVec ; + typedef Geometry::Ref_t Ref_t; + + // Ladder + LayerVec _lVec; + // Sensitive + LayerVec _sVec; + }; +} diff --git a/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp b/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp new file mode 100644 index 000000000..03af52f73 --- /dev/null +++ b/examples/ILDExDet/src/AhcalBarrelCalorimeter_geo.cpp @@ -0,0 +1,252 @@ +//==================================================================== +// AIDA Detector description implementation +// for LDC AHCAL Barrel +//-------------------------------------------------------------------- +// +// Author : S.Lu +// +// Basic idea: +// 1. Create the Hcal Barrel module envelope by two shapers. +// Note: with default material Steel235. +// +// 2. Create the Hcal Barrel Chamber(i.e. Layer) +// Create the Layer with slices (Polystyrene,Cu,FR4,air). +// Note: there is NO radiator (Steel235) in Layer/Chamber. +// +// 3. Place the Layer into the Hcal Barrel envelope, +// with the right position and rotation. +// And registry the IDs for slice,layer,stave,module and system. +// +// 4. Customer material FR4 and Steel235 defined in materials.xml +// +//==================================================================== +#include "DD4hep/DetFactoryHelper.h" +#include "XML/Layering.h" + +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +static Ref_t create_detector(LCDD& lcdd, xml_h element, SensitiveDetector sens) { + xml_det_t x_det = element; + Layering layering(x_det); + xml_dim_t dim = x_det.dimensions(); + string det_name = x_det.nameStr(); + string det_type = x_det.typeStr(); + Material air = lcdd.air(); + Material Steel235 = lcdd.material(x_det.materialStr()); + double gap = xml_dim_t(x_det).gap(); + int numSides = dim.numsides(); + + // Hcal Barrel module shapers' parameters + double detZ = dim.z(); + double Hcal_inner_radius = dim.rmin(); + + // The way to reaad constant from XML/LCDD file. + double Hcal_outer_radius = lcdd.constant<double>("Hcal_outer_radius"); // 3395.46 mm + double Hcal_radiator_thickness = lcdd.constant<double>("Hcal_radiator_thickness"); // 20.0mm + double Hcal_chamber_thickness = lcdd.constant<double>("Hcal_chamber_thickness"); // 6.5mm + int HcalBarrel_layers = lcdd.constant<int>("HcalBarrel_layers"); // 48 + // ======== Note============================================================ + // In the XML/LCDD file, make sure the above constant parameters + // are agree with the layering/slices in the detector AhcalBarrelCalorimeter. + // ========================================================================== + + + double Hcal_lateral_structure_thickness = lcdd.constant<double>("Hcal_lateral_structure_thickness"); + double Hcal_layer_air_gap = lcdd.constant<double>("Hcal_layer_air_gap"); + double Hcal_back_plate_thickness = lcdd.constant<double>("Hcal_back_plate_thickness"); + + double totalThickness_Hcal_Barrel = (Hcal_radiator_thickness + Hcal_chamber_thickness) + * HcalBarrel_layers + Hcal_back_plate_thickness; + double Hcal_module_radius = Hcal_inner_radius + totalThickness_Hcal_Barrel; + + double Hcal_Barrel_rotation = lcdd.constant<double>("Hcal_Barrel_rotation"); + + DetElement sdet(det_name,x_det.id()); + Volume motherVol = lcdd.pickMotherVolume(sdet); + + + // ========= Create Hcal Barrel envelope ==================================== + // It will be the volume for palcing the Hcal Barrel Chamber(i.e. Layers). + // Itself will be placed into the world volume. + // ========================================================================== + + // Hcal Barrel module shapers + PolyhedraRegular polyhedra_shaper("polyhedra",numSides,Hcal_inner_radius,Hcal_module_radius,detZ*2.); + Tube tube_shaper(0.,Hcal_outer_radius, detZ, 0., 2.*M_PI); + + // keep the envelope rotation as the same as the stave + // the stave number can be changed in the compact XML. + Rotation rot(M_PI/2. - M_PI/numSides,0,0); + + // Create Hcal Barrel volume with material Steel235 + IntersectionSolid barrelModuleSolid(tube_shaper,polyhedra_shaper,rot); + + Volume envelopeVol(det_name+"_envelope",barrelModuleSolid,Steel235); + + // Set envelope volume attributes. + envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); + + + // ========= Create Hcal Barrel Chmaber (i.e. Layers) ======================= + // It will be the sub volume for placing the slices. + // Itself will be placed into the Hcal Barrel envelope. + // ========================================================================== + + // create Layer (air) and place the slices (Polystyrene,Cu,FR4,air) into it. + // place the Layer into the HcalBarrel envelope (Steel235). + double innerAngle = 2.*M_PI/numSides; + double halfInnerAngle = innerAngle/2.; + double tan_inner = std::tan(halfInnerAngle) * 2.; + double cos_inner = std::cos(halfInnerAngle); + + double innerFaceLen = (Hcal_inner_radius + Hcal_radiator_thickness) * tan_inner; + + double layerOuterAngle = (M_PI-innerAngle)/2.; + double layerInnerAngle = (M_PI/2. - layerOuterAngle); + + // First Hcal Barrel Chamber position, start after first radiator + double layer_pos_x = Hcal_inner_radius + Hcal_radiator_thickness; + double layer_dim_y = innerFaceLen/2. - gap/2.; + + // Create Hcal Barrel Chamber without radiator + // Place into the Hcal Barrel envelope, after each radiator + int layer_num = 0; + for(xml_coll_t c(x_det,_U(layer)); c; ++c) { + xml_comp_t x_layer = c; + int repeat = x_layer.repeat(); // Get number of layers. + const Layer* lay = layering.layer(layer_num); // Get the layer from the layering engine. + // Loop over repeats for this layer. + for (int j = 0; j < repeat; j++) { + string layer_name = det_name+_toString(layer_num,"_layer%d"); + double layer_thickness = lay->thickness(); + DetElement layer(layer_name,_toString(layer_num,"layer%d"),x_det.id()); + + // Layer position in Z within the stave. + layer_pos_x += layer_thickness/2.; + // Active Layer box & volume + double active_layer_dim_x = layer_thickness/2.; + double active_layer_dim_y = layer_dim_y; + double active_layer_dim_z = (detZ-Hcal_lateral_structure_thickness)/2.; + + // The same Layer will be filled with skices, + // and placed into the HcalBarrel 16 times: 8 Staves * 2 modules: TODO 32 times. + Volume layer_vol(layer_name, Box(active_layer_dim_x,active_layer_dim_y,active_layer_dim_z), air); + + + // ========= Create sublayer slices ========================================= + // Create and place the slices into Layer + // ========================================================================== + + // Create the slices (sublayers) within the Hcal Barrel Chamber. + double slice_pos_x = -(layer_thickness/2.); + int slice_number = 0; + for(xml_coll_t k(x_layer,_U(slice)); k; ++k) { + xml_comp_t x_slice = k; + string slice_name = layer_name + _toString(slice_number,"_slice%d"); + double slice_thickness = x_slice.thickness(); + Material slice_material = lcdd.material(x_slice.materialStr()); + DetElement slice(layer,_toString(slice_number,"slice%d"),x_det.id()); + + slice_pos_x += slice_thickness/2.; + + // Slice volume & box + double slice_dim_y = active_layer_dim_y - Hcal_layer_air_gap ; + Volume slice_vol(slice_name,Box(slice_thickness/2.,slice_dim_y,active_layer_dim_z),slice_material); + + if ( x_slice.isSensitive() ) { + sens.setType("calorimeter"); + slice_vol.setSensitiveDetector(sens); + } + // Set region, limitset, and vis. + slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + // slice PlacedVolume + PlacedVolume slice_phv = layer_vol.placeVolume(slice_vol,Position(slice_pos_x,0.,0.)); + slice_phv.addPhysVolID("slice",slice_number); + + slice.setPlacement(slice_phv); + // Increment x position for next slice. + slice_pos_x += slice_thickness/2.; + // Increment slice number. + ++slice_number; + } + // Set region, limitset, and vis. + layer_vol.setAttributes(lcdd,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr()); + + + // ========= Place the Layer (i.e. Chamber) ================================= + // Place the Layer into the Hcal Barrel envelope. + // with the right position and rotation. + // Registry the IDs (layer, stave, module). + // ========================================================================== + + // Acording to the number of staves and modules, + // Place the same Layer into the HcalBarrel envelope + // with the right position and rotation. + for(int stave_num = 0; stave_num < numSides; stave_num++){ + double ds = double(stave_num); + double delte_phi = M_PI/2. - innerAngle*ds; + string stave_layer = _toString(stave_num,"stave%d_layer"); + // Layer physical volume. + double layer_pos_z = active_layer_dim_z + Hcal_lateral_structure_thickness; + for(int module_num = 0; module_num < 2; module_num++) + { + layer_pos_z = (module_num==0)?layer_pos_z:-layer_pos_z; + PlacedVolume layer_phv = envelopeVol.placeVolume(layer_vol, + Transform3D(RotationZ(delte_phi), + Translation3D(layer_pos_x*std::cos(delte_phi), + layer_pos_x*std::sin(delte_phi), + layer_pos_z))); + + // registry the ID of Layer, stave and module + layer_phv.addPhysVolID("layer",layer_num); + layer_phv.addPhysVolID("stave",stave_num); + layer_phv.addPhysVolID("module",module_num); + // then setPlacement for it. + layer.setPlacement(layer_phv); + + } + } + + + // ===== Prepare for next layer (i.e. next Chamber) ========================= + // Prepare the chamber placement position and the chamber dimension + // ========================================================================== + + // Prepare for next Layer + // Increment the layer_pos_x, and calculate the next layer_dim_y + // Place Hcal Barrel Chamber after each radiator + layer_pos_x += layer_thickness/2.; + layer_pos_x += Hcal_radiator_thickness; + // Increment the layer X dimension. + if((layer_pos_x + layer_thickness ) < (Hcal_outer_radius - Hcal_back_plate_thickness)* cos_inner) + layer_dim_y += (layer_thickness + Hcal_radiator_thickness) * std::tan(layerInnerAngle); + else + layer_dim_y = std::sqrt((Hcal_outer_radius-Hcal_radiator_thickness) + *(Hcal_outer_radius-Hcal_radiator_thickness) + - layer_pos_x*layer_pos_x) - gap/2.; + // Increment the layer number. + ++layer_num; + } + } + + + // =========== Place Hcal Barrel envelope =================================== + // Finally place the Hcal Barrel envelope into the world volume. + // Registry the system ID. + // ========================================================================== + + // Place Hcal Barrel volume into the world volume + PlacedVolume env_phv = motherVol.placeVolume(envelopeVol,Transform3D( RotationZ(Hcal_Barrel_rotation) )); + + // registry the system id + env_phv.addPhysVolID("system", sdet.id()); + sdet.setPlacement(env_phv); + return sdet; +} + + + + +DECLARE_DETELEMENT(AhcalBarrelCalorimeter, create_detector); diff --git a/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp b/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp new file mode 100644 index 000000000..0610f4241 --- /dev/null +++ b/examples/ILDExDet/src/AhcalEndcapCalorimeter_geo.cpp @@ -0,0 +1,286 @@ +//==================================================================== +// AIDA Detector description implementation +// for LDC AHCAL Endcap +//-------------------------------------------------------------------- +// +// Author : S.Lu +// +// Basic idea: +// 1. Create the Hcal Endcap module envelope (16 modules). +// Note: with default material Steel235. +// +// 2. Create the Hcal Endcap Chamber(i.e. Layer) for each module. +// Create the Layer with slices (Polystyrene,Cu,FR4,air). +// Place each slice into the chamber with the right position, +// And registry the IDs for slice +// +// 3. Place the same Layer into the endcap module envelope. +// It will be repeated repeat 48 times. +// And registry the IDs for layer, and endcapID. +// +// 4. Place the endcap module into the world volume, +// with the right position and rotation. +// And registry the IDs for stave,module and endcapID. +// +// 5. Customer material FR4 and Steel235 defined in materials.xml +// +//==================================================================== +#include "DD4hep/DetFactoryHelper.h" +#include "XML/Layering.h" + +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +static Ref_t create_detector(LCDD& lcdd, xml_h element, SensitiveDetector sens) { + xml_det_t x_det = element; + Layering layering(x_det); + xml_dim_t dim = x_det.dimensions(); + string det_name = x_det.nameStr(); + string det_type = x_det.typeStr(); + Material air = lcdd.air(); + Material Steel235 = lcdd.material(x_det.materialStr()); + double gap = xml_dim_t(x_det).gap(); + // int numSides = dim.numsides(); + double detZ = dim.z(); // Hcal endcap modules z start + double Hcal_inner_radius = dim.rmin(); // Endcap cernter box hole half length: 362.0 + + // The way to reaad constant from XML/LCDD file. + //double Hcal_outer_radius = lcdd.constant<double>("Hcal_outer_radius"); // 3395.46 mm + double Hcal_radiator_thickness = lcdd.constant<double>("Hcal_radiator_thickness"); // 20.0mm + //double Hcal_chamber_thickness = lcdd.constant<double>("Hcal_chamber_thickness"); // 6.5mm + //int Hcal_endcap_layers = lcdd.constant<int>("Hcal_endcap_layers"); // 48 + // ======== Note============================================================ + // In the XML/LCDD file, make sure the above constant parameters + // are agree with the layering/slices in the detector Ahcal. + // ========================================================================== + + + double Hcal_lateral_structure_thickness = lcdd.constant<double>("Hcal_lateral_structure_thickness"); + double Hcal_layer_air_gap = lcdd.constant<double>("Hcal_layer_air_gap"); + double Hcal_endcap_zmin = lcdd.constant<double>("Hcal_endcap_zmin"); + //double Hcal_back_plate_thickness = lcdd.constant<double>("Hcal_back_plate_thickness"); + + // ========= Create Hcal Endcap Modules envelope ============================ + // Read the Endcap Modules dimensions, + // Which defined in the compact XML files. + // ========================================================================== + double dim_x[16]; + double dim_y[16]; + double dim_z[16]; + double pos_x[16]; + double pos_y[16]; + double pos_z[16]; + + int endcapID =0; + for(xml_coll_t c(x_det.child(_U(dimensions)),_U(dimensions)); c; ++c) { + + xml_comp_t l(c); + + dim_x[endcapID] = l.attr<double>(_Unicode(dim_x)); + dim_y[endcapID] = l.attr<double>(_Unicode(dim_y)); + dim_z[endcapID] = l.attr<double>(_Unicode(dim_z)); + pos_y[endcapID] = l.attr<double>(_Unicode(y_offset)); + //std::cout<<" dim_z["<<endcapID<<"]: "<< dim_z[endcapID]/2.0<<std::endl; + endcapID++; + } + + + DetElement sdet(det_name,x_det.id()); + Volume motherVol = lcdd.pickMotherVolume(sdet); + + // ========= Create Hcal Endcap Modules envelope ============================ + // They will be the volume for palcing the Hcal Chamber(i.e. Layers). + // Themself will be placed into the world volume. + // ========================================================================== + + // build 16 Endcap Modules + for(int ecID=0; ecID<endcapID; ecID++) + { + // Hcal Endcap module shape + double box_half_x= dim_x[ecID]/2.0; // module width, all are same + double box_half_y= dim_y[ecID]/2.0; // total thickness, all are same + double box_half_z= dim_z[ecID]/2.0; // module length, changed, + + double x_offset = box_half_x*endcapID-box_half_x*ecID*2.0-box_half_x; + double y_offset = pos_y[ecID]; + + Box EndcapModule(box_half_x,box_half_y,box_half_z); + + // define the name of each endcap Module + string envelopeVol_name = det_name+_toString(ecID,"_EndcapModule%d"); + + Volume envelopeVol(envelopeVol_name,EndcapModule,Steel235); + + // Set envelope volume attributes. + envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); + + + // ========= Create Hcal Chamber (i.e. Layers) ============================== + // It will be the sub volume for placing the slices. + // Itself will be placed into the Hcal Endcap modules envelope. + // ========================================================================== + + // create Layer (air) and place the slices (Polystyrene,Cu,FR4,air) into it. + // place the Layer into the Hcal Endcap Modules envelope (Steel235). + + // First Hcal Chamber position, start after first radiator + double layer_pos_y = - box_half_y + Hcal_radiator_thickness; + + // Create Hcal Endcap Chamber without radiator + // Place into the Hcal Encap module envelope, after each radiator + int layer_num = 0; + for(xml_coll_t c(x_det,_U(layer)); c; ++c) { + xml_comp_t x_layer = c; + int repeat = x_layer.repeat(); // Get number of layers. + const Layer* lay = layering.layer(layer_num); // Get the layer from the layering engine. + + string layer_name = envelopeVol_name+"_layer"; + double layer_thickness = lay->thickness(); + DetElement layer(layer_name,layer_name,x_det.id()); + + // Active Layer box & volume + double active_layer_dim_x = box_half_x - Hcal_lateral_structure_thickness; + double active_layer_dim_y = layer_thickness/2.0; + double active_layer_dim_z = box_half_z; + + // Build chamber including air gap + // The Layer will be filled with slices, + Volume layer_vol(layer_name, Box((active_layer_dim_x + Hcal_layer_air_gap), + active_layer_dim_y,active_layer_dim_z), air); + + + // ========= Create sublayer slices ========================================= + // Create and place the slices into Layer + // ========================================================================== + + // Create the slices (sublayers) within the Hcal Chamber. + double slice_pos_y = -(layer_thickness / 2.0); + int slice_number = 0; + for(xml_coll_t k(x_layer,_U(slice)); k; ++k) { + xml_comp_t x_slice = k; + string slice_name = layer_name + _toString(slice_number,"_slice%d"); + double slice_thickness = x_slice.thickness(); + Material slice_material = lcdd.material(x_slice.materialStr()); + DetElement slice(layer,_toString(slice_number,"slice%d"),x_det.id()); + + slice_pos_y += slice_thickness / 2.0; + + // Slice volume & box + Volume slice_vol(slice_name,Box(active_layer_dim_x,slice_thickness/2.0,active_layer_dim_z),slice_material); + + if ( x_slice.isSensitive() ) { + sens.setType("calorimeter"); + slice_vol.setSensitiveDetector(sens); + } + // Set region, limitset, and vis. + slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + // slice PlacedVolume + PlacedVolume slice_phv = layer_vol.placeVolume(slice_vol,Position(0,slice_pos_y,0)); + slice_phv.addPhysVolID("slice",slice_number); + + slice.setPlacement(slice_phv); + // Increment Z position for next slice. + slice_pos_y += slice_thickness / 2.0; + // Increment slice number. + ++slice_number; + } + // Set region, limitset, and vis. + layer_vol.setAttributes(lcdd,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr()); + + + // ========= Place the Layer (i.e. Chamber) ================================= + // Place the Layer into the Hcal Endcap module envelope. + // with the right position and rotation. + // Registry the IDs (layer, stave, module). + // Place the same layer 48 times into Endcap module + // ========================================================================== + + for (int j = 0; j < repeat; j++) { + + // Layer position in y within the Endcap Modules. + layer_pos_y += layer_thickness / 2.0; + + PlacedVolume layer_phv = envelopeVol.placeVolume(layer_vol, + Position(0,layer_pos_y,0)); + // registry the ID of Layer, stave and module + layer_phv.addPhysVolID("layer",layer_num); + layer_phv.addPhysVolID("endcapID",ecID); + // then setPlacement for it. + layer.setPlacement(layer_phv); + + + // ===== Prepare for next layer (i.e. next Chamber) ========================= + // Prepare the chamber placement position and the chamber dimension + // ========================================================================== + + // Increment the layer_pos_y + // Place Hcal Chamber after each radiator + layer_pos_y += layer_thickness / 2.0; + layer_pos_y += Hcal_radiator_thickness; + ++layer_num; + } + + + } + + + // =========== Place Hcal Endcap envelope =================================== + // Finally place the Hcal Endcap envelope into the world volume. + // Registry the stave(up/down), module(left/right) and endcapID. + // ========================================================================== + + // Acording to the number of staves and modules, + // Place the same Hcal Endcap module volume into the world volume + // with the right position and rotation. + for(int stave_num=0;stave_num<2;stave_num++){ + + double EndcapModule_pos_x; + double EndcapModule_pos_y; + double EndcapModule_pos_z = Hcal_endcap_zmin + box_half_y; + double rot_EM = 0; + + switch (stave_num) + { + case 0 : + EndcapModule_pos_x = x_offset; + EndcapModule_pos_y = y_offset; + break; + case 1 : + EndcapModule_pos_x = -x_offset; + EndcapModule_pos_y = -y_offset; + break; + } + + for(int module_num=0;module_num<2;module_num++) { + + rot_EM = (module_num==0)?(M_PI/2.0):(-M_PI/2.0); + + EndcapModule_pos_z = (module_num==0)?EndcapModule_pos_z:-EndcapModule_pos_z; + + PlacedVolume env_phv = motherVol.placeVolume(envelopeVol, + Transform3D(RotationX(rot_EM), + Translation3D(EndcapModule_pos_x, + EndcapModule_pos_y, + EndcapModule_pos_z))); + + env_phv.addPhysVolID("stave",stave_num); // y: up /down + env_phv.addPhysVolID("module",module_num); // z: +/- + env_phv.addPhysVolID("system",x_det.id()); + sdet.setPlacement(env_phv); + + } + + } + + } + + + + return sdet; +} + + + + +DECLARE_DETELEMENT(AhcalEndcapCalorimeter, create_detector); diff --git a/examples/ILDExDet/src/ILDExSIT_geo.cpp b/examples/ILDExDet/src/ILDExSIT_geo.cpp new file mode 100644 index 000000000..29bb045f3 --- /dev/null +++ b/examples/ILDExDet/src/ILDExSIT_geo.cpp @@ -0,0 +1,78 @@ +// $Id: ILDExSIT_geo.cpp 687 2013-08-09 12:56:00Z gaede $ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== + +#include "DD4hep/DetFactoryHelper.h" + + +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { + xml_det_t x_det = e; + string name = x_det.nameStr(); + DetElement sit(name,x_det.id()); + Assembly assembly( name + "assembly" ) ; + PlacedVolume pv; + + + for(xml_coll_t c(e,_U(layer)); c; ++c) { + + + xml_comp_t x_layer (c); + xml_comp_t x_support (x_layer.child(_U(support))); + xml_comp_t x_ladder (x_layer.child(_U(ladder))); + int layer_id = x_layer.id(); + int nLadders = x_ladder.number(); + string layername = name+_toString(layer_id,"_layer%d"); + double dphi = 2.*M_PI/double(nLadders); + double zhalf = x_ladder.zhalf(); + double sens_radius= x_ladder.radius(); + double sens_thick = x_ladder.thickness(); + double supp_thick = x_support.thickness(); + double width = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.); + Box ladderbox ((sens_thick+supp_thick)/2.,width/2.,zhalf); + Volume laddervol (layername+"_ladder",ladderbox,lcdd.material(x_ladder.materialStr())); + Box sensbox (sens_thick/2.,width/2.,zhalf); + Volume sensvol (layername+"_sens",sensbox,lcdd.material(x_ladder.materialStr())); + Box suppbox (supp_thick/2.,width/2.,zhalf); + Volume suppvol (layername+"_supp",suppbox,lcdd.material(x_support.materialStr())); + Position senspos (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0); + Position supppos (-(sens_thick+supp_thick)/2.+sens_thick+supp_thick/2.,0,0); + + sens.setType("tracker"); + sensvol.setSensitiveDetector(sens); + sensvol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_layer.visStr()); + + pv = laddervol.placeVolume(sensvol,senspos) ; + laddervol.placeVolume(suppvol,supppos); + sit.setVisAttributes(lcdd, x_det.visStr(),laddervol); + + for(int j=0; j<nLadders; ++j) { + + string laddername = layername + _toString(j,"_ladder%d"); + double radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.); + Position pos(radius*cos(j*dphi),radius*sin(j*dphi),0.); + + pv = assembly.placeVolume(laddervol,Transform3D(RotationZ(j*dphi),pos)); + + // this will result int the correct cellID to be set... + pv.addPhysVolID("layer",layer_id).addPhysVolID("module",j).addPhysVolID("sensor",0 ) ; + + } + } + pv = lcdd.pickMotherVolume(sit).placeVolume(assembly) ; + + pv.addPhysVolID("system", x_det.id()).addPhysVolID("side",0 ) ; + + sit.setPlacement( pv ); + return sit; +} + +DECLARE_DETELEMENT(ILDExSIT,create_element); diff --git a/examples/ILDExDet/src/ILDExTPC_geo.cpp b/examples/ILDExDet/src/ILDExTPC_geo.cpp new file mode 100644 index 000000000..42ddc8560 --- /dev/null +++ b/examples/ILDExDet/src/ILDExTPC_geo.cpp @@ -0,0 +1,172 @@ +// $Id: ILDExTPC_geo.cpp 680 2013-08-06 15:07:53Z gaede $ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : A.Muennich +// +//==================================================================== + +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Detector.h" +//#include "TPCModuleData.h" +#include "TPCData.h" +//#include "TPCModule.h" +//#include "FixedPadAngleDiskLayout.h" + +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { + xml_det_t x_det = e; + xml_comp_t x_tube (x_det.child(_U(tubs))); + string name = x_det.nameStr(); + Material mat (lcdd.material(x_det.materialStr())); + //if data is needed do this + TPCData* tpcData = new TPCData(); + DetElement tpc(tpcData, name, x_det.typeStr()); + tpcData->id = x_det.id(); + //else do this + //DetElement tpc (name,x_det.typeStr(),x_det.id()); + Tube tpc_tub(x_tube.rmin(),x_tube.rmax(),x_tube.zhalf()); + Volume tpc_vol(name+"_envelope_volume", tpc_tub, mat); + Readout readout(sens.readout()); + + for(xml_coll_t c(e,_U(detector)); c; ++c) { + + xml_comp_t px_det (c); + xml_comp_t px_tube (px_det.child(_U(tubs))); + xml_dim_t px_pos (px_det.child(_U(position))); + xml_dim_t px_rot (px_det.child(_U(rotation))); + xml_comp_t px_mat (px_det.child(_U(material))); + string part_nam(px_det.nameStr()); + + Material part_mat(lcdd.material(px_mat.nameStr())); + DetElement part_det(part_nam,px_det.typeStr(),px_det.id()); + + Tube part_tub(px_tube.rmin(),px_tube.rmax(),px_tube.zhalf()); + Volume part_vol(part_nam,part_tub,part_mat); + + Position part_pos(px_pos.x(),px_pos.y(),px_pos.z()); + Rotation part_rot(px_rot.x(),px_rot.y(),px_rot.z()); + bool reflect = px_det.reflect(); + + sens.setType("tracker"); + + part_vol.setVisAttributes(lcdd,px_det.visStr()); + //cache the important volumes in TPCData for later use without having to know their name + switch(part_det.id()) + { + case 2: + tpcData->innerWall=part_det; + break; + case 3: + tpcData->outerWall=part_det; + break; + case 4: + { + xml_comp_t px_lay(px_det.child(_U(layer))); + int nTPClayer( px_lay.attr<int>(_U(number)) ); + + double r0 = px_tube.rmin() +1.e-3 ; + double r1 = px_tube.rmax() -1e-3 ; + double zh = px_tube.zhalf() - 1e-3 ; + double dR = ( r1 - r0 ) / ( 2.* nTPClayer ) ; + + + for(int i=0 ; i < nTPClayer ; ++i){ + + Tube gas_tubL( r0 + (2*i) * dR , r0 + (2*i+1) * dR , zh ); + Volume gas_volL( _toString( i, "tpc_row_lower_%03d") , gas_tubL, part_mat); + part_vol.placeVolume( gas_volL, Rotation(0,0,0) ); + + Tube gas_tubU( r0 + (2*i+1) * dR , r0 + (2*i+2) * dR , zh ); + Volume gas_volU( _toString( i, "tpc_row_upper_%03d") , gas_tubU, part_mat); + + gas_volU.setSensitiveDetector( sens ); + part_vol.placeVolume( gas_volU, Rotation(0,0,0) ).addPhysVolID("layer",i) ; + } + + + tpcData->gasVolume=part_det; + break; + } + case 5: + tpcData->cathode=part_det; + break; + } + //Endplate + if(part_det.id()== 0){ + tpcData->endplate=part_det; + //modules + int mdcount=0; + for(xml_coll_t m(px_det,_U(modules)); m; ++m) { + xml_comp_t modules (m); + string m_name = modules.nameStr(); + for(xml_coll_t r(modules,_U(row)); r; ++r) { + xml_comp_t row(r); + int nmodules = row.nModules(); + int rowID=row.RowID(); + //shape of module + double pitch=row.rowPitch(); + double rmin=px_tube.rmin()+pitch/2+rowID*row.moduleHeight()+rowID*pitch/2; + double rmax=rmin+row.moduleHeight(); + double DeltaPhi=(2*M_PI-nmodules*(row.modulePitch()/(rmin+(rmax-rmin)/2)))/nmodules; + double zhalf=px_tube.zhalf(); + string mr_nam=m_name+_toString(rowID,"_Row%d"); + Volume mr_vol(mr_nam,Tube(rmin,rmax,zhalf,DeltaPhi),part_mat); + Material mr_mat(lcdd.material(px_mat.nameStr())); + Readout xml_pads(lcdd.readout(row.padType())); + + //placing modules + for(int md=0;md<nmodules;md++){ + string m_nam=m_name+_toString(rowID,"_Row%d")+_toString(md,"_M%d"); + + DetElement module(part_det,m_nam,mdcount); + mdcount++; + double rotz=md*2*M_PI/nmodules+row.modulePitch()/(rmin+(rmax-rmin))/2; + PlacedVolume m_phv = part_vol.placeVolume(mr_vol,Rotation(rotz,0,0)); + m_phv.addPhysVolID("module",md); + module.setPlacement(m_phv); + // Readout and placement must be present before adding extension, + // since they are aquired internally for optimisation reasons. (MF) + // module.addExtension<PadLayout>(new FixedPadAngleDiskLayout(module,readout)); + + }//modules + }//rows + }//module groups + }//endplate + + PlacedVolume part_phv = tpc_vol.placeVolume(part_vol,Transform3D(Rotation3D(part_rot),part_pos)); + //part_phv.addPhysVolID(part_nam,px_det.id()); + part_phv.addPhysVolID("side",0); + part_det.setPlacement(part_phv); + tpc.add(part_det); + //now reflect it + if(reflect){ + Position r_pos(px_pos.x(),px_pos.y(),-px_pos.z()); + //Attention: rotation is given in euler angles + Rotation r_rot(0,M_PI,M_PI); + // Volume part_vol_r(lcdd,part_nam+"_negativ",part_tub,part_mat); + PlacedVolume part_phv2 = tpc_vol.placeVolume(part_vol,Transform3D(Rotation3D(r_rot),r_pos)); + //part_phv2.addPhysVolID(part_nam+"_negativ",px_det.id()+1); + part_phv2.addPhysVolID("side",1); + // needs a copy function for DetElement + // DetElement rdet(lcdd,part_nam+"_negativ",px_det.typeStr(),px_det.id()+1); + DetElement rdet = part_det.clone(part_nam+"_negativ",px_det.id()+1); + rdet.setPlacement(part_phv2); + tpcData->endplate2 = rdet; + tpc.add(rdet); + } + }//subdetectors + tpc_vol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); + + PlacedVolume phv = lcdd.pickMotherVolume(tpc).placeVolume(tpc_vol); + phv.addPhysVolID("system",x_det.id()); + tpc.setPlacement(phv); + return tpc; +} + +//first argument is the type from the xml file +DECLARE_DETELEMENT(ILDExTPC,create_element) diff --git a/examples/ILDExDet/src/ILDExVXD_geo.cpp b/examples/ILDExDet/src/ILDExVXD_geo.cpp new file mode 100644 index 000000000..e324e351a --- /dev/null +++ b/examples/ILDExDet/src/ILDExVXD_geo.cpp @@ -0,0 +1,147 @@ +// $Id: ILDExVXD_geo.cpp 673 2013-08-05 10:01:33Z gaede $ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== +#include "DD4hep/DetFactoryHelper.h" +#include "VXDData.h" + + +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens) { + DetElement vxd; + xml_det_t x_det = e; + string name = x_det.nameStr(); + + // Assembly assembly(name+"_assembly"); + + // replace assembly with cylinder of air: + xml_comp_t x_tube (x_det.child(_U(tubs))); + Tube envelope_cylinder(x_tube.rmin(),x_tube.rmax(),x_tube.zhalf()); + Volume assembly ("vxd_envelope_cyl", envelope_cylinder ,lcdd.air()); + + PlacedVolume pv; + + VXDData* vxd_data = new VXDData(); + vxd.assign(vxd_data,name,x_det.typeStr()); + vxd_data->id = x_det.id(); + + + for(xml_coll_t c(e,_U(layer)); c; ++c) { + + xml_comp_t x_layer (c); + + xml_comp_t x_support (x_layer.child(_U(support))); + xml_comp_t x_ladder (x_layer.child(_U(ladder))); + + int layer_id = x_layer.id(); + int nLadders = x_ladder.number(); + string layername = name+_toString(layer_id,"_layer%d"); + double dphi = 2.*M_PI/double(nLadders); + double zhalf = x_ladder.zhalf(); + double offset = x_ladder.offset(); + double sens_radius= x_ladder.radius(); + double sens_thick = x_ladder.thickness(); + double supp_thick = x_support.thickness(); + double radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.); + double phi0 = x_layer.phi0() ; + + // double width = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.); + double width = x_ladder.width(); + + Box ladderbox ( (sens_thick+supp_thick)/2., width/2., zhalf ); + + Volume laddervol (layername+"_ladder",ladderbox,lcdd.air()); + + Material sensmat = lcdd.material(x_ladder.materialStr()); + Box sensbox (sens_thick/2., width/2., zhalf); + Volume sensvol (layername+"_sens",sensbox,sensmat); + + Material suppmat = lcdd.material(x_support.materialStr()); + Box suppbox (supp_thick/2.,width/2.,zhalf); + Volume suppvol (layername+"_supp",suppbox,suppmat); + + //Position senspos (0,0,0); + //Position supppos (0,0,0); + Position senspos (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0); + Position supppos (-(sens_thick+supp_thick)/2.+sens_thick+supp_thick/2.,0,0); + + sens.setType("tracker"); + sensvol.setSensitiveDetector(sens); + sensvol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_layer.visStr()); + + laddervol.placeVolume(sensvol,senspos); + laddervol.placeVolume(suppvol,supppos); + + VXDData::Layer layer; + // Add ladder layer + layer.NLadders = nLadders ; + layer.internalPhi0 = phi0 ; //M_PI/2. - dphi; // phi0 given wrt x-axis - internalPhi0 is wrt yaxis , negative orientation + layer.Distance = 0.0; // What is this really (?) : ladderDistance; + layer.Offset = offset; // offset given in direction of positive rotation (increasing phi) + layer.Thickness = supp_thick; + layer.Length = suppbox.x(); + layer.Width = suppbox.y(); + layer.RadLength = suppmat->GetMaterial()->GetRadLen(); + vxd_data->_lVec.push_back(layer); + + // Now add sensitive ladder layer + layer.NLadders = nLadders ; + layer.internalPhi0 = phi0 ; //M_PI/2. - dphi; // phi0 given wrt x-axis - internalPhi0 is wrt yaxis , negative orientation + layer.Distance = 0.0; // What is this really (?) : sensitiveDistance ; + layer.Offset = offset; // offset given in direction of positive rotation (increasing phi) + layer.Thickness = sens_thick; + layer.Length = sensbox.x(); + layer.Width = sensbox.y(); + layer.RadLength = sensmat->GetMaterial()->GetRadLen(); + vxd_data->_sVec.push_back(layer); + + + // Assembly layer_assembly( name + _toString( layer_id,"layer_assembly_%d" ) ) ; + // PlacedVolume layer_physvol = assembly.placeVolume( layer_assembly,IdentityPos() ) ; + // layer_physvol.addPhysVolID("layer", layer_id ); + + for(int j=0; j<nLadders; ++j) { + + double dj = double(j); + double phi = phi0 + dj*dphi ; + + string laddername = layername + _toString(j,"_ladder%d"); + + // Position pos(radius*cos(dj*dphi) - offset*sin(dj*dphi), + // radius*sin(dj*dphi) - offset*cos(dj*dphi),0.); + + double lthick = sens_thick + supp_thick ; + + Position pos( (radius + lthick/2.)*cos(phi) - offset * sin( phi ) , + (radius + lthick/2.)*sin(phi) + offset * cos( phi ) , + 0. ) ; + + Rotation rot( 0, 0 , phi ) ; + + + pv = assembly.placeVolume( laddervol,Transform3D(RotationZ(phi),pos)); + pv.addPhysVolID("layer", layer_id ).addPhysVolID( "module" , j ).addPhysVolID("sensor", 0 ) ; + + //pv = assembly.placeVolume( sensvol, pos, rot ) ; + + } + vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol); + } + Volume mother = lcdd.pickMotherVolume(vxd) ; + + pv = mother.placeVolume(assembly); + + pv.addPhysVolID( "system", x_det.id() ).addPhysVolID("side",0 ) ; + + vxd.setPlacement(pv); + return vxd; +} + +DECLARE_DETELEMENT(ILDExVXD,create_element); -- GitLab