diff --git a/GeoModelTools/CMakeLists.txt b/GeoModelTools/CMakeLists.txt index 4b37b9c10258c341ccbf4fffda443456d8b0db3f..3c29cb7ad5912aa19e24997da70da49269d0bd1c 100644 --- a/GeoModelTools/CMakeLists.txt +++ b/GeoModelTools/CMakeLists.txt @@ -48,6 +48,7 @@ endif() include( GNUInstallDirs ) # Set up the build of the libraries of the project. +add_subdirectory( GeoModelXML ) add_subdirectory( GeoModelXMLParser ) add_subdirectory( GeoModelJSONParser ) add_subdirectory( ExpressionEvaluator ) diff --git a/GeoModelTools/GeoModelXML/CMakeLists.txt b/GeoModelTools/GeoModelXML/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c125601ae0f93a1a6b1bdb1276131b2b17718278 --- /dev/null +++ b/GeoModelTools/GeoModelXML/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + +# --- Add sub-projects --- +add_subdirectory(GeoModelXml) +add_subdirectory(GMXPlugin) + diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt b/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b3b922ecc2c5ea7eab9f5269cc76c9364559ce73 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt @@ -0,0 +1,44 @@ +# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + +# Find the header and source files. +file( GLOB SOURCES src/*.cxx ) + +# Create the library. +add_library( GMXPlugin SHARED ${SOURCES} ) +target_link_libraries( GMXPlugin PUBLIC GeoModelCore::GeoModelKernel XercesC::XercesC GeoModelXml ) +target_include_directories( GMXPlugin PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<INSTALL_INTERFACE:include> ) +source_group( "GMXPlugin" FILES ${HEADERS} ) +source_group( "src" FILES ${SOURCES} ) +set_target_properties( GMXPlugin PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} ) + +# Set up an alias with the same name that you would get by "finding" a pre-built +# version of the library. +add_library( GeoModelTools::GMXPlugin ALIAS GMXPlugin ) + +# Install the library. +install(TARGETS GMXPlugin + EXPORT ${PROJECT_NAME}-export + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT Runtime + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Runtime + NAMELINK_COMPONENT Development # Requires CMake 3.12 + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Development + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GMXPlugin + COMPONENT Development + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + +install( FILES ${HEADERS} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GMXPlugin + COMPONENT Development ) + +# set ( PLUGIN_NAME "GMXPlugin.so" ) +# ADD_CUSTOM_TARGET( GMX_plugin ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ${GMXPlugin} ${PLUGIN_NAME} ) + + diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx b/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx new file mode 100644 index 0000000000000000000000000000000000000000..05f18b33194aafaad110a9fe61b00cd436e727b2 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE geomodel SYSTEM "geomodel.dtd" []> + +<geomodel name="Hello World" version="1.0" + xmlns="http://www.nikhef.nl/%7Er29/gmx"> + + <materials> + <element name="Carbon" shortname="C" Z="6" A="12.011"/> + <material name="Diamond" density="3.515"> + <elementref fraction="1.0" ref="Carbon"/> + </material> + </materials> + + <shapes> + <tube name="ShapeOneMeterCylinder" rmin="0.2" rmax="0.5" zhalflength="0.5"/> + </shapes> + + <addbranch> + <logvol name="DiamondCylinder" shape="ShapeOneMeterCylinder" material="Diamond"/> + </addbranch> + +</geomodel> diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml b/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml new file mode 100644 index 0000000000000000000000000000000000000000..21aade7c2125f0d4f897135ee64a32676066269c --- /dev/null +++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml @@ -0,0 +1,7279 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- If you want to run totally locally, use: +<!DOCTYPE geomodel SYSTEM "/user/r29/localdisk/athena/apr/InnerDetector/InDetDetDescr/GmxLayouts/data/ITk/Strip/LTF/geomodel.dtd" [ +--> +<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [ +<!ENTITY materials SYSTEM "Materials.gmx"> +<!ENTITY commondefines SYSTEM "CommonDefines.gmx"> +<!ENTITY itk SYSTEM "ITk.gmx"> +<!ENTITY sensordefines SYSTEM "SensorDefines.gmx"> +<!ENTITY sensors SYSTEM "Sensors.gmx"> +<!ENTITY chips SYSTEM "Chips.gmx"> +<!ENTITY dcdc SYSTEM "DCDC.gmx"> +<!ENTITY stave SYSTEM "Stave.gmx"> +<!ENTITY petalplank SYSTEM "PetalPlank.gmx"> +<!ENTITY barrelhybrids SYSTEM "BarrelHybrids.gmx"> +<!ENTITY barrel SYSTEM "Barrel.gmx"> +<!ENTITY barreldefines SYSTEM "BarrelDefines.gmx"> +<!ENTITY barrelsupports SYSTEM "BarrelSupports.gmx"> +<!ENTITY eos SYSTEM "EOS.gmx"> +<!ENTITY pp1 SYSTEM "PP1.gmx"> +<!ENTITY endcaps SYSTEM "Endcaps.gmx"> +<!ENTITY endcaphybrids SYSTEM "EndcapHybrids.gmx"> +<!ENTITY endcapdefines SYSTEM "EndcapDefines.gmx"> +<!ENTITY endcapsupports SYSTEM "EndcapSupports.gmx"> +<!ENTITY services SYSTEM "LTFStripServices.gmx"> +]> +<geomodel xmlns="http://www.nikhef.nl/%7Er29/gmx" name="LTF Strip layout" version="1.1"> + +<!-- + Materials description file for use in gmx to build up GeoModel materials. + Please report errors, updates, improvements, requests for new materials to + nigel.hessey@cern.ch + + Densities are in g/cm3 or kg/l or ton/m3; they are converted internally into g/mm3. + Fractions are by weight +--> + + <materials> + + <!-- First 32 elements from Particle Physics Booklet 2002 or http://www.webelements.com/ --> + <element name="Hydrogen" shortname="H" Z="1" A="1.00794"/> + <element name="Deuterium" shortname="D" Z="1" A="2.0140"/> + <element name="Helium" shortname="He" Z="2" A="4.002602"/> + <element name="Lithium" shortname="Li" Z="3" A="6.941"/> + <element name="Berylium" shortname="Be" Z="4" A="9.012182"/> + <element name="Boron" shortname="B" Z="5" A="10.811"/> + <element name="Carbon" shortname="C" Z="6" A="12.011"/> + <element name="Nitrogen" shortname="N" Z="7" A="14.00674"/> + <element name="Oxygen" shortname="O" Z="8" A="15.9994"/> + <element name="Fluorine" shortname="F" Z="9" A="18.9984032"/> + <element name="Neon" shortname="Ne" Z="10" A="20.1797"/> + <element name="Sodium" shortname="Na" Z="11" A="22.98976928"/> + <element name="Magnesium" shortname="Mg" Z="12" A="24.3050"/> + <element name="Aluminium" shortname="Al" Z="13" A="26.981539"/> + <element name="Silicon" shortname="Si" Z="14" A="28.0855"/> + <element name="Phosphorous" shortname="P" Z="15" A="30.973762"/> + <element name="Sulphur" shortname="S" Z="16" A="32.065"/> + <element name="Chlorine" shortname="Cl" Z="17" A="35.453"/> + <element name="Argon" shortname="Ar" Z="18" A="39.948"/> + <element name="Potassium" shortname="K" Z="19" A="39.0983"/> + <element name="Calcium" shortname="Ca" Z="20" A="40.078"/> + <element name="Scandium" shortname="Sc" Z="21" A="44.955912"/> + <element name="Titanium" shortname="Ti" Z="22" A="47.867"/> + <element name="Vanadium" shortname="V" Z="23" A="50.9415"/> + <element name="Chromium" shortname="Cr" Z="24" A="51.9961"/> + <element name="Manganese" shortname="Mn" Z="25" A="54.938045"/> + <element name="Iron" shortname="Fe" Z="26" A="55.845"/> + <element name="Cobalt" shortname="Co" Z="27" A="58.93319"/> + <element name="Nickel" shortname="Ni" Z="28" A="58.6934"/> + <element name="Copper" shortname="Cu" Z="29" A="63.546"/> + <element name="Zinc" shortname="Zn" Z="30" A="65.38"/> + <element name="Gallium" shortname="Ga" Z="31" A="69.723"/> + <element name="Germanium" shortname="Ge" Z="32" A="72.61"/> + + <!-- Other elements used in detectors --> + + <element name="Niobium" shortname="Nb" Z="41" A="92.90638"/> + <element name="Molybdenum" shortname="Mo" Z="42" A="95.96"/> + <element name="Rhenium" shortname="Rh" Z="45" A="102.90550"/> + <element name="Silver" shortname="Ag" Z="47" A="107.8682"/> + <element name="Tin" shortname="Sn" Z="50" A="118.710"/> + <element name="Xenon" shortname="Xe" Z="54" A="131.29"/> + <element name="Cesium" shortname="Cs" Z="55" A="132.9054519"/> + <element name="Barium" shortname="Ba" Z="56" A="137.327"/> + <element name="Tungsten" shortname="W" Z="74" A="183.84"/> + <element name="Platinum" shortname="Pt" Z="78" A="195.08"/> + <element name="Gold" shortname="Au" Z="79" A="196.966569"/> + <element name="Lead" shortname="Pb" Z="82" A="207.2"/> + <element name="Uranium" shortname="U" Z="92" A="238.0289"/> + + <!-- Fractions are by mass; density in g/cm3 --> + + <!-- Pure Metals --> + + <material name="BeMetal" density="1.848"> + <elementref fraction="1.00000" ref="Berylium"/> + </material> + <material name="AlMetal" density="2.700"> + <elementref fraction="1.00000" ref="Aluminium"/> + </material> + <material name="SiMetal" density="2.3290"> + <elementref fraction="1.00000" ref="Silicon"/> + </material> + <material name="TiMetal" density="4.507"> + <elementref fraction="1.00000" ref="Titanium"/> + </material> + <material name="VaMetal" density="6.110"> + <elementref fraction="1.00000" ref="Vanadium"/> + </material> + <material name="FeMetal" density="7.874"> + <elementref fraction="1.00000" ref="Iron"/> + </material> + <material name="NiMetal" density="8.900"> + <elementref fraction="1.00000" ref="Nickel"/> + </material> + <material name="CuMetal" density="8.960"> + <elementref fraction="1.00000" ref="Copper"/> + </material> + <material name="GeMetal" density="5.323"> + <elementref fraction="1.00000" ref="Germanium"/> + </material> + <material name="SnMetal" density="7.310"> + <elementref fraction="1.00000" ref="Tin"/> + </material> + <material name="AgMetal" density="10.490"> + <elementref fraction="1.00000" ref="Silver"/> + </material> + <material name="AuMetal" density="19.300"> + <elementref fraction="1.00000" ref="Gold"/> + </material> + <material name="WMetal" density="19.250"> + <elementref fraction="1.00000" ref="Tungsten"/> + </material> + <material name="PtMetal" density="21.090"> + <elementref fraction="1.00000" ref="Platinum"/> + </material> + <material name="PbMetal" density="11.340"> + <elementref fraction="1.00000" ref="Lead"/> + </material> + <material name="UMetal" density="19.050"> + <elementref fraction="1.00000" ref="Uranium"/> + </material> + + <!-- Alloys --> + + <material name="SS304" density="7.95"> + <elementref fraction="0.6855" ref="Iron"/> + <elementref fraction="0.18" ref="Chromium"/> + <elementref fraction="0.08" ref="Nickel"/> + <elementref fraction="0.015" ref="Carbon"/> + <elementref fraction="0.02" ref="Manganese"/> + <elementref fraction="0.01" ref="Silicon"/> + <elementref fraction="0.002" ref="Phosphorous"/> + <elementref fraction="0.0015" ref="Sulphur"/> + <elementref fraction="0.006" ref="Molybdenum"/> + </material> + <material name="SS316" density="8.0"> <!-- E.g. Swagelok --> + <elementref fraction="0.65225" ref="Iron"/> + <elementref fraction="0.17" ref="Chromium"/> + <elementref fraction="0.12" ref="Nickel"/> + <elementref fraction="0.0008" ref="Carbon"/> + <elementref fraction="0.02" ref="Manganese"/> + <elementref fraction="0.0075" ref="Silicon"/> + <elementref fraction="0.00045" ref="Phosphorous"/> + <elementref fraction="0.003" ref="Sulphur"/> + <elementref fraction="0.001" ref="Nitrogen"/> + <elementref fraction="0.025" ref="Molybdenum"/> + </material> + + <!-- Other pure solids --> + + <material name="Graphite" density="2.267"> <!-- Wikipedia Carbon --> + <elementref fraction="1.0" ref="Carbon"/> + </material> + <material name="Diamond" density="3.515"> + <elementref fraction="1.0" ref="Carbon"/> + </material> + <material name="CFoam" density="0.3"> + <elementref fraction="1.0" ref="Carbon"/> + </material> +<material name="k9Allcomp" density="0.23"> + <elementref fraction="1.0" ref="Carbon"/> + </material> + + <!-- Liquids --> + <chemical name="CO2"> + <elemcontent ref="Carbon" quantity="1"/> + <elemcontent ref="Oxygen" quantity="2"/> + </chemical> + <material name="H_Liquid" density="0.0708"> + <elementref fraction="1.0" ref="Hydrogen"/> + </material> + <material name="D_Liquid" density="0.169"> + <elementref fraction="1.0" ref="Deuterium"/> + </material> + <material name="HeLiquid" density="0.1249"> + <elementref fraction="1.0" ref="Helium"/> + </material> + <!-- CO2 density from http://encyclopedia.airliquide.com/Encyclopedia.asp?GasID=26 -20C and 20 bar --> + <material name="CO2Liquid" density="1.03"> + <chemicalref fraction="1" ref="CO2"/> + </material> + <material name="CO2Mixed" density="0.41"> <!-- 40 % liquid by mass --> + <chemicalref fraction="1" ref="CO2"/> + </material> + + <!-- Gases --> + + <material name="N2atMinus20" density="1.307e-3"> <!-- g/cm3 N2 at -20 degC --> + <elementref fraction="1.00000" ref="Nitrogen"/> + </material> + <material name="N2" density="1.2504e-3 * 273.15/293.15 * 96265/100000"> + <!-- Wiki for N2 at STP adjusted to 20 degC and CERN altitude --> + <elementref fraction="1.00000" ref="Nitrogen"/> + </material> + <material name="Air" density="1.205e-3"> <!-- 78 % N2 + 21 % O2 + 1 % Ar by mass A = 2*14, 2*16, 40 --> + <elementref fraction="0.7541" ref="Nitrogen"/> + <elementref fraction="0.2321" ref="Oxygen"/> + <elementref fraction="0.0138" ref="Argon"/> + </material> + + <!-- Adhesives --> + + <material name="Bisphenol-A" density="1.2"> + <elementref fraction="0.03" ref="Hydrogen"/> + <elementref fraction="0.75" ref="Carbon"/> + <elementref fraction="0.10" ref="Nitrogen"/> + <elementref fraction="0.12" ref="Oxygen"/> + </material> + <material name="CyanateEster" density="1.2"> + <materialref fraction="1.0" ref="Bisphenol-A"/> <!-- It's a secret what they use --> + </material> + + <!-- Ref Product Information Sheet, Dow Corning, for SE4445 CV Gel, and SDS sheet (Canada) for fraction Alumina, + given as 77-78 % for B, range 70 - 86 ^% for A, so we take midrange 78. Ignore 0.77 % carbon. Ignore + Octamethylcyclotetrasiloxane 0.11 % --> + <!-- Ref: Wikipedia Polydimethylsiloxane for formula --> + <chemical name="C2H6OSi"> <!-- AKA Polydimethylsiloxane --> + <elemcontent quantity="2" ref="Carbon"/> + <elemcontent quantity="6" ref="Hydrogen"/> + <elemcontent quantity="1" ref="Oxygen"/> + <elemcontent quantity="1" ref="Silicon"/> + </chemical> + <material name="SE4445" density="2.36"> + <chemicalref fraction="0.78" ref="Al2O3"/> + <chemicalref fraction="0.22" ref="C2H6OSi"/> + </material> + + <!-- Plastics --> + + <material name="Nylon" density="1.14"> + <elementref fraction="0.636853" ref="Carbon"/> + <elementref fraction="0.097980" ref="Hydrogen"/> + <elementref fraction="0.141388" ref="Nitrogen"/> + <elementref fraction="0.123779" ref="Oxygen"/> + </material> + <material name="Lexan" density="1.2"> + <elementref fraction="0.755749" ref="Carbon"/> + <elementref fraction="0.055493" ref="Hydrogen"/> + <elementref fraction="0.188757" ref="Nitrogen"/> + </material> + <material name="Mylar" density="1.39"> + <elementref fraction="0.625016" ref="Carbon"/> + <elementref fraction="0.041960" ref="Hydrogen"/> + <elementref fraction="0.333024" ref="Nitrogen"/> + </material> + <material name="Polyethylene" density="0.935"> + <elementref fraction="0.856285" ref="Carbon"/> + <elementref fraction="0.143715" ref="Hydrogen"/> + </material> + <material name="Kapton" density="1.42"> <!-- Aka polyimide --> + <elementref fraction="0.691133" ref="Carbon"/> + <elementref fraction="0.026363" ref="Hydrogen"/> + <elementref fraction="0.209234" ref="Nitrogen"/> + <elementref fraction="0.073270" ref="Oxygen"/> + </material> + <material name="Plexiglas" density="1.18"> <!-- aka poly methyl-methacrylate, acrylate --> + <elementref fraction="0.599846" ref="Carbon"/> + <elementref fraction="0.080541" ref="Hydrogen"/> + <elementref fraction="0.319613" ref="Nitrogen"/> + </material> + <material name="PolystyreneScintillator" density="1.032"> + <elementref fraction="0.922579" ref="Carbon"/> + <elementref fraction="0.077421" ref="Hydrogen"/> + </material> + <material name="Teflon" density="2.2"> + <elementref fraction="0.240183" ref="Carbon"/> + <elementref fraction="0.759817" ref="Fluorine"/> + </material> + <material name="PolyvinyltolueneScintillator" density="1.032"> + <elementref fraction="0.914710" ref="Carbon"/> + <elementref fraction="0.085290" ref="Hydrogen"/> + </material> + <material name="BoratedPolyethylene" density="1.112"> <!-- Ref. www.marshield.com/borated-polyethylene --> + <elementref fraction="0.050" ref="Boron"/> <!-- 5 % by weight --> + <elementref fraction="0.111" ref="Oxygen"/> <!-- (3 * Awt O) / (2 * Awt B) * 0.05 --> + <materialref fraction="0.839" ref="Polyethylene"/> <!-- The rest --> + </material> + + + <!-- From Stephen Haywood et al spreadsheet Materials.xls at + http://hepwww.rl.ac.uk/atlas-sct/engineering/material_budget/ + But: ignore the densities there, they are nonsense? --> + <chemical name="C18O3H20"> + <elemcontent quantity="18" ref="Carbon"/> + <elemcontent quantity="20" ref="Hydrogen"/> + <elemcontent quantity="3" ref="Oxygen"/> + </chemical> + <material name="Epoxy" density="1.2"> <!-- Density for Araldite 2011 at 25 degC, from hazard sheet --> + <chemicalref fraction="1.0" ref="C18O3H20"/> + </material> + + <chemical name="H2O"> + <elemcontent quantity="1" ref="Oxygen"/> + <elemcontent quantity="2" ref="Hydrogen"/> + </chemical> + <material name="Water" density="1.0"> + <chemicalref fraction="1.0" ref="H2O"/> + </material> + + <chemical name="C19O3H12"> + <elemcontent quantity="19" ref="Carbon"/> + <elemcontent quantity="12" ref="Hydrogen"/> + <elemcontent quantity="3" ref="Oxygen"/> + </chemical> + <material name="Peek" density="1.32"> <!-- Wikipedia --> + <chemicalref fraction="1.0" ref="C19O3H12"/> + </material> + <material name="Torlon" density="1.45"> <!-- Wikipedia --> + <chemicalref fraction="1.0" ref="C19O3H12"/> + </material> + <chemical name="C37O4H24N2"> + <elemcontent quantity="37" ref="Carbon"/> + <elemcontent quantity="24" ref="Hydrogen"/> + <elemcontent quantity="4" ref="Oxygen"/> + <elemcontent quantity="2" ref="Nitrogen"/> + </chemical> + <material name="PEI" density="1.27"> <!-- aka Ultem, density taken from Quadrant --> + <chemicalref fraction="1.0" ref="C37O4H24N2"/> + </material> + + <chemical name="BN"> + <elemcontent quantity="1" ref="Boron"/> + <elemcontent quantity="1" ref="Nitrogen"/> + </chemical> + <material name="BoronNitride" density="2.28"> <!-- Density is amorphous form; see Wikipedia for others --> + <chemicalref fraction="1.0" ref="BN"/> + </material> + + <chemical name="B2O3"> + <elemcontent quantity="2" ref="Boron"/> + <elemcontent quantity="3" ref="Oxygen"/> + </chemical> + <material name="BoronOxide" density="2.46"> <!-- B2O3; other oxides exist. Amorphous/liquid form density --> + <chemicalref fraction="1.0" ref="B2O3"/> + </material> + + <chemical name="Al2O3"> + <elemcontent quantity="2" ref="Aluminium"/> + <elemcontent quantity="3" ref="Oxygen"/> + </chemical> + <material name="AluminiumOxide" density="4.00"> + <chemicalref fraction="1.0" ref="Al2O3"/> + </material> + + <chemical name="AlN"> + <elemcontent quantity="1" ref="Aluminium"/> + <elemcontent quantity="1" ref="Nitrogen"/> + </chemical> + <material name="AluminiumNitride" density="3.26"> + <chemicalref fraction="1.0" ref="AlN"/> + </material> + + <material name="SolderSnPb" density="8.52"> <!-- http://www.efunda.com/materials/solders/tin_lead.cfm for density --> + <elementref fraction="0.6" ref="Tin"/> + <elementref fraction="0.4" ref="Lead"/> + </material> + + <material name="SolderSnPbAg" density="8.41"> <!-- Alloy 104; http://alasir.com/reference/solder_alloys/ --> + <elementref fraction="0.625" ref="Tin"/> + <elementref fraction="0.361" ref="Lead"/> + <elementref fraction="0.014" ref="Silver"/> + </material> + + <material name="BoronNitrideEpoxy" density="1.4"> <!-- 1/(0.7/ density epoxy + 0.3/ density BN) --> + <materialref fraction="0.70" ref="Epoxy"/> + <materialref fraction="0.30" ref="BoronNitride"/> + </material> + <material name="BoronNitrideEpoxyEC" density="1.49"> <!-- 1/(0.8/ density epoxy + 0.2/ density BN) --> + <materialref fraction="0.80" ref="Epoxy"/> + <materialref fraction="0.20" ref="BoronNitride"/> + </material> + <material name="SilverEpoxy" density="3.23"> <!-- From material densities --> + <elementref fraction="0.71" ref="Silver"/> + <materialref fraction="0.29" ref="Epoxy"/> + </material> + + <!-- Ref http://www.camglassblowing.co.uk/gproperties.htm --> + <material name="Glass" density="2.20"> <!-- AKA Silica and Quartz --> + <elementref fraction="0.5326" ref="Oxygen"/> + <elementref fraction="0.4674" ref="Silicon"/> + </material> + <!-- Ref http://www.camglassblowing.co.uk/gproperties.htm --> + <material name="BorosilicateGlass" density="2.23"> + <elementref fraction="0.5422" ref="Oxygen"/> + <elementref fraction="0.3633" ref="Silicon"/> + <elementref fraction="0.0451" ref="Boron"/> + <elementref fraction="0.0295" ref="Sodium"/> + <elementref fraction="0.0199" ref="Aluminium"/> + </material> + + <material name="FR4" density="1.85"> <!-- Wikipedia density --> + <materialref fraction="0.229" ref="Epoxy"/> + <materialref fraction="0.771" ref="Glass"/> + </material> + + <!-- Others --> + + <material name="K13D2U" density="1.820"> + <materialref fraction="0.721" ref="Graphite"/> + <materialref fraction="0.279" ref="CyanateEster"/> + </material> + +<material name="K13C2U" density="1.6"> + <materialref fraction="0.57" ref="Graphite"/> + <materialref fraction="0.43" ref="CyanateEster"/> + </material> + + <material name="CFRP" density="1.7"> + <materialref fraction="0.721" ref="Graphite"/> + <materialref fraction="0.279" ref="CyanateEster"/> + </material> + + <material name="T300CF" density="1.52"> <!--density from Sergio--> + <materialref fraction="0.93" ref="Graphite"/><!--fraction from www.toraycfa.com/pdfs/T300DataSheet.pdf --> + <materialref fraction="0.07" ref="CyanateEster"/> + </material> + + <material name="CCAW" density="3.322"> <!-- 10 % by volume Cu --> + <elementref fraction="0.7315" ref="Aluminium"/> + <elementref fraction="0.2685" ref="Copper"/> + </material> + + <!-- Honeycombs --> + <material name="Honeycomb2pcf" density="0.032037"> + <materialref fraction="1.0" ref="CFRP"/> + </material> + <material name="Honeycomb3pcf" density="0.048"> + <materialref fraction="1.0" ref="CFRP"/> + </material> + <material name="Honeycomb5pcf" density="0.080092"> + <materialref fraction="1.0" ref="CFRP"/> + </material> + + <material name="Honeycomb10pcf" density="0.160185"> + <materialref fraction="1.0" ref="CFRP"/> + </material> + + <material name="Polymethacrylamide" density="1.11"> + <elementref fraction=".5645" ref="Carbon"/> + <elementref fraction=".1645" ref="Nitrogen"/> + <elementref fraction=".1880" ref="Oxygen"/> + <elementref fraction=".0829" ref="Hydrogen"/> + </material> + +<!-- + <material name="Polymethacrylimide" density="1.0"> + <elementref fraction=".4805" ref="Carbon"/> + <elementref fraction=".0578" ref="Nitrogen"/> + <elementref fraction=".3531" ref="Oxygen"/> + <elementref fraction=".1084" ref="Hydrogen"/> + </material> +--> + <!-- Found one picture with C29 N3 O16 H78 Density unknown --> + <chemical name="Polymethacrylimide"> + <elemcontent ref="Carbon" quantity="29"/> + <elemcontent ref="Nitrogen" quantity="3"/> + <elemcontent ref="Oxygen" quantity="16"/> + <elemcontent ref="Hydrogen" quantity="78"/> + </chemical> + + <material name="Rohacell110A" density="0.110"> + <chemicalref fraction="1.0" ref="Polymethacrylimide"/> + </material> + + <material name="Rohacell71A" density="0.075"> + <chemicalref fraction="1.0" ref="Polymethacrylimide"/> + </material> + + <material name="Rohacell51A" density="0.052"> + <chemicalref fraction="1.0" ref="Polymethacrylimide"/> + </material> + + <material name="Rohacell31A" density="0.032"> + <chemicalref fraction="1.0" ref="Polymethacrylimide"/> + </material> + +<material name="TiMetal_heat" density="0.33333"> + <elementref fraction="1.00000" ref="Titanium"/> + </material> +<material name="PVC" density="1.38"> + <elementref fraction="0.384" ref="Carbon"/> + <elementref fraction="0.048" ref="Hydrogen"/> + <elementref fraction="0.568" ref="Chlorine"/> + </material> +<material name="PE" density="0.935"> + <elementref fraction="0.86" ref="Carbon"/> + <elementref fraction="0.14" ref="Hydrogen"/> + + </material> +<material name="Poliax" density="1.42*1.19"> <!-- Aka polyimide --> + <elementref fraction="0.691133" ref="Carbon"/> + <elementref fraction="0.026363" ref="Hydrogen"/> + <elementref fraction="0.209234" ref="Nitrogen"/> + <elementref fraction="0.073270" ref="Oxygen"/> + </material> + </materials> + + +<!-- Inner Tracker dimensions and things common to barrel and endcap. --> +<defines> + <var name="PI" value="acos(-1.0)"/> + <var name="DEG" value="PI/180."/> <!-- Use as value="10*DEG" so it converts to radians for you --> + <var name="EPS" value="2.e-3"/> <!-- 2 micron to subtract from touching volumes to avoid G4 errors --> + + <vector name="CNL" value="0 0 0 0 0 0 0 0 0"/> <!-- Special for indexes; length >= no. levels --> + + <!-- + ITk (defined in C++ code) contains Strip (aka SCT) + Pixel + Beampipe + SCT contains PolymoderatorOC and StripB + StripB_ServicesGap + StripB_ServicesEC and StripEC + StripEC_Services + StripPP1 + Numbers mostly from EDMS 1530699 v1.3 + --> + + <var name="ITkOuterRadius" value="1130."/> <!-- Cryo inner r is 1150. mm, ref. blue book ATLAS exp at LHC --> + <var name="ITkHalfLength" value="3404"/> <!-- ITk env. v 1.4 has 3505 but reduced to 3475 to make space for HGTD + E-mail Simon Viel, 18/10/2016 --> + + <!-- E-mail Sabine 2015-10-26 for next three numbers --> + <var name="StripOuterRadius" value="ITkOuterRadius"/> + <var name="StripInnerRadius" value="346.701"/> <!-- Previously 361.751, now 346.701 --> + <var name="StripHalfLength" value="3326.-150"/> + + <var name="PolymoderatorOCOuterRadius" value="StripOuterRadius"/> + <var name="PolymoderatorOCInnerRadius" value="1045."/> + <!-- <var name="PolymoderatorOCLength" value="2*3170.+0.1"/> --> + <!-- DeGeorge envelope drawing --> + <var name="PolymoderatorOCLength" value="2*3020.+0.1"/> <!-- DeGeorge envelope drawing --> + + <var name="StripB_OuterRadius" value="PolymoderatorOCInnerRadius"/> + <var name="StripB_InnerRadius" value="StripInnerRadius"/> + <var name="StripB_HalfLength" value="1455."/> <!-- 14 modules * 98 mm pitch + 4 mm spare + 75 mm for z-brace + 4mm spare --> + + <var name="StripB_ServicesGapOuterRadius" value="1015."/> + <var name="StripB_ServicesGapInnerRadius" value="StripInnerRadius"/> + <var name="StripB_ServicesGapZ_Start" value="StripB_HalfLength"/> + <var name="StripB_ServicesGapZ_End" value="StripB_ServicesGapZ_Start + 25."/> <!-- Was 100, shrink by 75 to test --> + <var name="StripB_ServicesGapHalfLength" value="(StripB_ServicesGapZ_End - StripB_ServicesGapZ_Start) / 2."/> + + <var name="StripB_ServicesEC_OuterRadius" value="StripB_OuterRadius"/> + <var name="StripB_ServicesEC_InnerRadius" value="StripB_ServicesGapOuterRadius"/> + <var name="StripB_ServicesEC_Z_Start" value="StripB_ServicesGapZ_Start"/> + <var name="StripB_ServicesEC_Z_End" value="StripHalfLength"/> + <var name="StripB_ServicesEC_HalfLength" value="(StripB_ServicesEC_Z_End - StripB_ServicesEC_Z_Start) / 2."/> + + <var name="StripEC_OuterRadius" value="989."/> <!-- Was 985. Increased to accommodate M. Doets wheel design. --> + <var name="StripEC_InnerRadius" value="StripInnerRadius"/> + <var name="StripEC_Z_Start" value="StripB_ServicesGapZ_End"/> + <var name="StripEC_Z_End" value="3130.-150. - 1."/> + <var name="StripEC_HalfLength" value="(StripEC_Z_End - StripEC_Z_Start) / 2."/> + + <var name="StripEC_ServicesOuterRadius" value="1011"/> <!-- Env. def v1.4 --> + <var name="StripEC_ServicesInnerRadius" value="StripEC_OuterRadius"/> + <var name="StripEC_ServicesZ_Start" value="StripEC_Z_Start"/> + <var name="StripEC_ServicesZ_End" value="StripEC_Z_End - 2."/> + <var name="StripEC_ServicesHalfLength" value="(StripEC_ServicesZ_End - StripEC_ServicesZ_Start) / 2."/> + + <var name="StripEC_PP1OuterRadius" value="StripB_ServicesEC_InnerRadius"/> + <var name="StripEC_PP1InnerRadius" value="StripInnerRadius"/> + <var name="StripEC_PP1Z_Start" value="StripEC_Z_End"/> + <var name="StripEC_PP1Z_End" value="StripHalfLength"/> + <var name="StripEC_PP1HalfLength" value="(StripEC_PP1Z_End - StripEC_PP1Z_Start) / 2."/> + +</defines> + + +<transformation name="IdentityTransform"> + <translation/> +</transformation> + +<positionindex> + <addindex name="barrel_endcap"/> + <addindex name="layer_wheel"/> + <addindex name="phi_module"/> + <addindex name="eta_module"/> + <addindex name="side"/> +</positionindex> + +<!-- Material mixture for sensor local supports. Used in SS, LS and petal cores, + with density scaled to give required radiation length. --> +<materials> + <material name="MatStaveSupport" density="1.0"> + <elementref ref="Carbon" fraction="0.70"/> + <elementref ref="Aluminium" fraction="0.20"/> + <elementref ref="Hydrogen" fraction="0.06"/> + <elementref ref="Oxygen" fraction="0.03"/> + <elementref ref="Copper" fraction="0.01"/> + </material> +</materials> + + +<!-- Inner Tracker common items like polythene moderator, outer cyl support etc. --> + +<defines> + + <!-- Ref EDMS 1516118, Viehhauser, p. 10; deGeorge envelope model for length --> + <var name="OC_Length" value="PolymoderatorOCLength - 1."/> + <var name="OC_SkinThickness" value="2.5"/> + <var name="OC_CoreThickness" value="30."/> + <var name="OC_OuterSkinOuterR" value="1101."/> + <var name="OC_OuterSkinInnerR" value="OC_OuterSkinOuterR - OC_SkinThickness"/> + <var name="OC_InnerSkinOuterR" value="OC_OuterSkinInnerR - OC_CoreThickness"/> + <var name="OC_InnerR" value="OC_InnerSkinOuterR - OC_SkinThickness"/> + <var name="PolyModOuterR" value="PolymoderatorOCOuterRadius"/> + <var name="PolyModThickness" value="25."/> <!-- ref LoI p. 101 --> + <var name="PolyModInnerR" value="PolymoderatorOCOuterRadius - PolyModThickness"/> + + <var name="BulkheadRI" value="StripInnerRadius + 5"/> + <var name="BulkheadRO" value="StripEC_ServicesInnerRadius - 25."/> + <var name="BulkheadT" value="6"/> <!-- Guess, 3 May 2016: two facesheets of 3 mm CF --> + <var name="BulkheadTranslation" value="OC_Length/2 - BulkheadT/2 - 2"/> + + <var name="EC_PolyModRI" value="StripInnerRadius"/> <!-- To continue from Pixel polyM --> + <var name="EC_PolyModRO" value="PolymoderatorOCInnerRadius"/> <!-- Bit arbitrary. Space for type II limits it --> + <var name="EC_PolyModT" value="70."/> <!-- Ben Smart choice for pixel part --> + + <!-- We put PP1's here because they are attached to the supports rather than barrel or endcap --> + <var name="B_PP1_Z_Start" value="OC_Length / 2 + 1."/> + <var name="B_PP1_Z_End" value="StripHalfLength - 1."/> + <var name="B_PP1_RI" value="StripB_ServicesEC_OuterRadius + 1."/> + <var name="B_PP1_RO" value="OC_OuterSkinOuterR - 1."/> + <var name="B_PP1_L" value="B_PP1_Z_End - B_PP1_Z_Start"/> +<!-- + <var name="EC_PP1_Z_Start" value="3170 + 1."/> + <var name="EC_PP1_Z_End" value="3270 - 1."/> +--> + <var name="EC_PP1_Z_Start" value="3020 + 1."/> + <var name="EC_PP1_Z_End" value="3120 - 1."/> + <var name="EC_PP1_RI" value="750."/> + <var name="EC_PP1_RO" value="1000+EPS"/><!--BulkheadRO"/>--> + <var name="EC_PP1_L" value="EC_PP1_Z_End - EC_PP1_Z_Start"/> +<!-- + <var name="Pix_PP1_middle_Z_Start" value="3175.8 + EPS"/> + <var name="Pix_PP1_middle_Z_End" value="3242.8"/> + <var name="Pix_PP1_middle_RI" value="347."/> + <var name="Pix_PP1_middle_RO" value="420."/> + <var name="Pix_PP1_middle_L" value="Pix_PP1_middle_Z_End - Pix_PP1_middle_Z_Start"/> + + <var name="Pix_PP1_outer_Z_Start" value="3020 + EPS"/> + <var name="Pix_PP1_outer_Z_End" value="3175.8"/> + <var name="Pix_PP1_outer_RI" value="347."/> + <var name="Pix_PP1_outer_RO" value="700."/> + <var name="Pix_PP1_outer_L" value="Pix_PP1_outer_Z_End - Pix_PP1_outer_Z_Start"/> + + <var name="HeatExchanger_w" value="50"/> + <var name="HeatExchanger_t" value="HeatExchanger_w"/> + <var name="HeatExchanger_l" value="120"/> +<var name="HeatExchanger_z" value="3070"/> + <var name="HeatExchanger_Ri" value="400"/> +--> +</defines> + +<shapes> + <tube name="shPolyModOCEnvelope" rmin="PolymoderatorOCInnerRadius" rmax="PolymoderatorOCOuterRadius - 2*EPS" zhalflength="PolymoderatorOCLength/2"/> + + <tube name="shOC_InnerFace" rmin="OC_InnerR" rmax="OC_InnerSkinOuterR" zhalflength="OC_Length/2"/> + <tube name="shOC_Core" rmin="OC_InnerSkinOuterR + EPS" rmax="OC_OuterSkinInnerR - EPS" zhalflength="OC_Length/2"/> + <tube name="shOC_OuterFace" rmin="OC_OuterSkinInnerR" rmax="OC_OuterSkinOuterR" zhalflength="OC_Length/2"/> + <tube name="shBulkhead" rmin="BulkheadRI" rmax="BulkheadRO" zhalflength="BulkheadT/2"/> + + <tube name="shPolyMod" rmin="PolyModInnerR" rmax="PolyModOuterR - 3*EPS" zhalflength="OC_Length/2"/> + <tube name="shEC_PolyMod" rmin="EC_PolyModRI + EPS" rmax="EC_PolyModRO - EPS" zhalflength="EC_PolyModT/2"/> + + <tube name="shB_PP1" rmin="B_PP1_RI" rmax="B_PP1_RO" zhalflength="B_PP1_L/2"/> + <tube name="shEC_PP1" rmin="EC_PP1_RI" rmax="EC_PP1_RO" zhalflength="EC_PP1_L/2"/> + + <!--<tube name="shPixPP1Envelope" rmin="Pix_PP1_middle_RI" rmax="B_PP1_RO" zhalflength="Pix_PP1_middle_L/2"/>--> + <!--<tube name="shPix_PP1_middle" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="Pix_PP1_middle_L/2"/> + <tube name="shPix_PP1_outer" rmin="Pix_PP1_outer_RI" rmax="Pix_PP1_outer_RO" zhalflength="Pix_PP1_outer_L/2"/> + <box name="shHeatExTriplet" xhalflength="HeatExchanger_l/2" yhalflength="3*HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> +<box name="shHeatExSingle" xhalflength="HeatExchanger_l/2" yhalflength="HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> + +<union name="pixPP1union"> + <shaperef ref="shPix_PP1_outer"/> + <transformation name="PlacePixPP1middle"> + <translation z="Pix_PP1_outer_L+Pix_PP1_middle_L/2"/> + </transformation> + <shaperef ref="shPix_PP1_middle"/> + </union>--> +</shapes> + +<logvol name="EC_PolyMod" shape="shEC_PolyMod" material="BoratedPolyethylene"/> + +<logvol name="PolyModOCEnvelope" shape="shPolyModOCEnvelope" material="N2"> + + <logvol name="OC_InnerFace" shape="shOC_InnerFace" material="CFRP"/> + <logvol name="OC_OuterFace" shape="shOC_OuterFace" material="CFRP"/> + <logvol name="OC_Core" shape="shOC_Core" material="Honeycomb10pcf"/> + + <logvol name="PolyMod" shape="shPolyMod" material="BoratedPolyethylene"/> + +</logvol> + +<logvol name="Bulkhead" shape="shBulkhead" material="CFRP"/> + + + + +<materials> + <material name="MatB_PP1" density="0.356"> <!-- Hand calc to give 20 kg; logbook UG20 May 13th 2016 --> + <materialref ref="MatStaveSupport" fraction="1.0"/> + </material> + <material name="MatEC_PP1" density="0.177"> <!-- Density from hand calc. to give 20 kg --> + <materialref ref="MatStaveSupport" fraction="1.0"/> + </material> +</materials> + +<logvol name="B_PP1" shape="shB_PP1" material="MatB_PP1"/> +<logvol name="EC_PP1" shape="shEC_PP1" material="MatEC_PP1"/> +<logvol name="Pix_PP1_middle" shape="shPix_PP1_middle" material="Air"/> +<logvol name="Pix_PP1_outer" shape="shPix_PP1_outer" material="Air"/> +<!--<logvol name="pixPP1" shape="pixPP1union" material="Air"></logvol> +<assembly name="PixPP1"> + <logvolref ref="pixPP1"/> +</assembly> +--> + + + + +<defines> + <!-- Endcap sensor dimensions from apr15/small.geom --> + <!-- Wafer cut dimensions AX AY BX BY CX CY DX DY --> + <matrix name="E_SensorVtx" coldim="8" value=" -56.6118 -39.6071 47.9166 -47.8979 47.7066 49.9845 -56.4013 37.5210 -47.8155 -49.8880 37.2181 -56.6409 37.0474 58.3384 -47.6446 48.1909 -37.2139 -58.2059 25.1307 -63.1617 25.0056 64.4064 -37.0887 56.9616 -60.6002 -33.1240 57.1708 -36.5666 57.0531 38.9200 -60.4823 30.7708 -57.0256 -38.9917 53.0158 -42.2263 52.9057 44.4253 -56.9153 36.7930 -52.8785 -44.4755 48.3267 -47.4636 48.2253 49.4860 -52.7770 42.4533 "/> + <!-- R_i, R, R_o (cut values) --> + <matrix name="E_SensorRadius" coldim="3" value=" 384.050 438.614 488.873 489.373 534.639 574.644 575.144 609.405 637.659 638.159 697.899 755.951 756.451 812.471 866.512 867.012 918.749 968.235 "/> + <vector name="SensorRotation" value=" 0.0000000e+00 0.0000000e+00 0.0000000e+00 5.0397041e-02 5.0376915e-02 5.0381140e-02 "/> + <!-- End of definess from small.geom --> +</defines> + +<defines> + + <!-- Endcap --> + + <var name="SensorThickness" value="0.320"/> + + <vector name="N_InRing" value="32 32 32 64 64 64"/> + + <var name="ScaleAngleBy" value="1.05"/> + <var name="SensorPhiWidth_0" value="2 * PI / N_InRing_0 * ScaleAngleBy"/> + <var name="SensorPhiWidth_1" value="2 * PI / N_InRing_1 * ScaleAngleBy"/> + <var name="SensorPhiWidth_2" value="2 * PI / N_InRing_2 * ScaleAngleBy"/> + <var name="SensorPhiWidth_3" value="2 * PI / N_InRing_3 * ScaleAngleBy"/> + <var name="SensorPhiWidth_4" value="2 * PI / N_InRing_4 * ScaleAngleBy"/> + <var name="SensorPhiWidth_5" value="2 * PI / N_InRing_5 * ScaleAngleBy"/> + + <!-- We have to stretch the trapezoid corners so the intersection includes the curved part --> + <var name="ScaleTrapBy" value="1.05"/> + + <var name="E_VtxStr0Bx" value="ScaleTrapBy * (E_SensorVtx_0_2 - E_SensorVtx_0_0) + E_SensorVtx_0_0"/> + <var name="E_VtxStr0By" value="ScaleTrapBy * (E_SensorVtx_0_3 - E_SensorVtx_0_1) + E_SensorVtx_0_1"/> + <var name="E_VtxStr0Cx" value="ScaleTrapBy * (E_SensorVtx_0_4 - E_SensorVtx_0_6) + E_SensorVtx_0_6"/> + <var name="E_VtxStr0Cy" value="ScaleTrapBy * (E_SensorVtx_0_5 - E_SensorVtx_0_7) + E_SensorVtx_0_7"/> + + <var name="E_VtxStr1Bx" value="ScaleTrapBy * (E_SensorVtx_1_2 - E_SensorVtx_1_0) + E_SensorVtx_1_0"/> + <var name="E_VtxStr1By" value="ScaleTrapBy * (E_SensorVtx_1_3 - E_SensorVtx_1_1) + E_SensorVtx_1_1"/> + <var name="E_VtxStr1Cx" value="ScaleTrapBy * (E_SensorVtx_1_4 - E_SensorVtx_1_6) + E_SensorVtx_1_6"/> + <var name="E_VtxStr1Cy" value="ScaleTrapBy * (E_SensorVtx_1_5 - E_SensorVtx_1_7) + E_SensorVtx_1_7"/> + + <var name="E_VtxStr2Bx" value="ScaleTrapBy * (E_SensorVtx_2_2 - E_SensorVtx_2_0) + E_SensorVtx_2_0"/> + <var name="E_VtxStr2By" value="ScaleTrapBy * (E_SensorVtx_2_3 - E_SensorVtx_2_1) + E_SensorVtx_2_1"/> + <var name="E_VtxStr2Cx" value="ScaleTrapBy * (E_SensorVtx_2_4 - E_SensorVtx_2_6) + E_SensorVtx_2_6"/> + <var name="E_VtxStr2Cy" value="ScaleTrapBy * (E_SensorVtx_2_5 - E_SensorVtx_2_7) + E_SensorVtx_2_7"/> + + <var name="E_VtxStr3Bx" value="ScaleTrapBy * (E_SensorVtx_3_2 - E_SensorVtx_3_0) + E_SensorVtx_3_0"/> + <var name="E_VtxStr3By" value="ScaleTrapBy * (E_SensorVtx_3_3 - E_SensorVtx_3_1) + E_SensorVtx_3_1"/> + <var name="E_VtxStr3Cx" value="ScaleTrapBy * (E_SensorVtx_3_4 - E_SensorVtx_3_6) + E_SensorVtx_3_6"/> + <var name="E_VtxStr3Cy" value="ScaleTrapBy * (E_SensorVtx_3_5 - E_SensorVtx_3_7) + E_SensorVtx_3_7"/> + + <var name="E_VtxStr4Bx" value="ScaleTrapBy * (E_SensorVtx_4_2 - E_SensorVtx_4_0) + E_SensorVtx_4_0"/> + <var name="E_VtxStr4By" value="ScaleTrapBy * (E_SensorVtx_4_3 - E_SensorVtx_4_1) + E_SensorVtx_4_1"/> + <var name="E_VtxStr4Cx" value="ScaleTrapBy * (E_SensorVtx_4_4 - E_SensorVtx_4_6) + E_SensorVtx_4_6"/> + <var name="E_VtxStr4Cy" value="ScaleTrapBy * (E_SensorVtx_4_5 - E_SensorVtx_4_7) + E_SensorVtx_4_7"/> + + <var name="E_VtxStr5Bx" value="ScaleTrapBy * (E_SensorVtx_5_2 - E_SensorVtx_5_0) + E_SensorVtx_5_0"/> + <var name="E_VtxStr5By" value="ScaleTrapBy * (E_SensorVtx_5_3 - E_SensorVtx_5_1) + E_SensorVtx_5_1"/> + <var name="E_VtxStr5Cx" value="ScaleTrapBy * (E_SensorVtx_5_4 - E_SensorVtx_5_6) + E_SensorVtx_5_6"/> + <var name="E_VtxStr5Cy" value="ScaleTrapBy * (E_SensorVtx_5_5 - E_SensorVtx_5_7) + E_SensorVtx_5_7"/> + + <!-- And we allow an increase in the tubs thickness just to improve VP1 shading/colouring --> + <!-- Which changes it, but never fixes it, so leave at 1 * --> + <var name="E_TubsThick" value="1 * SensorThickness"/> + + <!-- Barrel: Updated to April 2019 tender document +https://edms.cern.ch/document/2135101--> + <var name="B_SensorLength" value="97.621"/> <!-- Along strips direction, x, eta --> + <var name="B_SensorWidth" value="97.950"/> <!-- Across-strips direction, y, phi --> + <!-- Historically it was square and the distinction didn't matter. --> + +</defines> + +<readoutgeometry> + + <param name="thickness" value="0.320"/> + <param name="carrierType" value="electrons"/> + <param name="readoutSide" value="+"/> + <param name="fieldDirection" value="z"/> + <param name="stripDirection" value="x"/> + + <sensorclass name="SiStripBox"> + <param name="nStrips" value="1280"/> + <!-- Ref: New thin-guard design from Nobu --> + <param name="pitch" value="0.0755"/> + <!-- Start and end positions are Sensitive Size (= 96.734 mm) divided by 2 or 4 --> +<!-- sensitive size = 97621-2*450 (edge distance) = 96721--> + <sensortype name="RG_ISB_SS"> + <param name="nRows" value="4"/> + <param name="stripLength" value="24.18025"/> + </sensortype> + <sensortype name="RG_ISB_MS"> + <param name="nRows" value="2"/> + <param name="stripLength" value="48.3605"/> + </sensortype> + </sensorclass> + + <sensorclass name="StereoAnnulus"> + <param name="stereoAngle" value=" 0.020"/> + <sensortype name="RG_ISE_0"> + <param name="centreR" value="438.614"/> + <param name="nRows" value="4"/> + <param name="nStrips" value="1024 1024 1152 1152 "/> + <param name="phiPitch" value="1.930863e-04 1.930863e-04 1.716880e-04 1.716880e-04 "/> + <param name="startR" value="384.500 403.481 427.462 456.442 "/> + <param name="endR" value="403.481 427.462 456.442 488.423 "/> + </sensortype> + <sensortype name="RG_ISE_1"> + <param name="centreR" value="534.639"/> + <param name="nRows" value="4"/> + <param name="nStrips" value="1280 1280 1408 1408 "/> + <param name="phiPitch" value="1.547122e-04 1.547122e-04 1.406774e-04 1.406774e-04 "/> + <param name="startR" value="489.823 507.916 535.009 559.101 "/> + <param name="endR" value="507.916 535.009 559.101 574.194 "/> + </sensortype> + <sensortype name="RG_ISE_2"> + <param name="centreR" value="609.405"/> + <param name="nRows" value="2"/> + <param name="nStrips" value="1536 1536 "/> + <param name="phiPitch" value="1.290774e-04 1.290774e-04 "/> + <param name="startR" value="575.594 606.402 "/> + <param name="endR" value="606.402 637.209 "/> + </sensortype> + <sensortype name="RG_ISE_3"> + <param name="centreR" value="697.899"/> + <param name="nRows" value="4"/> + <param name="nStrips" value="896 896 896 896 "/> + <param name="phiPitch" value="1.095053e-04 1.095053e-04 1.095053e-04 1.095053e-04 "/> + <param name="startR" value="638.609 664.832 697.055 729.278 "/> + <param name="endR" value="664.832 697.055 729.278 755.501 "/> + </sensortype> + <sensortype name="RG_ISE_4"> + <param name="centreR" value="812.471"/> + <param name="nRows" value="2"/> + <param name="nStrips" value="1024 1024 "/> + <param name="phiPitch" value="9.617533e-05 9.617533e-05 "/> + <param name="startR" value="756.901 811.482 "/> + <param name="endR" value="811.482 866.062 "/> + </sensortype> + <sensortype name="RG_ISE_5"> + <param name="centreR" value="918.749"/> + <param name="nRows" value="2"/> + <param name="nStrips" value="1152 1152 "/> + <param name="phiPitch" value="8.574294e-05 8.574294e-05 "/> + <param name="startR" value="867.462 907.623 "/> + <param name="endR" value="907.623 967.785 "/> + </sensortype> + </sensorclass> +</readoutgeometry> + + +<shapes> + + <generictrap name="TrapSensor0" x0="E_SensorVtx_0_6" y0="E_SensorVtx_0_7" x1="E_VtxStr0Cx" y1="E_VtxStr0Cy" x2="E_VtxStr0Bx" y2="E_VtxStr0By" x3="E_SensorVtx_0_0" y3="E_SensorVtx_0_1" x4="E_SensorVtx_0_6" y4="E_SensorVtx_0_7" x5="E_VtxStr0Cx" y5="E_VtxStr0Cy" x6="E_VtxStr0Bx" y6="E_VtxStr0By" x7="E_SensorVtx_0_0" y7="E_SensorVtx_0_1" zhalflength="SensorThickness / 2."/> + + <generictrap name="TrapSensor1" x0="E_SensorVtx_1_6" y0="E_SensorVtx_1_7" x1="E_VtxStr1Cx" y1="E_VtxStr1Cy" x2="E_VtxStr1Bx" y2="E_VtxStr1By" x3="E_SensorVtx_1_0" y3="E_SensorVtx_1_1" x4="E_SensorVtx_1_6" y4="E_SensorVtx_1_7" x5="E_VtxStr1Cx" y5="E_VtxStr1Cy" x6="E_VtxStr1Bx" y6="E_VtxStr1By" x7="E_SensorVtx_1_0" y7="E_SensorVtx_1_1" zhalflength="SensorThickness / 2."/> + + <generictrap name="TrapSensor2" x0="E_SensorVtx_2_6" y0="E_SensorVtx_2_7" x1="E_VtxStr2Cx" y1="E_VtxStr2Cy" x2="E_VtxStr2Bx" y2="E_VtxStr2By" x3="E_SensorVtx_2_0" y3="E_SensorVtx_2_1" x4="E_SensorVtx_2_6" y4="E_SensorVtx_2_7" x5="E_VtxStr2Cx" y5="E_VtxStr2Cy" x6="E_VtxStr2Bx" y6="E_VtxStr2By" x7="E_SensorVtx_2_0" y7="E_SensorVtx_2_1" zhalflength="SensorThickness / 2."/> + + <generictrap name="TrapSensor3" x0="E_SensorVtx_3_6" y0="E_SensorVtx_3_7" x1="E_VtxStr3Cx" y1="E_VtxStr3Cy" x2="E_VtxStr3Bx" y2="E_VtxStr3By" x3="E_SensorVtx_3_0" y3="E_SensorVtx_3_1" x4="E_SensorVtx_3_6" y4="E_SensorVtx_3_7" x5="E_VtxStr3Cx" y5="E_VtxStr3Cy" x6="E_VtxStr3Bx" y6="E_VtxStr3By" x7="E_SensorVtx_3_0" y7="E_SensorVtx_3_1" zhalflength="SensorThickness / 2."/> + + <generictrap name="TrapSensor4" x0="E_SensorVtx_4_6" y0="E_SensorVtx_4_7" x1="E_VtxStr4Cx" y1="E_VtxStr4Cy" x2="E_VtxStr4Bx" y2="E_VtxStr4By" x3="E_SensorVtx_4_0" y3="E_SensorVtx_4_1" x4="E_SensorVtx_4_6" y4="E_SensorVtx_4_7" x5="E_VtxStr4Cx" y5="E_VtxStr4Cy" x6="E_VtxStr4Bx" y6="E_VtxStr4By" x7="E_SensorVtx_4_0" y7="E_SensorVtx_4_1" zhalflength="SensorThickness / 2."/> + + <generictrap name="TrapSensor5" x0="E_SensorVtx_5_6" y0="E_SensorVtx_5_7" x1="E_VtxStr5Cx" y1="E_VtxStr5Cy" x2="E_VtxStr5Bx" y2="E_VtxStr5By" x3="E_SensorVtx_5_0" y3="E_SensorVtx_5_1" x4="E_SensorVtx_5_6" y4="E_SensorVtx_5_7" x5="E_VtxStr5Cx" y5="E_VtxStr5Cy" x6="E_VtxStr5Bx" y6="E_VtxStr5By" x7="E_SensorVtx_5_0" y7="E_SensorVtx_5_1" zhalflength="SensorThickness / 2."/> + + <tubs name="TubeSensor0" rmin="E_SensorRadius_0_0" rmax="E_SensorRadius_0_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/> + + <tubs name="TubeSensor1" rmin="E_SensorRadius_1_0" rmax="E_SensorRadius_1_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/> + + <tubs name="TubeSensor2" rmin="E_SensorRadius_2_0" rmax="E_SensorRadius_2_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_2 / 2" dphi="SensorPhiWidth_2"/> + + <tubs name="TubeSensor3" rmin="E_SensorRadius_3_0" rmax="E_SensorRadius_3_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_3 / 2" dphi="SensorPhiWidth_3"/> + + <tubs name="TubeSensor4" rmin="E_SensorRadius_4_0" rmax="E_SensorRadius_4_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_4 / 2" dphi="SensorPhiWidth_4"/> + + <tubs name="TubeSensor5" rmin="E_SensorRadius_5_0" rmax="E_SensorRadius_5_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_5 / 2" dphi="SensorPhiWidth_5"/> + + <intersection name="ShE_Sensor0"> + <shaperef ref="TubeSensor0"/> + <transformation name="PlaceTrapInTubs0"> + <translation x="E_SensorRadius_0_1"/> + </transformation> + <shaperef ref="TrapSensor0"/> + </intersection> + + <intersection name="ShE_Sensor1"> + <shaperef ref="TubeSensor1"/> + <transformation name="PlaceTrapInTubs1"> + <translation x="E_SensorRadius_1_1"/> + </transformation> + <shaperef ref="TrapSensor1"/> + </intersection> + + <intersection name="ShE_Sensor2"> + <shaperef ref="TubeSensor2"/> + <transformation name="PlaceTrapInTubs2"> + <translation x="E_SensorRadius_2_1"/> + </transformation> + <shaperef ref="TrapSensor2"/> + </intersection> + + <intersection name="ShE_Sensor3"> + <shaperef ref="TubeSensor3"/> + <transformation name="PlaceTrapInTubs3"> + <translation x="E_SensorRadius_3_1"/> + </transformation> + <shaperef ref="TrapSensor3"/> + </intersection> + + <intersection name="ShE_Sensor4"> + <shaperef ref="TubeSensor4"/> + <transformation name="PlaceTrapInTubs4"> + <translation x="E_SensorRadius_4_1"/> + </transformation> + <shaperef ref="TrapSensor4"/> + </intersection> + + <intersection name="ShE_Sensor5"> + <shaperef ref="TubeSensor5"/> + <transformation name="PlaceTrapInTubs5"> + <translation x="E_SensorRadius_5_1"/> + </transformation> + <shaperef ref="TrapSensor5"/> + </intersection> + + <box name="ShBarrelSensor" xhalflength="B_SensorLength / 2" yhalflength="B_SensorWidth / 2" zhalflength="SensorThickness / 2"/> + +</shapes> + +<!-- NB Sensor names use a convention; they are used in atlas_idet.py. Need to add ECSensor4 and 5 --> + +<logvol name="ECSensor0" shape="ShE_Sensor0" material="SiMetal" sensitive="RG_ISE_0" alignable="true"> + <index ref="eta_module" value="0"/> +</logvol> +<logvol name="ECSensor1" shape="ShE_Sensor1" material="SiMetal" sensitive="RG_ISE_1" alignable="true"> + <index ref="eta_module" value="1"/> +</logvol> +<logvol name="ECSensor2" shape="ShE_Sensor2" material="SiMetal" sensitive="RG_ISE_2" alignable="true"> + <index ref="eta_module" value="2"/> +</logvol> +<logvol name="ECSensor3" shape="ShE_Sensor3" material="SiMetal" sensitive="RG_ISE_3" alignable="true"> + <index ref="eta_module" value="3"/> +</logvol> +<logvol name="ECSensor4" shape="ShE_Sensor4" material="SiMetal" sensitive="RG_ISE_4" alignable="true"> + <index ref="eta_module" value="4"/> +</logvol> +<logvol name="ECSensor5" shape="ShE_Sensor5" material="SiMetal" sensitive="RG_ISE_5" alignable="true"> + <index ref="eta_module" value="5"/> +</logvol> + +<logvol name="BRLSensorSS" shape="ShBarrelSensor" material="SiMetal" sensitive="RG_ISB_SS" alignable="true"/> +<logvol name="BRLSensorMS" shape="ShBarrelSensor" material="SiMetal" sensitive="RG_ISB_MS" alignable="true"/> + + + +<defines> + <!-- ABC chip ref. np49-01-104.pdf --> + <var name="ChipT" value="0.31"/> + + <!-- Ref Laura Gonella Intro Talk https://indico.cern.ch/event/676645 --> + <var name="ABC_W" value="7.0"/> + <var name="ABC_L" value="7.9"/> + <var name="ABC_T" value="ChipT"/> + + <var name="HCC_W" value="5.2"/> + <var name="HCC_L" value="3.5"/> + <var name="HCC_T" value="ChipT"/> + + <var name="AMAC_W" value="5.2"/> + <var name="AMAC_L" value="3.5"/> + <var name="AMAC_T" value="ChipT"/> + <!-- Laura G --> + + <!-- Ref. Paulo Moreira GBT status talk, 20?? --> + <var name="GBT_W" value="5.5"/> + <var name="GBT_L" value="5.5"/> + <var name="GBT_T" value="ChipT"/> + + <!-- Ref. Complete guess. Smaller than GBT. --> + <var name="GBT_SCA_W" value="2.5"/> + <var name="GBT_SCA_L" value="2.5"/> + <var name="GBT_SCA_T" value="ChipT"/> + +</defines> + +<shapes> + <box name="shABC_Chip" xhalflength="ABC_W/2" yhalflength="ABC_L/2" zhalflength="ABC_T/2 - EPS"/> + <box name="shHCC_Chip" xhalflength="HCC_W/2" yhalflength="HCC_L/2" zhalflength="HCC_T/2 - EPS"/> + <box name="shGBT_Chip" xhalflength="GBT_W/2" yhalflength="GBT_L/2" zhalflength="GBT_T/2 - EPS"/> + <box name="shGBT_SCA_Chip" xhalflength="GBT_SCA_W/2" yhalflength="GBT_SCA_L/2" zhalflength="GBT_SCA_T/2 - EPS"/> +</shapes> + +<logvol name="ABC_Chip" shape="shABC_Chip" material="SiMetal"/> +<logvol name="HCC_Chip" shape="shHCC_Chip" material="SiMetal"/> +<logvol name="GBT_Chip" shape="shGBT_Chip" material="SiMetal"/> +<logvol name="GBT_SCA_Chip" shape="shGBT_SCA_Chip" material="SiMetal"/> + + +<defines> + <!-- Ref: NP49-01-104.pdf Ver. C 24 June 2014--> + <var name="DCDC_PCB_W" value="8.0"/> + <var name="DCDC_PCB_L" value="53.85"/> + <var name="DCDC_PCB_T" value="0.66"/> + + <var name="E_DCDC_PCB_RadiusMinR0" value="425"/> + <var name="E_DCDC_PCB_RadiusMaxR0" value="435"/> + <var name="E_DCDC_PCB_LengthR0" value="49.0"/> + <var name="E_DCDC_PCB_RadiusMinR1" value="529.1"/> + <var name="E_DCDC_PCB_RadiusMaxR1" value="538.3"/> + <var name="E_DCDC_PCB_LengthR1" value="67.3"/> + <var name="E_DCDC_PCB_RadiusMinR2" value="625.9"/> + <var name="E_DCDC_PCB_RadiusMaxR2" value="634.5"/> + <var name="E_DCDC_PCB_LengthR2" value="67.3"/> + <var name="E_DCDC_PCB_RadiusMinR3" value="693"/> + <var name="E_DCDC_PCB_RadiusMaxR3" value="701.5"/> + <var name="E_DCDC_PCB_LengthR3" value="67.3"/> + <var name="E_DCDC_PCB_RadiusMinR4" value="841.8"/> + <var name="E_DCDC_PCB_RadiusMaxR4" value="850.5"/> + <var name="E_DCDC_PCB_LengthR4" value="67.0"/> + <var name="E_DCDC_PCB_RadiusMinR5" value="934.5"/> + <var name="E_DCDC_PCB_RadiusMaxR5" value="943.0"/> + <var name="E_DCDC_PCB_LengthR5" value="67.0"/> + <var name="E_DCDC_PCB_dPhiR0" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR0"/> + <var name="E_DCDC_PCB_dPhiR1" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR1"/> + <var name="E_DCDC_PCB_dPhiR2" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR2"/> + <var name="E_DCDC_PCB_dPhiR3" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR3"/> + <var name="E_DCDC_PCB_dPhiR4" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR4"/> + <var name="E_DCDC_PCB_dPhiR5" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR5"/> + + + <var name="DCDC_dist_from_PCBend" value="5.1"/> + + <!-- modified to follow Tony Affolder values from his spreadsheet powering-X-calculator-01011v10.xls --> + <var name="DCDC_BoxW" value="8.5"/> + <var name="DCDC_BoxL" value="19.0"/> + <var name="DCDC_BoxT" value="4.5"/> + + + + <var name="DCDC_EC_BoxW" value="DCDC_BoxL"/> + <var name="DCDC_EC_BoxL" value="DCDC_BoxW"/> + <var name="DCDC_EC_BoxT" value="DCDC_BoxT"/> + + <var name="DCDC_R0_PCB_R" value="424.9"/> + <var name="DCDC_R0_PCB_dphi" value="0"/> + <var name="DCDC_R0_Box_R" value="424.9"/> + <var name="DCDC_R0_Box_dphi" value="0"/> + + <var name="DCDC_R1_PCB_R" value="424.9"/> + <var name="DCDC_R1_PCB_dphi" value="0"/> + <var name="DCDC_R1_Box_R" value="424.9"/> + <var name="DCDC_R1_Box_dphi" value="0"/> + + <var name="DCDC_R2_PCB_R" value="424.9"/> + <var name="DCDC_R2_PCB_dphi" value="0"/> + <var name="DCDC_R2_Box_R" value="424.9"/> + <var name="DCDC_R2_Box_dphi" value="0"/> + + <var name="DCDC_R3_PCB_R" value="424.9"/> + <var name="DCDC_R3_PCB_dphi" value="0"/> + <var name="DCDC_R3_Box_R" value="424.9"/> + <var name="DCDC_R3_Box_dphi" value="0"/> + + <var name="DCDC_R4_PCB_R" value="424.9"/> + <var name="DCDC_R4_PCB_dphi" value="0"/> + <var name="DCDC_R4_Box_R" value="424.9"/> + <var name="DCDC_R4_Box_dphi" value="0"/> + + <var name="DCDC_R5_PCB_R" value="424.9"/> + <var name="DCDC_R5_PCB_dphi" value="0"/> + <var name="DCDC_R5_Box_R" value="424.9"/> + <var name="DCDC_R5_Box_dphi" value="0"/> + +</defines> + + +<materials> + <!-- GeoModelXml input created by ConsolidX version 1.1 for DCDC_CoilShield, version 1.0. --> + + <material name="matDCDC_PCB" density="4.928691"> + <elementref ref="Aluminium" fraction="0.000974"/> + <elementref ref="Barium" fraction="0.139637"/> + <elementref ref="Carbon" fraction="0.114105"/> + <elementref ref="Copper" fraction="0.259533"/> + <elementref ref="Gold" fraction="0.001686"/> + <elementref ref="Hydrogen" fraction="0.010639"/> + <elementref ref="Lead" fraction="0.015838"/> + <elementref ref="Nickel" fraction="0.026116"/> + <elementref ref="Oxygen" fraction="0.215126"/> + <elementref ref="Silicon" fraction="0.122968"/> + <elementref ref="Silver" fraction="0.000614"/> + <elementref ref="Tin" fraction="0.044091"/> + <elementref ref="Titanium" fraction="0.048672"/> + </material> + + + + <!-- GeoModelXml input created by ConsolidX for DCDC_CoilShield, version 1.0. --> + <material name="matDCDC_Box" density="0.850484"> + <elementref ref="Aluminium" fraction="0.178664"/> + <elementref ref="Carbon" fraction="0.254920"/> + <elementref ref="Copper" fraction="0.523632"/> + <elementref ref="Hydrogen" fraction="0.042785"/> + </material> +</materials> + +<shapes> + <box name="shDCDC_PCB" xhalflength="DCDC_PCB_W/2" yhalflength="DCDC_PCB_L/2" zhalflength="DCDC_PCB_T/2 - EPS"/> + <box name="shDCDC_Box" xhalflength="DCDC_BoxW/2" yhalflength="DCDC_BoxL/2" zhalflength="DCDC_BoxT/2 - EPS"/> + <tubs name="shDCDC_EC_PCBR0" rmin="E_DCDC_PCB_RadiusMinR0" rmax="E_DCDC_PCB_RadiusMaxR0" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_0 / 2" dphi="E_DCDC_PCB_dPhiR0"/> +<tubs name="shDCDC_EC_PCBR1" rmin="E_DCDC_PCB_RadiusMinR1" rmax="E_DCDC_PCB_RadiusMaxR1" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_1 / 2" dphi="E_DCDC_PCB_dPhiR1"/> + +<tubs name="shDCDC_EC_PCBR2" rmin="E_DCDC_PCB_RadiusMinR2" rmax="E_DCDC_PCB_RadiusMaxR2" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_2 / 2" dphi="E_DCDC_PCB_dPhiR2"/> + <tubs name="shDCDC_EC_PCBR3" rmin="E_DCDC_PCB_RadiusMinR3" rmax="E_DCDC_PCB_RadiusMaxR3" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_3 / 2" dphi="E_DCDC_PCB_dPhiR3"/> +<tubs name="shDCDC_EC_PCBR4" rmin="E_DCDC_PCB_RadiusMinR4" rmax="E_DCDC_PCB_RadiusMaxR4" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_4 / 2" dphi="E_DCDC_PCB_dPhiR4"/> +<tubs name="shDCDC_EC_PCBR5" rmin="E_DCDC_PCB_RadiusMinR5" rmax="E_DCDC_PCB_RadiusMaxR5" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_5 / 2" dphi="E_DCDC_PCB_dPhiR5"/> + <box name="shDCDC_EC_Box" xhalflength="DCDC_EC_BoxW/2" yhalflength="DCDC_EC_BoxL/2" zhalflength="DCDC_EC_BoxT/2 "/> +</shapes> + +<logvol name="DCDC_PCB" shape="shDCDC_PCB" material="matDCDC_PCB"/> +<logvol name="DCDC_Box" shape="shDCDC_Box" material="matDCDC_Box"/> +<logvol name="DCDC_EC_PCBR0" shape="shDCDC_EC_PCBR0" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_PCBR1" shape="shDCDC_EC_PCBR1" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_PCBR2" shape="shDCDC_EC_PCBR2" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_PCBR3" shape="shDCDC_EC_PCBR3" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_PCBR4" shape="shDCDC_EC_PCBR4" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_PCBR5" shape="shDCDC_EC_PCBR5" material="matDCDC_PCB"/> +<logvol name="DCDC_EC_Box" shape="shDCDC_EC_Box" material="matDCDC_Box"/> + + +<defines> + <var name="StereoAngle" value="-26.0e-3"/> + + <var name="B_N_SensorsPerFace" value="14"/> + + <!-- Most dimensions from NP49-01-100.pdf, 27-AUG-2014 --> + <var name="B_SensorGap" value="98.0 - B_SensorLength"/> + + <var name="StaveCoreWidth" value="115."/> + <var name="StaveCoreExtraLength" value="3.0"/> + <var name="StaveCoreLength" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) + StaveCoreExtraLength"/> + + <var name="CoreToSiDistAtEta0" value="0.0"/> <!-- Overhangs!! Or you need a very special shape at the end. --> + <var name="StaveFaceTranslation" value="-((B_N_SensorsPerFace - 1) / 2 * (B_SensorLength + B_SensorGap) + StaveCoreExtraLength / 2) + CoreToSiDistAtEta0"/> + + <!-- Stave core thickness built up in following order: --> + <var name="StaveHoneycombT" value="5.2 + 0.078"/> <!-- Small correction to make Si-Si mid dist. 6.42. + NPH logbook UG20 29/4/2016 --> + <var name="StaveFacesheetT" value="0.15"/> + <var name="StaveBusGlueT" value="2 * 0.025 + 0.1"/> <!-- Includes module-to-bus glue, 0.1 mm --> + <var name="StaveBusKaptonT" value="3 * 0.025"/> + <var name="StaveCoreT" value="StaveHoneycombT + 2 * (StaveFacesheetT + StaveBusGlueT + StaveBusKaptonT)"/> + <var name="StaveBusCuT" value="0.018"/> + <var name="StavePlankT" value="StaveCoreT + 4 * StaveBusCuT"/> + + <var name="EOSCoreWidth" value="50."/> + <var name="EOSCoreLength" value="100."/> + <var name="EOSCoreT" value="StaveCoreT"/> + + <var name="StaveCloseoutFarEndL" value="StaveCoreWidth"/> + <var name="StaveCloseoutFarEndT" value="StaveHoneycombT"/> + <!-- Reference e-mail from Peter Sutcliffe to Nigel, 13 Jan 2016 --> + <var name="StaveCloseoutFarEndW" value="(1754. + 328.) / StaveCloseoutFarEndL / StaveCloseoutFarEndT"/> + + <var name="StaveCloseoutEOS_EndL" value="StaveCoreWidth + EOSCoreWidth"/> + <var name="StaveCloseoutEOS_EndT" value="StaveHoneycombT"/> + <var name="StaveCloseoutEOS_EndW" value="10.0"/> <!-- Temp. Guessed! --> + + <var name="StaveCloseoutLongL" value="StaveCoreLength - StaveCloseoutEOS_EndW - StaveCloseoutFarEndW"/> + <var name="StaveCloseoutLongT" value="2 * 0.05"/> <!-- We do the C as a | of double thickness --> + <var name="StaveCloseoutLongW" value="StaveHoneycombT"/> + + <var name="StaveCloseoutLongEOS_L" value="StaveCoreLength - EOSCoreLength - StaveCloseoutFarEndW"/> + + <!-- Center, Intermediate, End stavemounts: Masses are 19g, 13.1g, 10g from Stephanie Yang 15/05/2018 --> + <var name="StaveMountL" value="20.0"/> + <var name="StaveMountR" value="12.5"/> <!-- Must be small to miss support cylinder and next stave --> + <var name="NumStaveMounts" value="5"/> + <vector name="StaveMountThickness" value="35. 33. 35."/> + <vector name="StaveMountHeight" value="8. 8. 8."/> + <vector name="StaveMountLength" value="21. 28.13 21.5"/> + <var name="NumStaveMountsI" value="4"/><!-- Center and End have 1 each, Intermediate has 4 --> + <var name="StaveMountIGap" value="294."/><!-- Based on drawings, may not be accurate? --> + + <!-- Stave Bus Copper dimensions Ref LB. UG20, 7/1/2016: --> + <var name="StaveTrackWidth" value="0.100"/> + <var name="StaveI2C_Width" value="0.200"/> + + <var name="StaveGroundEOS_L" value="92."/> + <var name="StaveGroundEOS_W" value="12.5"/> + <var name="StaveGroundEOS_FromEnd" value="10.5"/> + <var name="StaveGroundEOS_FromTop" value="4.2"/> + + <var name="StaveGroundPowerL_Corr" value="48."/> + <var name="StaveGroundPowerL" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) - StaveGroundPowerL_Corr"/> + <var name="StaveGroundPowerW" value="12.0 + StaveI2C_Width + B_N_SensorsPerFace * 71.3 / StaveGroundPowerL"/> + <var name="StaveGroundPowerFromEnd" value="StaveGroundEOS_FromEnd + StaveGroundEOS_W"/> + <var name="StaveGroundPowerFromTop" value="StaveGroundEOS_FromTop + StaveGroundEOS_L - StaveGroundPowerW"/> + + <var name="StaveGroundSignalL" value="StaveGroundPowerL"/> + <var name="StaveGroundSignalW" value="11.5"/> + <var name="StaveGroundSignalFromEnd" value="StaveGroundEOS_FromEnd + StaveGroundEOS_W"/> + <var name="StaveGroundSignalFromTop" value="1.0"/> + + <var name="StaveSignalEOS_L" value="95."/> + <var name="StaveSignalEOS_W" value="13.15"/> + <var name="StaveSignalEOS_FromEnd" value="9.0"/> + <var name="StaveSignalEOS_FromTop" value="1.4"/> + + <var name="StaveSignalPowerL_Corr" value="48."/> + <var name="StaveSignalPowerL" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) - StaveSignalPowerL_Corr"/> + <var name="StaveSignalPowerW" value="13.15 + B_N_SensorsPerFace * 89.3 / StaveSignalPowerL"/> + <var name="StaveSignalPowerFromEnd" value="StaveSignalEOS_FromEnd + StaveSignalEOS_W"/> + <var name="StaveSignalPowerFromTop" value="StaveSignalEOS_FromTop + StaveSignalEOS_L - StaveSignalPowerW"/> + + <var name="StaveSignalSignalL" value="StaveSignalPowerL"/> + <var name="StaveSignalSSSignalBigW" value="(3 + 2 * B_N_SensorsPerFace) * 2 * StaveTrackWidth"/> + <var name="StaveSignalSSSignalSmallW" value="(3 + 2) * 2 * StaveTrackWidth"/> + <var name="StaveSignalMSSignalBigW" value="(3 + B_N_SensorsPerFace) * 2 * StaveTrackWidth"/> + <var name="StaveSignalMSSignalSmallW" value="(3 + 1) * 2 * StaveTrackWidth"/> + <var name="StaveSignalSignalFromEnd" value="StaveSignalEOS_FromEnd + StaveSignalEOS_W"/> + <var name="StaveSignalSignalFromTop" value="StaveSignalEOS_FromTop"/> + + <var name="StaveCFoamT" value="StaveHoneycombT"/> + <var name="StaveCFoamW" value="10.0"/> + <var name="StaveCoolingL" value="StaveCoreLength - StaveCloseoutEOS_EndW - StaveCloseoutFarEndW"/> + <var name="StaveCoolingOffset" value="25."/> + <var name="StaveCoolingPipeOD" value="2.275"/> + <var name="StaveCoolingPipeID" value="1.975"/> <!-- 0.1 mm wall thickness on drawing, but not yet achieved so thicker --> + + <var name="StaveEOS_CFoamL" value="60.0"/> <!-- Ref: np49-01-141.pdf 1/3/2016 --> + <var name="StaveEOS_CFoamW" value="73.5"/> <!-- Ref: np49-01-141.pdf 1/3/2016 --> + + <vector name="N_StavesInCyl" value="28 40 56 72"/> + <vector name="CylRadius" value="399. 562. 762. 1000."/><!-- B0 405 to 399, E-mail Charles Evans 2018-08-10 --> + <vector name="TiltAngle" value="0.22689280 0.20943951 0.20943951 0.191986"/> + <!-- 13 12 12 11 degrees converted to radians, E-mail Ian Wilmut 2018-03-15 and Charles Evans (B0) 2018-08-10 --> + + <var name="CylEnvelopeThO" value="55."/> <!-- coreT/2 + EOS_T + rotation + spare ~ 3 + 5 + 24 + 10 currently 44--> + + + <var name="StaveGapZ0" value="0.1"/> <!-- each stave shifted this much at z = 0 --> + + <var name="StaveSupportCylLength" value="2. * StaveCoreLength"/> + <var name="StaveHeightAboveCyl" value="21."/> <!-- Must not push top-hats inwards beyond inner radius of Strip env. UPDATE 05/02/2018: Parameter currently deprecated --> + <var name="StaveSupportCylThickness" value="0.6"/> <!-- Constant throughout the barrel layers --> + + <var name="StaveCylHatThickness" value="0.7"/> + <var name="StaveCylHatFootWidth" value="10."/> + <vector name="StaveCylHatWallHeight" value="14. 35. 35. 35."/> <!-- Top Hats not uniform between layers --> + <vector name="StaveCylHatTopWidth" value="8. 7. 7. 7."/> + <var name="NumberOfHatsPerCyl" value="9"/> + <vector name="StaveCylWallWidth" value="16. 16.5 16.5 16.5"/> + <var name="StaveCylHatGap" value="0.4"/><!-- Does this parameter exist? 21/02/2018: Currently does not--> + + <vector name="BarrelRadius" value="347. 496. 685. 923."/> <!-- "347.6 502.4 702.9 923.9"/> From the INNER DIAMETER --> + + <var name="InnerPolyModThickness" value="20."/> + <var name="InnerPolyModHalfLength" value="1150.0"/><!-- Was "StaveCoreLength - EOSCoreLength - 50.0" try 1150." --> + + <var name="ZBraceLength" value="PolymoderatorOCInnerRadius - BarrelRadius_0 - 3."/> <!-- Drawing is 713.02 --> + <vector name="ZBraceWidth" value="33. 42."/> <!-- Total Width is 75, split into two pieces --> + <vector name="ZBraceThickness" value="8. 1."/> + <vector name="ZBraceTooth" value="18.98 128.5 145.5 98. 22.4"/> + <var name="ZBraceToothSpace" value="75."/> + <var name="NumberOfZBraces" value="4"/> + + + <var name="FlangeFootLength" value="17.2"/> + <var name="FlangeThickness" value="2."/> + <vector name="FlangeHeight" value="20.4 35. 35. 35."/> + <var name="FlangeSubLength" value="20."/> + <var name="FlangeSlantLength" value="18."/> + + <vector name="InterlinkSurfaceArea" value="5869.44 7844.48 7058.43 4477.66"/> + + <var name="InterlinkThickness" value="2."/> + <vector name="InterlinkFootHeight" value="11. 16. 16. 16."/> + <vector name="InterlinkFootWidth" value="49.94 54.8 58.46 56.08"/> + <vector name="InterlinkFootAngle" value="0.698132 0.837758 0.77230819 0.64786622"/> + <vector name="InterlinkBridgeLength" value="148.16 113.86 177.3 97.21"/> + <var name="InterlinkBridgeWidth" value="19."/> + <var name="InterlinkHatHeight" value="16."/> <!-- Barrel 4 interlink differs in hat parameters --> + <vector name="InterlinkHatWidth" value="54.27 78.59 57.32"/> + <vector name="InterlinkHatAngle" value="2.16421 2.09526777 2.197195 2.6267205"/> + +</defines> + + +<!-- CNL_n meanings for barrel: + + n Meaning Range +=================================== + 0 SCT 0 + 1 SCTBarrel 0 + 2 StripB 0 + 3 Cylinder 0 (! All cylinders are unique, never copied) + 4 StavePair 0 - 72; depends on which barrel + 5 Stave 0 - 1 + 6 StaveFace 0 - 1 + 7 Module 0 - 13 + 8 Sensor 0 +--> + +<shapes> + <tube name="shStripB_Cyl0" rmin="BarrelRadius_0 + EPS" rmax="BarrelRadius_0 + StaveSupportCylThickness - EPS" zhalflength="StaveSupportCylLength / 2.0"/> + <!-- For top-hats on inside of cylinder: --> + <tube name="shStaveCylHatFoot0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/> + <cons name="shStaveCylHatWall0" rmin1="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0" rmax1="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_0" rmin2="BarrelRadius_0 + StaveSupportCylThickness" rmax2="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_0 / 2."/> + <tube name="shStaveCylHatTop0" rmin="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0" rmax="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_0 / 2."/> + + <tube name="shStripB_Cyl1" rmin="BarrelRadius_1" rmax="BarrelRadius_1 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/> + <tube name="shStaveCylHatFoot1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/> + <cons name="shStaveCylHatWall1" rmin1="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1" rmax1="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_1" rmin2="BarrelRadius_1 + StaveSupportCylThickness" rmax2="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_1 / 2."/> + <tube name="shStaveCylHatTop1" rmin="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1" rmax="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_1 / 2."/> + + <tube name="shStripB_Cyl2" rmin="BarrelRadius_2" rmax="BarrelRadius_2 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/> + <tube name="shStaveCylHatFoot2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/> + <cons name="shStaveCylHatWall2" rmin1="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2" rmax1="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_2" rmin2="BarrelRadius_2 + StaveSupportCylThickness" rmax2="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_2 / 2."/> + <tube name="shStaveCylHatTop2" rmin="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2" rmax="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_2 / 2."/> + + <tube name="shStripB_Cyl3" rmin="BarrelRadius_3" rmax="BarrelRadius_3 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/> + <tube name="shStaveCylHatFoot3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/> + <cons name="shStaveCylHatWall3" rmin1="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3" rmax1="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_3" rmin2="BarrelRadius_3 + StaveSupportCylThickness" rmax2="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_0 / 2."/> + <tube name="shStaveCylHatTop3" rmin="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3" rmax="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_3 / 2."/> + + <tube name="shFlangeWall0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0" zhalflength="FlangeThickness"/> + <cons name="shFlangeWallSlant0" rmin1="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - FlangeThickness" rmax1="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0" rmin2="BarrelRadius_0 + StaveSupportCylThickness" rmax2="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/> + <tube name="shFlangeFoot0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/> + <tube name="shFlangeHat0" rmin="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - FlangeThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - EPS" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/> + <tube name="shFlangeFloor0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/> + + <tube name="shFlangeWall1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" zhalflength="FlangeThickness"/> + <cons name="shFlangeWallSlant1" rmin1="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1 - FlangeThickness" rmax1="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" rmin2="BarrelRadius_1 + StaveSupportCylThickness" rmax2="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/> + <tube name="shFlangeFoot1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/> + <tube name="shFlangeHat1" rmin="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1 - FlangeThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/> + <tube name="shFlangeFloor1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/> + + <tube name="shFlangeWall2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" zhalflength="FlangeThickness"/> + <cons name="shFlangeWallSlant2" rmin1="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2 - FlangeThickness" rmax1="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" rmin2="BarrelRadius_2 + StaveSupportCylThickness" rmax2="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/> + <tube name="shFlangeFoot2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/> + <tube name="shFlangeHat2" rmin="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2 - FlangeThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/> + <tube name="shFlangeFloor2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/> + + <tube name="shFlangeWall3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" zhalflength="FlangeThickness"/> + <cons name="shFlangeWallSlant3" rmin1="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3 - FlangeThickness" rmax1="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" rmin2="BarrelRadius_3 + StaveSupportCylThickness" rmax2="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/> + <tube name="shFlangeFoot3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/> + <tube name="shFlangeHat3" rmin="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3 - FlangeThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/> + <tube name="shFlangeFloor3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/> + + <!-- Capital i for Inner, capital o for outer --> + <box name="shZBraceSpineI" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceLength / 2." zhalflength="ZBraceWidth_0 / 2."/> + + <box name="shZBraceTeeth0I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_0 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth1I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_1 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth2I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_2 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth3I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_3 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth4I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_4 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <tube name="TestCircle" rmin="0." rmax="10." zhalflength="20."/> + + <!-- Adding teeth one at a time--> + <union name="shZBrace1TeethI"> + <shaperef ref="shZBraceSpineI"/> + <transformation name="PlaceZBraceTooth0dI"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth0I"/> + </union> + + <union name="shZBrace2TeethI"> + <shaperef ref="shZBrace1TeethI"/> + <transformation name="PlaceZBraceTooth1dI"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth1I"/> + </union> + + <union name="shZBrace3TeethI"> + <shaperef ref="shZBrace2TeethI"/> + <transformation name="PlaceZBraceTooth2dI"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 - ZBraceToothSpace - ZBraceTooth_2 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth2I"/> + </union> + + <union name="shZBrace4TeethI"> + <shaperef ref="shZBrace3TeethI"/> + <transformation name="PlaceZBraceTooth3dI"> + <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 - ZBraceToothSpace - ZBraceTooth_3 / 2.)"/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth3I"/> + </union> + + <union name="shZBrace5TeethI"> + <shaperef ref="shZBrace4TeethI"/> + <transformation name="PlaceZBraceTooth4dI"> + <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 / 2.)"/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth4I"/> + </union> + + + + <box name="shZBraceSpineO" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceLength / 2." zhalflength="ZBraceWidth_0 / 2."/> + + <box name="shZBraceTeeth0O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_0 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth1O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_1 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth2O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_2 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth3O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_3 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <box name="shZBraceTeeth4O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_4 / 2." zhalflength="ZBraceWidth_1 / 2."/> + + <union name="shZBrace1TeethO"> + <shaperef ref="shZBraceSpineO"/> + <transformation name="PlaceZBraceTooth0dO"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth0O"/> + </union> + + <union name="shZBrace2TeethO"> + <shaperef ref="shZBrace1TeethO"/> + <transformation name="PlaceZBraceTooth1dO"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth1O"/> + </union> + + <union name="shZBrace3TeethO"> + <shaperef ref="shZBrace2TeethO"/> + <transformation name="PlaceZBraceTooth2dO"> + <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 - ZBraceToothSpace - ZBraceTooth_2 / 2."/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth2O"/> + </union> + + <union name="shZBrace4TeethO"> + <shaperef ref="shZBrace3TeethO"/> + <transformation name="PlaceZBraceTooth3dO"> + <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 - ZBraceToothSpace - ZBraceTooth_3 / 2.)"/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth3O"/> + </union> + + <union name="shZBrace5TeethO"> + <shaperef ref="shZBrace4TeethO"/> + <transformation name="PlaceZBraceTooth4dO"> + <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 / 2.)"/> + <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/> + </transformation> + <shaperef ref="shZBraceTeeth4O"/> + </union> + + + <trap name="shInterlinkCuboid0" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_0 / ( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0) / sin( InterlinkFootAngle_0) ) ) / 2." dxdyndzn="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." dxdypdzn="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." angleydzn="InterlinkFootAngle_0" dydzp="(InterlinkSurfaceArea_0 / ( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) ) / 2." dxdyndzp="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." dxdypdzp="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." angleydzp="InterlinkFootAngle_0"/> + + <trap name="shInterlinkCuboid1" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_1 / ( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) ) / 2." dxdyndzn="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." dxdypdzn="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." angleydzn="InterlinkFootAngle_1" dydzp="(InterlinkSurfaceArea_1 / ( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) ) / 2." dxdyndzp="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." dxdypdzp="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." angleydzp="InterlinkFootAngle_1"/> + + <trap name="shInterlinkCuboid2" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_2 / ( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) ) / 2." dxdyndzn="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." dxdypdzn="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." angleydzn="InterlinkFootAngle_2" dydzp="(InterlinkSurfaceArea_2 / ( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) ) / 2." dxdyndzp="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." dxdypdzp="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." angleydzp="InterlinkFootAngle_2"/> + + <trap name="shInterlinkCuboid3" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_3 / ( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) ) / 2." dxdyndzn="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." dxdypdzn="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." angleydzn="InterlinkFootAngle_3" dydzp="(InterlinkSurfaceArea_3 / ( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) ) / 2." dxdyndzp="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." dxdypdzp="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." angleydzp="InterlinkFootAngle_3"/> + + +</shapes> + +<logvol name="StaveCylHatFoot0" shape="shStaveCylHatFoot0" material="CFRP"/> +<logvol name="StaveCylHatWall0" shape="shStaveCylHatWall0" material="CFRP"/> +<logvol name="StaveCylHatTop0" shape="shStaveCylHatTop0" material="CFRP"/> + +<logvol name="StaveCylHatFoot1" shape="shStaveCylHatFoot1" material="CFRP"/> +<logvol name="StaveCylHatWall1" shape="shStaveCylHatWall1" material="CFRP"/> +<logvol name="StaveCylHatTop1" shape="shStaveCylHatTop1" material="CFRP"/> + +<logvol name="StaveCylHatFoot2" shape="shStaveCylHatFoot2" material="CFRP"/> +<logvol name="StaveCylHatWall2" shape="shStaveCylHatWall2" material="CFRP"/> +<logvol name="StaveCylHatTop2" shape="shStaveCylHatTop2" material="CFRP"/> + +<logvol name="StaveCylHatFoot3" shape="shStaveCylHatFoot3" material="CFRP"/> +<logvol name="StaveCylHatWall3" shape="shStaveCylHatWall3" material="CFRP"/> +<logvol name="StaveCylHatTop3" shape="shStaveCylHatTop3" material="CFRP"/> + +<logvol name="ZBraceI" shape="shZBrace5TeethI" material="Honeycomb2pcf"/><!-- Not totally accurate, density is about 0.038 not 0.032 --> +<logvol name="ZBraceO" shape="shZBrace5TeethO" material="CFRP"/> + +<logvol name="FlangeFoot0" shape="shFlangeFoot0" material="CFRP"/> +<logvol name="FlangeHat0" shape="shFlangeHat0" material="CFRP"/> +<logvol name="FlangeFloor0" shape="shFlangeFloor0" material="CFRP"/> +<logvol name="FlangeWall0" shape="shFlangeWall0" material="CFRP"/> +<logvol name="FlangeWallSlant0" shape="shFlangeWallSlant0" material="CFRP"/> + +<logvol name="FlangeFoot1" shape="shFlangeFoot1" material="CFRP"/> +<logvol name="FlangeHat1" shape="shFlangeHat1" material="CFRP"/> +<logvol name="FlangeFloor1" shape="shFlangeFloor1" material="CFRP"/> +<logvol name="FlangeWall1" shape="shFlangeWall1" material="CFRP"/> +<logvol name="FlangeWallSlant1" shape="shFlangeWallSlant1" material="CFRP"/> + +<logvol name="FlangeFoot2" shape="shFlangeFoot2" material="CFRP"/> +<logvol name="FlangeHat2" shape="shFlangeHat2" material="CFRP"/> +<logvol name="FlangeFloor2" shape="shFlangeFloor2" material="CFRP"/> +<logvol name="FlangeWall2" shape="shFlangeWall2" material="CFRP"/> +<logvol name="FlangeWallSlant2" shape="shFlangeWallSlant2" material="CFRP"/> + +<logvol name="FlangeFoot3" shape="shFlangeFoot3" material="CFRP"/> +<logvol name="FlangeHat3" shape="shFlangeHat3" material="CFRP"/> +<logvol name="FlangeFloor3" shape="shFlangeFloor3" material="CFRP"/> +<logvol name="FlangeWall3" shape="shFlangeWall3" material="CFRP"/> +<logvol name="FlangeWallSlant3" shape="shFlangeWallSlant3" material="CFRP"/> + +<logvol name="Interlink0" shape="shInterlinkCuboid0" material="CFRP"/> +<logvol name="Interlink1" shape="shInterlinkCuboid1" material="CFRP"/> +<logvol name="Interlink2" shape="shInterlinkCuboid2" material="CFRP"/> +<logvol name="Interlink3" shape="shInterlinkCuboid3" material="CFRP"/> + + + +<assembly name="Flange0"> + <logvolref ref="FlangeWall0"/> + + <transform name="PutFlangeFoot0"> + <transformation name="PlaceFlangeFoot0"> + <translation z="FlangeFootLength / 2."/> + </transformation> + <logvolref ref="FlangeFoot0"/> + </transform> + + <transform name="PutFlangeHat0"> + <transformation name="PlaceFlangeHat0"> + <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/> + </transformation> + <logvolref ref="FlangeHat0"/> + </transform> + + <transform name="PutFlangeSlant0"> + <transformation name="PlaceFlangeSlant0"> + <translation z="FlangeSubLength + FlangeSlantLength / 2."/> + </transformation> + <logvolref ref="FlangeWallSlant0"/> + </transform> + + <transform name="PutFlangeFloor0"> + <transformation name="PlaceFlangeFloor0"> + <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/> + </transformation> + <logvolref ref="FlangeFloor0"/> + </transform> +</assembly> + +<assembly name="Flange1"> + <logvolref ref="FlangeWall1"/> + + <transform name="PutFlangeFoot1"> + <transformation name="PlaceFlangeFoot1"> + <translation z="FlangeFootLength / 2."/> + </transformation> + <logvolref ref="FlangeFoot1"/> + </transform> + + <transform name="PutFlangeHat1"> + <transformation name="PlaceFlangeHat1"> + <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/> + </transformation> + <logvolref ref="FlangeHat1"/> + </transform> + + <transform name="PutFlangeSlant1"> + <transformation name="PlaceFlangeSlant1"> + <translation z="FlangeSubLength + FlangeSlantLength / 2."/> + </transformation> + <logvolref ref="FlangeWallSlant1"/> + </transform> + + <transform name="PutFlangeFloor1"> + <transformation name="PlaceFlangeFloor1"> + <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/> + </transformation> + <logvolref ref="FlangeFloor1"/> + </transform> +</assembly> + +<assembly name="Flange2"> + <logvolref ref="FlangeWall2"/> + + <transform name="PutFlangeFoot2"> + <transformation name="PlaceFlangeFoot2"> + <translation z="FlangeFootLength / 2."/> + </transformation> + <logvolref ref="FlangeFoot2"/> + </transform> + + <transform name="PutFlangeHat2"> + <transformation name="PlaceFlangeHat2"> + <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/> + </transformation> + <logvolref ref="FlangeHat2"/> + </transform> + + <transform name="PutFlangeSlant2"> + <transformation name="PlaceFlangeSlant2"> + <translation z="FlangeSubLength + FlangeSlantLength / 2."/> + </transformation> + <logvolref ref="FlangeWallSlant2"/> + </transform> + + <transform name="PutFlangeFloor2"> + <transformation name="PlaceFlangeFloor2"> + <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/> + </transformation> + <logvolref ref="FlangeFloor2"/> + </transform> +</assembly> + +<assembly name="Flange3"> + <logvolref ref="FlangeWall3"/> + + <transform name="PutFlangeFoot3"> + <transformation name="PlaceFlangeFoot3"> + <translation z="FlangeFootLength / 2."/> + </transformation> + <logvolref ref="FlangeFoot3"/> + </transform> + + <transform name="PutFlangeHat3"> + <transformation name="PlaceFlangeHat3"> + <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/> + </transformation> + <logvolref ref="FlangeHat3"/> + </transform> + + <transform name="PutFlangeSlant3"> + <transformation name="PlaceFlangeSlant3"> + <translation z="FlangeSubLength + FlangeSlantLength / 2."/> + </transformation> + <logvolref ref="FlangeWallSlant3"/> + </transform> + + <transform name="PutFlangeFloor3"> + <transformation name="PlaceFlangeFloor3"> + <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/> + </transformation> + <logvolref ref="FlangeFloor3"/> + </transform> +</assembly> + +<assembly name="ZBrace"> <!-- Single ZBrace panel, shifted upwards --> + <transform name="ShiftedZBrace"> + <transformation name="ShiftZBraceUp"> + <translation y="BarrelRadius_0 + ZBraceLength / 2."/> + </transformation> + <logvolref ref="ZBraceI"/> + </transform> + + <transform name="ZBraceL"> + <transformation name="PutZBraceL"> + <translation x="ZBraceThickness_0 / 2. + ZBraceThickness_1 / 2."/> + <translation y="BarrelRadius_0 + ZBraceLength / 2."/> + </transformation> + <logvolref ref="ZBraceO"/> + </transform> + + <transform name="ZBraceR"> + <transformation name="PutZBraceR"> + <translation x="-(ZBraceThickness_0 / 2. + ZBraceThickness_1 / 2.)"/> + <translation y="BarrelRadius_0 + ZBraceLength / 2."/> + </transformation> + <logvolref ref="ZBraceO"/> + </transform> +</assembly> + +<assembly name="ZBraceCap"> <!-- Multicopied, to be placed --> + <multicopy name="PlaceZBraces" n="NumberOfZBraces"> + <transformation name="RotateZBraces"> + <rotation zcos="1." angle="2*PI / NumberOfZBraces"/> + </transformation> + <assemblyref ref="ZBrace"/> + </multicopy> +</assembly> + +<assembly name="TempInterlink0"> + <transform> + <transformation name="PlaceInterlinkTest0Pos"> + <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/> + <translation x="BarrelRadius_0 + ( (BarrelRadius_1 - BarrelRadius_0) / 2. + FlangeHeight_0 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_0"/> + </transformation> + <logvolref ref="Interlink0"/> + </transform> + <transform> + <transformation name="PlaceInterlinkTest0Neg"> + <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/> + <translation x="BarrelRadius_0 + ( (BarrelRadius_1 - BarrelRadius_0) / 2. + FlangeHeight_0 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_0"/> + </transformation> + <logvolref ref="Interlink0"/> + </transform> +</assembly> + +<assembly name="TempInterlink1"> + <transform> + <transformation name="PlaceInterlinkTest1Pos"> + <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/> + <translation x="BarrelRadius_1 + ( (BarrelRadius_2 - BarrelRadius_1) / 2. + FlangeHeight_1 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_1"/> + </transformation> + <logvolref ref="Interlink1"/> + </transform> + <transform> + <transformation name="PlaceInterlinkTest1Neg"> + <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/> + <translation x="BarrelRadius_1 + ( (BarrelRadius_2 - BarrelRadius_1) / 2. + FlangeHeight_1 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_1"/> + </transformation> + <logvolref ref="Interlink1"/> + </transform> +</assembly> + +<assembly name="TempInterlink2"> + <transform> + <transformation name="PlaceInterlinkTest2Pos"> + <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/> + <translation x="BarrelRadius_2 + ( (BarrelRadius_3 - BarrelRadius_2) / 2. + FlangeHeight_2 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_2"/> + </transformation> + <logvolref ref="Interlink2"/> + </transform> + <transform> + <transformation name="PlaceInterlinkTest2Neg"> + <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/> + <translation x="BarrelRadius_2 + ( (BarrelRadius_3 - BarrelRadius_2) / 2. + FlangeHeight_2 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_2"/> + </transformation> + <logvolref ref="Interlink2"/> + </transform> +</assembly> + +<assembly name="TempInterlink3"> + <transform> + <transformation name="PlaceInterlinkTest3Pos"> + <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/> + <translation x="BarrelRadius_3 + ( (PolymoderatorOCInnerRadius - BarrelRadius_3) / 2. + FlangeHeight_3 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_3"/> + </transformation> + <logvolref ref="Interlink3"/> + </transform> + <transform> + <transformation name="PlaceInterlinkTest3Neg"> + <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/> + <translation x="BarrelRadius_3 + ( (PolymoderatorOCInnerRadius - BarrelRadius_3) / 2. + FlangeHeight_3 / 4.)"/> + <rotation zcos="1." angle="InterlinkFootAngle_3"/> + </transformation> + <logvolref ref="Interlink3"/> + </transform> +</assembly> + +<assembly name="StaveCylHat0"> + <logvolref ref="StaveCylHatTop0"/> + + <transform> + <transformation name="PlaceStaveCylHatWall0Low"> + <translation z="-(StaveCylHatTopWidth_0 / 2. + StaveCylWallWidth_0 / 2.)"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <logvolref ref="StaveCylHatWall0"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatWall0High"> + <translation z="StaveCylHatTopWidth_0 / 2. + StaveCylWallWidth_0 / 2."/> + </transformation> + <logvolref ref="StaveCylHatWall0"/> + </transform> + + <transform> + <transformation name="PlaceStaveCylHatFoot0Low"> + <translation z="-(StaveCylHatTopWidth_0 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_0)"/> + </transformation> + <logvolref ref="StaveCylHatFoot0"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatFoot0High"> + <translation z="StaveCylHatTopWidth_0 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_0"/> + </transformation> + <logvolref ref="StaveCylHatFoot0"/> + </transform> +</assembly> + +<assembly name="StaveCylHat1"> + <logvolref ref="StaveCylHatTop1"/> + + <transform> + <transformation name="PlaceStaveCylHatWall1Low"> + <translation z="-(StaveCylHatTopWidth_1 / 2. + StaveCylWallWidth_1 / 2.)"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <logvolref ref="StaveCylHatWall1"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatWall1High"> + <translation z="StaveCylHatTopWidth_1 / 2. + StaveCylWallWidth_1 / 2."/> + </transformation> + <logvolref ref="StaveCylHatWall1"/> + </transform> + + <transform> + <transformation name="PlaceStaveCylHatFoot1Low"> + <translation z="-(StaveCylHatTopWidth_1 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_1)"/> + </transformation> + <logvolref ref="StaveCylHatFoot1"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatFoot1High"> + <translation z="StaveCylHatTopWidth_1 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_1"/> + </transformation> + <logvolref ref="StaveCylHatFoot1"/> + </transform> +</assembly> + +<assembly name="StaveCylHat2"> + <logvolref ref="StaveCylHatTop2"/> + + <transform> + <transformation name="PlaceStaveCylHatWall2Low"> + <translation z="-(StaveCylHatTopWidth_2 / 2. + StaveCylWallWidth_2 / 2.)"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <logvolref ref="StaveCylHatWall2"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatWall2High"> + <translation z="StaveCylHatTopWidth_2 / 2. + StaveCylWallWidth_2 / 2."/> + </transformation> + <logvolref ref="StaveCylHatWall2"/> + </transform> + + <transform> + <transformation name="PlaceStaveCylHatFoot2Low"> + <translation z="-(StaveCylHatTopWidth_2 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_2)"/> + </transformation> + <logvolref ref="StaveCylHatFoot2"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatFoot2High"> + <translation z="StaveCylHatTopWidth_2 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_2"/> + </transformation> + <logvolref ref="StaveCylHatFoot2"/> + </transform> +</assembly> + +<assembly name="StaveCylHat3"> + <logvolref ref="StaveCylHatTop3"/> + + <transform> + <transformation name="PlaceStaveCylHatWall3Low"> + <translation z="-(StaveCylHatTopWidth_3 / 2. + StaveCylWallWidth_3 / 2.)"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <logvolref ref="StaveCylHatWall3"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatWall3High"> + <translation z="StaveCylHatTopWidth_3 / 2. + StaveCylWallWidth_3 / 2."/> + </transformation> + <logvolref ref="StaveCylHatWall3"/> + </transform> + + <transform> + <transformation name="PlaceStaveCylHatFoot3Low"> + <translation z="-(StaveCylHatTopWidth_3 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_3)"/> + </transformation> + <logvolref ref="StaveCylHatFoot3"/> + </transform> + <transform> + <transformation name="PlaceStaveCylHatFoot3High"> + <translation z="StaveCylHatTopWidth_3 / 2. + StaveCylHatFootWidth / 2. + StaveCylWallWidth_3"/> + </transformation> + <logvolref ref="StaveCylHatFoot3"/> + </transform> +</assembly> + +<assembly name="Barrel0Support"> + <logvol name="StripB_Cyl0" shape="shStripB_Cyl0" material="CFRP"/> + + <multicopy name="PlaceHatsCyl0" n="NumberOfHatsPerCyl"> + <transformation name="TranslateHatsCyl0"> + <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceTopHatAtLowEnd0"> + <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <assemblyref ref="StaveCylHat0"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceFlangeAtPosEnd0"> + <translation z="StaveSupportCylLength / 2. - FlangeThickness"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="Flange0"/> + </transform> + + <transform> + <transformation name="PlaceFlangeAtNegEnd0"> + <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/> + </transformation> + <assemblyref ref="Flange0"/> + </transform> + +</assembly> + +<assembly name="Barrel1Support"> + <logvol name="StripB_Cyl1" shape="shStripB_Cyl1" material="CFRP"/> + + <multicopy name="PlaceHatsCyl1" n="NumberOfHatsPerCyl"> + <transformation name="TranslateHatsCyl1"> + <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceTopHatAtLowEnd1"> + <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <assemblyref ref="StaveCylHat1"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceFlangeAtPosEnd1"> + <translation z="StaveSupportCylLength / 2. - FlangeThickness"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="Flange1"/> + </transform> + + <transform> + <transformation name="PlaceFlangeAtNegEnd1"> + <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/> + </transformation> + <assemblyref ref="Flange1"/> + </transform> + +</assembly> + +<assembly name="Barrel2Support"> + <logvol name="StripB_Cyl2" shape="shStripB_Cyl2" material="CFRP"/> + + <multicopy name="PlaceHatsCyl2" n="NumberOfHatsPerCyl"> + <transformation name="TranslateHatsCyl2"> + <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceTopHatAtLowEnd2"> + <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <assemblyref ref="StaveCylHat2"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceFlangeAtPosEnd2"> + <translation z="StaveSupportCylLength / 2. - FlangeThickness"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="Flange2"/> + </transform> + + <transform> + <transformation name="PlaceFlangeAtNegEnd2"> + <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/> + </transformation> + <assemblyref ref="Flange2"/> + </transform> + + +</assembly> + +<assembly name="Barrel3Support"> + <logvol name="StripB_Cyl3" shape="shStripB_Cyl3" material="CFRP"/> + + <multicopy name="PlaceHatsCyl3" n="NumberOfHatsPerCyl"> + <transformation name="TranslateHatsCyl3"> + <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceTopHatAtLowEnd3"> + <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/> + </transformation> + <assemblyref ref="StaveCylHat3"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceFlangeAtPosEnd3"> + <translation z="StaveSupportCylLength / 2. - FlangeThickness"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="Flange3"/> + </transform> + + <transform> + <transformation name="PlaceFlangeAtNegEnd3"> + <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/> + </transformation> + <assemblyref ref="Flange3"/> + </transform> + + +</assembly> + +<!-- To be included in Barrel.gmx. Builds up the SS and MS staves cores (including bus tape copper) --> + +<shapes> + <box name="shStaveCoreMain" xhalflength="StaveCoreLength/2" yhalflength="StaveCoreWidth/2" zhalflength="StaveCoreT/2 - EPS"/> + <box name="shEOSCore" xhalflength="EOSCoreLength/2" yhalflength="EOSCoreWidth/2" zhalflength="EOSCoreT/2 - EPS"/> + <union name="shStaveCore"> + <shaperef ref="shStaveCoreMain"/> + <transformation name="MoveEOS_ToCore"> + <translation x="(StaveCoreLength - EOSCoreLength)/2" y="(StaveCoreWidth + EOSCoreWidth)/2"/> + </transformation> + <shaperef ref="shEOSCore"/> + </union> + + <box name="shStaveFacesheet" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveFacesheetT/2 - EPS"/> + <box name="shEOS_Facesheet" xhalflength="EOSCoreLength/2 - EPS" yhalflength="EOSCoreWidth/2 - EPS" zhalflength="StaveFacesheetT/2 - EPS"/> + <union name="shStaveFacesheetAll"> + <shaperef ref="shStaveFacesheet"/> + <transformation name="MoveEOS_Facesheet"> + <translation x="(StaveCoreLength - EOSCoreLength)/2" y="(StaveCoreWidth + EOSCoreWidth)/2"/> + </transformation> + <shaperef ref="shEOS_Facesheet"/> + </union> + + <box name="shStaveCloseoutLong" xhalflength="StaveCloseoutLongL/2 - EPS" yhalflength="StaveCloseoutLongT/2" zhalflength="StaveCloseoutLongW/2 - EPS"/> + + <box name="shStaveCloseoutLongEOS" xhalflength="StaveCloseoutLongEOS_L/2 - EPS" yhalflength="StaveCloseoutLongT/2" zhalflength="StaveCloseoutLongW/2 - EPS"/> + + <box name="shStaveCloseoutFarEnd" xhalflength="StaveCloseoutFarEndW/2" yhalflength="StaveCloseoutFarEndL/2" zhalflength="StaveCloseoutFarEndT/2 - EPS"/> + + <box name="shStaveCloseoutEOS_End" xhalflength="StaveCloseoutEOS_EndW/2" yhalflength="StaveCloseoutEOS_EndL/2" zhalflength="StaveCloseoutEOS_EndT/2 - EPS"/> + + <tube name="shStaveMount" rmin="0.0" rmax="StaveMountR - EPS" zhalflength="StaveMountL/2"/> + + <trap name="shStaveMountC" zhalflength="StaveMountLength_0 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_0 / 2." dxdyndzn="StaveMountThickness_0 / 2." dxdypdzn="StaveMountThickness_0 / 2." angleydzn="0." dydzp="(StaveMountHeight_0 + (tan(TiltAngle_3) * StaveMountLength_0)) / 2." dxdyndzp="StaveMountThickness_0 / 2." dxdypdzp="StaveMountThickness_0 / 2." angleydzp="0."/> + + <trap name="shStaveMountI" zhalflength="StaveMountLength_1 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_1 / 2." dxdyndzn="StaveMountThickness_1 / 2." dxdypdzn="StaveMountThickness_1 / 2." angleydzn="0." dydzp="(StaveMountHeight_1 + (tan(TiltAngle_3) * StaveMountLength_1)) / 2." dxdyndzp="StaveMountThickness_1 / 2." dxdypdzp="StaveMountThickness_1 / 2." angleydzp="0."/> + + + <trap name="shStaveMountE" zhalflength="StaveMountLength_2 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_2 / 2." dxdyndzn="StaveMountThickness_2 / 2." dxdypdzn="StaveMountThickness_2 / 2." angleydzn="0." dydzp="(StaveMountHeight_2 + (tan(TiltAngle_3) * StaveMountLength_2)) / 2." dxdyndzp="StaveMountThickness_2 / 2." dxdypdzp="StaveMountThickness_2 / 2." angleydzp="0."/> + + <box name="shStaveBusKapton" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveBusKaptonT/2 - EPS"/> + <box name="shStaveBusGlue" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveBusGlueT/2 - EPS"/> + + <box name="shStaveGroundEOS_Cu" xhalflength="StaveGroundEOS_W/2" yhalflength="StaveGroundEOS_L/2" zhalflength="StaveBusCuT/2 - EPS"/> + <box name="shStaveGroundPowerCu" xhalflength="StaveGroundPowerL/2" yhalflength="StaveGroundPowerW/2" zhalflength="StaveBusCuT/2 - EPS"/> + <box name="shStaveGroundSignalCu" xhalflength="StaveGroundSignalL/2" yhalflength=" StaveGroundSignalW/2" zhalflength="StaveBusCuT/2 - EPS"/> + <union name="shStaveGroundU1"> + <shaperef ref="shStaveGroundSignalCu"/> + <transformation name="AddPowerCu"> + <translation y="-(StaveGroundEOS_L + (StaveGroundEOS_FromTop - StaveGroundSignalFromTop) - (StaveGroundSignalW + StaveGroundPowerW)/2)"/> + </transformation> + <shaperef ref="shStaveGroundPowerCu"/> + </union> + <union name="shStaveGround"> + <shaperef ref="shStaveGroundU1"/> + <transformation name="AddEOS_Cu"> + <translation x="(StaveGroundSignalL + StaveGroundEOS_W)/2" y="-((StaveGroundEOS_L - StaveGroundSignalW)/2 + (StaveGroundEOS_FromTop - StaveGroundSignalFromTop))"/> + </transformation> + <shaperef ref="shStaveGroundEOS_Cu"/> + </union> + + <box name="shStaveSignalEOS_Cu" xhalflength="StaveSignalEOS_W/2" yhalflength="StaveSignalEOS_L/2" zhalflength="StaveBusCuT/2 - EPS"/> + <box name="shStaveSignalPowerCu" xhalflength="StaveSignalPowerL/2" yhalflength="StaveSignalPowerW/2" zhalflength="StaveBusCuT/2 - EPS"/> + <!-- Trap has to be made with z in length direction; thickness is y direction; width changes in x direction --> + <trd name="shStaveSignalSSSignalCu" xhalflength1="StaveSignalSSSignalBigW/2" xhalflength2="StaveSignalSSSignalSmallW/2" yhalflength1="StaveBusCuT/2" yhalflength2="StaveBusCuT/2" zhalflength="StaveSignalSignalL/2"/> + <trd name="shStaveSignalMSSignalCu" xhalflength1="StaveSignalMSSignalBigW/2" xhalflength2="StaveSignalMSSignalSmallW/2" yhalflength1="StaveBusCuT/2" yhalflength2="StaveBusCuT/2" zhalflength="StaveSignalSignalL/2"/> + <union name="shStaveSignalU1"> + <shaperef ref="shStaveSignalEOS_Cu"/> + <transformation name="AddSignalPowerCu"> + <translation x="-(StaveSignalEOS_W/2 + StaveSignalPowerL/2)" y="-(StaveSignalEOS_L/2 - StaveSignalPowerW/2)"/> + </transformation> + <shaperef ref="shStaveSignalPowerCu"/> + </union> + <union name="shStaveSignalSS"> + <shaperef ref="shStaveSignalU1"/> + <transformation name="AddSignalSS_SignalCu"> + <translation x="-(StaveSignalEOS_W/2 + StaveSignalSignalL/2)" y="B_SensorWidth/2 - StaveSignalSSSignalBigW/2 - ((StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop)"/> <!-- Leave all copper below Si sensor --> + <rotation ycos="1" angle="-PI/2"/> + <rotation zcos="1" angle="PI/2"/> + </transformation> + <shaperef ref="shStaveSignalSSSignalCu"/> + </union> + <union name="shStaveSignalMS"> + <shaperef ref="shStaveSignalU1"/> + <transformation name="AddSignalMS_SignalCu"> + <translation x="-(StaveSignalEOS_W/2 + StaveSignalSignalL/2)" y="B_SensorWidth/2 - StaveSignalSSSignalBigW/2 - ((StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop)"/> <!-- Leave all copper below Si sensor --> + <rotation ycos="1" angle="-PI/2"/> + <rotation zcos="1" angle="PI/2"/> + </transformation> + <shaperef ref="shStaveSignalMSSignalCu"/> + </union> + + <box name="shStaveCFoam" xhalflength="StaveCoolingL/2" yhalflength="StaveCFoamW/2" zhalflength="StaveCFoamT/2 - EPS"/> + + <box name="shStaveEOS_CFoam" xhalflength="StaveEOS_CFoamL/2" yhalflength="StaveEOS_CFoamW/2" zhalflength="StaveCFoamT/2 - EPS"/> + + <tube name="shStaveCoolingTube" rmin="0.0" rmax="StaveCoolingPipeOD" zhalflength="StaveCoolingL/2 - 2 * EPS"/> + <tube name="shStaveCoolingCO2" rmin="0.0" rmax="StaveCoolingPipeID" zhalflength="StaveCoolingL/2 - 3 * EPS"/> + +</shapes> + +<logvol name="StaveFacesheetAll" shape="shStaveFacesheetAll" material="K13D2U"/> +<logvol name="StaveCloseoutLong" shape="shStaveCloseoutLong" material="CFRP"/> +<logvol name="StaveCloseoutLongEOS" shape="shStaveCloseoutLongEOS" material="CFRP"/> +<logvol name="StaveCloseoutFarEnd" shape="shStaveCloseoutFarEnd" material="Peek"/> +<logvol name="StaveCloseoutEOS_End" shape="shStaveCloseoutEOS_End" material="Peek"/> +<logvol name="StaveMountC" shape="shStaveMountC" material="Peek"/> +<logvol name="StaveMountI" shape="shStaveMountI" material="Peek"/> +<logvol name="StaveMountE" shape="shStaveMountE" material="Peek"/> + +<logvol name="StaveBusKapton" shape="shStaveBusKapton" material="Kapton"/> +<logvol name="StaveBusGlue" shape="shStaveBusGlue" material="BoronNitrideEpoxy"/> +<logvol name="StaveGround" shape="shStaveGround" material="CuMetal"/> +<logvol name="StaveSignalSS" shape="shStaveSignalSS" material="CuMetal"/> +<logvol name="StaveSignalMS" shape="shStaveSignalMS" material="CuMetal"/> + + +<logvol name="StaveCoolingUnit" shape="shStaveCFoam" material="CFoam"> + <transform> + <transformation name="PlaceTubeInStaveCFoam"> + <rotation ycos="1" angle="PI / 2."/> + </transformation> + <logvol name="StaveCoolingTube" shape="shStaveCoolingTube" material="TiMetal"> + <logvol name="StaveCoolingCO2" shape="shStaveCoolingCO2" material="CO2Liquid"/> + </logvol> + </transform> +</logvol> + +<logvol name="StaveEOS_CFoam" shape="shStaveEOS_CFoam" material="CFoam"/> + +<logvol name="StaveCore" shape="shStaveCore" material="Honeycomb2pcf"> + + <transform> + <transformation name="PlaceLowZ_Facesheet"> + <translation z="-((StaveHoneycombT + StaveFacesheetT)/2)"/> + </transformation> + <logvolref ref="StaveFacesheetAll"/> + </transform> + <transform> + <transformation name="PlaceHighZ_Facesheet"> + <translation z="(StaveHoneycombT + StaveFacesheetT)/2"/> + </transformation> + <logvolref ref="StaveFacesheetAll"/> + </transform> + + <transform> + <transformation name="PlaceCloseoutLongUp"> + <translation x="(-StaveCoreLength + StaveCloseoutLongEOS_L)/2 + StaveCloseoutFarEndW" y="StaveCoreWidth/2 - 2."/> + </transformation> + <logvolref ref="StaveCloseoutLongEOS"/> + </transform> + + <transform> + <transformation name="PlaceCloseoutLongDown"> + <translation x="(StaveCoreLength - StaveCloseoutLongL)/2 - StaveCloseoutEOS_EndW" y="-(StaveCoreWidth/2 - 2.)"/> + </transformation> + <logvolref ref="StaveCloseoutLong"/> + </transform> + + <transform> + <transformation name="PlaceCloseoutFarEnd"> + <translation x="-(StaveCoreLength - StaveCloseoutFarEndW)/2"/> + </transformation> + <logvolref ref="StaveCloseoutFarEnd"/> + </transform> + + <transform> + <transformation name="PlaceCloseoutEOS_End"> + <translation x="(StaveCoreLength - StaveCloseoutEOS_EndW)/2" y="EOSCoreWidth/2"/> + </transformation> + <logvolref ref="StaveCloseoutEOS_End"/> + </transform> + + <transform> + <transformation name="PlaceLowZ_BusGlue"> + <translation z="-((StaveHoneycombT + StaveBusGlueT)/2 + StaveFacesheetT)"/> + </transformation> + <logvolref ref="StaveBusGlue"/> + </transform> + <transform> + <transformation name="PlaceHighZ_BusGlue"> + <translation z="(StaveHoneycombT + StaveBusGlueT)/2 + StaveFacesheetT"/> + </transformation> + <logvolref ref="StaveBusGlue"/> + </transform> + + <transform> + <transformation name="PlaceLowZ_BusKapton"> + <translation z="-((StaveHoneycombT + StaveBusKaptonT)/2 + StaveFacesheetT + StaveBusGlueT)"/> + </transformation> + <logvolref ref="StaveBusKapton"/> + </transform> + <transform> + <transformation name="PlaceHighZ_BusKapton"> + <translation z="(StaveHoneycombT + StaveBusKaptonT)/2 + StaveFacesheetT + StaveBusGlueT"/> + </transformation> + <logvolref ref="StaveBusKapton"/> + </transform> + + <transform> + <transformation name="PlaceLowY_Cooling"> + <translation x="(StaveCoreLength - StaveCoolingL)/2 - StaveCloseoutEOS_EndW" y="-StaveCoolingOffset"/> + </transformation> + <logvolref ref="StaveCoolingUnit"/> + </transform> + <transform> + <transformation name="PlaceHighY_Cooling"> + <translation x="(StaveCoreLength - StaveCoolingL)/2 - StaveCloseoutEOS_EndW" y="StaveCoolingOffset"/> + </transformation> + <logvolref ref="StaveCoolingUnit"/> + </transform> + + <transform> + <transformation name="PlaceStaveEOS_CFoam"> + <translation x="(StaveCoreLength - EOSCoreLength)/2" y="StaveCoolingOffset + (StaveCFoamW + StaveEOS_CFoamW)/2"/> + </transformation> + <logvolref ref="StaveEOS_CFoam"/> + </transform> + +</logvol> + +<assembly name="StaveCoreSS"> <!-- A core plus the Cu in the cable bus plus mounts --> + <logvolref ref="StaveCore"/> + <transform> + <transformation name="PlaceLowZ_SignalCu"> + <translation x="(StaveCoreLength - StaveSignalEOS_W)/2 - StaveSignalEOS_FromEnd" y="(StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop" z="-((StaveCoreT + StaveBusCuT)/2 + StaveBusCuT)"/> + </transformation> + <logvolref ref="StaveSignalSS"/> + </transform> + <transform> + <transformation name="PlaceHighZ_SignalCu"> + <translation x="(StaveCoreLength - StaveSignalEOS_W)/2 - StaveSignalEOS_FromEnd" y="(StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop" z="(StaveCoreT + StaveBusCuT)/2 + StaveBusCuT"/> + </transformation> + <logvolref ref="StaveSignalSS"/> + </transform> + <transform> + <transformation name="PlaceLowZ_GroundCu"> + <translation x="(StaveCoreLength - (StaveGroundSignalL + StaveGroundEOS_W))/2 - StaveGroundEOS_FromEnd" y="(StaveCoreWidth - StaveGroundSignalW)/2 - StaveGroundSignalFromTop" z="-((StaveCoreT + StaveBusCuT)/2)"/> + </transformation> + <logvolref ref="StaveGround"/> + </transform> + <transform> + <transformation name="PlaceHighZ_GroundCu"> + <translation x="(StaveCoreLength - (StaveGroundSignalL + StaveGroundEOS_W))/2 - StaveGroundEOS_FromEnd" y="(StaveCoreWidth - StaveGroundSignalW)/2 - StaveGroundSignalFromTop" z="(StaveCoreT + StaveBusCuT)/2"/> + </transformation> + <logvolref ref="StaveGround"/> + </transform> + +</assembly> + +<assembly name="StaveCoreMS"> <!-- A core plus the Cu in the cable bus plus mounts --> + <logvolref ref="StaveCore"/> + <transform> + <transformationref ref="PlaceLowZ_SignalCu"/> + <logvolref ref="StaveSignalMS"/> + </transform> + <transform> + <transformationref ref="PlaceHighZ_SignalCu"/> + <logvolref ref="StaveSignalMS"/> + </transform> + <transform> + <transformationref ref="PlaceLowZ_GroundCu"/> + <logvolref ref="StaveGround"/> + </transform> + <transform> + <transformationref ref="PlaceHighZ_GroundCu"/> + <logvolref ref="StaveGround"/> + </transform> + +</assembly> + +<!-- Build up SS and MS barrel hybrids --> +<defines> + <!-- Ref. np49-01-104.pdf, Rev C June 2014, ignore extension for HCC --> + <var name="B_HybridW" value="15.5"/> + <var name="B_HybridL" value="B_SensorWidth"/> + <var name="B_HybridT" value="0.120 + 0.240 + 0.080"/> + + <var name="HCC_OffsetX" value="B_HybridW/2 - (3.55 + 0.5 + ABC_W + HCC_L/2)"/> + <var name="HCC_OffsetY" value="36.41 + HCC_W/2"/> + <var name="NumABC_PerB_Hybrid" value="10"/> + <var name="ABC_Pitch" value="1.64 + ABC_L"/> + <var name="ABC_ToHybridEdgeGap" value="0.5"/> + <var name="B_HybridX_Offset" value="5.535"/> + +</defines> + +<shapes> + <box name="shB_HybridPCB" xhalflength="B_HybridW/2" yhalflength="B_HybridL/2" zhalflength="B_HybridT/2 - EPS"/> +</shapes> + +<!-- GeoModelXml input created by ConsolidX version 1.100000 for B_HybridPCB, version 1.0. --> + +<materials> + + <material name="matB_HybridPCB" density="2.165382"> + <elementref ref="Aluminium" fraction="0.008079"/> + <elementref ref="Barium" fraction="0.057375"/> + <elementref ref="Carbon" fraction="0.250888"/> + <elementref ref="Copper" fraction="0.421377"/> + <elementref ref="Gold" fraction="0.004799"/> + <elementref ref="Hydrogen" fraction="0.014609"/> + <elementref ref="Lead" fraction="0.023518"/> + <elementref ref="Nickel" fraction="0.020306"/> + <elementref ref="Nitrogen" fraction="0.048265"/> + <elementref ref="Oxygen" fraction="0.058161"/> + <elementref ref="Silver" fraction="0.024977"/> + <elementref ref="Tin" fraction="0.047647"/> + <elementref ref="Titanium" fraction="0.019999"/> + </material> + +</materials> + +<!-- End of ConsolidX output --> + +<logvol name="B_HybridPCB" shape="shB_HybridPCB" material="matB_HybridPCB"/> + +<assembly name="B_HybridNear"> <!-- As in near to EOS --> + <logvolref ref="B_HybridPCB"/> + + <transform> + <transformation name="PlaceHCCOnB_Hybrid"> + <translation x="HCC_OffsetX" y="HCC_OffsetY" z="(B_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <multicopy name="PlaceABCsOnB_Hybrid" n="NumABC_PerB_Hybrid"> + <transformation name="PlaceABCOnHybrid"> + <translation y="ABC_Pitch"/> + </transformation> + <transform> + <transformation name="ABC_ReadyForCopyingToB_Hybrid"> + <translation x="B_HybridW/2 - ABC_ToHybridEdgeGap - ABC_W/2" y="-((NumABC_PerB_Hybrid - 1) * ABC_Pitch / 2.)" z="(B_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + </multicopy> + +</assembly> + +<assembly name="B_HybridFar"> + <logvolref ref="B_HybridPCB"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridF"> + <translation x="-HCC_OffsetX" y="HCC_OffsetY" z="(B_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <multicopy name="PlaceABCsOnB_HybridF" n="NumABC_PerB_Hybrid"> + <transformation name="PlaceABCOnHybridF"> + <translation y="ABC_Pitch"/> + </transformation> + <transform> + <transformation name="ABC_ReadyForCopyingToB_HybridF"> + <translation x="-(B_HybridW/2 - ABC_ToHybridEdgeGap - ABC_W/2)" y="-((NumABC_PerB_Hybrid - 1) * ABC_Pitch / 2.)" z="(B_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + </multicopy> + +</assembly> + +<shapes> + + <tube name="shInnerPolyMod" rmin="StripB_OuterRadius - InnerPolyModThickness" rmax="StripB_OuterRadius - 3 * EPS" zhalflength="InnerPolyModHalfLength"/> + + <tube name="shBarrel0" rmin="BarrelRadius_0" rmax="CylRadius_0 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> + <tube name="shBarrel1" rmin="BarrelRadius_1" rmax="CylRadius_1 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Offset of + 1 to avoid Stavecore overlap in Barrel 2 --> + <tube name="shBarrel2" rmin="BarrelRadius_2" rmax="CylRadius_2 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Why though? --> + <tube name="shBarrel3" rmin="BarrelRadius_3" rmax="StripB_OuterRadius - 2 * EPS" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Originally StripB_HalfLength - EPS --> + +</shapes> + +<transformation name="StereoRot"> + <rotation zcos="1" angle="StereoAngle"/> +</transformation> + +<transformation name="RotateModulePowerEnd"> + <rotation zcos="1" angle="PI + StereoAngle"/> +</transformation> + +<!-- GeoModelXml input created by ConsolidX version 1.100000 for BarrelEOSBoard, version 1.0. --> + +<materials> + + <material name="matEOS" density="1.052352"> + <elementref ref="Carbon" fraction="0.103183"/> + <elementref ref="Copper" fraction="0.393132"/> + <elementref ref="Hydrogen" fraction="0.009621"/> + <elementref ref="Oxygen" fraction="0.266262"/> + <elementref ref="Silicon" fraction="0.215452"/> + <elementref ref="Tin" fraction="0.012349"/> + </material> + +</materials> + +<shapes> + <box name="shEOS" xhalflength="100/2" yhalflength="45/2" zhalflength="5/2"/> +</shapes> + +<logvol name="EOS" shape="shEOS" material="matEOS"/> + +<assembly name="SS_Module"> + + <transform alignable="0"> + <transformation name="BRLSensorSSdummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="BRLSensorSS"/> + </transform> + + <transform> + <transformation name="PlaceNearHybridSS"> + <translation x="B_HybridX_Offset + B_HybridW / 2" z="(SensorThickness + B_HybridT) / 2."/> + </transformation> + <assemblyref ref="B_HybridNear"/> + </transform> + + <transform> + <transformation name="PlaceFarHybridSS"> + <translation x="-(B_HybridX_Offset + B_HybridW / 2)" z="(SensorThickness + B_HybridT) / 2."/> + </transformation> + <assemblyref ref="B_HybridFar"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_PCB_SS"> + <translation y="-(B_SensorWidth - DCDC_PCB_L) / 2." z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_PCB"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_Box_SS"> + <translation y="-(B_SensorWidth - DCDC_PCB_L - DCDC_PCB_L + DCDC_BoxL) / 2." z="(SensorThickness + DCDC_BoxT) / 2. + DCDC_PCB_T"/> + </transformation> + <logvolref ref="DCDC_Box"/> + </transform> + +</assembly> + +<assembly name="MS_Module"> + + + <transform alignable="0"> + <transformation name="BRLSensorMSdummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="BRLSensorMS"/> + </transform> + + <transform> + <transformation name="PlaceNearHybridMS"> + <translation x="B_HybridX_Offset + B_HybridW / 2" z="(SensorThickness + B_HybridT) / 2."/> + </transformation> + <assemblyref ref="B_HybridNear"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_PCB_MS"> + <translation y="-(B_SensorWidth - DCDC_PCB_L) / 2." z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_PCB"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_Box_MS"> + <translation y="-(B_SensorWidth - DCDC_PCB_L - DCDC_PCB_L + DCDC_BoxL) / 2." z="(SensorThickness + DCDC_BoxT) / 2. + DCDC_PCB_T"/> + </transformation> + <logvolref ref="DCDC_Box"/> + </transform> + +</assembly> + +<assembly name="SS_FaceL"> + <index ref="side" value="CNL_5"/> + <multicopy name="CopySS_InStereoFaceL" n="B_N_SensorsPerFace"> + <transformation name="PlaceSS_InStereoFaceL"> + <translation x="B_SensorGap + B_SensorLength"/> + </transformation> + <transform> + <transformationref ref="StereoRot"/> + <assemblyref ref="SS_Module"/> + </transform> + </multicopy> +</assembly> + +<assembly name="SS_FaceR"> <!-- Modules rotated 180 deg cf L version --> + <index ref="side" value="1 - CNL_5"/> + <multicopy name="CopySS_InStereoFaceR" n="B_N_SensorsPerFace"> + <transformation name="PlaceSS_InStereoFaceR"> + <translation x="B_SensorGap + B_SensorLength"/> + </transformation> + <transform> + <transformationref ref="RotateModulePowerEnd"/> + <assemblyref ref="SS_Module"/> + </transform> + </multicopy> +</assembly> + +<assembly name="MS_FaceL"> + <index ref="side" value="CNL_5"/> + <multicopy name="CopyMS_InStereoFaceL" n="B_N_SensorsPerFace"> + <transformation name="PlaceMS_InStereoFaceL"> + <translation x="B_SensorGap + B_SensorLength"/> + </transformation> + <transform> + <transformationref ref="StereoRot"/> + <assemblyref ref="MS_Module"/> + </transform> + </multicopy> +</assembly> + +<assembly name="MS_FaceR"> + <index ref="side" value="1 - CNL_5"/> + <multicopy name="CopyMS_InStereoFaceR" n="B_N_SensorsPerFace"> + <transformation name="PlaceMS_InStereoFaceR"> + <translation x="B_SensorGap + B_SensorLength"/> + </transformation> + <transform> + <transformationref ref="RotateModulePowerEnd"/> + <assemblyref ref="MS_Module"/> + </transform> + </multicopy> +</assembly> + +<assembly name="SS_Stave"> + <assemblyref ref="StaveCoreSS"/> + <transform> + <transformation name="PlaceFirstSS_FaceOnCore"> + <translation x="StaveFaceTranslation" z="-(StavePlankT + SensorThickness)/2"/> + <rotation xcos="1" angle="PI"/> <!-- Strips on low-z side --> + </transformation> + <assemblyref ref="SS_FaceR" zeroid="true"/> + </transform> + <transform> + <transformation name="PlaceSecondSS_FaceOnCore"> + <translation x="StaveFaceTranslation" z="+(StavePlankT + SensorThickness)/2"/> + </transformation> + <assemblyref ref="SS_FaceL"/> + </transform> + + <transform> + <transformation name="PlaceFirstEOS_OnSS_Core"> + <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="-(StavePlankT + 5.)/2"/> + </transformation> + <logvolref ref="EOS"/> + </transform> + <transform> + <transformation name="PlaceSecondEOS_OnSS_Core"> + <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="+(StavePlankT + 5.)/2"/> + </transformation> + <logvolref ref="EOS"/> + </transform> + +</assembly> + +<assembly name="MS_Stave"> + <assemblyref ref="StaveCoreMS"/> + + <transform> + <transformation name="PlaceFirstMS_FaceOnCore"> + <translation x="StaveFaceTranslation" z="-(StavePlankT + SensorThickness)/2"/> + <rotation xcos="1" angle="PI"/> <!-- Strips on low-z side --> + </transformation> + <assemblyref ref="MS_FaceR" zeroid="true"/> + </transform> + + <transform> + <transformation name="PlaceSecondMS_FaceOnCore"> + <translation x="StaveFaceTranslation" z="+(StavePlankT + SensorThickness)/2"/> + </transformation> + <assemblyref ref="MS_FaceL"/> + </transform> + + <transform> + <transformation name="PlaceFirstEOS_OnMS_Core"> + <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="-(StavePlankT + 5.)/2"/> + </transformation> + <logvolref ref="EOS"/> + </transform> + <transform> + <transformation name="PlaceSecondEOS_OnMS_Core"> + <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="+(StavePlankT + 5.)/2"/> + </transformation> + <logvolref ref="EOS"/> + </transform> + +</assembly> + +<assembly name="StavePairSS"> + + <index ref="eta_module" value="CNL_7 + 1"/> + <transform> + <transformation name="PlacePlusZ_SS_Stave"> + <translation x="StaveGapZ0 + StaveCoreLength/2"/> + </transformation> + <assemblyref ref="SS_Stave" zeroid="true"/> + </transform> + + <multicopy name="CopyStaveMountsSS_Plus" n="NumStaveMountsI"> + <transformation name="PlaceStaveMountsSS_Plus"> + <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceStaveMountReadySS_PlusForCopying"> + <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountR/2"/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountI"/> + </transform> + </multicopy> + + <index ref="eta_module" value="-(CNL_7 + 1)"/> + <transform> + <transformation name="PlaceMinusZ_SS_Stave"> + <translation x="-(StaveGapZ0 + StaveCoreLength/2)"/> + <rotation ycos="1" angle="PI"/> + </transformation> + <assemblyref ref="SS_Stave"/> + </transform> + + <multicopy name="CopyStaveMountsSS_Minus" n="NumStaveMountsI"> + <transformation name="PlaceStaveMountsSS_Minus"> + <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))"/> + </transformation> + <transform> + <transformation name="PlaceStaveMountSS_MinusReadyForCopying"> + <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountI"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceStaveMountCSS_Plus"> + <translation x="StaveMountThickness_0 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountC"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountCSS_Minus"> + <translation x="-(StaveMountThickness_0 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountC"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountESS_Plus"> + <translation x="StaveCoreLength - StaveMountThickness_2 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountE"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountESS_Minus"> + <translation x="-(StaveCoreLength - StaveMountThickness_2 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountE"/> + </transform> + +</assembly> + +<assembly name="StavePairMS"> + + <index ref="eta_module" value="CNL_7 + 1"/> + <transform> + <transformation name="PlacePlusZ_MS_Stave"> + <translation x="StaveGapZ0 + StaveCoreLength/2"/> + </transformation> + <assemblyref ref="MS_Stave" zeroid="true"/> + </transform> + + <multicopy name="CopyStaveMountsMS_Plus" n="NumStaveMountsI"> + <transformation name="PlaceStaveMountsMS_Plus"> + <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)"/> + </transformation> + <transform> + <transformation name="PlaceStaveMountReadyMS_PlusForCopying"> + <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountI"/> + </transform> + </multicopy> + + <index ref="eta_module" value="-(CNL_7 + 1)"/> + <transform> + <transformation name="PlaceMinusZ_MS_Stave"> + <translation x="-(StaveGapZ0 + StaveCoreLength/2)"/> + <rotation ycos="1" angle="PI"/> + </transformation> + <assemblyref ref="MS_Stave"/> + </transform> + + <multicopy name="CopyStaveMountsMS_Minus" n="NumStaveMountsI"> + <transformation name="PlaceStaveMountsMS_Minus"> + <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))"/> + </transformation> + <transform> + <transformation name="PlaceStaveMountMS_MinusReadyForCopying"> + <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountI"/> + </transform> + </multicopy> + + <transform> + <transformation name="PlaceStaveMountCMS_Plus"> + <translation x="StaveMountThickness_0 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountC"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountCMS_Minus"> + <translation x="-(StaveMountThickness_0 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountC"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountEMS_Plus"> + <translation x="StaveCoreLength - StaveMountThickness_2 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountE"/> + </transform> + + <transform> + <transformation name="PlaceStaveMountEMS_Minus"> + <translation x="-(StaveCoreLength - StaveMountThickness_2 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/> + <rotation xcos="1" angle="-PI/2"/> + </transformation> + <logvolref ref="StaveMountE"/> + </transform> + + +</assembly> + +<logvol name="Barrel0" shape="shBarrel0" material="N2" alignable="true"> + <index ref="layer_wheel" value="0"/> + <multicopy name="PlaceStavesB0" n="N_StavesInCyl_0"> + <transformation name="XfStavesB0"> + <rotation zcos="1" angle="2 * PI / N_StavesInCyl_0"/> + </transformation> + <transform> + <transformation name="XfStave0ReadyForCopying"> + <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> + <rotation zcos="1" angle="PI / N_StavesInCyl_0"/> + <translation x="CylRadius_0"/> + <rotation zcos="1" angle="-TiltAngle_0"/> + <rotation ycos="1" angle="-PI/2"/> + </transformation> + <assemblyref ref="StavePairSS"/> + </transform> + </multicopy> + + <assemblyref ref="Barrel0Support"/> + +</logvol> + +<logvol name="Barrel1" shape="shBarrel1" material="N2" alignable="true"> + <index ref="layer_wheel" value="1"/> + <multicopy name="PlaceStavesB1" n="N_StavesInCyl_1"> + <transformation name="XfStavesB1"> + <rotation zcos="1" angle="2 * PI / N_StavesInCyl_1"/> + </transformation> + <transform> + <transformation name="XfStave1ReadyForCopying"> + <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> + <rotation zcos="1" angle="PI / N_StavesInCyl_1"/> + <translation x="CylRadius_1"/> + <rotation zcos="1" angle="-TiltAngle_1"/> + <rotation ycos="1" angle="-PI/2"/> + </transformation> + <assemblyref ref="StavePairSS"/> + </transform> + </multicopy> + + <assemblyref ref="Barrel1Support"/> + +</logvol> + +<logvol name="Barrel2" shape="shBarrel2" material="N2" alignable="true"> + <index ref="layer_wheel" value="2"/> + <multicopy name="PlaceStavesB2" n="N_StavesInCyl_2"> + <transformation name="XfStavesB2"> + <rotation zcos="1" angle="2 * PI / N_StavesInCyl_2"/> + </transformation> + <transform> + <transformation name="XfStave2ReadyForCopying"> + <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> + <rotation zcos="1" angle="PI / N_StavesInCyl_2"/> + <translation x="CylRadius_2"/> + <rotation zcos="1" angle="-TiltAngle_2"/> + <rotation ycos="1" angle="-PI/2"/> + </transformation> + <assemblyref ref="StavePairMS"/> + </transform> + </multicopy> + + <assemblyref ref="Barrel2Support"/> + +</logvol> + +<logvol name="Barrel3" shape="shBarrel3" material="N2" alignable="true"> + <index ref="layer_wheel" value="3"/> + <multicopy name="PlaceStavesB3" n="N_StavesInCyl_3"> + <transformation name="XfStavesB3"> + <rotation zcos="1" angle="2 * PI / N_StavesInCyl_3"/> + </transformation> + <transform> + <transformation name="XfStave3ReadyForCopying"> + <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> + <rotation zcos="1" angle="PI / N_StavesInCyl_3"/> + <translation x="CylRadius_3"/> + <rotation zcos="1" angle="-TiltAngle_3"/> + <rotation ycos="1" angle="-PI/2"/> + </transformation> + <assemblyref ref="StavePairMS"/> + </transform> + </multicopy> + <logvol name="InnerPolyMod" shape="shInnerPolyMod" material="BoratedPolyethylene"/> + + <assemblyref ref="Barrel3Support"/> + +</logvol> + +<assembly name="StripB"> + <index ref="phi_module" value="CNL_4"/> + + <transform alignable="2"> + <transformation name="Barrel0dummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="Barrel0"/> + </transform> + + <transform alignable="2"> + <transformation name="Barrel1dummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="Barrel1"/> + </transform> + + <transform alignable="2"> + <transformation name="Barrel2dummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="Barrel2"/> + </transform> + + <transform alignable="2"> + <transformation name="Barrel3dummy" alignable="true"> + <translation/> + </transformation> + <logvolref ref="Barrel3"/> + </transform> + + <transform name="ZBraceCapFC"> + <transformation name="PlaceZBraceCapFC"> + <translation z="StaveSupportCylLength / 2. + ZBraceWidth_0 / 2. + ZBraceWidth_1 + InterlinkThickness + 1"/> + </transformation> + <assemblyref ref="ZBraceCap"/> + </transform> + + + <transform name="ZBraceCapEC"> + <transformation name="PlaceZBraceCapEC"> + <rotation ycos="1." angle="PI"/> + <translation z="StaveSupportCylLength / 2. + ZBraceWidth_0 / 2. + ZBraceWidth_1 + InterlinkThickness + 1"/> + </transformation> + <assemblyref ref="ZBraceCap"/> + </transform> + + <multicopy name="MultipleInterlinks0" n="N_StavesInCyl_0"> + <transformation name="PlaceMultipleInterlinks0"> + <rotation zcos="1." angle="2*PI / N_StavesInCyl_0"/> + </transformation> + <assemblyref ref="TempInterlink0"/> + </multicopy> + + <multicopy name="MultipleInterlinks1" n="N_StavesInCyl_1"> + <transformation name="PlaceMultipleInterlinks1"> + <rotation zcos="1." angle="2*PI / N_StavesInCyl_1"/> + </transformation> + <assemblyref ref="TempInterlink1"/> + </multicopy> + + <multicopy name="MultipleInterlinks2" n="N_StavesInCyl_2"> + <transformation name="PlaceMultipleInterlinks2"> + <rotation zcos="1." angle="2*PI / N_StavesInCyl_2"/> + </transformation> + <assemblyref ref="TempInterlink2"/> + </multicopy> + + <multicopy name="MultipleInterlinks3" n="N_StavesInCyl_3"> + <transformation name="PlaceMultipleInterlinks3"> + <rotation zcos="1." angle="2*PI / N_StavesInCyl_3"/> + </transformation> + <assemblyref ref="TempInterlink3"/> + </multicopy> + + + +<!-- + <logvolref ref="Barrel0"/> + <logvolref ref="Barrel1"/> + <logvolref ref="Barrel2"/> + <logvolref ref="Barrel3"/> +--> + +</assembly> + + +<!-- CNL_n meanings: + n Meaning Range + 0 SCT Envelope 0 + 1 Endcap - or + 0 - 1 + 2 Endcap 0 - 0 + 3 Wheel 0 - 5 + 4 Pair 0 - 15 + 5 Petal 0 - 1 + 6 Face 0 - 1 + 7 Module 0 - big; not used and not zeroed + 8 Sensor 0 - big; not used and not zeroed + +--> + +<defines> + <var name="N_Wheels" value="6"/> + <vector name="WheelZ" value="1512 1702 1952 2237 2532 2850"/> + <vector name="WheelZOdd" value="1512 1952 2532"/> + <vector name="WheelZEven" value="1702 2237 2850"/> + <var name="NPetalsInWheel" value="32"/> + <var name="CastellationOffset" value="7.5"/> + <var name="PetalCoreInnerRadius" value="380"/> + <var name="PetalCoreOuterRadius" value="975"/> + <var name="PetalCoreExtraWidth" value="41"/> + <!-- Extra width at outer edges for bus-tape --> + <var name="PetalCoreAngle" value="2*PI/NPetalsInWheel + 2 * PetalCoreExtraWidth / PetalCoreOuterRadius"/> + <var name="PetalEarLength" value="150"/> + <var name="PetalEarWidth" value="28.8"/> + <var name="PetalEarAngle" value="PetalEarWidth / PetalCoreOuterRadius"/> + <var name="PetalEarInnerRadius" value="PetalCoreOuterRadius - PetalEarLength"/> + <var name="PetalEarOuterRadius" value="PetalCoreOuterRadius"/> + <var name="PetalFaceRotation" value="-3.5e-3"/> <!-- 3.5 mrad, clockwise. See e-mail 2016-08-02 layout --> + <!-- Pixel core thickness built up in following order: --> + <var name="PetalHoneycombT" value="5.2 + 0.078"/> + <!-- Small correction to make Si-Si mid dist. 6.42. NPH logbook UG20 29/4/2016 This increases the thickness of honeycomb, Allcomp foam, and the closeouts. To be revised. --> + <var name="PetalFaceSheetT" value="0.15"/> + <var name="PetalBusGlueT" value="0.1"/> + <!-- Includes module-to-bus glue, 0.1 mm --> + <var name="PetalBusKaptonT" value="0.2"/> + <var name="PetalCoreT" value="PetalHoneycombT + 2 * (PetalFaceSheetT + PetalBusGlueT + PetalBusKaptonT)"/> + <var name="PetalBusCuT" value="0.018"/> + <var name="PetalPlankT" value="PetalCoreT + 4 * PetalBusCuT"/> + + <var name="PetalCoreThickness" value="PetalCoreT"/> + <var name="PetalCloseoutW" value="8.0"/> + <var name="PetalCloseoutT" value="PetalHoneycombT"/> + <var name="PetalCchannelLongL" value="(PetalCoreOuterRadius-PetalCoreInnerRadius)-2*PetalCloseoutW"/> + <var name="PetalCchannelShortL" value="(PetalEarInnerRadius-PetalCoreInnerRadius)-PetalCloseoutW"/> + <var name="PetalCchannelW" value="4"/> + <var name="PetalCchannelInnerW" value="PetalCchannelW-0.5"/> + <var name="PetalCchannelInnerT" value="PetalHoneycombT-0.9-2*EPS"/> + <!-- Cooling--> + <var name="PetalCFoamT" value="PetalHoneycombT"/> + <var name="PetalCFoamW" value="10.0"/> + <var name="PetalCooling1L" value="510"/> + <var name="PetalCooling2L" value="440"/> + <var name="PetalCooling3L" value="173.9"/> + <var name="PetalCoolingOffset" value="25."/> + <var name="PetalCoolingPipeOD" value="2.275"/> + <var name="PetalCoolingPipeID" value="1.975"/> + <!-- 0.1 mm wall thickness on drawing, but not yet achieved so thicker --> + <var name="EC_InnerCylLength" value="2. * StripEC_HalfLength - 2."/> + <var name="EC_InnerCylThickness" value="0.6"/> + <var name="EC_InnerCylInnerR" value="367."/> + <var name="EC_InnerCylOuterR" value="EC_InnerCylInnerR + EC_InnerCylThickness"/> + <var name="WheelSupportOffset" value="40."/> + <var name="WheelInnerT_ShimThickness" value="1.0"/> + <var name="WheelInnerT_BaseThickness" value="2.0 + WheelInnerT_ShimThickness"/> + <var name="WheelInnerT_BaseWidth" value="20.0"/> + <var name="WheelInnerT_BaseOuterR" value="EC_InnerCylOuterR + WheelInnerT_BaseThickness "/> + <var name="WheelInnerT_UprightThickness" value="3.0"/> + <var name="WheelInnerT_UprightHeight" value="30.0"/> + <var name="WheelInnerT_UprightOuterR" value="WheelInnerT_BaseOuterR + WheelInnerT_UprightHeight"/> + <var name="WheelOuterT_OuterR" value="988.0"/> + <var name="WheelOuterT_BaseThickness" value="2.0"/> + <var name="WheelOuterT_BaseWidth" value="20.0"/> + <var name="WheelOuterT_BaseInnerR" value="WheelOuterT_OuterR - WheelOuterT_BaseThickness"/> + <var name="WheelOuterT_UprightThickness" value="3.0"/> + <var name="WheelOuterT_UprightHeight" value="50.0"/> + <var name="WheelOuterT_UprightInnerR" value="WheelOuterT_BaseInnerR - WheelOuterT_UprightHeight"/> + <!-- Cone modelled as tubes. See layout/LTF/services/StiffDisc.ods --> + <var name="StiffDiscRI" value="EC_InnerCylOuterR + 1."/> + <var name="StiffDiscRO" value="988.0"/> + <var name="StiffDiscCF_T" value="0.9"/> + <var name="StiffDiscFoamT" value="54.5"/> + <var name="StiffDiscTranslation" value="StripEC_HalfLength - StiffDiscFoamT/ 2. - StiffDiscCF_T - 1."/> + <!-- Word of mouth and guesses for the tubes at outer radius of wheels which control their z positions --> + <var name="ZtubeRI" value="2.0"/><!-- originally 3.0 --> + <var name="ZtubeRO" value="4.0"/><!-- originally 5.0 --> + <var name="ZtubeRadialPosition" value="WheelOuterT_OuterR - WheelOuterT_BaseThickness - ZtubeRO - EPS"/> + <var name="nZtubes" value="8"/> + + <!-- Blade Supports --> + <vector name="BladeHoleDiameter" value="11. 26.58 39.07 55.3 76.41 103.86 139.54"/> + <var name="BladeHoleThickness" value="20."/> + <var name="BladeHoleGap" value="15."/> + <var name="BladeHoleOffset" value="480."/> + <var name="BladeAngle" value="15. * DEG"/> + <var name="BladeOuterEndWidth" value="38.09"/> + <var name="BladeLength" value="985."/> + <var name="BladeRodOuterEdge" value="8."/> + <var name="BladeRodInnerEdge" value="6."/> + <var name="BladeFaceSheetThickness" value="0.2"/> + <var name="BladeBarrelR" value="373."/> + <var name="BladeBaseHeight" value="15."/> + <var name="BladeBaseWidth" value="100."/> + + <var name="LockBaseHHeight" value="26.5"/> + <var name="LockBaseHWidth" value="22.5"/> + <var name="LockBaseHThickness" value="5.77"/> + <var name="LockBaseLHeight" value="9.5"/> + <var name="LockBaseLWidth" value="22.5"/> + <var name="LockBaseLThickness" value="6.45"/> + <var name="LockBaseTAngleOffset" value="0.9375 * DEG"/> + <var name="LockBaseTAngle" value="11.25 * DEG"/> + <var name="LockBaseTAssemblyN" value="16."/> + <var name="LockBaseBAngleOffset" value="5.625 * DEG"/> <!-- was 3.91 * DEG --> + <var name="LockBaseBAssemblyN" value="16."/> + <var name="LockBaseOffset" value="3."/> + + <!-- Blade Rails --> + <var name="RailRadius" value="998."/> + <var name="RailShelfLength" value="1479."/> + <var name="RailShelfWidth" value="40."/> + <var name="RailShelfHeight" value="10."/> + <var name="RailBoltHeight" value="25."/> + <var name="RailBoltRadius" value="3."/> + <var name="RailBoltGap" value="152."/> + <var name="RailBoltOffset" value="80."/> + <var name="RailBoltNumber" value="10."/> + <var name="RailWallLength" value="1434."/> + <var name="RailWallWidth" value="10."/> + <var name="RailWallHeight" value="50."/> + <var name="RailLength" value="1479."/> + <vector name="RailLengthS" value="155. 100. 1224."/> + <vector name="RailSquareTAngle" value="0.01999 0.009999"/> + <var name="RailCircleRadius" value="8."/> + <var name="RailSquareEdge" value="8."/> + <var name="RailWheelLength" value="20."/> + <var name="RailWheelRadius" value="25."/> + <var name="RailWheelOffsetClose" value="118."/> + <var name="RailWheelOffsetFar" value="187."/> + <vector name="RailWedgeHeight" value="12. 17."/> + <var name="RailWedgeLength" value="60"/> + <var name="RailWedgeWidth" value="14."/> + <var name="RailWedgeAngle" value="0.08314"/> + <var name="RailWedgeOffset" value="30."/> + + <var name="ECPSTLength" value="1482."/><!-- Original value is 1632, revert when proper interfaces exist --> + <var name="ECPSTHatGap" value="300."/> + <var name="ECPSTHatHeight" value="15."/> + <var name="ECPSTOffset" value="216."/> + <var name="ECPSTHatNumber" value="5"/> + +</defines> + +<!--Build up EC hybrids--> +<defines> + <var name="E_HybridT" value="0.120 + 0.240 + 0.080"/> + <var name="E_HybridRadiusMinR0H0" value="404.749"/> + <var name="E_HybridRadiusMaxR0H0" value="421.944"/> + <var name="E_HybridRadiusMinR0H1" value="437.406"/> + <var name="E_HybridRadiusMaxR0H1" value="454.601"/> + <var name="E_HybridRadiusMinR1H0" value="508.8"/> + <var name="E_HybridRadiusMaxR1H0" value="524.32"/> + <var name="E_HybridRadiusMinR1H1" value="542.769"/> + <var name="E_HybridRadiusMaxR1H1" value="557.523"/> + <var name="E_HybridRadiusMinR2H0" value="603.67"/> + <var name="E_HybridRadiusMaxR2H0" value="624.433"/> + <var name="E_HybridRadiusMinR3H0" value="671.918"/> + <var name="E_HybridRadiusMaxR3H0" value="688.336"/> + <var name="E_HybridRadiusMinR3H2" value="705.934"/> + <var name="E_HybridRadiusMaxR3H2" value="721.732"/> + <var name="E_HybridRadiusMinR3H1" value="E_HybridRadiusMinR3H0"/> + <var name="E_HybridRadiusMaxR3H1" value="E_HybridRadiusMaxR3H0"/> + <var name="E_HybridRadiusMinR3H3" value="E_HybridRadiusMinR3H2"/> + <var name="E_HybridRadiusMaxR3H3" value="E_HybridRadiusMaxR3H2"/> + <var name="E_HybridRadiusMinR4H0" value="812.573"/> + <var name="E_HybridRadiusMaxR4H0" value="834.485"/> + <var name="E_HybridRadiusMinR4H1" value="E_HybridRadiusMinR4H0"/> + <var name="E_HybridRadiusMaxR4H1" value="E_HybridRadiusMaxR4H0"/> + <var name="E_HybridRadiusMinR5H0" value="908.56"/> + <var name="E_HybridRadiusMaxR5H0" value="934.4"/> + <var name="E_HybridRadiusMinR5H1" value="E_HybridRadiusMinR5H0"/> + <var name="E_HybridRadiusMaxR5H1" value="E_HybridRadiusMaxR5H0"/> + <var name="E_HCCRadiusR0H0" value="419.6"/> + <var name="E_HCCRadiusR0H1" value="437.2"/> + <var name="E_HCCRadiusR1H0" value="520.02"/> + <var name="E_HCCRadiusR1H1" value="540.905"/> + <var name="E_HCCRadiusR2H0" value="618.3"/> + <var name="E_HCCRadiusR2H0a" value="627.14"/> + <var name="E_HCCRadiusR3H1" value="686.509"/> + <var name="E_HCCRadiusR3H1a" value="690.503"/> + <var name="E_HCCRadiusR3H3" value="700.993"/> + <var name="E_HCCRadiusR3H3a" value="704.779"/> + <var name="E_HCCRadiusR4H1" value="830.651"/> + <var name="E_HCCRadiusR4H1a" value="833.607"/> + <var name="E_HCCRadiusR5H1" value="926.664"/> + <var name="E_HCCRadiusR5H1a" value="931.488"/> + <var name="N_ABC_R0" value="8"/> + <var name="N_ABC_R1" value="10"/> + <var name="N_ABC_R2" value="12"/> + <var name="N_ABC_R3" value="7"/> + <var name="N_ABC_R4" value="8"/> + <var name="N_ABC_R5" value="9"/> + <var name="ABC_ToEHybridEdgeGap" value="0.31"/> + <var name="HCC_R0H0_OffsetX" value="B_HybridW/2 - (3.55 + 0.5 + ABC_W + HCC_L/2)"/> + <var name="HCC_R0H0_OffsetY" value="36.41 + HCC_W/2"/> +</defines> + +<shapes> + <tubs name="ShE_HybridR0H0" rmin="E_HybridRadiusMinR0H0" rmax="E_HybridRadiusMaxR0H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/> + <tubs name="ShE_HybridR0H1" rmin="E_HybridRadiusMinR0H1" rmax="E_HybridRadiusMaxR0H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/> + <tubs name="ShE_HybridR1H0" rmin="E_HybridRadiusMinR1H0" rmax="E_HybridRadiusMaxR1H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/> + <tubs name="ShE_HybridR1H1" rmin="E_HybridRadiusMinR1H1" rmax="E_HybridRadiusMaxR1H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/> + <tubs name="ShE_HybridR2H0" rmin="E_HybridRadiusMinR2H0" rmax="E_HybridRadiusMaxR2H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_2 / 2" dphi="SensorPhiWidth_2"/> + <tubs name="ShE_HybridR3H0" rmin="E_HybridRadiusMinR3H0" rmax="E_HybridRadiusMaxR3H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/> + <tubs name="ShE_HybridR3H2" rmin="E_HybridRadiusMinR3H2" rmax="E_HybridRadiusMaxR3H2" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/> + <tubs name="ShE_HybridR3H1" rmin="E_HybridRadiusMinR3H1" rmax="E_HybridRadiusMaxR3H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/> + <tubs name="ShE_HybridR3H3" rmin="E_HybridRadiusMinR3H3" rmax="E_HybridRadiusMaxR3H3" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/> + <tubs name="ShE_HybridR4H0" rmin="E_HybridRadiusMinR4H0" rmax="E_HybridRadiusMaxR4H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_4*0.49" dphi="SensorPhiWidth_4*0.975"/> + <tubs name="ShE_HybridR5H0" rmin="E_HybridRadiusMinR5H0" rmax="E_HybridRadiusMaxR5H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.975"/> + <tubs name="ShE_HybridR4H1" rmin="E_HybridRadiusMinR4H1" rmax="E_HybridRadiusMaxR4H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_4*0.49" dphi="SensorPhiWidth_4*0.975"/> + <tubs name="ShE_HybridR5H1" rmin="E_HybridRadiusMinR5H1" rmax="E_HybridRadiusMaxR5H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.975"/> + <!--sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.97" /> enough clearance - can i reduce? 0.98 is not enough. 0.975 looks perfect in vp1/Debugger --> +</shapes> + +<materials> + + <!-- GeoModelXml input created by ConsolidX for EC_HybridPCB, version 1.0. --> + <material name="matEC_HybridPCB" density="0.002165*1000"> + <elementref ref="Aluminium" fraction="0.008079"/> + <elementref ref="Barium" fraction="0.057375"/> + <elementref ref="Carbon" fraction="0.250888"/> + <elementref ref="Copper" fraction="0.421377"/> + <elementref ref="Gold" fraction="0.004799"/> + <elementref ref="Hydrogen" fraction="0.014609"/> + <elementref ref="Lead" fraction="0.023518"/> + <elementref ref="Nickel" fraction="0.020306"/> + <elementref ref="Nitrogen" fraction="0.048265"/> + <elementref ref="Oxygen" fraction="0.058161"/> + <elementref ref="Silver" fraction="0.024977"/> + <elementref ref="Tin" fraction="0.047647"/> + <elementref ref="Titanium" fraction="0.019999"/> + </material> + + <material name="matEC_HybridR0H0" density="0.002283*1000"> + <elementref ref="Aluminium" fraction="0.016242"/> + <elementref ref="Barium" fraction="0.056974"/> + <elementref ref="Carbon" fraction="0.232673"/> + <elementref ref="Copper" fraction="0.387344"/> + <elementref ref="Gold" fraction="0.004411"/> + <elementref ref="Hydrogen" fraction="0.013620"/> + <elementref ref="Lead" fraction="0.040407"/> + <elementref ref="Nickel" fraction="0.021053"/> + <elementref ref="Nitrogen" fraction="0.044367"/> + <elementref ref="Oxygen" fraction="0.064096"/> + <elementref ref="Silver" fraction="0.020835"/> + <elementref ref="Tin" fraction="0.078118"/> + <elementref ref="Titanium" fraction="0.019859"/> + </material> + + <material name="matEC_HybridR0H1" density="0.002276*1000"> + <elementref ref="Aluminium" fraction="0.015741"/> + <elementref ref="Barium" fraction="0.057777"/> + <elementref ref="Carbon" fraction="0.230008"/> + <elementref ref="Copper" fraction="0.388521"/> + <elementref ref="Gold" fraction="0.004425"/> + <elementref ref="Hydrogen" fraction="0.013347"/> + <elementref ref="Lead" fraction="0.040916"/> + <elementref ref="Nickel" fraction="0.021079"/> + <elementref ref="Nitrogen" fraction="0.044502"/> + <elementref ref="Oxygen" fraction="0.063062"/> + <elementref ref="Silver" fraction="0.021489"/> + <elementref ref="Tin" fraction="0.078995"/> + <elementref ref="Titanium" fraction="0.020139"/> + </material> + + <material name="matEC_HybridR1H0" density="0.002291*1000"> + <elementref ref="Aluminium" fraction="0.015573"/> + <elementref ref="Barium" fraction="0.059492"/> + <elementref ref="Carbon" fraction="0.226923"/> + <elementref ref="Copper" fraction="0.386042"/> + <elementref ref="Gold" fraction="0.004397"/> + <elementref ref="Hydrogen" fraction="0.013111"/> + <elementref ref="Lead" fraction="0.042078"/> + <elementref ref="Nickel" fraction="0.021198"/> + <elementref ref="Nitrogen" fraction="0.044218"/> + <elementref ref="Oxygen" fraction="0.062647"/> + <elementref ref="Silver" fraction="0.022440"/> + <elementref ref="Tin" fraction="0.081145"/> + <elementref ref="Titanium" fraction="0.020737"/> + </material> + + <material name="matEC_HybridR1H1" density="0.002329*1000"> + <elementref ref="Aluminium" fraction="0.015723"/> + <elementref ref="Barium" fraction="0.062244"/> + <elementref ref="Carbon" fraction="0.223189"/> + <elementref ref="Copper" fraction="0.379731"/> + <elementref ref="Gold" fraction="0.004325"/> + <elementref ref="Hydrogen" fraction="0.012895"/> + <elementref ref="Lead" fraction="0.043978"/> + <elementref ref="Nickel" fraction="0.021420"/> + <elementref ref="Nitrogen" fraction="0.043495"/> + <elementref ref="Oxygen" fraction="0.062818"/> + <elementref ref="Silver" fraction="0.023760"/> + <elementref ref="Tin" fraction="0.084726"/> + <elementref ref="Titanium" fraction="0.021696"/> + </material> + <material name="matEC_HybridR2H0" density="0.002217*1000"> + <elementref ref="Aluminium" fraction="0.011959"/> + <elementref ref="Barium" fraction="0.074836"/> + <elementref ref="Carbon" fraction="0.216346"/> + <elementref ref="Copper" fraction="0.398835"/> + <elementref ref="Gold" fraction="0.004542"/> + <elementref ref="Hydrogen" fraction="0.011858"/> + <elementref ref="Lead" fraction="0.035170"/> + <elementref ref="Nickel" fraction="0.023559"/> + <elementref ref="Nitrogen" fraction="0.045683"/> + <elementref ref="Oxygen" fraction="0.063084"/> + <elementref ref="Silver" fraction="0.017340"/> + <elementref ref="Tin" fraction="0.070704"/> + <elementref ref="Titanium" fraction="0.026085"/> + </material> + + <material name="matEC_HybridR3H0" density="0.001911*1000"> + <elementref ref="Aluminium" fraction="0.011684"/> + <elementref ref="Barium" fraction="0.029534"/> + <elementref ref="Carbon" fraction="0.253875"/> + <elementref ref="Copper" fraction="0.462759"/> + <elementref ref="Gold" fraction="0.005270"/> + <elementref ref="Hydrogen" fraction="0.014025"/> + <elementref ref="Lead" fraction="0.025363"/> + <elementref ref="Nickel" fraction="0.018224"/> + <elementref ref="Nitrogen" fraction="0.053005"/> + <elementref ref="Oxygen" fraction="0.053494"/> + <elementref ref="Silver" fraction="0.014008"/> + <elementref ref="Tin" fraction="0.048465"/> + <elementref ref="Titanium" fraction="0.010294"/> + </material> + + <material name="matEC_HybridR3H1" density="0.002005*1000"> + <elementref ref="Aluminium" fraction="0.011138"/> + <elementref ref="Barium" fraction="0.046565"/> + <elementref ref="Carbon" fraction="0.242011"/> + <elementref ref="Copper" fraction="0.441134"/> + <elementref ref="Gold" fraction="0.005024"/> + <elementref ref="Hydrogen" fraction="0.013370"/> + <elementref ref="Lead" fraction="0.027924"/> + <elementref ref="Nickel" fraction="0.020280"/> + <elementref ref="Nitrogen" fraction="0.050528"/> + <elementref ref="Oxygen" fraction="0.057430"/> + <elementref ref="Silver" fraction="0.013499"/> + <elementref ref="Tin" fraction="0.054867"/> + <elementref ref="Titanium" fraction="0.016231"/> + </material> + + <material name="matEC_HybridR3H2" density="0.001907*1000"> + <elementref ref="Aluminium" fraction="0.011594"/> + <elementref ref="Barium" fraction="0.029306"/> + <elementref ref="Carbon" fraction="0.254014"/> + <elementref ref="Copper" fraction="0.463746"/> + <elementref ref="Gold" fraction="0.005282"/> + <elementref ref="Hydrogen" fraction="0.014018"/> + <elementref ref="Lead" fraction="0.025167"/> + <elementref ref="Nickel" fraction="0.018203"/> + <elementref ref="Nitrogen" fraction="0.053118"/> + <elementref ref="Oxygen" fraction="0.053348"/> + <elementref ref="Silver" fraction="0.013900"/> + <elementref ref="Tin" fraction="0.048091"/> + <elementref ref="Titanium" fraction="0.010215"/> + </material> + + <material name="matEC_HybridR3H3" density="0.002000*1000"> + <elementref ref="Aluminium" fraction="0.011056"/> + <elementref ref="Barium" fraction="0.046222"/> + <elementref ref="Carbon" fraction="0.242231"/> + <elementref ref="Copper" fraction="0.442234"/> + <elementref ref="Gold" fraction="0.005037"/> + <elementref ref="Hydrogen" fraction="0.013367"/> + <elementref ref="Lead" fraction="0.027719"/> + <elementref ref="Nickel" fraction="0.020245"/> + <elementref ref="Nitrogen" fraction="0.050654"/> + <elementref ref="Oxygen" fraction="0.057261"/> + <elementref ref="Silver" fraction="0.013399"/> + <elementref ref="Tin" fraction="0.054464"/> + <elementref ref="Titanium" fraction="0.016111"/> + </material> + + <material name="matEC_HybridR4H0" density="0.001775*1000"> + <elementref ref="Aluminium" fraction="0.008135"/> + <elementref ref="Barium" fraction="0.022302"/> + <elementref ref="Carbon" fraction="0.256947"/> + <elementref ref="Copper" fraction="0.498279"/> + <elementref ref="Gold" fraction="0.005675"/> + <elementref ref="Hydrogen" fraction="0.013571"/> + <elementref ref="Lead" fraction="0.018727"/> + <elementref ref="Nickel" fraction="0.017545"/> + <elementref ref="Nitrogen" fraction="0.057074"/> + <elementref ref="Oxygen" fraction="0.047715"/> + <elementref ref="Silver" fraction="0.010489"/> + <elementref ref="Tin" fraction="0.035768"/> + <elementref ref="Titanium" fraction="0.007774"/> + </material> + + <material name="matEC_HybridR4H1" density="0.001835*1000"> + <elementref ref="Aluminium" fraction="0.007868"/> + <elementref ref="Barium" fraction="0.034268"/> + <elementref ref="Carbon" fraction="0.248501"/> + <elementref ref="Copper" fraction="0.481900"/> + <elementref ref="Gold" fraction="0.005488"/> + <elementref ref="Hydrogen" fraction="0.013125"/> + <elementref ref="Lead" fraction="0.020926"/> + <elementref ref="Nickel" fraction="0.018974"/> + <elementref ref="Nitrogen" fraction="0.055198"/> + <elementref ref="Oxygen" fraction="0.050585"/> + <elementref ref="Silver" fraction="0.010253"/> + <elementref ref="Tin" fraction="0.040968"/> + <elementref ref="Titanium" fraction="0.011945"/> + </material> + + <material name="matEC_HybridR5H0" density="0.001724*1000"> + <elementref ref="Aluminium" fraction="0.006621"/> + <elementref ref="Barium" fraction="0.019448"/> + <elementref ref="Carbon" fraction="0.257935"/> + <elementref ref="Copper" fraction="0.512994"/> + <elementref ref="Gold" fraction="0.005842"/> + <elementref ref="Hydrogen" fraction="0.013356"/> + <elementref ref="Lead" fraction="0.016038"/> + <elementref ref="Nickel" fraction="0.017274"/> + <elementref ref="Nitrogen" fraction="0.058759"/> + <elementref ref="Oxygen" fraction="0.045248"/> + <elementref ref="Silver" fraction="0.009086"/> + <elementref ref="Tin" fraction="0.030619"/> + <elementref ref="Titanium" fraction="0.006779"/> + </material> + + <material name="matEC_HybridR5H1" density="0.001769*1000"> + <elementref ref="Aluminium" fraction="0.006450"/> + <elementref ref="Barium" fraction="0.028926"/> + <elementref ref="Carbon" fraction="0.251272"/> + <elementref ref="Copper" fraction="0.499742"/> + <elementref ref="Gold" fraction="0.005692"/> + <elementref ref="Hydrogen" fraction="0.013011"/> + <elementref ref="Lead" fraction="0.017835"/> + <elementref ref="Nickel" fraction="0.018404"/> + <elementref ref="Nitrogen" fraction="0.057241"/> + <elementref ref="Oxygen" fraction="0.047568"/> + <elementref ref="Silver" fraction="0.008937"/> + <elementref ref="Tin" fraction="0.034839"/> + <elementref ref="Titanium" fraction="0.010083"/> + </material> + +</materials> + +<logvol name="ECHybridPCBR0H0" shape="ShE_HybridR0H0" material="matEC_HybridR0H0"> + <index ref="eta_module" value="0"/> +</logvol> +<assembly name="ECHybridR0H0"> + <logvolref ref="ECHybridPCBR0H0"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*(N_ABC_R0-1.5))"/> + <translation y="E_HCCRadiusR0H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC0OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*1)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + <transform> + <transformation name="PlaceABC2OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*2)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*3)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + <transform> + <transformation name="PlaceABC4OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*4)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*5)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*6)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +<transform> + <transformation name="PlaceABC7OnE_HybridR0H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*7)"/> + <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +</assembly> + +<logvol name="ECHybridPCBR0H1" shape="ShE_HybridR0H1" material="matEC_HybridR0H1"> + <index ref="eta_module" value="0"/> +</logvol> +<assembly name="ECHybridR0H1"> + <logvolref ref="ECHybridPCBR0H1"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*(N_ABC_R0-1.5))"/> + <translation y="E_HCCRadiusR0H1+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC0OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*1)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*2)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*3)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*4)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*5)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*6)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR0H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*7)"/> + <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +</assembly> +<logvol name="ECHybridPCBR1H0" shape="ShE_HybridR1H0" material="matEC_HybridR1H0"> + <index ref="eta_module" value="1"/> +</logvol> +<assembly name="ECHybridR1H0"> + <logvolref ref="ECHybridPCBR1H0"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*(N_ABC_R1-1.5))"/> + <translation y="E_HCCRadiusR1H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC0OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*1)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*2)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*3)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*4)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*5)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*6)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*7)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC8OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*8)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC9OnE_HybridR1H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*9)"/> + <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +</assembly> + +<logvol name="ECHybridPCBR1H1" shape="ShE_HybridR1H1" material="matEC_HybridR1H1"> + <index ref="eta_module" value="1"/> +</logvol> + +<assembly name="ECHybridR1H1"> + <logvolref ref="ECHybridPCBR1H1"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*(N_ABC_R1-1.5))"/> + <translation y="E_HCCRadiusR1H1+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC0OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*1)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*2)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*3)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*4)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*5)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*6)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*7)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC8OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*8)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC9OnE_HybridR1H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*9)"/> + <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR2H0" shape="ShE_HybridR2H0" material="matEC_HybridR2H0"> + <index ref="eta_module" value="2"/> +</logvol> + +<assembly name="ECHybridR2H0"> + <logvolref ref="ECHybridPCBR2H0"/> + + <transform> + <transformation name="PlaceHCCOnB_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*(N_ABC_R2-1.5))"/> + <translation y="E_HCCRadiusR2H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceHCCOnB_HybridR2H0a"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*(N_ABC_R2-1.5))"/> + <translation y="E_HCCRadiusR2H0a+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC0OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*0)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR2H0a"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*1)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*2)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*3)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*4)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*5)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*6)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*7)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC8OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*8)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC9OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*9)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC10OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*10)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC11OnE_HybridR2H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*11)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +<!-- <multicopy name="PlaceABCsOnR2_Hybrid" n="N_ABC_R2"> + <transformation name="ABC_ReadyForCopyingToR2_Hybrid"> + <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R2)*(1-N_ABC_R2+2*N_ABC_R2)"/> + <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </multicopy> +--> +</assembly> + +<logvol name="ECHybridPCBR3H0" shape="ShE_HybridR3H0" material="matEC_HybridR3H0"> + <index ref="eta_module" value="3"/> +</logvol> + +<assembly name="ECHybridR3H0"> + <logvolref ref="ECHybridPCBR3H0"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR3H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/> + <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR3H2" shape="ShE_HybridR3H2" material="matEC_HybridR3H2"> + <index ref="eta_module" value="3"/> +</logvol> +<assembly name="ECHybridR3H2"> + <logvolref ref="ECHybridPCBR3H2"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR3H2"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/> + <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR3H1" shape="ShE_HybridR3H1" material="matEC_HybridR3H1"> + <index ref="eta_module" value="3"/> +</logvol> + +<assembly name="ECHybridR3H1"> + <logvolref ref="ECHybridPCBR3H1"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/> + <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR3H3" shape="ShE_HybridR3H3" material="matEC_HybridR3H3"> + <index ref="eta_module" value="3"/> +</logvol> + +<assembly name="ECHybridR3H3"> + <logvolref ref="ECHybridPCBR3H3"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/> + <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR4H0" shape="ShE_HybridR4H0" material="matEC_HybridR4H0"> + <index ref="eta_module" value="4"/> +</logvol> +<assembly name="ECHybridR4H0"> + <logvolref ref="ECHybridPCBR4H0"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*0)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*1)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*2)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*3)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*4)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*5)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*6)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR4H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*7)"/> + <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + +</assembly> + +<logvol name="ECHybridPCBR4H1" shape="ShE_HybridR4H1" material="matEC_HybridR4H1"> + <index ref="eta_module" value="4"/> +</logvol> + +<assembly name="ECHybridR4H1"> + <logvolref ref="ECHybridPCBR4H1"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*0)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*1)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*2)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*3)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*4)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*5)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*6)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*7)"/> + <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR5H0" shape="ShE_HybridR5H0" material="matEC_HybridR5H0"> + <index ref="eta_module" value="5"/> +</logvol> +<assembly name="ECHybridR5H0"> + <logvolref ref="ECHybridPCBR5H0"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*0)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*1)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*2)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*3)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*4)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*5)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*6)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*7)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC8OnE_HybridR5H0"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*8)"/> + <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<logvol name="ECHybridPCBR5H1" shape="ShE_HybridR5H1" material="matEC_HybridR5H1"> + <index ref="eta_module" value="5"/> +</logvol> + +<assembly name="ECHybridR5H1"> + <logvolref ref="ECHybridPCBR5H1"/> + + <transform> + <transformation name="PlaceABC0OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*0)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC1OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*1)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC2OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*2)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC3OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*3)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC4E_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*4)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC5OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*5)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC6OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*6)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC7OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*7)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> + + <transform> + <transformation name="PlaceABC8OnE_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*8)"/> + <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/> + </transformation> + <logvolref ref="ABC_Chip"/> + </transform> +</assembly> + +<!-- To be included in Endcaps.gmx. Builds up the Petal Plank cores (including bus tape copper) --> +<!-- GeoModelXml input created by ConsolidX for BusTape, version 1.0. --> + +<materials> + <material name="matPetalBusKapton" density="1.180"> + <elementref ref="Carbon" fraction="0.524968"/> + <elementref ref="Copper" fraction="0.266830"/> + <elementref ref="Hydrogen" fraction="0.031077"/> + <elementref ref="Nitrogen" fraction="0.098203"/> + <elementref ref="Oxygen" fraction="0.078922"/> + </material> +</materials> + +<shapes> + + <tubs name="ShPetalCore" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalCoreThickness/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> + <tubs name="ShPetalEOS" rmin="PetalEarInnerRadius" rmax="PetalEarOuterRadius" zhalflength="PetalCoreThickness/2" sphi="-PetalEarAngle/2" dphi="PetalEarAngle"/> + <union name="shPetalCore"> + <shaperef ref="ShPetalCore"/> + <transformation name="PlaceFirstEOS"> + <rotation zcos="1" angle="(PetalCoreAngle + PetalEarAngle)/2"/> + </transformation> + <shaperef ref="ShPetalEOS"/> + </union> + + <tubs name="ShPetalFaceSheet" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalFaceSheetT/2 - EPS" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> + + <tubs name="ShPetalEOS_FaceSheet" rmin="PetalEarInnerRadius" rmax="PetalEarOuterRadius" zhalflength="PetalFaceSheetT/2 - EPS" sphi="-PetalEarAngle/2" dphi="PetalEarAngle"/> + + <union name="shPetalFaceSheet"> + <shaperef ref="ShPetalFaceSheet"/> + <transformation name="PlaceFirstEOS_FaceSheet"> + <rotation zcos="1" angle="(PetalCoreAngle + PetalEarAngle)/2"/> + </transformation> + <shaperef ref="ShPetalEOS_FaceSheet"/> + </union> + + <tubs name="shPetalCloseoutFar" rmin="PetalCoreOuterRadius-PetalCloseoutW" rmax="PetalCoreOuterRadius" zhalflength="PetalCloseoutT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle+PetalEarAngle"/> + <tubs name="shPetalCloseoutNear" rmin="PetalCoreInnerRadius" rmax="PetalCoreInnerRadius+PetalCloseoutW" zhalflength="PetalCloseoutT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> + <box name="shPetalCloseoutLong" xhalflength="PetalCchannelLongL/2 -2*EPS" yhalflength="PetalCchannelW/2" zhalflength="PetalCFoamT/2 - EPS"/> + <box name="shPetalCloseoutLongSpace" xhalflength="(PetalCchannelLongL-1)/2" yhalflength="PetalCchannelInnerW/2" zhalflength="PetalCchannelInnerT/2"/> + <box name="shPetalCloseoutShort" xhalflength="PetalCchannelShortL/2 - EPS" yhalflength="PetalCchannelW/2" zhalflength="PetalCFoamT/2 - EPS"/> + <box name="shPetalCloseoutShortSpace" xhalflength="(PetalCchannelShortL-1)/2" yhalflength="PetalCchannelInnerW/2" zhalflength="PetalCchannelInnerT/2"/> + <tubs name="shPetalBusKapton" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalBusKaptonT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> + + <tubs name="shPetalBusGlue" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalBusGlueT/2" sphi="-SensorPhiWidth_0/2" dphi="SensorPhiWidth_0"/> + + <box name="shPetalCFoam1" xhalflength="PetalCooling1L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/> + + <tube name="shPetalCooling1Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling1L/2 - 2 * EPS"/> + + <tube name="shPetalCooling1CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling1L/2 - 3 * EPS"/> + + <box name="shPetalCFoam2" xhalflength="PetalCooling2L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/> + + <tube name="shPetalCooling2Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling2L/2 - 2 * EPS"/> + + <tube name="shPetalCooling2CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling2L/2 - 3 * EPS"/> + + <box name="shPetalCFoam3" xhalflength="PetalCooling3L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/> + + <tube name="shPetalCooling3Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling3L/2 - 2 * EPS"/> + + <tube name="shPetalCooling3CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling3L/2 - 3 * EPS"/> + +</shapes> + +<logvol name="PetalFaceSheetAll" shape="shPetalFaceSheet" material="K13C2U"/> +<logvol name="PetalBusKapton" shape="shPetalBusKapton" material="matPetalBusKapton"/> +<logvol name="PetalBusGlue" shape="shPetalBusGlue" material="SE4445"/> +<logvol name="PetalCloseoutFar" shape="shPetalCloseoutFar" material="Torlon"/> +<logvol name="PetalCloseoutNear" shape="shPetalCloseoutNear" material="Torlon"/> +<logvol name="PetalCloseoutLong" shape="shPetalCloseoutLong" material="T300CF"> +<transform> + <transformation name="Place_PetalCloseoutLongSpace"> + <translation y="-(PetalCchannelW-PetalCchannelInnerW)/2+EPS"/> + </transformation> +<logvol name="PetalCloseoutLongSpace" shape="shPetalCloseoutLongSpace" material="Air"/> + + </transform> +</logvol> +<logvol name="PetalCloseoutShort" shape="shPetalCloseoutShort" material="T300CF"> +<transform> +<transformation name="Place_PetalCloseoutShortSpace"> + <translation y="((PetalCchannelW-PetalCchannelInnerW)/2-EPS)"/> + </transformation> +<logvol name="PetalCloseoutShortSpace" shape="shPetalCloseoutShortSpace" material="Air"/> + </transform> +</logvol> + + +<logvol name="PetalCooling1Unit" shape="shPetalCFoam1" material="k9Allcomp"> + <transform> + <transformation name="PlaceTubeInPetalCFoam1"> + <rotation ycos="1" angle="PI / 2."/> + </transformation> + <logvol name="PetalCoolingTube" shape="shPetalCooling1Tube" material="TiMetal"> + <logvol name="PetalCoolingCO2" shape="shPetalCooling1CO2" material="CO2Liquid"/> + </logvol> + </transform> +</logvol> + +<logvol name="PetalCooling2Unit" shape="shPetalCFoam2" material="k9Allcomp"> + <transform> + <transformation name="PlaceTubeInPetalCFoam2"> + <rotation ycos="1" angle="PI / 2."/> + </transformation> + <logvol name="PetalCooling2Tube" shape="shPetalCooling2Tube" material="TiMetal"> + <logvol name="PetalCooling2CO2" shape="shPetalCooling2CO2" material="CO2Liquid"/> + </logvol> + </transform> +</logvol> + +<logvol name="PetalCooling3Unit" shape="shPetalCFoam3" material="k9Allcomp"> + <transform> + <transformation name="PlaceTubeInPetalCFoam3"> + <rotation ycos="1" angle="PI / 2."/> + </transformation> + <logvol name="PetalCooling3Tube" shape="shPetalCooling3Tube" material="TiMetal"> + <logvol name="PetalCooling3CO2" shape="shPetalCooling3CO2" material="CO2Liquid"/> + </logvol> + </transform> +</logvol> + +<logvol name="PetalCore" shape="shPetalCore" material="Honeycomb3pcf"> + + <transform> + <transformation name="Place_PetalCloseoutFar"> + <translation x="0.00"/> + </transformation> + <logvolref ref="PetalCloseoutFar"/> + </transform> + + <transform> + <transformation name="Place_PetalCloseoutNear"> + <translation x="0.00"/> + </transformation> + <logvolref ref="PetalCloseoutNear"/> + </transform> + +<transform> + <transformation name="Place_PetalCloseoutShort"> + <rotation zcos="1" angle="+0.962*PetalCoreAngle/2"/> + <translation x="PetalCoreInnerRadius +PetalCchannelShortL/2+PetalCloseoutW "/> + + </transformation> + <logvolref ref="PetalCloseoutShort"/> + </transform> + + <transform> + <transformation name="Place_PetalCloseoutLong"> + <rotation zcos="1" angle="-0.962*PetalCoreAngle/2"/> + <translation x="PetalCoreInnerRadius + (PetalCchannelLongL)/2+PetalCloseoutW "/> + + </transformation> + <logvolref ref="PetalCloseoutLong"/> + </transform> + + <transform> + <transformation name="PlaceLowZ_PetalFacesheet"> + <translation z="-((PetalHoneycombT + PetalFaceSheetT)/2)"/> + </transformation> + <logvolref ref="PetalFaceSheetAll"/> + </transform> + + <transform> + <transformation name="PlaceHighZ_PetalFacesheet"> + <translation z="(PetalHoneycombT + PetalFaceSheetT)/2"/> + </transformation> + <logvolref ref="PetalFaceSheetAll"/> + </transform> + + <transform> + <transformation name="PlaceLowZ_PetalBusGlue"> + <translation z="-((PetalHoneycombT + PetalBusGlueT)/2 + PetalFaceSheetT)"/> + </transformation> + <logvolref ref="PetalBusGlue"/> + </transform> + + <transform> + <transformation name="PlaceHighZ_PetalBusGlue"> + <translation z="(PetalHoneycombT + PetalBusGlueT)/2 + PetalFaceSheetT"/> + </transformation> + <logvolref ref="PetalBusGlue"/> + </transform> + + <transform> + <transformation name="PlaceLowZ_PetalBusKapton"> + <translation z="-((PetalHoneycombT + PetalBusKaptonT)/2 + PetalFaceSheetT + PetalBusGlueT)"/> + </transformation> + <logvolref ref="PetalBusKapton"/> + </transform> + + <transform> + <transformation name="PlaceHighZ_PetalBusKapton"> + <translation z="(PetalHoneycombT + PetalBusKaptonT)/2 + PetalFaceSheetT + PetalBusGlueT"/> + </transformation> + <logvolref ref="PetalBusKapton"/> + </transform> + + <transform> + <transformation name="PlacePetal_Cooling1"> + <rotation zcos="1" angle="-4*PI/180"/> + <translation x="(PetalCoreInnerRadius + PetalCooling1L/2+PetalCloseoutW) "/> + </transformation> + <logvolref ref="PetalCooling1Unit"/> + </transform> + + <transform> + <transformation name="PlacePetal_Cooling2"> + <rotation zcos="1" angle="+4*PI/180"/> + <translation x="(PetalCoreInnerRadius + PetalCooling2L/2+PetalCloseoutW) "/> + </transformation> + <logvolref ref="PetalCooling2Unit"/> + </transform> + + <transform> + <transformation name="PlacePetal_Cooling3"> + <translation x="(PetalCoreOuterRadius-40) "/> + <translation y="(30) "/> + <rotation zcos="1" angle="+PI/2"/> + </transformation> + <logvolref ref="PetalCooling3Unit"/> + </transform> + +</logvol> + +<assembly name="PetalPlank"> <!-- A core plus the Cu in the cable bus plus mounts --> + <logvolref ref="PetalCore"/> +</assembly> + +<shapes> + <tube name="shEC_InnerCyl" rmin="EC_InnerCylInnerR" rmax="EC_InnerCylOuterR - EPS" zhalflength="EC_InnerCylLength / 2."/> + + <tube name="shWheelInnerT_Base" rmin="EC_InnerCylOuterR" rmax="WheelInnerT_BaseOuterR" zhalflength="WheelInnerT_BaseWidth / 2."/> + <tube name="shWheelInnerT_Upright" rmin="WheelInnerT_BaseOuterR" rmax="WheelInnerT_UprightOuterR" zhalflength="WheelInnerT_UprightThickness / 2."/> + <union name="shWheelInnerT"> + <shaperef ref="shWheelInnerT_Base"/> + <transformationref ref="IdentityTransform"/> + <shaperef ref="shWheelInnerT_Upright"/> + </union> + + <tube name="shWheelOuterT_Base" rmin="WheelOuterT_BaseInnerR" rmax="WheelOuterT_OuterR" zhalflength="WheelOuterT_BaseWidth / 2.0"/> + <tube name="shWheelOuterT_Upright" rmin="WheelOuterT_UprightInnerR" rmax="WheelOuterT_BaseInnerR" zhalflength="WheelOuterT_UprightThickness / 2.0"/> + <union name="shWheelOuterT"> + <shaperef ref="shWheelOuterT_Base"/> + <transformationref ref="IdentityTransform"/> + <shaperef ref="shWheelOuterT_Upright"/> + </union> + + <tube name="shStiffDiscCF" rmin="StiffDiscRI" rmax="StiffDiscRO" zhalflength="StiffDiscCF_T / 2."/> + <tube name="shStiffDiscFoam" rmin="StiffDiscRI" rmax="StiffDiscRO" zhalflength="StiffDiscFoamT / 2. - 2. * EPS"/> + + <tube name="shZtubeD0D1" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_1 - WheelZ_0 - WheelOuterT_UprightThickness) / 2. - EPS"/> + <tube name="shZtubeD1D2" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_2 - WheelZ_1 - WheelOuterT_UprightThickness) / 2. - EPS"/> + <tube name="shZtubeD2D3" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_3 - WheelZ_2 - WheelOuterT_UprightThickness) / 2. - EPS"/> + <tube name="shZtubeD3D4" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_4 - WheelZ_3 - WheelOuterT_UprightThickness) / 2. - EPS"/> + <tube name="shZtubeD4D5" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_5 - WheelZ_4 - WheelOuterT_UprightThickness) / 2. - EPS"/> + + + + + + <trd name="BladeFaceSheet" xhalflength1="BladeFaceSheetThickness / 2." xhalflength2="BladeFaceSheetThickness / 2." yhalflength1="BladeOuterEndWidth / 2. + BladeLength * tan( BladeAngle / 2. )" yhalflength2="BladeOuterEndWidth / 2." zhalflength="BladeLength / 2."/> + + <trd name="BladeCoreTrap" xhalflength1="BladeRodOuterEdge / 2. - 0.05" xhalflength2="BladeRodOuterEdge / 2. - 0.05" yhalflength1="BladeOuterEndWidth / 2. + BladeLength * tan( BladeAngle / 2. ) - 0.05" yhalflength2="BladeOuterEndWidth / 2. - 0.05" zhalflength="BladeLength / 2."/> + + <trap name="BladeRodCore" zhalflength="(BladeLength / 2. ) + 1" theta="-BladeAngle / 2." phi="PI / 2." dydzn="BladeRodInnerEdge / 2." dxdyndzn="BladeRodInnerEdge / 2." dxdypdzn="BladeRodInnerEdge / 2." angleydzn="0." dydzp="BladeRodInnerEdge / 2." dxdyndzp="BladeRodInnerEdge / 2." dxdypdzp="BladeRodInnerEdge / 2." angleydzp="0."/> + + <trap name="BladeRodShell" zhalflength="(BladeLength / 2. )" theta="-BladeAngle / 2." phi="PI / 2." dydzn="BladeRodOuterEdge / 2." dxdyndzn="BladeRodOuterEdge / 2." dxdypdzn="BladeRodOuterEdge / 2." angleydzn="0." dydzp="BladeRodOuterEdge / 2." dxdyndzp="BladeRodOuterEdge / 2." dxdypdzp="BladeRodOuterEdge / 2." angleydzp="0."/> + + <tube name="BladeCircle0" rmin="0." rmax="BladeHoleDiameter_0 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle1" rmin="0." rmax="BladeHoleDiameter_1 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle2" rmin="0." rmax="BladeHoleDiameter_2 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle3" rmin="0." rmax="BladeHoleDiameter_3 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle4" rmin="0." rmax="BladeHoleDiameter_4 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle5" rmin="0." rmax="BladeHoleDiameter_5 / 2." zhalflength="BladeHoleThickness"/> + + <tube name="BladeCircle6" rmin="0." rmax="BladeHoleDiameter_6 / 2." zhalflength="BladeHoleThickness"/> + + <tubs name="BladeCircle7" rmin="0." rmax="BladeBarrelR" sphi="PI / 2." dphi="PI" zhalflength="BladeHoleThickness"/> + + <tube name="BladeBarrelCore" rmin="0." rmax="BladeBarrelR" zhalflength="BladeHoleThickness"/> + + <box name="BladeBaseHole" xhalflength="BladeBaseHeight" yhalflength="BladeBaseWidth / 2." zhalflength="BladeHoleThickness"/> + + <tube name="shECPSTube" rmin="BarrelRadius_0 + EPS" rmax="BarrelRadius_0 + StaveSupportCylThickness - EPS" zhalflength="ECPSTLength / 2."/> + + + + <union name="BarrelBase"> + <shaperef ref="BladeBarrelCore"/> + <transformation name="AddBase"> + <translation y="BladeBarrelR"/> + <rotation zcos="1." angle="PI / 2."/> + </transformation> + <shaperef ref="BladeBaseHole"/> + </union> + + <union name="BarrelBase1Hole"> + <shaperef ref="BarrelBase"/> + <transformation name="AddCircle1"> + <translation y="BladeHoleOffset"/> + </transformation> + <shaperef ref="BladeCircle6"/> + </union> + + <union name="BarrelBase2Hole"> + <shaperef ref="BarrelBase1Hole"/> + <transformation name="AddCircle2"> + <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + BladeHoleGap + BladeHoleDiameter_5 / 2."/> + </transformation> + <shaperef ref="BladeCircle5"/> + </union> + + <union name="BarrelBase3Hole"> + <shaperef ref="BarrelBase2Hole"/> + <transformation name="AddCircle3"> + <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (2 * BladeHoleGap) + BladeHoleDiameter_5 + BladeHoleDiameter_4 / 2."/> + </transformation> + <shaperef ref="BladeCircle4"/> + </union> + + <union name="BarrelBase4Hole"> + <shaperef ref="BarrelBase3Hole"/> + <transformation name="AddCircle4"> + <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (3 * BladeHoleGap) + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 / 2."/> + </transformation> + <shaperef ref="BladeCircle3"/> + </union> + + <union name="BarrelBase5Hole"> + <shaperef ref="BarrelBase4Hole"/> + <transformation name="AddCircle5"> + <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (4 * BladeHoleGap) + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 + BladeHoleDiameter_2 / 2."/> + </transformation> + <shaperef ref="BladeCircle2"/> + </union> + + <union name="BarrelBase6Hole"> + <shaperef ref="BarrelBase5Hole"/> + <transformation name="AddCircle6"> + <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (5 * BladeHoleGap) + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 + BladeHoleDiameter_2 + BladeHoleDiameter_1 /2."/> + </transformation> + <shaperef ref="BladeCircle1"/> + </union> + + <union name="BarrelBase7Hole"> + <shaperef ref="BarrelBase6Hole"/> + <transformation name="AddCircle7"> + <translation y="BladeLength - 3"/> + </transformation> + <shaperef ref="BladeCircle0"/> + </union> + + <subtraction name="BladeFaceSheetComplete"> + <shaperef ref="BladeFaceSheet"/> + <transformation name="BladeFSRemoveShapes"> + <translation z="-(BladeLength / 2.)"/> + <rotation ycos="1." angle="-(PI / 2.)"/> + <rotation zcos="1." angle="-(PI / 2.)"/> + </transformation> + <shaperef ref="BarrelBase7Hole"/> + </subtraction> + + <subtraction name="BladeCore7HoleNoBarrel"> + <shaperef ref="BladeCoreTrap"/> + <transformation name="BladeCoreRemoveShapes"> + <translation z="-(BladeLength / 2.)"/> + <rotation ycos="1." angle="-(PI / 2.)"/> + <rotation zcos="1." angle="-(PI / 2.)"/> + </transformation> + <shaperef ref="BarrelBase7Hole"/> + </subtraction> + + + <subtraction name="BladeCoreminusL"> + <shaperef ref="BladeCore7HoleNoBarrel"/> + <transformation name="BladeCRemoveLRod"> + <translation y="(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/> + </transformation> + <shaperef ref="BladeRodShell"/> + </subtraction> + + <subtraction name="BladeCoreComplete"> + <shaperef ref="BladeCoreminusL"/> + <transformation name="BladeCRemoveRRod"> + <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/> + <rotation zcos="1." angle="PI"/> + </transformation> + <shaperef ref="BladeRodShell"/> + </subtraction> + + <!-- Blade Siderods --> + <subtraction name="BladeSideRodRemoveCore"> + <shaperef ref="BladeRodShell"/> + <transformation name="BladeSideRodHollow"> + <rotation ycos="1." angle="0."/> + </transformation> + <shaperef ref="BladeRodCore"/> + </subtraction> + + <subtraction name="BladeSideRodComplete"> + <shaperef ref="BladeSideRodRemoveCore"/> + <transformation name="BladeSideRodRemoveBarrel"> + <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/> + <translation z="-(BladeLength / 2.)"/> + <rotation ycos="1." angle="PI / 2."/> + </transformation> + <shaperef ref="BladeBarrelCore"/> + </subtraction> + + <box name="shLockBaseH" xhalflength="LockBaseHWidth / 2." yhalflength="LockBaseHHeight / 2." zhalflength="LockBaseHThickness / 2."/> + + <box name="shLockBaseL" xhalflength="LockBaseLWidth / 2." yhalflength="LockBaseLHeight / 2." zhalflength="LockBaseLThickness / 2."/> + + <tube name="shRailWheel" rmin="0." rmax="RailWheelRadius / 2." zhalflength="RailWheelLength / 2."/> + + <tube name="shRailBolt" rmin="0." rmax="RailBoltRadius / 2." zhalflength="RailBoltHeight / 2."/> + + <tube name="shRailBoltCore" rmin="0." rmax="RailBoltRadius / 2." zhalflength="RailShelfHeight / 2."/> + + <box name="shRailShelf" xhalflength="RailShelfWidth / 2." yhalflength="RailShelfHeight / 2." zhalflength="RailShelfLength / 2."/> + + <box name="shRailWall" xhalflength="RailWallWidth / 2." yhalflength="RailWallHeight / 2." zhalflength="RailWallLength / 2."/> + + <box name="shRailSquare1" xhalflength="RailSquareEdge / 2." yhalflength="RailSquareEdge / 2." zhalflength="RailLengthS_0 / 2."/> + + <trap name="shRailSquareT" zhalflength="RailLengthS_1 / 2." theta="RailSquareTAngle_1" phi="0." dydzn="RailSquareEdge / 2." dxdyndzn="(RailSquareEdge + 2) / 2." dxdypdzn="(RailSquareEdge + 2) / 2." angleydzn="0." dydzp="RailSquareEdge / 2." dxdyndzp="RailSquareEdge / 2." dxdypdzp="RailSquareEdge / 2." angleydzp="0."/> + + <box name="shRailSquare2" xhalflength="RailSquareEdge / 2." yhalflength="(RailSquareEdge + 2) / 2." zhalflength="RailLengthS_2 / 2."/> + + <tube name="shRailCircle" rmin="0." rmax="RailCircleRadius / 2." zhalflength="RailLength / 2."/> + + <trap name="shRailWedge" zhalflength="RailWedgeLength / 2." theta="RailWedgeAngle / 2." phi="0." dydzn="RailWedgeWidth / 2." dxdyndzn="RailWedgeHeight_0 / 2." dxdypdzn="RailWedgeHeight_0 / 2." angleydzn="0." dydzp="RailWedgeWidth / 2." dxdyndzp="RailWedgeHeight_1 / 2." dxdypdzp="RailWedgeHeight_1 / 2." angleydzp="0."/> + + <subtraction name="shRailBoltNoCore"> + <shaperef ref="shRailBolt"/> + <transformation name="BoltSub"> + <translation z="0."/> + </transformation> + <shaperef ref="shRailBoltCore"/> + </subtraction> + +</shapes> + +<logvol name="EC_InnerCyl" shape="shEC_InnerCyl" material="CFRP"/> +<logvol name="WheelInnerT" shape="shWheelInnerT" material="CFRP"/> +<logvol name="WheelOuterT" shape="shWheelOuterT" material="CFRP"/> + +<logvol name="StiffDiscCF" shape="shStiffDiscCF" material="CFRP"/> +<logvol name="StiffDiscFoam" shape="shStiffDiscFoam" material="Rohacell110A"/> + +<logvol name="ZtubeD0D1" shape="shZtubeD0D1" material="CFRP"/> +<logvol name="ZtubeD1D2" shape="shZtubeD1D2" material="CFRP"/> +<logvol name="ZtubeD2D3" shape="shZtubeD2D3" material="CFRP"/> +<logvol name="ZtubeD3D4" shape="shZtubeD3D4" material="CFRP"/> +<logvol name="ZtubeD4D5" shape="shZtubeD4D5" material="CFRP"/> + +<logvol name="BladeFace" shape="BladeFaceSheetComplete" material="CFRP"/> <!-- Placeholder material --> +<logvol name="BladeCore" shape="BladeCoreComplete" material="Honeycomb10pcf"/> +<logvol name="BladeSideRod" shape="BladeSideRodComplete" material="CFRP"/> + +<logvol name="LockBaseH" shape="shLockBaseH" material="Torlon"/> +<logvol name="LockBaseL" shape="shLockBaseL" material="Torlon"/> + +<logvol name="RailWall" shape="shRailWall" material="CFRP"/> +<logvol name="RailShelf" shape="shRailShelf" material="CFRP"/> +<logvol name="RailBolt" shape="shRailBoltNoCore" material="SS304"/> +<logvol name="RailWheel" shape="shRailWheel" material="SS304"/> +<logvol name="RailCircle" shape="shRailCircle" material="SS304"/> +<logvol name="RailSquare1" shape="shRailSquare1" material="SS304"/> +<logvol name="RailSquareT" shape="shRailSquareT" material="SS304"/> +<logvol name="RailSquare" shape="shRailSquare2" material="SS304"/> +<logvol name="RailWedge" shape="shRailWedge" material="SS304"/> <!-- Change to Bronze equivalent --> + +<logvol name="ECPSTube" shape="shECPSTube" material="CFRP"/> + +<assembly name="RailSquareComplete"> + <transform> + <transformation name="AlignRailSquare"> + <translation y="1."/> + </transformation> + <logvolref ref="RailSquare"/> + </transform> + + <transform> + <transformation name="AttachRailT"> + <translation z="RailLengthS_2 / 2. + RailLengthS_1 / 2. + EPS"/> + <translation y="tan(RailSquareTAngle_1) * RailLengthS_1 / 2. + EPS"/> + <rotation zcos="1." angle="-(PI / 2.)"/> + </transformation> + <logvolref ref="RailSquareT"/> + </transform> + + <transform> + <transformation name="AttachRail1"> + <translation z="RailLengthS_2 / 2. + RailLengthS_1 + RailLengthS_0 / 2. + EPS"/> + </transformation> + <logvolref ref="RailSquare1"/> + </transform> + + <transform> + <transformation name="AttachWedge"> + <translation z="RailLengthS_2 / 2. + RailLengthS_1 + RailLengthS_0 - RailWedgeOffset - RailWedgeLength / 2."/> + <translation y="RailSquareEdge / 2. + (RailWedgeHeight_0 + RailWedgeHeight_1) / 4. + 3*EPS"/> + <rotation zcos="1." angle="(PI / 2.)"/> + </transformation> + <logvolref ref="RailWedge"/> + </transform> +</assembly> + +<assembly name="RailBoltReady"> + <transform> + <transformation name="PrepareRailBolt"> + <rotation xcos="1." angle="PI / 2."/> + </transformation> + <logvolref ref="RailBolt"/> + </transform> +</assembly> + +<assembly name="RailWheelReady"> + <transform> + <transformation name="PrepareRailWheel"> + <rotation ycos="1." angle="PI / 2."/> + </transformation> + <logvolref ref="RailWheel"/> + </transform> +</assembly> + + +<assembly name="RailShelfWithBoltsSquare"> + <multicopy name="AddBoltsToRail" n="RailBoltNumber"> + <transformation name="PlaceRailBolts"> + <translation z="RailBoltGap"/> + </transformation> + <assemblyref ref="RailBoltReady"/> + </multicopy> + + <transform> + <transformation name="PlaceRailShelf"> + <translation z="RailShelfLength / 2. - RailBoltOffset"/> + </transformation> + <logvolref ref="RailShelf"/> + </transform> + + <transform> + <transformation name="PlaceRailSquare"> + <translation x="-(RailShelfWidth / 2. - RailSquareEdge)"/> + <translation y="(RailShelfHeight + RailSquareEdge) / 2."/> + <translation z="RailLengthS_2 / 2. - RailBoltOffset"/> + </transformation> + <assemblyref ref="RailSquareComplete"/> + </transform> +</assembly> + + +<assembly name="RailShelfSquareComplete"> + <logvolref ref="RailWall"/> + + <transform> + <transformation name="PlaceRailShelfWithBoltsSquare"> + <translation x="RailWallWidth / 2. + RailShelfWidth / 2."/> + <translation y="-(RailWallHeight /2.) + RailShelfHeight"/> + <translation z="-(RailShelfLength / 2. - RailBoltOffset) + (RailShelfLength - RailWallLength) / 2."/> + </transformation> + <assemblyref ref="RailShelfWithBoltsSquare"/> + </transform> + + <transform> + <transformation name="PlaceWheelClose"> + <translation x="(RailWallWidth + RailWheelLength) / 2."/> + <translation y="RailWheelRadius / 2."/> + <translation z="-(RailShelfLength / 2. - RailWheelOffsetClose)"/> + </transformation> + <assemblyref ref="RailWheelReady"/> + </transform> + + <transform> + <transformation name="PlaceWheelFar"> + <translation x="(RailWallWidth + RailWheelLength) / 2."/> + <translation y="RailWheelRadius / 2."/> + <translation z="RailShelfLength / 2. - RailWheelOffsetFar"/> + </transformation> + <assemblyref ref="RailWheelReady"/> + </transform> + +</assembly> + +<assembly name="RailShelfWithBoltsCircle"> + <multicopy name="AddBoltsToRail2" n="RailBoltNumber"> + <transformation name="PlaceRailBolts2"> + <translation z="RailBoltGap"/> + </transformation> + <assemblyref ref="RailBoltReady"/> + </multicopy> + + <transform> + <transformation name="PlaceRailShelf2"> + <translation z="RailShelfLength / 2. - RailBoltOffset"/> + </transformation> + <logvolref ref="RailShelf"/> + </transform> + + <transform> + <transformation name="PlaceRailCircle"> + <translation x="RailShelfWidth / 2. - RailCircleRadius"/> + <translation y="(RailShelfHeight + RailCircleRadius) / 2."/> + <translation z="RailLengthS_2 / 2. - RailBoltOffset"/> + </transformation> + <logvolref ref="RailCircle"/> + </transform> +</assembly> + + +<assembly name="RailShelfCircleComplete"> + <logvolref ref="RailWall"/> + + <transform> + <transformation name="PlaceRailShelfWithBoltsCircle"> + <translation x="-(RailWallWidth / 2. + RailShelfWidth / 2.)"/> + <translation y="-(RailWallHeight /2.) + RailShelfHeight"/> + <translation z="-(RailShelfLength / 2. - RailBoltOffset) + (RailShelfLength - RailWallLength) / 2."/> + </transformation> + <assemblyref ref="RailShelfWithBoltsSquare"/> + </transform> + + <transform> + <transformation name="PlaceWheelClose2"> + <translation x="-(RailWallWidth + RailWheelLength) / 2."/> + <translation y="RailWheelRadius / 2."/> + <translation z="-(RailShelfLength / 2. - RailWheelOffsetClose)"/> + </transformation> + <assemblyref ref="RailWheelReady"/> + </transform> + + <transform> + <transformation name="PlaceWheelFar2"> + <translation x="-(RailWallWidth + RailWheelLength) / 2."/> + <translation y="RailWheelRadius / 2."/> + <translation z="RailShelfLength / 2. - RailWheelOffsetFar"/> + </transformation> + <assemblyref ref="RailWheelReady"/> + </transform> + +</assembly> + + + +<assembly name="Ztubes"> + <!-- We place each tube midway between discs, remembering how much the whole endcap will be shifted when placed --> + <transform> + <transformation name="PlaceZtubeD0D1"> + <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_0 + WheelZ_1) / 2.0 + WheelSupportOffset"/> + </transformation> + <logvolref ref="ZtubeD0D1"/> + </transform> + <transform> + <transformation name="PlaceZtubeD1D2"> + <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_1 + WheelZ_2) / 2.0 + WheelSupportOffset"/> + </transformation> + <logvolref ref="ZtubeD1D2"/> + </transform> + <transform> + <transformation name="PlaceZtubeD2D3"> + <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_2 + WheelZ_3) / 2.0 + WheelSupportOffset"/> + </transformation> + <logvolref ref="ZtubeD2D3"/> + </transform> + <transform> + <transformation name="PlaceZtubeD3D4"> + <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_3 + WheelZ_4) / 2.0 + WheelSupportOffset"/> + </transformation> + <logvolref ref="ZtubeD3D4"/> + </transform> + <transform> + <transformation name="PlaceZtubeD4D5"> + <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_4 + WheelZ_5) / 2.0 + WheelSupportOffset"/> + </transformation> + <logvolref ref="ZtubeD4D5"/> + </transform> +</assembly> + +<assembly name="StiffDisc"> + + <logvolref ref="StiffDiscFoam"/> + + <transform> + <transformation name="PlaceNearFaceSheetStiffDisc"> + <translation z="-(StiffDiscFoamT + StiffDiscCF_T) / 2.0"/> + </transformation> + <logvolref ref="StiffDiscCF"/> + </transform> + + <transform> + <transformation name="PlaceFarFaceSheetStiffDisc"> + <translation z="(StiffDiscFoamT + StiffDiscCF_T) / 2.0"/> + </transformation> + <logvolref ref="StiffDiscCF"/> + </transform> + +</assembly> + +<assembly name="BladeSupport"> + <logvolref ref="BladeCore"/> + <transform> + <transformation name="BladeFace1"> + <translation x="BladeFaceSheetThickness / 2. + BladeRodOuterEdge / 2."/> + </transformation> + <logvolref ref="BladeFace"/> + </transform> + <transform> + <transformation name="BladeFace2"> + <translation x="-(BladeFaceSheetThickness / 2. + BladeRodOuterEdge / 2.)"/> + </transformation> + <logvolref ref="BladeFace"/> + </transform> + <transform> + <transformation name="BladeRod1"> + <translation y="(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/> + </transformation> + <logvolref ref="BladeSideRod"/> + </transform> + <transform> + <transformation name="BladeRod2"> + <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/> + <rotation zcos="1." angle="PI"/> + </transformation> + <logvolref ref="BladeSideRod"/> + </transform> +</assembly> + +<assembly name="BladeSingle"> + <transform> + <transformation name="ShiftBlade"> + <translation x="BladeLength / 2."/> + <rotation ycos="1." angle="PI / 2."/> + </transformation> + <assemblyref ref="BladeSupport"/> + </transform> +</assembly> + +<assembly name="BladeSupportWheel"> + <multicopy name="AddBlades" n="8"> + <transformation name="WheelsGoRound"> + <rotation zcos="1." angle="PI / 4."/> + </transformation> + <assemblyref ref="BladeSingle"/> + </multicopy> +</assembly> + +<assembly name="LockPointTH"> + <transform> + <transformation name="MoveLockPointTH"> + <translation y="WheelOuterT_OuterR - LockBaseHHeight / 2. - LockBaseOffset"/> + </transformation> + <logvolref ref="LockBaseH"/> + </transform> +</assembly> + +<assembly name="LockPointTL"> + <transform> + <transformation name="MoveLockPointTL"> + <translation y="WheelOuterT_OuterR - LockBaseLHeight / 2. - LockBaseOffset"/> + </transformation> + <logvolref ref="LockBaseL"/> + </transform> +</assembly> + +<assembly name="LockPointBH"> + <transform> + <transformation name="MoveLockPointBH"> + <translation y="WheelInnerT_BaseOuterR + LockBaseHHeight / 2."/> + </transformation> + <logvolref ref="LockBaseH"/> + </transform> +</assembly> + +<assembly name="LockPointBL"> + <transform> + <transformation name="MoveLockPointBL"> + <translation y="WheelInnerT_BaseOuterR + LockBaseLHeight / 2."/> + </transformation> + <logvolref ref="LockBaseL"/> + </transform> +</assembly> + +<assembly name="LockPointTModule1"> + <transform> + <transformation name="LockPointTH1"> + <rotation zcos="1." angle="LockBaseTAngleOffset"/> + </transformation> + <assemblyref ref="LockPointTH"/> + </transform> + <transform> + <transformation name="LockPointTL1"> + <rotation zcos="1." angle="-LockBaseTAngleOffset"/> + </transformation> + <assemblyref ref="LockPointTL"/> + </transform> +</assembly> + +<assembly name="LockPointTModule2"> + <transform> + <transformation name="LockPointTH2"> + <rotation zcos="1." angle="-LockBaseTAngleOffset + LockBaseTAngle"/> + </transformation> + <assemblyref ref="LockPointTH"/> + </transform> + <transform> + <transformation name="LockPointTL2"> + <rotation zcos="1." angle="LockBaseTAngleOffset + LockBaseTAngle"/> + </transformation> + <assemblyref ref="LockPointTL"/> + </transform> +</assembly> + +<assembly name="LockPointBModule"> + <transform> + <transformation name="LockPointModuleBH"> + <rotation zcos="1." angle="LockBaseBAngleOffset"/> + </transformation> + <assemblyref ref="LockPointBH"/> + </transform> + <transform> + <transformation name="LockPointModuleBL"> + <rotation zcos="1." angle="-(LockBaseBAngleOffset)"/> + </transformation> + <assemblyref ref="LockPointBL"/> + </transform> +</assembly> + + + +<assembly name="LockPointWheel"> + <multicopy name="LockBaseTWheel1" n="LockBaseTAssemblyN"> + <transformation name="PlaceLockBaseTMod1"> + <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/> + </transformation> + <assemblyref ref="LockPointTModule1"/> + </multicopy> + + <multicopy name="LockBaseTWheel2" n="LockBaseTAssemblyN"> + <transformation name="PlaceLockBaseTMod2"> + <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/> + </transformation> + <assemblyref ref="LockPointTModule2"/> + </multicopy> + + <multicopy name="LockBaseBWheel" n="LockBaseTAssemblyN"> + <transformation name="PlaceLockBaseBMod"> + <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/> + </transformation> + <assemblyref ref="LockPointBModule"/> + </multicopy> +</assembly> + +<assembly name="WheelSupport"> + <logvolref ref="WheelInnerT"/> + <logvolref ref="WheelOuterT"/> + <transform> + <transformation name="AddLockPoints"> + <translation z="WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2."/> + </transformation> + <assemblyref ref="LockPointWheel"/> + </transform> +</assembly> + +<assembly name="EndcapPSTHats"> + <multicopy name="CopyECPSTHats" n="ECPSTHatNumber"> + <transformation name="PlaceECHats"> + <translation z="ECPSTHatGap"/> + </transformation> + <assemblyref ref="StaveCylHat0"/> + </multicopy> +</assembly> + + +<assembly name="EndcapPST"> + <logvolref ref="ECPSTube"/> + + <transform> + <transformation name="AssemblePST"> + <translation z="-( ECPSTLength / 2. ) + ECPSTOffset"/> + </transformation> + <assemblyref ref="EndcapPSTHats"/> + </transform> +</assembly> + + +<assembly name="EC_Support"> + <logvolref ref="EC_InnerCyl"/> +<!-- For now, add support wheels with wheel-of-petals + <multicopy name="AddSupportWheels" loopvar="WheelZ" n="N_Wheels" > + ???? + </multicopy> +--> + +<!-- + <transform> + <transformation name="PlaceRailShelfSquareComplete"> + <translation x="RailRadius"/> + </transformation> + <assemblyref ref="RailShelfSquareComplete"/> + </transform> +--> + + + <transform> + <transformation name="PlaceStiffDisc"> + <translation z="StiffDiscTranslation"/> + </transformation> + <assemblyref ref="StiffDisc"/> + </transform> + + <multicopy name="AddZtubes" n="nZtubes"> + <transformation name="PlaceZtubes"> + <rotation zcos="1." angle="2. * PI / nZtubes"/> + </transformation> + <transform> + <transformation name="PlaceZtubesReadyForRotation"> + <translation x="ZtubeRadialPosition"/> + </transformation> + <assemblyref ref="Ztubes"/> + </transform> + </multicopy> + +</assembly> + + +<assembly name="ECModule0"> + + <logvolref ref="ECSensor0"/> + <transform> + <transformation name="PlaceR0H0"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR0H0"/> + </transform> + <transform> + <transformation name="PlaceR0H1"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR0H1"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_R0_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR0"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R0_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_0/2+E_DCDC_PCB_dPhiR0"/> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR0+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T + DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="ECModule1"> + <logvolref ref="ECSensor1"/> + <transform> + <transformation name="PlaceR1H0"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR1H0"/> + </transform> + <transform> + <transformation name="PlaceR1H1"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR1H1"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R1_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR1"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R1_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_1/2+E_DCDC_PCB_dPhiR1"/> +<!-- need to subtract half the length of DCDC DCDC_EC_BoxL/(2*E_DCDC_PCB_RadiusMinR1)"/>--> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR1+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="ECModule2"> + <logvolref ref="ECSensor2"/> + <transform> + <transformation name="PlaceR2H0"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR2H0"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R2_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR2"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R2_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_2/2+E_DCDC_PCB_dPhiR2"/> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR2+0.5*DCDC_BoxW" z="+(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="ECModule3Plus"> + <logvolref ref="ECSensor3"/> + <transform> + <transformation name="PlaceR3H1"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR3H1"/> + </transform> + <transform> + <transformation name="PlaceR3H3"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR3H3"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR3H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-1.5))"/> + <translation y="E_HCCRadiusR3H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR3H1a"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-2.5))"/> + <translation y="E_HCCRadiusR3H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> + +<transform> + <transformation name="PlaceHCCOnB_HybridR3H3"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-2.5))"/> + <translation y="E_HCCRadiusR3H3+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR3H3a"> + <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-1.5))"/> + <translation y="E_HCCRadiusR3H3a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +</assembly> + +<assembly name="ECModule3Minus"> + <logvolref ref="ECSensor3"/> + <transform> + <transformation name="PlaceR3H0Minus"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR3H0"/> + </transform> + <transform> + <transformation name="PlaceR3H2Minus"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR3H2"/> + </transform> + + + + <transform> + <transformation name="PlaceDCDC_R3_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR3"/> + </transform> + + <transform> + <transformation name="PlaceDCDC_R3_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_3/2+E_DCDC_PCB_dPhiR3"/> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR3+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="ECModule4Plus"> + <logvolref ref="ECSensor4"/> + <transform> + <transformation name="PlaceR4H1"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR4H1"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR4H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*(N_ABC_R4-1.5))"/> + <translation y="E_HCCRadiusR4H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR4H1a"> + <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*(N_ABC_R4-2.5))"/> + <translation y="E_HCCRadiusR4H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +</assembly> + +<assembly name="ECModule4Minus"> + <logvolref ref="ECSensor4"/> + <transform> + <transformation name="PlaceR4H0"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR4H0"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R4_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR4"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R4_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_4/2+E_DCDC_PCB_dPhiR4"/> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR4+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="ECModule5Plus"> + <logvolref ref="ECSensor5"/> + <transform> + <transformation name="PlaceR5H1"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR5H1"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR5H1"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*(N_ABC_R5-1.5))"/> + <translation y="E_HCCRadiusR5H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +<transform> + <transformation name="PlaceHCCOnB_HybridR5H1a"> + <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*(N_ABC_R5-2.5))"/> + <translation y="E_HCCRadiusR5H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/> + </transformation> + <logvolref ref="HCC_Chip"/> + </transform> +</assembly> + +<assembly name="ECModule5Minus"> + <logvolref ref="ECSensor5"/> + <transform> + <transformation name="PlaceR5H0"> + <translation z="(SensorThickness + E_HybridT) / 2."/> + </transformation> + <assemblyref ref="ECHybridR5H0"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R5_PCB"> + <translation z="(SensorThickness + DCDC_PCB_T) / 2."/> + </transformation> + <logvolref ref="DCDC_EC_PCBR5"/> + </transform> + <transform> + <transformation name="PlaceDCDC_R5_Box"> + <rotation zcos="1.0" angle="-SensorPhiWidth_5/2+E_DCDC_PCB_dPhiR5"/> + <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR5+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/> + </transformation> + <logvolref ref="DCDC_EC_Box"/> + </transform> +</assembly> + +<assembly name="PetalFace"> + <index ref="phi_module" value="2*CNL_4 + CNL_5"/> <!-- 0 to 31. --> + + <transform alignable="0"> + <transformation name="ESensor0dummy" alignable="true"> + <translation/> + </transformation> + <assemblyref ref="ECModule0" zeroid="true"/> +</transform> +<transform alignable="0"> + <transformation name="ESensor1dummy" alignable="true"> + <translation/> + </transformation> + <assemblyref ref="ECModule1" zeroid="true"/> +</transform> +<transform alignable="0"> + <transformation name="ESensor2dummy" alignable="true"> + <translation/> + </transformation> + <assemblyref ref="ECModule2" zeroid="true"/> +</transform> + + + <!-- For outer rings, we have to add 1 half the time; when? Depends which way round the face is in the wheel. 0 - 63. --> + <index ref="phi_module" value="2*(2*CNL_4 + CNL_5) + (CNL_5 == 0 && CNL_6 == 0) + (CNL_5 == 1 && CNL_6 == 1) "/> + <transform alignable="0"> + <transformation name="PlaceFaceRing3Minus" alignable="true"> + <rotation zcos="1.0" angle="-SensorRotation_3"/> + </transformation> + <assemblyref ref="ECModule3Minus"/> + </transform> + + <transform alignable="0"> + <transformation name="PlaceFaceRing4Minus" alignable="true"> + <rotation zcos="1.0" angle="-SensorRotation_4"/> + </transformation> + <assemblyref ref="ECModule4Minus"/> + </transform> + + <transform alignable="0"> + <transformation name="PlaceFaceRing5Minus" alignable="true"> + <rotation zcos="1.0" angle="-SensorRotation_5"/> + </transformation> + <assemblyref ref="ECModule5Minus"/> + </transform> +<index ref="phi_module" value="2*(2*CNL_4 + CNL_5) + (CNL_5 == 0 && CNL_6 == 1) + (CNL_5 == 1 && CNL_6 == 0)"/> + <transform alignable="0"> + <transformation name="PlaceFaceRing3Plus" alignable="true"> + <rotation zcos="1.0" angle="+SensorRotation_3"/> + </transformation> + <assemblyref ref="ECModule3Plus"/> + </transform> + + <transform alignable="0"> + <transformation name="PlaceFaceRing4Plus" alignable="true"> + <rotation zcos="1.0" angle="+SensorRotation_4"/> + </transformation> + <assemblyref ref="ECModule4Plus"/> + </transform> + + <transform alignable="0"> + <transformation name="PlaceFaceRing5Plus" alignable="true"> + <rotation zcos="1.0" angle="+SensorRotation_5"/> + </transformation> + <assemblyref ref="ECModule5Plus"/> + </transform> +</assembly> + + +<assembly name="Petal"> + <assemblyref ref="PetalPlank"/> + + <transform name="NearFace"> + <transformation name="PlacePetalFaceNear"> + <translation z="-(PetalCoreThickness + SensorThickness)/2"/> + <rotation xcos="1." angle="PI"/> + <rotation zcos="1." angle="PetalFaceRotation"/> + </transformation> + <assemblyref ref="PetalFace" zeroid="true"/> + </transform> + + <transform name="FarFace"> + <transformation name="PlacePetalFaceFar"> + <translation z="(PetalCoreThickness + SensorThickness)/2"/> + <rotation zcos="1." angle="PetalFaceRotation"/> + </transformation> + <assemblyref ref="PetalFace"/> + </transform> + + <transform> + <transformation name="PlaceFirstEOS_OnPetalCore"> + <rotation zcos="1.0" angle="+(PetalCoreAngle+PetalEarAngle)/2"/> + <translation x="(PetalEarOuterRadius -100)" z="+(PetalCoreThickness+5)/2" y="-17"/> + </transformation> + <logvolref ref="EOS"/> + </transform> + + <transform> + <transformation name="PlaceSecondEOS_OnPetalCore"> + <rotation zcos="1.0" angle="+(PetalCoreAngle+PetalEarAngle)/2"/> + <translation x="(PetalEarOuterRadius -100)" z="-(PetalCoreThickness+5)/2" y="-17"/> + + </transformation> + <logvolref ref="EOS"/> + </transform> + +</assembly> + +<assembly name="PetalPair"> + <index ref="side" value="CNL_6"/> + <transform name="Near"> + <transformation name="PlaceCastleNear"> + <translation z="-CastellationOffset"/> + </transformation> + <assemblyref ref="Petal" zeroid="true"/> + </transform> + + <index ref="side" value="1 - CNL_6"/> + <transform name="Far"> + <transformation name="PlaceCastleFar"> + <translation z="+CastellationOffset"/> + <rotation zcos="1." angle="2*PI/NPetalsInWheel"/> + <rotation xcos="1." angle="2*PI/2"/> + </transformation> + <assemblyref ref="Petal"/> + </transform> + +</assembly> + + +<assembly name="Wheel" alignable="true"> + <index ref="layer_wheel" value="CNL_3"/> + <multicopy name="AddPetalPairsToWheel" n="NPetalsInWheel/2"> + <transformation name="PlacePetalPairsToWheel"> + <rotation zcos="1." angle="2*PI/(NPetalsInWheel/2)"/> + </transformation> + <assemblyref ref="PetalPair"/> + </multicopy> + <transform> + <transformation name="PlaceWheelSupport"> + <translation z="WheelSupportOffset"/> + </transformation> + <assemblyref ref="WheelSupport"/> + </transform> +</assembly> + + +<assembly name="SCT_Forward" alignable="true"> + <multicopy name="AddWheelsToEndcap" n="N_Wheels" loopvar="WheelZ" alignable="2"> + <transformation name="PlaceWheelsOdd" alignable="true"> + <translation z="WheelZ"/> + </transformation> + <assemblyref ref="Wheel"/> + </multicopy> + <multicopy name="AddBladesToEndcapOdd" n="N_Wheels / 2." loopvar="WheelZOdd"> + <transformation name="AddWheelBladesOdd"> + <translation z="WheelZOdd -(WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2.) + WheelSupportOffset"/> + </transformation> + <assemblyref ref="BladeSupportWheel"/> + </multicopy> + <multicopy name="AddBladesToEndcapEven" n="N_Wheels / 2." loopvar="WheelZEven"> + <transformation name="AddWheelBladesEven"> + <translation z="WheelZEven -(WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2.) + WheelSupportOffset"/> + <rotation zcos="1." angle="PI / 8."/> + </transformation> + <assemblyref ref="BladeSupportWheel"/> + </multicopy> + <transform> + <transformation name="PlaceEC_Support"> + <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/> + </transformation> + <assemblyref ref="EC_Support"/> + </transform> + +<!-- + <transform> + <transformation name="PlacePST"> + <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. - 30."/> + </transformation> + <assemblyref ref="EndcapPST"/> + </transform> +--> + +</assembly> + +<!-- GeoModelXml input created by ServMat. Detector "LoI Strip" version 2018-10-15 --> + +<!-- Masses of interlinks scaled by interlinkSF = 1.200000 --> + + + <materials> + + <material name="matSV_Barrel01" density="0.103698"> + <elementref ref="Aluminium" fraction="0.203153"/> + <elementref ref="Carbon" fraction="0.308931"/> + <elementref ref="Copper" fraction="0.110710"/> + <elementref ref="Hydrogen" fraction="0.011784"/> + <elementref ref="Nickel" fraction="0.025469"/> + <elementref ref="Nitrogen" fraction="0.093526"/> + <elementref ref="Oxygen" fraction="0.033535"/> + <elementref ref="Silicon" fraction="0.000688"/> + <elementref ref="Titanium" fraction="0.212203"/> + </material> + + <material name="matSV_Barrel12" density="0.178647"> + <elementref ref="Aluminium" fraction="0.207867"/> + <elementref ref="Carbon" fraction="0.316098"/> + <elementref ref="Copper" fraction="0.113279"/> + <elementref ref="Hydrogen" fraction="0.012057"/> + <elementref ref="Nickel" fraction="0.026060"/> + <elementref ref="Nitrogen" fraction="0.095696"/> + <elementref ref="Oxygen" fraction="0.034313"/> + <elementref ref="Silicon" fraction="0.000704"/> + <elementref ref="Titanium" fraction="0.193926"/> + </material> + + <material name="matSV_Barrel23" density="0.240794"> + <elementref ref="Aluminium" fraction="0.211315"/> + <elementref ref="Carbon" fraction="0.321342"/> + <elementref ref="Copper" fraction="0.115158"/> + <elementref ref="Hydrogen" fraction="0.012257"/> + <elementref ref="Nickel" fraction="0.026492"/> + <elementref ref="Nitrogen" fraction="0.097283"/> + <elementref ref="Oxygen" fraction="0.034882"/> + <elementref ref="Silicon" fraction="0.000716"/> + <elementref ref="Titanium" fraction="0.180553"/> + </material> + + <material name="matSV_Barrel3Out" density="0.798240"> + <elementref ref="Aluminium" fraction="0.088150"/> + <elementref ref="Carbon" fraction="0.134048"/> + <elementref ref="Copper" fraction="0.048038"/> + <elementref ref="Hydrogen" fraction="0.005113"/> + <elementref ref="Nickel" fraction="0.011051"/> + <elementref ref="Nitrogen" fraction="0.040582"/> + <elementref ref="Oxygen" fraction="0.014551"/> + <elementref ref="Silicon" fraction="0.000299"/> + <elementref ref="Titanium" fraction="0.658168"/> + </material> + + <material name="matSV_BarrelPastEndcap" density="0.456011"> + <elementref ref="Aluminium" fraction="0.228508"/> + <elementref ref="Carbon" fraction="0.347487"/> + <elementref ref="Copper" fraction="0.124527"/> + <elementref ref="Hydrogen" fraction="0.013255"/> + <elementref ref="Nickel" fraction="0.028648"/> + <elementref ref="Nitrogen" fraction="0.105198"/> + <elementref ref="Oxygen" fraction="0.037720"/> + <elementref ref="Silicon" fraction="0.000774"/> + <elementref ref="Titanium" fraction="0.113883"/> + </material> + + <material name="matSV_Endcap01" density="0.253309"> + <elementref ref="Aluminium" fraction="0.206755"/> + <elementref ref="Carbon" fraction="0.314407"/> + <elementref ref="Copper" fraction="0.112673"/> + <elementref ref="Hydrogen" fraction="0.011993"/> + <elementref ref="Nickel" fraction="0.025921"/> + <elementref ref="Nitrogen" fraction="0.095184"/> + <elementref ref="Oxygen" fraction="0.034130"/> + <elementref ref="Silicon" fraction="0.000700"/> + <elementref ref="Titanium" fraction="0.198239"/> + </material> + + <material name="matSV_Endcap12" density="0.493606"> + <elementref ref="Aluminium" fraction="0.212205"/> + <elementref ref="Carbon" fraction="0.322695"/> + <elementref ref="Copper" fraction="0.115643"/> + <elementref ref="Hydrogen" fraction="0.012309"/> + <elementref ref="Nickel" fraction="0.026604"/> + <elementref ref="Nitrogen" fraction="0.097693"/> + <elementref ref="Oxygen" fraction="0.035029"/> + <elementref ref="Silicon" fraction="0.000719"/> + <elementref ref="Titanium" fraction="0.177105"/> + </material> + + <material name="matSV_Endcap23" density="0.732819"> + <elementref ref="Aluminium" fraction="0.214402"/> + <elementref ref="Carbon" fraction="0.326037"/> + <elementref ref="Copper" fraction="0.116840"/> + <elementref ref="Hydrogen" fraction="0.012437"/> + <elementref ref="Nickel" fraction="0.026880"/> + <elementref ref="Nitrogen" fraction="0.098705"/> + <elementref ref="Oxygen" fraction="0.035392"/> + <elementref ref="Silicon" fraction="0.000726"/> + <elementref ref="Titanium" fraction="0.168582"/> + </material> + + <material name="matSV_Endcap34" density="0.974642"> + <elementref ref="Aluminium" fraction="0.214941"/> + <elementref ref="Carbon" fraction="0.326857"/> + <elementref ref="Copper" fraction="0.117134"/> + <elementref ref="Hydrogen" fraction="0.012468"/> + <elementref ref="Nickel" fraction="0.026947"/> + <elementref ref="Nitrogen" fraction="0.098953"/> + <elementref ref="Oxygen" fraction="0.035481"/> + <elementref ref="Silicon" fraction="0.000728"/> + <elementref ref="Titanium" fraction="0.166491"/> + </material> + + <material name="matSV_Endcap45" density="1.211989"> + <elementref ref="Aluminium" fraction="0.216061"/> + <elementref ref="Carbon" fraction="0.328559"/> + <elementref ref="Copper" fraction="0.117744"/> + <elementref ref="Hydrogen" fraction="0.012533"/> + <elementref ref="Nickel" fraction="0.027087"/> + <elementref ref="Nitrogen" fraction="0.099468"/> + <elementref ref="Oxygen" fraction="0.035666"/> + <elementref ref="Silicon" fraction="0.000732"/> + <elementref ref="Titanium" fraction="0.162149"/> + </material> + + <material name="matSV_Endcap5Out" density="1.600535"> + <elementref ref="Aluminium" fraction="0.196332"/> + <elementref ref="Carbon" fraction="0.298558"/> + <elementref ref="Copper" fraction="0.106993"/> + <elementref ref="Hydrogen" fraction="0.011388"/> + <elementref ref="Nickel" fraction="0.024614"/> + <elementref ref="Nitrogen" fraction="0.090386"/> + <elementref ref="Oxygen" fraction="0.032409"/> + <elementref ref="Silicon" fraction="0.000665"/> + <elementref ref="Titanium" fraction="0.238655"/> + </material> + + </materials> + + <shapes> + <tube name="shSV_Barrel01" rmin="399.000 + EPS" rmax="561.998 - EPS" zhalflength="4.000 - EPS"/> + <tube name="shSV_Barrel12" rmin="562.000 + EPS" rmax="761.998 - EPS" zhalflength="4.000 - EPS"/> + <tube name="shSV_Barrel23" rmin="762.000 + EPS" rmax="999.998 - EPS" zhalflength="4.000 - EPS"/> + <tube name="shSV_Barrel3Out" rmin="1000.000 + EPS" rmax="1013.998 - EPS" zhalflength="4.000 - EPS"/> + <tubs name="shSV_BarrelPastEndcap" rmin="1016.000 + EPS" rmax="1024.000 - EPS" zhalflength="860.498 - EPS" sphi="0.1308998" dphi="0.5235986"/> + <tubs name="shSV_Endcap01" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="94.999 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tubs name="shSV_Endcap12" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="124.999 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tubs name="shSV_Endcap23" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="142.499 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tubs name="shSV_Endcap34" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="147.499 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tubs name="shSV_Endcap45" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="158.999 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tubs name="shSV_Endcap5Out" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="63.499 - EPS" sphi="0.3054327" dphi="0.1745327"/> + <tube name="shSV_Barrel" rmin="346.701 + EPS" rmax="1015.000 - EPS" zhalflength="12.500 - EPS"/> + <tubs name="shSV_BarrelAtEC" rmin="1015.000 + EPS" rmax="1045.000 - EPS" zhalflength="860.500 - EPS" sphi="0.1308997" dphi="0.5235988"/> + <tubs name="shSV_Endcap" rmin="989.000 + EPS" rmax="1011.000 - EPS" zhalflength="748.500 - EPS" sphi="0.3054326" dphi="0.1745329"/> + </shapes> + + <logvol name="SV_Barrel01" shape="shSV_Barrel01" material="matSV_Barrel01"/> + <logvol name="SV_Barrel12" shape="shSV_Barrel12" material="matSV_Barrel12"/> + <logvol name="SV_Barrel23" shape="shSV_Barrel23" material="matSV_Barrel23"/> + <logvol name="SV_Barrel3Out" shape="shSV_Barrel3Out" material="matSV_Barrel3Out"/> + <logvol name="SV_BarrelPastEndcap" shape="shSV_BarrelPastEndcap" material="matSV_BarrelPastEndcap"/> + <logvol name="SV_Endcap01" shape="shSV_Endcap01" material="matSV_Endcap01"/> + <logvol name="SV_Endcap12" shape="shSV_Endcap12" material="matSV_Endcap12"/> + <logvol name="SV_Endcap23" shape="shSV_Endcap23" material="matSV_Endcap23"/> + <logvol name="SV_Endcap34" shape="shSV_Endcap34" material="matSV_Endcap34"/> + <logvol name="SV_Endcap45" shape="shSV_Endcap45" material="matSV_Endcap45"/> + <logvol name="SV_Endcap5Out" shape="shSV_Endcap5Out" material="matSV_Endcap5Out"/> + + <logvol name="SV_Barrel_lv" shape="shSV_Barrel" material="N2"> + <transform> + <transformation name="placeSV_Barrel01"> + <translation z="-7.500"/> + </transformation> + <logvolref ref="SV_Barrel01"/> + </transform> + <transform> + <transformation name="placeSV_Barrel12"> + <translation z="-7.500"/> + </transformation> + <logvolref ref="SV_Barrel12"/> + </transform> + <transform> + <transformation name="placeSV_Barrel23"> + <translation z="-7.500"/> + </transformation> + <logvolref ref="SV_Barrel23"/> + </transform> + <transform> + <transformation name="placeSV_Barrel3Out"> + <translation z="-7.500"/> + </transformation> + <logvolref ref="SV_Barrel3Out"/> + </transform> + </logvol> + + <logvol name="SV_BarrelAtEC_lv" shape="shSV_BarrelAtEC" material="N2"> + <transform> + <transformation name="placeSV_BarrelPastEndcap"> + <translation z="0.000"/> + </transformation> + <logvolref ref="SV_BarrelPastEndcap"/> + </transform> + </logvol> + + <logvol name="SV_Endcap_lv" shape="shSV_Endcap" material="N2"> + <transform> + <transformation name="placeSV_Endcap01"> + <translation z="-621.501"/> + </transformation> + <logvolref ref="SV_Endcap01"/> + </transform> + <transform> + <transformation name="placeSV_Endcap12"> + <translation z="-401.501"/> + </transformation> + <logvolref ref="SV_Endcap12"/> + </transform> + <transform> + <transformation name="placeSV_Endcap23"> + <translation z="-134.001"/> + </transformation> + <logvolref ref="SV_Endcap23"/> + </transform> + <transform> + <transformation name="placeSV_Endcap34"> + <translation z="155.999"/> + </transformation> + <logvolref ref="SV_Endcap34"/> + </transform> + <transform> + <transformation name="placeSV_Endcap45"> + <translation z="462.499"/> + </transformation> + <logvolref ref="SV_Endcap45"/> + </transform> + <transform> + <transformation name="placeSV_Endcap5Out"> + <translation z="684.999"/> + </transformation> + <logvolref ref="SV_Endcap5Out"/> + </transform> + </logvol> + + + <assembly name="SV_Barrel"> + <logvolref ref="SV_Barrel_lv"/> + </assembly> + + <assembly name="SV_BarrelAtEC"> + <multicopy name="placeContentsOfSV_BarrelAtEC" n="8"> + <transformation name="rotate_SV_BarrelAtEC"> + <rotation zcos="1.0" angle="0.785"/> + </transformation> + <logvolref ref="SV_BarrelAtEC_lv"/> + </multicopy> + </assembly> + + <assembly name="SV_Endcap"> + <multicopy name="placeContentsOfSV_Endcap" n="8"> + <transformation name="rotate_SV_Endcap"> + <rotation zcos="1.0" angle="0.785"/> + </transformation> + <logvolref ref="SV_Endcap_lv"/> + </multicopy> + </assembly> + + + +<!-- To be included in Endcaps.gmx. Builds up the PP1 volume (including type 2 services) --> +<materials> +<material name="matPixRed1" density="0.155179495"> <!--red-outer--> + <materialref fraction="0.447786132" ref="CuMetal"/> + <materialref fraction="0.139515455" ref="AlMetal"/> + <materialref fraction="0.248955723" ref="PE"/> + <materialref fraction="0.16374269" ref="PVC"/> + </material> +<material name="matPixRed2" density="0.124194654"> <!--red-inner--> + <materialref fraction="0.447786132" ref="CuMetal"/> + <materialref fraction="0.139515455" ref="AlMetal"/> + <materialref fraction="0.248955723" ref="PE"/> + <materialref fraction="0.16374269" ref="PVC"/> + + </material> +<material name="matPixCoolingInner" density="0.688923717"> <!--red-inner--> + <!--<materialref fraction="0.16" ref="Chromium"/>--> + <materialref fraction="0.967853023" ref="SS316"/> + <chemicalref fraction="0.032146977" ref="CO2"/> + </material> +<material name="matPixCoolingOuter" density="0.541945371"> <!--red-inner--> + <!--<materialref fraction="0.16" ref="Chromium"/>--> + <materialref fraction="0.872747728" ref="SS316"/> + <chemicalref fraction="0.127252272" ref="CO2"/> + </material> +<material name="matPixCoolingSum" density="0.91406121"> <!--red-inner--> + <!--<materialref fraction="0.16" ref="Chromium"/>--> + <materialref fraction="0.911465252" ref="SS316"/> + <chemicalref fraction="0.088534748" ref="CO2"/> + </material> +<material name="matPixType2D" density="0.293763408"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + + </material> +<material name="matPixType2E" density="0.159322011"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + + </material> +<material name="matPixType2F" density="0.44538827"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + </material> +<material name="matPixType2G" density="0.465356131"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + + </material> +<material name="matPixType2H" density="0.564667619"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + </material> +<material name="matPixType2I" density="0.528960234"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + </material> + +<material name="matPixType2L" density="0.775606326"> <!--just try with one Type 2 value for now.--> + <materialref fraction="0.67070062" ref="CuMetal"/> + <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton--> + </material> +<material name="matPP1Type1PixInner" density="0.060277165"> <!--just try with one Type 2 value for now.--> + + <materialref fraction="0.582454255" ref="CuMetal"/> + <materialref fraction="0.095137505" ref="AlMetal"/> + <materialref fraction="0.021627338" ref="Kapton"/> + <materialref fraction="0.167436662" ref="Polyethylene"/> + <materialref fraction="0.110149445" ref="PVC"/> + <materialref fraction="0.023194794" ref="TiMetal"/> +</material> + +<material name="matPP1Type1PixOuter" density="0.216283525"> <!--just try with one Type 2 value for now.--> +<materialref fraction="0.684427651" ref="CuMetal"/> +<materialref fraction="0.124967982" ref="AlMetal"/> +<materialref fraction="0.021199502" ref="Kapton"/> +<materialref fraction="0.220348505" ref="Polyethylene"/> +<materialref fraction="0.144957892" ref="PVC"/> +<materialref fraction="0.204098467" ref="TiMetal"/> + + + + +</material> +<material name="matPP1InnerConnectors" density="1.654315985"> <!--just try with one Type 2 value for now.--> +<materialref fraction="1.0" ref="AlMetal"/> +</material> +<material name="matPP1OuterConnectors" density="2.704150857"> <!--just try with one Type 2 value for now.--> +<materialref fraction="1.0" ref="AlMetal"/> +</material> + +<material name="matHeatExchanger" density="0.592*4.507"> <!--just try with one Type 2 value for now.--> +<elementref fraction="1.0" ref="Titanium"/> +</material> + + + + +</materials> +<defines> + + <var name="Pix_PP1_Z_Start" value="3020 + EPS"/> + <var name="Pix_PP1_middle_Z_Start" value="3020 + EPS"/> + <var name="Pix_PP1_middle_Z_End" value="3020+210"/> + <var name="Pix_PP1_cooling_Z_End" value="Pix_PP1_middle_Z_End+60."/> + <var name="Pix_PP1_middle_RI" value="347."/> + <var name="Pix_PP1_middle_RO" value="419."/> + <var name="HXcorrection" value="100"/> + <var name="Pix_PP1_middle_L" value="Pix_PP1_middle_Z_End - Pix_PP1_middle_Z_Start-HXcorrection"/> + <var name="ConnectorDepth" value="20"/> + <var name="Pix_PP1_outer_Z_Start" value="3020 + EPS"/> + <var name="Pix_PP1_outer_Z_End" value="3020+143"/> + <var name="Pix_PP1_outer_RI" value="Pix_PP1_middle_RO"/> + <var name="Pix_PP1_outer_RO" value="699."/> + <var name="Pix_PP1_outer_L" value="Pix_PP1_outer_Z_End - Pix_PP1_outer_Z_Start-HXcorrection"/> + <var name="PixPP1Type2End" value="3404 +EPS"/> + <var name="PixPP1Type2Length" value="PixPP1Type2End-Pix_PP1_Z_Start"/> + <var name="HeatExchanger_w" value="50"/> + <var name="HeatExchanger_t" value="HeatExchanger_w"/> + <var name="HeatExchanger_l" value="120"/> + <var name="HeatExchanger_z" value="-(3020+PixPP1Type2Length/2-3070)"/><!--3070--> + <var name="HeatExchanger_Ri" value="400"/> + <var name="PixType2D_l" value="3400-3302.8"/><!--Pix_PP1_cooling_Z_End"/>--> + <var name="PixType2D_hl" value="PixType2D_l/2."/> + <var name="PixType2E_l" value="PixType2D_l"/> + <var name="PixType2E_hl" value="PixType2E_l/2."/> +<var name="PixType2OutZ_w" value="35"/> +<var name="PixType2OutZ_start" value="PixPP1Type2End-PixType2OutZ_w"/> + + <var name="PixType2MaxR" value="1000"/> <!--place holder, until i can put this through the strip PP1--> + <var name="CoolingAngle" value="(45.-9)*PI/180"/> + <var name="RedAngle" value="-7.*PI/180"/> + <var name="Type2Angle" value="(21.5-14.5)*PI/180"/> + <var name="Type2Angle_b" value="(68.5-14.5)*PI/180"/> +</defines> +<shapes> + + <tube name="shPix_PP1_middle" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="Pix_PP1_middle_L/2"/> + <tube name="shPix_PP1_outer" rmin="Pix_PP1_outer_RI" rmax="Pix_PP1_outer_RO" zhalflength="Pix_PP1_outer_L/2"/> + <tube name="shPix_PP1_outerskin_z" rmin="Pix_PP1_outer_RO-1" rmax="Pix_PP1_outer_RO" zhalflength="Pix_PP1_outer_L/2"/> + <tube name="shPix_PP1_outerskin_r" rmin="375" rmax="Pix_PP1_outer_RO-1" zhalflength="0.5"/> + <tube name="shPix_PP1InnerServices" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO-1.5" zhalflength="(Pix_PP1_middle_L-Pix_PP1_outer_L-25)/2"/> +<tube name="shPix_PP1OuterServices" rmin="375" rmax="Pix_PP1_outer_RO-1.5" zhalflength="(Pix_PP1_outer_L*1.25-ConnectorDepth)/2"/> + <tube name="shPix_PP1_middleskin_z" rmin="Pix_PP1_middle_RO-1" rmax="Pix_PP1_middle_RO" zhalflength="Pix_PP1_middle_L/2-Pix_PP1_outer_L/2"/> + <tube name="shPix_PP1_middleskin_r" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO-1" zhalflength="0.5"/> + <!--<cons name="shPix_PP1_outercone" rmin1="347" rmin2="348" rmax1="Pix_PP1_middle_RO-1" rmax2="Pix_PP1_middle_RO-2" dz="2" sphi="PI/4" dphi="2*PI"/>--> + +<cons name="shPix_PP1_outercone" rmin1="347" rmin2="375-2" rmax1="348" rmax2="375-1" dz="5" sphi="375/Pix_PP1_outer_Z_End" dphi="2*PI"/> + + <box name="shHeatExTriplet" xhalflength="HeatExchanger_l/2" yhalflength="3*HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> + <box name="shHeatExSingle" xhalflength="HeatExchanger_l/2" yhalflength="HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> + + <!--<tube name="shPixRed1" rmin="Pix_PP1_outer_RO" rmax="PixType2MaxR" zhalflength="(Pix_PP1_outer_Z_End-Pix_PP1_outer_Z_Start)/2"/>--> + <tubs name="shOuterPP1Connectors" rmin="458.5" rmax="660" zhalflength="(ConnectorDepth-1)/2" sphi="0" dphi="0.45"/> +<tubs name="shInnerPP1Connectors" rmin="Pix_PP1_middle_RI+EPS" rmax="395" zhalflength="(25)/2" sphi="0" dphi="0.45"/> + <tubs name="shPixRed1Q1" rmin="Pix_PP1_outer_RO" rmax="EC_PP1_RI" zhalflength="(Pix_PP1_outer_Z_End-Pix_PP1_outer_Z_Start)/2" sphi="0" dphi="14.*PI/180."/> + + <!--<tube name="shPixRed2" rmin="Pix_PP1_outer_RI" rmax="" zhalflength="(Pix_PP1_middle_Z_End-Pix_PP1_outer_Z_End)/2"/>--> + <tubs name="shPixRed2Q1" rmin="Pix_PP1_outer_RI" rmax="PixType2MaxR" zhalflength="(Pix_PP1_middle_Z_End-Pix_PP1_outer_Z_End)/2" sphi="0" dphi="14.*PI/180."/> + <!--<tube name="shPixCooling" rmin="Pix_PP1_middle_RI" rmax="PixType2MaxR" zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2"/>--> + <tubs name="shPixCoolingInnerQ1" rmin="Pix_PP1_middle_RI" rmax="420-EPS" zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2" sphi="0" dphi="18.*PI/180."/> +<tubs name="shPixCoolingOuterQ1" rmin="420" rmax="PixType2MaxR" zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2" sphi="0" dphi="18.*PI/180."/> + + <!--<tube name="shPixType2D" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="PixType2D_l/2"/>--> + <tubs name="shPixType2DQ1" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="PixType2D_l/2" sphi="0" dphi="29*PI/180"/> + + <!--<tube name="shPixType2E" rmin="Pix_PP1_middle_RO" rmax="474" zhalflength="PixType2E_l/2-EPS"/>--> + <tubs name="shPixType2EQ1" rmin="Pix_PP1_middle_RO" rmax="474" zhalflength="PixType2E_l/2-EPS" sphi="0" dphi="29*PI/180"/> + + + <!--<tube name="shPixType2F" rmin="474" rmax="529" zhalflength="PixType2E_hl-EPS"/>--> + <tubs name="shPixType2FQ1" rmin="474" rmax="529" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/> + + <!--<tube name="shPixType2G" rmin="529" rmax="584" zhalflength="PixType2E_hl-EPS"/>--> + <tubs name="shPixType2GQ1" rmin="529" rmax="584" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/> + <!--<tube name="shPixType2H" rmin="584" rmax="639" zhalflength="PixType2E_hl-EPS"/>--> + <tubs name="shPixType2HQ1" rmin="584" rmax="639" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/> + <!--<tube name="shPixType2I" rmin="639" rmax="700" zhalflength="PixType2E_hl-EPS"/>--> + <tubs name="shPixType2IQ1" rmin="639" rmax="Pix_PP1_outer_RO" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/> + + <!--<tube name="shPixType2L" rmin="Pix_PP1_outer_RO" rmax="PixType2MaxR" zhalflength="17.5-EPS"/>--> + <tubs name="shPixType2LQ1" rmin="Pix_PP1_outer_RO" rmax="EC_PP1_RO" zhalflength="17.5-EPS" sphi="0" dphi="29*PI/180"/> + + + + <union name="pixPP1outerskinunion"> + <shaperef ref="shPix_PP1_outerskin_z"/> + <transformation name="PlacePixPP1skinr"> + <translation z="Pix_PP1_outer_L/2-0.5"/> + </transformation> + <shaperef ref="shPix_PP1_outerskin_r"/> + </union> + <union name="pixPP1middleskinunion"> + <shaperef ref="shPix_PP1_middleskin_z"/> + <transformation name="PlacePixmPP1skinr"> + <translation z="(-Pix_PP1_outer_L/2+Pix_PP1_middle_L/2)"/> + </transformation> + <shaperef ref="shPix_PP1_middleskin_r"/> + </union> + <union name="pixPP1skin1"> + <shaperef ref="pixPP1outerskinunion"/> + <transformation name="PlacePixPP1skinrz"> + <!--<translation z="Pix_PP1_outer_L+(Pix_PP1_middle_L-Pix_PP1_outer_L)/2+0.5"/>--> + <translation z="Pix_PP1_middle_L/2+0.5"/> + </transformation> + <shaperef ref="pixPP1middleskinunion"/> + </union> +<union name="pixPP1skin"> + <shaperef ref="pixPP1skin1"/> + <transformation name="PlacePixPP1cone"> + <translation z="Pix_PP1_outer_L/2-(Pix_PP1_outer_Z_End-3149.4)/2"/> +<!-- <translation z="Pix_PP1_outer_L/4"/>--> + </transformation> + <shaperef ref="shPix_PP1_outercone"/> + </union> + + + <tube name="ShPixPP1_Envelope" rmin="Pix_PP1_middle_RI" rmax="EC_PP1_RO+EPS" zhalflength="PixPP1Type2Length/2"/> <!-- rmin = StripEC_InnerRadius originally --> +</shapes> + +<logvol name="HeatExchanger" shape="shHeatExTriplet" material="matHeatExchanger"/> +<logvol name="HeatExchanger_single" shape="shHeatExSingle" material="matHeatExchanger"/> +<assembly name="HeatExchanger_doublet"> +<multicopy name="AddHX" n="2"> + <transformation name="PlaceHX"> + <translation y="2*HeatExchanger_w"/> + </transformation> + <logvolref ref="HeatExchanger_single"/> +</multicopy> +</assembly> + + + + + +<logvol name="Pix_PP1InnerServices" shape="shPix_PP1InnerServices" material="matPP1Type1PixInner"/><!--Placeholder for visibility !!--> +<logvol name="Pix_PP1OuterServices" shape="shPix_PP1OuterServices" material="matPP1Type1PixOuter"/><!--Placeholder for visibility !!--> +<logvol name="OuterPP1Connectors" shape="shOuterPP1Connectors" material="matPP1OuterConnectors"/><!--Placeholder for visibility !!--> +<logvol name="InnerPP1Connectors" shape="shInnerPP1Connectors" material="matPP1InnerConnectors"/><!--Placeholder for visibility !!--> +<logvol name="pixSvc_PP1_T2_R700_R1000_Data" shape="shPixRed1Q1" material="matPixRed1"/> +<logvol name="pixSvc_PP1_T2_R347_R1000_Data" shape="shPixRed2Q1" material="matPixRed2"/><!--Placeholder for visibility !!--> +<logvol name="pixSvc_PP1_T2_R347_R420_CoolingInner" shape="shPixCoolingInnerQ1" material="matPixCoolingInner"/> +<logvol name="pixSvc_PP1_T2_R420_R1000_CoolingOuter" shape="shPixCoolingOuterQ1" material="matPixCoolingOuter"/> +<logvol name="pixSvc_PP1_T2_R420_R1000_CoolingSum" shape="shPixCoolingOuterQ1" material="matPixCoolingSum"/><!--Placeholder for visibility !!--> + +<assembly name="OuterPP1ConnectorWheel"> + + <multicopy name="AddConnectorsToWheel" n="8"> + <transformation name="PlaceConnectorsToWheel"> + <rotation zcos="1." angle="PI/4"/> + </transformation> + <logvolref ref="OuterPP1Connectors"/> + </multicopy> + +</assembly> + +<assembly name="InnerPP1ConnectorWheel"> + + <multicopy name="AddIConnectorsToWheel" n="8"> + <transformation name="PlaceIConnectorsToWheel"> + <rotation zcos="1." angle="PI/4"/> + </transformation> + <logvolref ref="InnerPP1Connectors"/> + </multicopy> + +</assembly> + +<assembly name="CoolingOuterWheel"> + + <multicopy name="AddCoolingOuterToWheel" n="3"> + <transformation name="PlaceCoolingOuterToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R420_R1000_CoolingOuter"/> + </multicopy> + +</assembly> + + +<assembly name="PixRed1Wheel"> + + <multicopy name="AddPixRed1ToWheel" n="4"> + <transformation name="PlacePixRed1ToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R700_R1000_Data"/> + </multicopy> + +</assembly> +<assembly name="PixRed2Wheel"> + + <multicopy name="AddPixRed2ToWheel" n="4"> + <transformation name="PlacePixRed2ToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R347_R1000_Data"/> + </multicopy> + +</assembly> + +<!--<logvol name="PixType2DQ1" shape="shPixType2DQ1" material="matPixType2D"></logvol>--> +<logvol name="pixSvc_PP1_T2_R347_R420_Power" shape="shPixType2DQ1" material="matPixType2D"/> + + + +<assembly name="PixType2DWheel"> + <multicopy name="AddType2DaToWheel" n="4"> + <transformation name="PlaceType2DaToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R347_R420_Power"/> + </multicopy> +</assembly> + +<logvol name="pixSvc_PP1_T2_R420_R474_Power" shape="shPixType2EQ1" material="matPixType2E"/> + + +<assembly name="PixType2EWheel"> + <multicopy name="AddType2EbToWheel" n="4"> + <transformation name="PlaceType2EbToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R420_R474_Power"/> + </multicopy> +</assembly> + +<logvol name="pixSvc_PP1_T2_R474_R529_Power" shape="shPixType2FQ1" material="matPixType2F"/> + + +<assembly name="PixType2FWheel"> + + <multicopy name="AddType2FbToWheel" n="4"> + <transformation name="PlaceType2FbToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R474_R529_Power"/> + </multicopy> + + </assembly> +<!--<assembly name="PixType2FWheel"> +<assemblyref ref="PixType2aFWheel"/> +<assemblyref ref="PixType2FbWheel"/> +</assembly>--> + + + +<logvol name="pixSvc_PP1_T2_R529_R584_Power" shape="shPixType2GQ1" material="matPixType2G"/> +<assembly name="PixType2GWheel"> + + <multicopy name="AddType2GToWheel" n="4"> + <transformation name="PlaceType2GToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R529_R584_Power"/> + </multicopy> + + </assembly> +<logvol name="pixSvc_PP1_T2_R584_R639_Power" shape="shPixType2HQ1" material="matPixType2H"/> +<assembly name="PixType2HWheel"> + + <multicopy name="AddType2HToWheel" n="4"> + <transformation name="PlaceType2HToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R584_R639_Power"/> + </multicopy> + + </assembly> +<logvol name="pixSvc_PP1_T2_R639_R700_Power" shape="shPixType2IQ1" material="matPixType2I"/> +<assembly name="PixType2IWheel"> + + <multicopy name="AddType2IToWheel" n="4"> + <transformation name="PlaceType2IToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R639_R700_Power"/> + </multicopy> + + </assembly> + +<logvol name="pixSvc_PP1_T2_R700_R1000_Power" shape="shPixType2LQ1" material="matPixType2L"/> +<assembly name="PixType2LWheel"> + + <multicopy name="AddType2LToWheel" n="4"> + <transformation name="PlaceType2LToWheel"> + <rotation zcos="1." angle="PI/2"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R700_R1000_Power"/> + </multicopy> + + </assembly> + + +<!--<logvol name="pixPP1middle" shape="shPix_PP1_middle" material="AlMetal"/>--> +<logvol name="pixPP1outer" shape="pixPP1skin" material="AlMetal"/><!--Placeholder for visibility !!--> +<logvol name="pixPP1" shape="ShPixPP1_Envelope" material="Air"> +<!-- + <transform> + <transformation name="PlaceB_PP1A"> + <translation z="-PixPP1Type2Length/2 + B_PP1_L/2"/> + </transformation> + <logvolref ref="B_PP1"/> + </transform>--> + <transform> + <transformation name="PlaceEC_PP1A"> + <translation z="-PixPP1Type2Length/2 + EC_PP1_L/2"/> + </transformation> + <logvolref ref="EC_PP1"/> + </transform> + <transform> + + <transformation name="PlacePixPP1outer"> + <translation z="Pix_PP1_outer_Z_Start-Pix_PP1_Z_Start+Pix_PP1_outer_L/2+HXcorrection-PixPP1Type2Length/2"/> + </transformation> + <logvolref ref="pixPP1outer"/> + </transform> + <!--<transform> + <transformation name="PlacePixPP1middle"> + <translation z="Pix_PP1_middle_Z_Start-Pix_PP1_Z_Start+Pix_PP1_middle_L/2+HXcorrection-PixPP1Type2Length/2"/> + </transformation> + <logvolref ref="pixPP1middle"/> + </transform>--> + <!--place HX here--> +<transform> + <transformation name="PlacePixPP1OuterServices"> + + <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start -PixPP1Type2Length/2+(-Pix_PP1_outer_L*1.25)/2-0.5-ConnectorDepth"/> + + </transformation> + <logvolref ref="Pix_PP1OuterServices"/> + </transform> +<transform> + <transformation name="PlacePixPP1Connectors"> + + <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start-PixPP1Type2Length/2-22/2"/> + <rotation zcos="1" angle="PI/16"/> + </transformation> + <assemblyref ref="OuterPP1ConnectorWheel"/> + </transform> + +<transform> + <transformation name="PlacePixPP1IConnectors"> + + <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start -PixPP1Type2Length/2-25/2"/> + <rotation zcos="1" angle="PI/16"/> + </transformation> + <assemblyref ref="InnerPP1ConnectorWheel"/> +</transform> +<transform> + <transformation name="PlacePixPP1InnerServices"> + + <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start + (Pix_PP1_middle_Z_End - Pix_PP1_outer_Z_End)/2-25/2-PixPP1Type2Length/2"/> + + </transformation> + <logvolref ref="Pix_PP1InnerServices"/> +</transform> + + <transform> + <transformation name="PlaceHeatExchange_NC"> + <rotation zcos="1." angle="0.785398"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <assemblyref ref="HeatExchanger_doublet"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_EC"> + <rotation zcos="1." angle="2.35619"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + <translation y="-HeatExchanger_w"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_SC"> + <rotation zcos="1." angle="3.92699"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_WC"> + <rotation zcos="1." angle="5.49779"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <!--now Type 2 service--> + + <transform> + <transformation name="PlacePixRed1"> + + <translation z="(Pix_PP1_outer_Z_End - Pix_PP1_Z_Start)/2 -PixPP1Type2Length/2"/> + <rotation zcos="1." angle="RedAngle"/> + </transformation> + <assemblyref ref="PixRed1Wheel"/> + </transform> + + <transform> + <transformation name="PlacePixRed2"> + + <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start + (Pix_PP1_middle_Z_End - Pix_PP1_outer_Z_End)/2-PixPP1Type2Length/2"/> +<rotation zcos="1." angle="RedAngle"/> + </transformation> + <assemblyref ref="PixRed2Wheel"/> + </transform> + + <transform> + <transformation name="PlacePixCoolingOuter"> + + <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="CoolingAngle-3*PI/2"/> + </transformation> + <assemblyref ref="CoolingOuterWheel"/> + </transform> + +<transform> + <transformation name="PlacePixCoolingInner"> + + <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="CoolingAngle"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R347_R420_CoolingInner"/> + </transform> + +<transform> + <transformation name="PlacePixCoolingSum"> + + <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="CoolingAngle"/> + </transformation> + <logvolref ref="pixSvc_PP1_T2_R420_R1000_CoolingSum"/> + </transform> + + <transform> + <transformation name="PlacePixPP1Type2D"> + + <translation z="Pix_PP1_cooling_Z_End - Pix_PP1_Z_Start + PixType2D_hl-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + + </transformation> + <assemblyref ref="PixType2DWheel"/> + </transform> + + <transform> + <transformation name="PlacePixPP1Type2Da"> + + <translation z="Pix_PP1_cooling_Z_End - Pix_PP1_Z_Start + PixType2D_hl-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2DWheel"/> + </transform> + + <transform> + <transformation name="PlacePixPP1Type2E"> + + <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2EWheel"/> + </transform> + + + + + + <transform> + <transformation name="PlacePixPP1Type2Ea"> + + <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2EWheel"/> + </transform> + + + <transform> + <transformation name="PlacePixPP1Type2F"> + + <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2FWheel"/> + </transform> + <transform> + <transformation name="PlacePixPP1Type2Fa"> + + <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + + + </transformation> + <assemblyref ref="PixType2FWheel"/> + </transform> + + + + <transform> + <transformation name="PlacePixPP1Type2G"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start+PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2GWheel"/> + </transform> +<transform> + <transformation name="PlacePixPP1Type2Ga"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start+PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2GWheel"/> + </transform> + + + + <transform> + <transformation name="PlacePixPP1Type2H"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2HWheel"/> + </transform> + <transform> + <transformation name="PlacePixPP1Type2Ha"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2HWheel"/> + </transform> + + + + <transform> + <transformation name="PlacePixPP1Type2I"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2IWheel"/> + </transform> +<transform> + <transformation name="PlacePixPP1Type2Ia"> + + <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2IWheel"/> + </transform> + + + + <transform> + <transformation name="PlacePixPP1Type2L"> + + <translation z="PixPP1Type2Length/2-35/2"/> + <rotation zcos="1." angle="Type2Angle"/> + </transformation> + <assemblyref ref="PixType2LWheel"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2La"> + + <translation z="PixPP1Type2Length/2-35/2"/> + <rotation zcos="1." angle="Type2Angle_b"/> + </transformation> + <assemblyref ref="PixType2LWheel"/> + </transform> + + + + +</logvol> +<!--<logvol name="pixPP1" shape="shPix_PP1_outer" material="Air"></logvol>--> +<assembly name="PixPP1"> <!-- pixPP1 plus HeatExchangers --> + <logvolref ref="pixPP1"/> +</assembly> + + +<shapes> + + <tube name="ShStripEnvelope" rmin="StripInnerRadius" rmax="StripOuterRadius - EPS" zhalflength="ITkHalfLength"/> + <tube name="ShStripB_Envelope" rmin="StripB_InnerRadius" rmax="StripB_OuterRadius - 2*EPS" zhalflength="StripB_HalfLength"/> + <tube name="ShStripEC_Envelope" rmin="365." rmax="StripEC_OuterRadius - 2*EPS" zhalflength="StripEC_HalfLength-EPS"/> <!-- rmin = StripEC_InnerRadius originally --> + +</shapes> +<logvol name="SCT_ForwardPlus" shape="ShStripEC_Envelope" material="N2" alignable="true"> + <transform> + <transformation name="MoveEC1ToEnvelope"> + <translation z="-(StripEC_Z_Start + StripEC_HalfLength)"/> + </transformation> + <assemblyref ref="SCT_Forward"/> + </transform> +</logvol> + +<!-- We make an identical logvol differing only in name for the other endcap, to fit with SCT_GeoModel convention --> +<logvol name="SCT_ForwardMinus" shape="ShStripEC_Envelope" material="N2" alignable="true"> + <transform> + <transformation name="MoveEC2ToEnvelope"> + <translation z="-(StripEC_Z_Start + StripEC_HalfLength)"/> + </transformation> + <assemblyref ref="SCT_Forward"/> + </transform> +</logvol> + +<!--log vol for pix pp1--> +<!-- +<logvol name="SCT_PixPP1Plus" shape="ShPixPP1_Envelope" material="Air" alignable="true"> + <transform> + <transformation name="MovePixPP11ToEnvelope"> + + <translation z="-(Pix_PP1_outer_Z_Start+190)"/> + </transformation> + <assemblyref ref="PixPP1"/> + </transform> +</logvol> + + + +<logvol name="SCT_PixPP1Minus" shape="ShPixPP1_Envelope" material="Air" alignable="true"> + <transform> + <transformation name="MovePixPP12ToEnvelope"> + + <translation z="-(Pix_PP1_outer_Z_Start + 190)"/> + </transformation> + <assemblyref ref="PixPP1"/> + </transform> +</logvol> +--> +<!--log vol for pix pp1--> + +<addbranch> + + <logvol name="SCT" shape="ShStripEnvelope" material="N2"> + + <logvolref ref="PolyModOCEnvelope"/> + + <transform> + <transformation name="PlaceBulkheadA"> + <translation z="BulkheadTranslation"/> + </transformation> + <logvolref ref="Bulkhead"/> + </transform> + + <transform> + <transformation name="PlaceBulkheadC"> + <translation z="-BulkheadTranslation"/> + </transformation> + <logvolref ref="Bulkhead"/> + </transform> + + <transform> + <transformation name="PlaceB_PP1A"> + <translation z="B_PP1_Z_Start + B_PP1_L/2"/> + </transformation> + <logvolref ref="B_PP1"/> + </transform> + + <transform> + <transformation name="PlaceB_PP1C"> + <translation z="-(B_PP1_Z_Start + B_PP1_L/2)"/> + </transformation> + <logvolref ref="B_PP1"/> + </transform> + <!-- + <transform> + <transformation name="PlaceEC_PP1A"> + <translation z="EC_PP1_Z_Start + EC_PP1_L/2"/> + </transformation> + <logvolref ref="EC_PP1"/> + </transform> + + <transform> + <transformation name="PlaceEC_PP1C"> + <translation z="-(EC_PP1_Z_Start + EC_PP1_L/2)"/> + </transformation> + <logvolref ref="EC_PP1"/> + </transform> + + <transform> + <transformation name="PlacePix_PP1_middle_C"> + <translation z="-(Pix_PP1_middle_Z_Start + Pix_PP1_middle_L/2)"/> + </transformation> + <logvolref ref="pixPP1"/> + </transform> + --> + + <!-- + <transform> + <transformation name="PlaceHeatExchange_NA"> + <rotation zcos="1." angle="0.785398"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_EA"> + <rotation zcos="1." angle="2.35619"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_SA"> + <rotation zcos="1." angle="3.92699"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_WA"> + <rotation zcos="1." angle="5.49779"/> + <translation z="HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + + <transform> + <transformation name="PlaceHeatExchange_NC"> + <rotation zcos="1." angle="0.785398"/> + <translation z="-HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_EC"> + <rotation zcos="1." angle="2.35619"/> + <translation z="-HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_SC"> + <rotation zcos="1." angle="3.92699"/> + <translation z="-HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + <transform> + <transformation name="PlaceHeatExchange_WC"> + <rotation zcos="1." angle="5.49779"/> + <translation z="-HeatExchanger_z"/> + <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/> + </transformation> + <logvolref ref="HeatExchanger"/> + </transform> + --> + <index ref="barrel_endcap" value="0"/> + <transform alignable="3"> + <transformation name="NoneButNeededForAlignable" alignable="true"> + <translation/> + </transformation> + <logvol name="SCT_Barrel" shape="ShStripB_Envelope" material="N2" alignable="true"> + <assemblyref ref="StripB"/> + </logvol> + </transform> + + <index ref="barrel_endcap" value="2"/> + <transform alignable="3"> + <transformation name="PlaceEC_Plus" alignable="true"> + <translation z="StripEC_Z_Start + StripEC_HalfLength"/> + </transformation> + <logvolref ref="SCT_ForwardPlus"/> + </transform> + + <index ref="barrel_endcap" value="-2"/> + <transform alignable="3"> + <transformation name="TurnE_A_ToE_C" alignable="true"> + <rotation ycos="1." angle="PI"/> + <translation z="StripEC_Z_Start + StripEC_HalfLength"/> + </transformation> + <logvolref ref="SCT_ForwardMinus"/> + </transform> + + + <transform> + <transformation name="TurnPixPP1plus"> + + <translation z="(Pix_PP1_Z_Start + 190)"/> + </transformation> + <logvolref ref="pixPP1"/> + </transform> + + <transform> + <transformation name="TurnPixPP1minus"> + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_Z_Start + 190)"/> + </transformation> + <logvolref ref="pixPP1"/> + </transform> + +<!-- + <transform> + <transformation name="PlacePixPP1Type2D"> + + <translation z="(Pix_PP1_middle_Z_End + PixType2D_hl)"/> + </transformation> + <logvolref ref="pixType2D"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2D_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_middle_Z_End + PixType2D_hl)"/> + </transformation> + <logvolref ref="pixType2D"/> + </transform> + + <transform> + <transformation name="PlacePixPP1Type2E"> + + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2E"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2E_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2E"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2F"> + + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2F"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2F_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2F"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2G"> + + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2G"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2G_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2G"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2H"> + + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2H"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2H_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2H"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2I"> + + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2I"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2I_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/> + </transformation> + <logvolref ref="pixType2I"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2J"> + + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2J"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2J_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2J"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2K"> + + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2K"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2K_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2K"/> + </transform> + +<transform> + <transformation name="PlacePixPP1Type2L"> + + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2L"/> + </transform> + + <transform> + <transformation name="TurnPixPP1Type2L_minus" > + <rotation ycos="1." angle="PI"/> + <translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/> + </transformation> + <logvolref ref="pixType2L"/> + </transform> +--> + + + + <!-- Service volumes --> + <transform> + <transformation name="PlaceBServicesPlus"> + <translation z="StripB_ServicesGapZ_Start + StripB_ServicesGapHalfLength"/> + </transformation> + <assemblyref ref="SV_Barrel"/> + </transform> + + <transform> + <transformation name="PlaceBServicesMinus"> + <rotation ycos="1." angle="PI"/> + <translation z="(StripB_ServicesGapZ_Start + StripB_ServicesGapHalfLength)"/> + </transformation> + <assemblyref ref="SV_Barrel"/> + </transform> + + <transform> + <transformation name="PlaceBServicesAtECPlus"> + <translation z="StripB_ServicesEC_Z_Start + StripB_ServicesEC_HalfLength+EPS"/> <!-- Shrunk services by 10 halflength to fit SCT Barrel expansion --> + </transformation> + <assemblyref ref="SV_BarrelAtEC"/> + </transform> + + <transform> + <transformation name="PlaceBServicesAtECMinus"> + <rotation ycos="1." angle="PI"/> + <translation z="StripB_ServicesEC_Z_Start + StripB_ServicesEC_HalfLength+EPS"/> <!-- Shrunk services by 10 halflength to fit SCT Barrel expansion --> + </transformation> + <assemblyref ref="SV_BarrelAtEC"/> + </transform> + + <transform> + <transformation name="PlaceECServicesPlus"> + <translation z="StripEC_ServicesZ_Start + StripEC_ServicesHalfLength + EPS"/> + </transformation> + <assemblyref ref="SV_Endcap"/> + </transform> + + <transform> + <transformation name="PlaceECServicesMinus"> + <rotation ycos="1." angle="PI"/> + <translation z="(StripEC_ServicesZ_Start + StripEC_ServicesHalfLength + EPS)"/> + + + </transformation> + <assemblyref ref="SV_Endcap"/> + </transform> + + <transform> + <transformation name="PlaceRailShelfSquareCompleteA"> + <translation x="RailRadius"/> + <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/> + </transformation> + <assemblyref ref="RailShelfSquareComplete"/> + </transform> + + <transform> + <transformation name="PlaceRailShelfCircleCompleteA"> + <translation x="-RailRadius"/> + <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/> + </transformation> + <assemblyref ref="RailShelfCircleComplete"/> + </transform> + + <transform> + <transformation name="PlacePSTA"> + <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/> + </transformation> + <assemblyref ref="EndcapPST"/> + </transform> + + <transform> + <transformation name="PlaceRailShelfSquareCompleteC"> + <translation x="-( RailRadius )"/> + <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="RailShelfSquareComplete"/> + </transform> + + <transform> + <transformation name="PlaceRailShelfCircleCompleteC"> + <translation x="RailRadius"/> + <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/> + <rotation ycos="1." angle="PI"/> + </transformation> + <assemblyref ref="RailShelfCircleComplete"/> + </transform> + + <transform> + <transformation name="PlacePSTC"> + <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/> + </transformation> + <assemblyref ref="EndcapPST"/> + </transform> + +</logvol> + +</addbranch> + +</geomodel> diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd b/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd new file mode 100644 index 0000000000000000000000000000000000000000..54cf5c59d9012e4dc64979e0f957d879f805f17a --- /dev/null +++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd @@ -0,0 +1,245 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- Copyright N.P. Hessey, Nikhef, 2013 --> + +<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)> + <!ATTLIST geomodel name CDATA "Unnamed detector" + version CDATA "0.0" + xmlns CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx"> + + <!ELEMENT defines (var|vector|matrix)+> + + <!ELEMENT var EMPTY> + <!ATTLIST var name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT vector EMPTY> + <!ATTLIST vector name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT matrix EMPTY> + <!ATTLIST matrix name ID #REQUIRED + coldim CDATA #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT materials ((element|chemical|material)+)> + <!ATTLIST materials densitysf CDATA "1.0"> + + <!ELEMENT element EMPTY> + <!ATTLIST element name ID #REQUIRED + shortname NMTOKEN #REQUIRED + Z CDATA #REQUIRED + A CDATA #REQUIRED> + + <!ELEMENT chemical (elemcontent)+> + <!ATTLIST chemical name ID #REQUIRED> + <!ELEMENT elemcontent EMPTY> + <!ATTLIST elemcontent ref IDREF #REQUIRED + quantity CDATA #REQUIRED> + + <!ELEMENT material (elementref|materialref|chemicalref)+> + <!ATTLIST material name ID #REQUIRED + density CDATA #REQUIRED> + + <!ELEMENT elementref EMPTY> + <!ATTLIST elementref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT materialref EMPTY> + <!ATTLIST materialref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT chemicalref EMPTY> + <!ATTLIST chemicalref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT readoutgeometry (param*, sensorclass+)> + <!ELEMENT param EMPTY> + <!ATTLIST param name NMTOKEN #REQUIRED + value CDATA #REQUIRED> + <!ELEMENT sensorclass (param*, sensortype+)> + <!ATTLIST sensorclass name ID #REQUIRED> + <!ELEMENT sensortype (param*)> + <!ATTLIST sensortype name ID #REQUIRED> + + <!ELEMENT positionindex (addindex+)> + <!ELEMENT addindex EMPTY> + <!ATTLIST addindex name ID #REQUIRED> + + <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union)+)> + <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case --> + + <!ELEMENT box EMPTY> + <!ATTLIST box name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT cons EMPTY> + <!ATTLIST cons name ID #REQUIRED + rmin1 CDATA #REQUIRED + rmin2 CDATA #REQUIRED + rmax1 CDATA #REQUIRED + rmax2 CDATA #REQUIRED + dz CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT generictrap EMPTY> + <!ATTLIST generictrap name ID #REQUIRED + x0 CDATA #REQUIRED + y0 CDATA #REQUIRED + x1 CDATA #REQUIRED + y1 CDATA #REQUIRED + x2 CDATA #REQUIRED + y2 CDATA #REQUIRED + x3 CDATA #REQUIRED + y3 CDATA #REQUIRED + x4 CDATA #REQUIRED + y4 CDATA #REQUIRED + x5 CDATA #REQUIRED + y5 CDATA #REQUIRED + x6 CDATA #REQUIRED + y6 CDATA #REQUIRED + x7 CDATA #REQUIRED + y7 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT para EMPTY> + <!ATTLIST para name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED + alpha CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED> + + <!ELEMENT pcon (addplane, addplane+)> + <!ELEMENT addplane EMPTY> + <!ATTLIST addplane zplane CDATA #REQUIRED + rminplane CDATA #REQUIRED + rmaxplane CDATA #REQUIRED> + + <!ATTLIST pcon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT pgon (addplane, addplane+)> + <!ATTLIST pgon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED + nsides CDATA #REQUIRED> + + <!ELEMENT trap EMPTY> + <!ATTLIST trap name ID #REQUIRED + zhalflength CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED + dydzn CDATA #REQUIRED + dxdyndzn CDATA #REQUIRED + dxdypdzn CDATA #REQUIRED + angleydzn CDATA #REQUIRED + dydzp CDATA #REQUIRED + dxdyndzp CDATA #REQUIRED + dxdypdzp CDATA #REQUIRED + angleydzp CDATA #REQUIRED> + + <!ELEMENT tube EMPTY> + <!ATTLIST tube name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT tubs EMPTY> + <!ATTLIST tubs name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT trd EMPTY> + <!ATTLIST trd name ID #REQUIRED + xhalflength1 CDATA #REQUIRED + xhalflength2 CDATA #REQUIRED + yhalflength1 CDATA #REQUIRED + yhalflength2 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST intersection name ID #REQUIRED> + + <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST subtraction name ID #REQUIRED> + + <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST union name ID #REQUIRED> + + <!ELEMENT shaperef EMPTY> + <!ATTLIST shaperef ref IDREF #REQUIRED> + + <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))> + <!ATTLIST transform name ID #IMPLIED + alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number --> + + <!ELEMENT transformation (scaling|rotation|translation)+> + + <!ELEMENT scaling EMPTY> + <!ATTLIST scaling x CDATA "1.0" + y CDATA "1.0" + z CDATA "1.0"> + + <!ELEMENT rotation EMPTY> + <!ATTLIST rotation xcos CDATA "0.0" + ycos CDATA "0.0" + zcos CDATA "0.0" + angle CDATA "0.0"> + + <!ELEMENT translation EMPTY> + <!ATTLIST translation x CDATA "0.0" + y CDATA "0.0" + z CDATA "0.0"> + + <!ATTLIST transformation name ID #REQUIRED> + <!ATTLIST transformation alignable (true|false) "false"> + + <!ELEMENT transformationref EMPTY> + <!ATTLIST transformationref ref IDREF #REQUIRED> + + <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*> + <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme --> + <!ATTLIST logvol name ID #REQUIRED + shape IDREF #REQUIRED + material IDREF #REQUIRED + sensitive IDREF #IMPLIED + alignable (true|false) "false"> + + <!ELEMENT index EMPTY> + <!ATTLIST index ref IDREF #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT logvolref EMPTY> + <!ATTLIST logvolref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+> + <!ATTLIST assembly name ID #REQUIRED + alignable (true|false) "false"> + + <!ELEMENT assemblyref EMPTY> + <!ATTLIST assemblyref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))> + <!-- Removed logvol and assembly from multicopy content. There is no particular reason + why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding + the index stuff. If you need them, put them back. Got rid of transformref; never used. --> + <!-- loopvar: Set to a vector variable name or omit; see manual --> + <!-- alignable: Value is the alignment level-number --> + <!ATTLIST multicopy name ID #REQUIRED + n CDATA #REQUIRED + loopvar CDATA #IMPLIED + alignable CDATA #IMPLIED> + <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice --> + + <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+> + diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx b/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1fcf13f1619a41d79578674753010ff2431b0410 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx @@ -0,0 +1,107 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + + +#include "GeoModelKernel/GeoVGeometryPlugin.h" + + +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/Units.h" +#define SYSTEM_OF_UNITS GeoModelKernelUnits // so we will get, e.g., 'GeoModelKernelUnits::cm' + +#include "GeoModelXml/GmxInterface.h" +#include "GeoModelXml/Gmx2Geo.h" + +#include <iostream> +#include <fstream> +#include <sstream> + +class GMXPlugin : public GeoVGeometryPlugin { + + public: + + // Constructor: + GMXPlugin(); + + // Destructor: + ~GMXPlugin(); + + // Creation of geometry: + virtual void create(GeoPhysVol *world, bool publish); + + private: + + // Illegal operations: + const GMXPlugin & operator=(const GMXPlugin &right)=delete; + GMXPlugin(const GMXPlugin &right) = delete; + + bool exists (const std::string& name) + { + std::ifstream f(name.c_str()); + return f.good(); + } + + std::vector<std::string> parseFiles(const std::string files, const char separator=';') + { + std::string parsed; + std::istringstream iFiles(files); + std::vector<std::string> fileList; + while (iFiles>>parsed) + { + std::cout<<" parsed string "<<parsed<<std::endl; + fileList.push_back(parsed); + } + return fileList; + } + +}; + + + + + +GMXPlugin::GMXPlugin() +{ +} + + +GMXPlugin::~GMXPlugin() +{ +} + + +//## Other Operations (implementation) +void GMXPlugin::create(GeoPhysVol *world, bool publish) +{ + + std::cout<< "This is GMXPlugin: creating a GeoModelXml detector "<<std::endl; + std::vector<std::string> filesToParse; + char* fPath=getenv("GMX_FILES"); + std::string fileName; + if (fPath!=NULL) { + std::cout<<" Environment variable GMX_FILES set to "<<fPath<<std::endl; + fileName=std::string(fPath); + filesToParse=parseFiles(fileName,':'); + } + else { + fileName="gmx.xml"; + filesToParse.push_back(fileName); + } + + for (auto f: filesToParse) + { + if (!exists(f)) { + std::cout <<"GDMLtoGeo: input file "<<f<< + " does not exist. quitting and returning nicely! "<<std::endl; + return; + } + GmxInterface gmxInterface; + Gmx2Geo gmx2Geo(f, world, gmxInterface, 0); + } + +} + +extern "C" GMXPlugin *createGMXPlugin() { + return new GMXPlugin; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt b/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5bfcae6907de16a3696b4b513535cda109044bd7 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt @@ -0,0 +1,51 @@ +# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + +# Find the header and source files. +file( GLOB SOURCES src/*.cxx ) +file( GLOB HEADERS GeoModelXml/*.h ) +file( GLOB SHAPEHEADERS GeoModelXml/shape/*.h ) + +# External dependencies +find_package( ZLIB REQUIRED ) + + +# Create the library. +add_library( GeoModelXml SHARED ${HEADERS} ${SOURCES} ) +# Add custom definitions +target_compile_definitions( GeoModelXml PUBLIC -DSTANDALONE_GMX ) +# link libraries +target_link_libraries( GeoModelXml PUBLIC GeoModelCore::GeoModelKernel GeoModelTools::ExpressionEvaluator XercesC::XercesC ZLIB::ZLIB ) +target_include_directories( GeoModelXml PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<INSTALL_INTERFACE:include> ) +source_group( "GeoModelXml" FILES ${HEADERS} ) +source_group( "src" FILES ${SOURCES} ) +set_target_properties( GeoModelXml PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} ) + +# Set up an alias with the same name that you would get by "finding" a pre-built +# version of the library. +add_library( GeoModelTools::GeoModelXml ALIAS GeoModelXml ) + +# Install the library. +install(TARGETS GeoModelXml + EXPORT ${PROJECT_NAME}-export + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT Runtime + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Runtime + NAMELINK_COMPONENT Development # Requires CMake 3.12 + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Development + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml + COMPONENT Development + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + +install( FILES ${HEADERS} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml + COMPONENT Development ) +install( FILES ${SHAPEHEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml/shape) + + diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..c728cf248a0fabd79fb86199e40daa525df6373a --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h @@ -0,0 +1,18 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H +#define GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> +// +// Processor for addbranch tags. +// +#include "GeoModelXml/ElementProcessor.h" + +class AddbranchProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &util, GeoNodeList &toAdd); +}; + +#endif // ADD_BRANCH_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..523204ece15ed2195eab0a9167d2b7e6a33a7247 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h @@ -0,0 +1,31 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H +#define GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> +// +// Processor for assembly tags. +// +#include <string> +#include <map> + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; +class GeoNameTag; + +class AssemblyProcessor: public ElementProcessor { +public: + typedef struct { + GeoNameTag *name; + int id; + bool alignable; + } AssemblyStore; + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); + void zeroId(const xercesc::DOMElement *element); +private: + std::map<std::string, AssemblyStore> m_map; +}; + +#endif // ASSEMBLY_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..54e1a691202758fd4b45d4994f92c8e99435ffdf --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H +#define GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> + +// +// Processor for assemblyref tags. +// + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; + +class AssemblyrefProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); +}; + +#endif // ASSEMBLYREF_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h new file mode 100644 index 0000000000000000000000000000000000000000..01e8562de77412ad50bdccf8d37a6cfb72d67783 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Base class to process one element (not its children). +// For each element-tag, create a class inheriting from this; and supply the process method. +// Register your processor with the BranchProcessor. +// +#ifndef GEO_MODEL_XML_ELEMENT2GEO_ITEM_H +#define GEO_MODEL_XML_ELEMENT2GEO_ITEM_H +#include <xercesc/util/XercesDefs.hpp> + +#include <map> +#include <string> + +class RCBase; +class GmxUtil; + +XERCES_CPP_NAMESPACE_BEGIN +class DOMElement; +XERCES_CPP_NAMESPACE_END +class ProcessorRegistry; +namespace HepTool {class Evaluator;} + +class Element2GeoItem { + +public: + Element2GeoItem(); + virtual ~Element2GeoItem(); + const RCBase * process(const xercesc::DOMElement *element, GmxUtil &gmxUtil); + virtual const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +protected: + std::map<std::string, const RCBase *> m_map; +}; +#endif // ELEMENT2GEO_ITEM_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h new file mode 100644 index 0000000000000000000000000000000000000000..bb85bc1457b085f92e7d925d6120078ffe76bdb1 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process an element followed by all its children. +// Element processors have to be registered with me so I know who to call. +// Any element tag with no registered processor will be handled by a default handler, which +// does nothing and stops processing of its children. +// +#ifndef GEO_MODEL_XML_ELEMENT2GEO_ITEM_REGISTRY_H +#define GEO_MODEL_XML_ELEMENT2GEO_ITEM_REGISTRY_H +#include <string> +#include <map> + +class Element2GeoItem; + +class Element2GeoItemRegistry { +public: + Element2GeoItemRegistry(); + ~Element2GeoItemRegistry(); + void enregister(const std::string tagName, Element2GeoItem *processor); // register = keyword + Element2GeoItem *find(const std::string tagName); + +private: + Element2GeoItem *m_defaultProcessor; + std::map<std::string, Element2GeoItem *> m_processor; +}; + +#endif // ELEMENT2GEO_ITEM_REGISTRY_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..08c92612ac39c52b926a019c51782981d34e7bb1 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Base class to process one element (not its children). +// For each element-tag, create a class inheriting from this; and supply the process method. +// Register your processor with the BranchProcessor. +// +#ifndef GEO_MODEL_XML_ELEMENT_PROCESSOR_H +#define GEO_MODEL_XML_ELEMENT_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/GeoNodeList.h" + +XERCES_CPP_NAMESPACE_BEGIN +class DOMElement; +XERCES_CPP_NAMESPACE_END +class GmxUtil; + +class ElementProcessor { + +public: + ElementProcessor(); + virtual void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, + GeoNodeList &toBeAdded); +}; +#endif // ELEMENT_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h new file mode 100644 index 0000000000000000000000000000000000000000..eac3c942d3b64ab52b0b6b56bca4e949a4486ea3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h @@ -0,0 +1,8 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include <vector> +#include "GeoModelKernel/GeoGraphNode.h" + +typedef std::vector<GeoGraphNode *> GeoNodeList; diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h new file mode 100644 index 0000000000000000000000000000000000000000..2690f137c6fdaac058cc8299dbe2854e751c6402 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_GMX2GEO_H +#define GEO_MODEL_XML_GMX2GEO_H +#include <xercesc/util/XercesDefs.hpp> + +/** + * @brief Create a branch of a GeoModel Tree. + * + * @author Nigel Hessey, Nikhef +@section GeoModelXmlOverview Class Overview + The GeoModelXml package contains the following classes: + + - Gmx2Geo : Create an instance of a Gmx2Geo class to do all the work + * First parameter is the name of the file containing the xml + * Second parameter is the position in the ATLAS GeoModel tree at which your geometry is to be inserted + * Third parameter gives a set of call back routines for dealing with sensitive and alignable volumes. + * + */ + +// +// Gmx2Geo is the main class needed to set-up a GeoModel graph branch using +// xml (in a .gmx file). +// The user instantiates one of these, giving the name of the file and where in the +// GeoModel graph the volumes are to be added, and a GmxInterface object. The constructor does the rest, +// adding solids and materials etc. according to the .gmx file. +// +// Use: +// #include "GeoModelXml/Gmx2Geo.h" +// #include "GeoModelXml/GmxInterface.h" +// ...create your world volume and do all the Athena setup... +// ... get the filename with the xml in: +// std::string xmlfilename; some athena stuff to get filename from the job options... +// ...create your envelope GeoPhysVol... +// GeoPhysVol *sct(...); +// GmxInterface gmxInterface; +// +// Gmx2Geo gmx2Geo(xmlfilename, sct, gmxInterface); +// +#include <string> +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GmxInterface.h" + +class GeoPhysVol; +XERCES_CPP_NAMESPACE_BEGIN +class DOMDocument; +XERCES_CPP_NAMESPACE_END +XERCES_CPP_NAMESPACE_BEGIN +class DOMNode; +XERCES_CPP_NAMESPACE_END + +class Evaluator; + +class Gmx2Geo { +public: + Gmx2Geo(const std::string gmxFile, GeoPhysVol *addHere, GmxInterface &gmxInterface, unsigned int flags = 0); +private: +// Disallow copying + Gmx2Geo(const Gmx2Geo &right); + Gmx2Geo & operator=(const Gmx2Geo &right); + + int doDefines(xercesc::DOMDocument *doc, Evaluator &eval); + int doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil); + int doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil); + void addParam(xercesc::DOMNode *node, std::map<std::string, std::string> ¶ms); +}; +#endif // GMX2GEO_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h new file mode 100644 index 0000000000000000000000000000000000000000..7c64ebee49558473421ee9262d20068c6650c1bb --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_GMX_INTERFACE_H +#define GEO_MODEL_XML_GMX_INTERFACE_H +// +// Interface between SCT_SLHC_GeoModel and GeoModelXml. +// Provides 4 call-back routines: +// (0) To get a copy number with which to label a sensitive ID. +// ...gets copied to the G4 volume. Then SCT_G4_SD package uses this +// to get the position indexes or hashId +// (1) To add sensitive detector types +// (2) To add sensitive elements +// (3) To add alignable transforms +// - these get added to the detector manager. +// +#include <string> +#include <vector> +#include <map> +#include "GeoModelKernel/GeoVFullPhysVol.h" +#include "GeoModelKernel/GeoAlignableTransform.h" + +class GmxInterface { +public: + virtual int sensorId(std::map<std::string, int> &index) const; + virtual int splitSensorId(std::map<std::string, int> &index, std::pair<std::string, int> &extraIndex, std::map<std::string, int> &updatedIndex) const; //For "artificially" adding to Identifiers; specify the field (e.g. "eta_module") and the value to add + virtual void addSensorType(std::string type, std::string name, std::map<std::string, std::string> parameters); + virtual void addSensor(std::string name, std::map<std::string, int> &index, int id, GeoVFullPhysVol *fpv); + virtual void addSplitSensor(std::string name, std::map<std::string, int> &index, std::pair<std::string, int> &extraIndex, int id, GeoVFullPhysVol *fpv); + virtual void addAlignable(int level, std::map<std::string, int> &index, + GeoVFullPhysVol *fpv, GeoAlignableTransform *transform); + +}; +#endif // GMX_INTERFACE_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h new file mode 100644 index 0000000000000000000000000000000000000000..74c8bdf717cb94c6c0fe8b628522bc6253f0b675 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h @@ -0,0 +1,131 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_GMXUTIL_H +#define GEO_MODEL_XML_GMXUTIL_H +// +// Convenience class to hold Evaluator and registries. Allows one parameter to be passed +// to element handlers instead of a (changing??) list. +// +#include <string> +#ifndef STANDALONE_GMX +#include "CLHEP/Evaluator/Evaluator.h" +#else +#include "ExpressionEvaluator/Evaluator.h" +#endif +#include "GeoModelXml/ProcessorRegistry.h" +#include "GeoModelXml/Element2GeoItemRegistry.h" + +#include "GeoModelXml/AddbranchProcessor.h" +#include "GeoModelXml/LogvolProcessor.h" +#include "GeoModelXml/LogvolrefProcessor.h" +#include "GeoModelXml/AssemblyProcessor.h" +#include "GeoModelXml/AssemblyrefProcessor.h" +#include "GeoModelXml/TransformProcessor.h" +#include "GeoModelXml/MulticopyProcessor.h" +#include "GeoModelXml/IndexProcessor.h" + +#include "GeoModelXml/MakeElement.h" +#include "GeoModelXml/MakeMaterial.h" +#include "GeoModelXml/MakeTransformation.h" +#include "GeoModelXml/MakeTransformationref.h" +#include "GeoModelXml/MakeTranslation.h" +#include "GeoModelXml/MakeRotation.h" +#ifndef STANDALONE_GMX +#include "GeoModelXml/MakeScaling.h" +#endif + +#include "GeoModelXml/shape/MakeSimplePolygonBrep.h" +#include "GeoModelXml/shape/MakeBox.h" +#include "GeoModelXml/shape/MakeCons.h" +#include "GeoModelXml/shape/MakeGenericTrap.h" +#include "GeoModelXml/shape/MakePara.h" +#include "GeoModelXml/shape/MakePcon.h" +#include "GeoModelXml/shape/MakePgon.h" +#include "GeoModelXml/shape/MakeTrap.h" +#include "GeoModelXml/shape/MakeTrd.h" +#include "GeoModelXml/shape/MakeTube.h" +#include "GeoModelXml/shape/MakeTubs.h" +#include "GeoModelXml/shape/MakeIntersection.h" +#include "GeoModelXml/shape/MakeUnion.h" +#include "GeoModelXml/shape/MakeSubtraction.h" +#include "GeoModelXml/shape/MakeShaperef.h" +#include "GeoModelXml/shape/AddPlane.h" + +#include "GeoModelXml/PositionIndex.h" +//#include "GeoModelXml/SensitiveId.h" +#include "GeoModelXml/GmxInterface.h" + +class GmxUtil { +public: + GmxUtil(GmxInterface &gmxInterface); + ~GmxUtil(); + GmxInterface *gmxInterface(); + double evaluate(char const *expression); + std::string debracket(std::string expression); +#ifndef STANDALONE_GMX + HepTool::Evaluator eval; +#else + Evaluator eval; +#endif + PositionIndex positionIndex; + ProcessorRegistry processorRegistry; + Element2GeoItemRegistry geoItemRegistry; + GeoLogVol * getAssemblyLV() {return m_assemblyLV;}; + struct TagHandler { +// +// Things creating a vector of nodes to be added to the tree +// + AddbranchProcessor addbranch; + LogvolProcessor logvol; + LogvolrefProcessor logvolref; + AssemblyProcessor assembly; + AssemblyrefProcessor assemblyref; + TransformProcessor transform; + MulticopyProcessor multicopy; + IndexProcessor index; +// +// Things creating an RCBase * +// + MakeElement element; + MakeMaterial material; + MakeSimplePolygonBrep simplepolygonbrep; + MakeBox box; + MakeCons cons; + MakeGenericTrap generictrap; + MakePara para; + MakePcon pcon; + MakePgon pgon; + MakeTrap trap; + MakeTrd trd; + MakeTube tube; + MakeTubs tubs; + MakeIntersection intersection; + MakeUnion onion; // union is reserved + MakeSubtraction subtraction; + MakeShaperef shaperef; + MakeTransformation transformation; + MakeTransformationref transformationref; +// +// Things creating HEP transforms +// + MakeTranslation translation; + MakeRotation rotation; +#ifndef STANDALONE_GMX + MakeScaling scaling; +#endif +// +// Other things +// + AddPlane addplane; + } tagHandler; +// SensitiveId sensitiveId; +private: + GeoLogVol *makeAssemblyLV(); + GeoLogVol *m_assemblyLV; // Special logvol to be turned into an assembly-physical-volume. + // Achieved by filling it with special::ether material. + GmxInterface *m_gmxInterface; +}; + +#endif // GMXUTIL_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..2e66b9576e339848c18e7a72c1faeac9817909fb --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h @@ -0,0 +1,18 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_INDEX_PROCESSOR_H +#define GEO_MODEL_XML_INDEX_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> +// +// Processor for index tags which change the formula for generating a position-index. +// +#include "GeoModelXml/ElementProcessor.h" + +class IndexProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &util, GeoNodeList &toAdd); +}; + +#endif // INDEX_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..a3b44e18f599c3ca959869433f2c75190ca92ddf --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_LOGVOL_PROCESSOR_H +#define GEO_MODEL_XML_LOGVOL_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> +// +// Processor for logvol tags. +// +#include <string> +#include <map> + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; +class GeoNameTag; +class GeoLogVol; + +class LogvolProcessor: public ElementProcessor { +public: + typedef struct { + GeoNameTag *name; + int id; + GeoLogVol *logVol; + bool alignable; + } LogVolStore; + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); + void zeroId(const xercesc::DOMElement *element); +private: + std::map<std::string, LogVolStore> m_map; +}; + +#endif // LOGVOL_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..a3efbb9bd4157992bdadda0e6b9229f7a4783c2e --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H +#define GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> + +// +// Processor for logvolref tags. +// + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; + +class LogvolrefProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); +}; + +#endif // LOGVOLREF_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h new file mode 100644 index 0000000000000000000000000000000000000000..f1494499f1af72106d71ab71a3a6892c6f7034e1 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Handle material elements. +// +#ifndef GEO_MODEL_XML_MAKE_ELEMENT_H +#define GEO_MODEL_XML_MAKE_ELEMENT_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeElement: public Element2GeoItem { +public: + MakeElement(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // MAKE_ELEMENT_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h new file mode 100644 index 0000000000000000000000000000000000000000..8d95e862226a72f8206a06620d6d430f7c0aaa8e --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Handle material elements. +// +#ifndef GEO_MODEL_XML_MAKE_MATERIAL_H +#define GEO_MODEL_XML_MAKE_MATERIAL_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeMaterial: public Element2GeoItem { +public: + MakeMaterial(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // MAKE_MATERIAL_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h new file mode 100644 index 0000000000000000000000000000000000000000..3a41d1ebbc8179c5d2537ee890a405e96a787194 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h @@ -0,0 +1,23 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_MAKE_ROTATION_H +#define GEO_MODEL_XML_MAKE_ROTATION_H +#include <xercesc/util/XercesDefs.hpp> +// +// Create and return a HepRotation3d. Caller must delete it. +// + +XERCES_CPP_NAMESPACE_BEGIN +class DOMElement; +XERCES_CPP_NAMESPACE_END +#include "GeoModelKernel/GeoDefinitions.h" +class GmxUtil; + +class MakeRotation { +public: + MakeRotation(); + GeoTrf::Rotation3D getTransform(const xercesc::DOMElement *rotation, GmxUtil &gmxUtil); +}; +#endif // MAKE_ROTATION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h new file mode 100644 index 0000000000000000000000000000000000000000..c80e05c88c8f15581f75f6bd27f5358236eadf71 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Handle material elements. +// +#ifndef GEO_MODEL_XML_MAKE_TRANSFORMATION_H +#define GEO_MODEL_XML_MAKE_TRANSFORMATION_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTransformation: public Element2GeoItem { +public: + MakeTransformation(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // MAKE_TRANSFORMATION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h new file mode 100644 index 0000000000000000000000000000000000000000..5c345f73663ddb943762f1ece8b883b0ee482730 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h @@ -0,0 +1,19 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Handle material elements. +// +#ifndef GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H +#define GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTransformationref: public Element2GeoItem { +public: + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // MAKE_TRANSFORMATIONREF_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h new file mode 100644 index 0000000000000000000000000000000000000000..3464308f791059a16548cd7fa36d0f89e52d299f --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h @@ -0,0 +1,24 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_MAKE_TRANSLATION_H +#define GEO_MODEL_XML_MAKE_TRANSLATION_H +#include <xercesc/util/XercesDefs.hpp> +// +// Create and return a HepRotation3d. Caller must delete it. +// + +XERCES_CPP_NAMESPACE_BEGIN +class DOMElement; +XERCES_CPP_NAMESPACE_END +#include "GeoModelKernel/GeoDefinitions.h" +class GmxUtil; + + +class MakeTranslation { +public: + MakeTranslation(); + GeoTrf::Translate3D getTransform(const xercesc::DOMElement *rotation, GmxUtil &gmxUtil); +}; +#endif // MAKE_TRANSLATION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..d52033f4ea5ae1ca046ca83547b2d6696dab7808 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h @@ -0,0 +1,24 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_MULTICOPY_PROCESSOR_H +#define GEO_MODEL_XML_MULTICOPY_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> +// +// Processor for multicopy tags. +// +#include <string> +#include <map> + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; + +class MulticopyProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); +private: + std::map <std::string, GeoNodeList> m_map; +}; + +#endif // MULTICOPY_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h new file mode 100644 index 0000000000000000000000000000000000000000..72b18bc2a3a2215504a4758c5ae35bf101f5aed9 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Use gaudi messaging service when in Athena; use cout when "stand-alone". +// + +#ifndef OUTPUTDIRECTOR_H +#define OUTPUTDIRECTOR_H + +//#define STANDALONE_GMX + +#ifdef STANDALONE_GMX + #include <iostream> + #include <string> + + namespace MSG { + // enum((VERBOSE=1, DEBUG, INFO, WARNING, ERROR, FATAL, ALWAYS))} + const std::string PKG_NAME("GeoModelXML-"); + const std::string VERBOSE(PKG_NAME + "VERBOSE: "); + const std::string DEBUG(PKG_NAME + "DEBUG: "); + const std::string INFO(PKG_NAME + "INFO: "); + const std::string WARNING(PKG_NAME + "WARNING: "); + const std::string ERROR(PKG_NAME + "ERROR: "); + const std::string FATAL(PKG_NAME + "FATAL: "); + const std::string ALWAYS(PKG_NAME + "ALWAYS: "); + } + // Consider changing this to a longer, less clashing sort of name, in the code + #define msglog std::cout + #define endmsg std::endl + // Nothing to do for stand-alone output; cout is already available. + #define OUTPUT_STREAM +#else + #include "GaudiKernel/ServiceHandle.h" + #include "GaudiKernel/MsgStream.h" + #include "GaudiKernel/IMessageSvc.h" + // Macro OUTPUT_STREAM opens a MsgStream called log; can then write to it. + // Cannot get ServiceHandle directly into the macro; hide it with a typedef... + typedef ServiceHandle<IMessageSvc> SvcHndl; + #define OUTPUT_STREAM SvcHndl msgh("MessageSvc", "GeoModelXml"); MsgStream log(&(*msgh), "GeoModelXml") +#endif + +#endif // OUTPUTDIRECTOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h new file mode 100644 index 0000000000000000000000000000000000000000..59a730ac5861a86125fa867409459fefc1c05931 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Deal with positional indices (layer number etc.) +// +#ifndef GEO_MODEL_XML_POSITIONINDEX_H +#define GEO_MODEL_XML_POSITIONINDEX_H + +/** + * @brief Handle the position index names, formulae, and values + * + * Values are calculated strictly in the order that the index names are given in the xml file. + * This allows the user freedom to choose the order of evaluation, which matters when he is using + * the CNL_n values in her formulae. + */ + +#include <vector> +#include <map> +#include <string> + +class Evaluator; + +class PositionIndex { +public: + PositionIndex(); + ~PositionIndex(); + + int level(); + int incrementLevel(); + int decrementLevel(); + + int copyNo(int level); + int setCopyNo(int copyNo); + + void addIndex(std::string name); + std::string name(int whichOne); + std::string formula(std::string name); + void setFormula(std::string name, std::string formula); + + void indices(std::map<std::string, int> &index, Evaluator &eval); + +private: + int m_level; + std::vector <int> m_copyNo; // Size is always m_level+1 +/** @brief We keep a separate vector of the names as a way of preserving the order of evaluation + */ + std::vector <std::string> m_name; + std::map <std::string, std::string> m_formula; +}; +#endif // POSITIONINDEX_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h new file mode 100644 index 0000000000000000000000000000000000000000..ae15a9b024bb0112a9dfe5ff09542df90f6494fe --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process an element followed by all its children. +// Element processors have to be registered with me so I know who to call. +// Any element tag with no registered processor will be handled by a default handler, which +// does nothing and stops processing of its children. +// +#ifndef GEO_MODEL_XML_PROCESSOR_REGISTRY_H +#define GEO_MODEL_XML_PROCESSOR_REGISTRY_H + +#include <string> +#include <map> + +class ElementProcessor; + +class ProcessorRegistry { +public: + ProcessorRegistry(); + void enregister(const std::string tagName, ElementProcessor *processor); + ElementProcessor *find(const std::string name); + +private: + ElementProcessor *m_defaultProcessor; + std::map<std::string, ElementProcessor *> m_processor; +}; + +#endif // PROCESSOR_REGISTRY_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h new file mode 100644 index 0000000000000000000000000000000000000000..58927237c71bd12a5172c1ffd9284c1009458059 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h @@ -0,0 +1,18 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Class for generating unique id's for sensitive volumes (unique across +// all sensitive detectors in the gmx file, so not unique across ATLAS!) +// Used in LogvolProcessor for GeoModel identifiers. +// Conceptually, the class has a stock of identifiers, and pop() returns the next one, like a stack. +// In fact, the identifiers are the sequence 0, 1, ...; suitable for use as an array index. +// +class SensitiveId { +public: + SensitiveId() {m_id = 0;} + int pop() {return m_id++;} +private: + int m_id; +}; diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h new file mode 100644 index 0000000000000000000000000000000000000000..09dc48d18c59b7578261776e5866f84924e8ff39 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Simple error handler +// +#ifndef GEO_MODEL_XML_STRICT_ERROR_HANDLER_H +#define GEO_MODEL_XML_STRICT_ERROR_HANDLER_H +#include <xercesc/util/XercesDefs.hpp> + +#include <xercesc/dom/DOMErrorHandler.hpp> +#include <xercesc/util/XMLString.hpp> + +class StrictErrorHandler: public xercesc::DOMErrorHandler { + +public: + StrictErrorHandler(); + ~StrictErrorHandler(); + bool getSawErrors() const; + // + // Implementation of the DOM ErrorHandler interface + // + bool handleError(const xercesc::DOMError &domError); + +private : + // + // fSawErrors + // This is set if we get any errors, and is queryable via a getter + // method. It's used by the main code to suppress output if there are + // errors. + // + bool m_SawErrors; +}; + +inline bool StrictErrorHandler::getSawErrors() const { + return m_SawErrors; +} + +#endif //STRICT_ERROR_HANDLER_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..7167379dd05e3b2f2cd38044090161d57a1574a3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_TRANSFORM_PROCESSOR_H +#define GEO_MODEL_XML_TRANSFORM_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> + +// +// Processor for transform tags. +// +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; + +class TransformProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); +}; + +#endif // TRANSFORM_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..3314c90ea9fff64e97be50daa1272a5a729ee735 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H +#define GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H +#include <xercesc/util/XercesDefs.hpp> + +// +// Processor for logvolref tags. +// + +#include "GeoModelXml/ElementProcessor.h" +class GmxUtil; + +class TransformrefProcessor: public ElementProcessor { +public: + void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); +}; + +#endif // TRANSFORMREF_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h new file mode 100644 index 0000000000000000000000000000000000000000..bc7772436d8bc2b82967cd4b747fe7fdba93c7fb --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h @@ -0,0 +1,16 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef CREATEDOMDOCUMENT_H +#define CREATEDOMDOCUMENT_H +#include <xercesc/util/XercesDefs.hpp> +#include <xercesc/dom/DOM.hpp> +#include <xercesc/dom/DOMLSParser.hpp> +#include <iostream> + +using namespace std; +using namespace xercesc; + +DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int flags = 0); + +#endif // CREATEDOMDOCUMENT_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h new file mode 100644 index 0000000000000000000000000000000000000000..7bac7dfa87f5f188905b3dc88479a14ffe3b2968 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef ADDPLANE_H +#define ADDPLANE_H +#include <xercesc/util/XercesDefs.hpp> + +XERCES_CPP_NAMESPACE_BEGIN +class DOMElement; +XERCES_CPP_NAMESPACE_END + +class AddPlane { +public: + AddPlane() {}; + ~AddPlane() {}; + void process(const xercesc::DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane); +}; + + +#endif //ADDPLANE_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h new file mode 100644 index 0000000000000000000000000000000000000000..599abebcec3b07fd648e3a84ad280b2cfacc7c01 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_BOX_H +#define GEO_MODEL_XML_MAKE_BOX_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeBox: public Element2GeoItem { +public: + MakeBox(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_BOX_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h new file mode 100644 index 0000000000000000000000000000000000000000..9283cfc20a0b8ac1d7b1f28e54b71f8cb0fb3329 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_CONS_H +#define GEO_MODEL_XML_MAKE_CONS_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeCons: public Element2GeoItem { +public: + MakeCons(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_CONS_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h new file mode 100644 index 0000000000000000000000000000000000000000..0eed6fe1193ef4c476cef6c33172c37190cb3ecc --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_GENERICTRAP_H +#define GEO_MODEL_XML_MAKE_GENERICTRAP_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeGenericTrap: public Element2GeoItem { +public: + MakeGenericTrap(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_GENERICTRAP_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h new file mode 100644 index 0000000000000000000000000000000000000000..483a11e51fecc2285f66a949de54b0e743282abd --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_INTERSECTION_H +#define GEO_MODEL_XML_MAKE_INTERSECTION_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeIntersection: public Element2GeoItem { +public: + MakeIntersection(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_INTERSECTION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h new file mode 100644 index 0000000000000000000000000000000000000000..b354c986541eff1b35c55c6967c7c313224cd98d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_PARA_H +#define GEO_MODEL_XML_MAKE_PARA_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakePara: public Element2GeoItem { +public: + MakePara(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_PARA_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h new file mode 100644 index 0000000000000000000000000000000000000000..aab86ab53367d9c6921110411baf9def6a9f9067 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_PCON_H +#define GEO_MODEL_XML_MAKE_PCON_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakePcon: public Element2GeoItem { +public: + MakePcon(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_PCON_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h new file mode 100644 index 0000000000000000000000000000000000000000..df9fded68e5f2382b1c0f8018adb8eefcd87996d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_PGON_H +#define GEO_MODEL_XML_MAKE_PGON_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakePgon: public Element2GeoItem { +public: + MakePgon(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_PGON_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h new file mode 100644 index 0000000000000000000000000000000000000000..905e5fe2c131f60890aece05f8f056631d8714be --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_SHAPEREF_H +#define GEO_MODEL_XML_MAKE_SHAPEREF_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeShaperef: public Element2GeoItem { +public: +// MakeShaperef() {}; + const RCBase * process(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_SHAPEREF_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h new file mode 100644 index 0000000000000000000000000000000000000000..5ec995fb3fbc496de16e1970f01e2b6a14977ae4 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ +#include <xercesc/util/XercesDefs.hpp> +// +// Handle simplePolygonBrep shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H +#define GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeSimplePolygonBrep: public Element2GeoItem { +public: + MakeSimplePolygonBrep(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h new file mode 100644 index 0000000000000000000000000000000000000000..5dcd328651f4438b568e0e67d090ebb9645a92d3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_SUBTRACTION_H +#define GEO_MODEL_XML_MAKE_SUBTRACTION_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeSubtraction: public Element2GeoItem { +public: + MakeSubtraction(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_SUBTRACTION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h new file mode 100644 index 0000000000000000000000000000000000000000..3e8794c8c2e9a4ea43b5189b6dd931a4d209fb2a --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_TRAP_H +#define GEO_MODEL_XML_MAKE_TRAP_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTrap: public Element2GeoItem { +public: + MakeTrap(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_TRAP_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h new file mode 100644 index 0000000000000000000000000000000000000000..85ec542afa17852cf85ff6c18ccc06127950c612 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_TRD_H +#define GEO_MODEL_XML_MAKE_TRD_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTrd: public Element2GeoItem { +public: + MakeTrd(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_TRD_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h new file mode 100644 index 0000000000000000000000000000000000000000..8c6f45debeb43709523b3f688e52a84c549687b1 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_TUBE_H +#define GEO_MODEL_XML_MAKE_TUBE_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTube: public Element2GeoItem { +public: + MakeTube(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_TUBE_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h new file mode 100644 index 0000000000000000000000000000000000000000..c414908e5ba65f6e63f3e65dc7fb0c693a59d621 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_TUBS_H +#define GEO_MODEL_XML_MAKE_TUBS_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeTubs: public Element2GeoItem { +public: + MakeTubs(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_TUBS_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h new file mode 100644 index 0000000000000000000000000000000000000000..e1a762fda56697a5488eb60225e8494565761213 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape +// Handle tube shape elements. +// +#ifndef GEO_MODEL_XML_MAKE_UNION_H +#define GEO_MODEL_XML_MAKE_UNION_H +#include <xercesc/util/XercesDefs.hpp> + +#include "GeoModelXml/Element2GeoItem.h" + +class MakeUnion: public Element2GeoItem { +public: + MakeUnion(); + const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const; +}; + +#endif // GEO_MODEL_XML_MAKE_UNION_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd b/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd new file mode 100644 index 0000000000000000000000000000000000000000..8f7ae0c7fb2967da9051c206de57586d8790f70d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd @@ -0,0 +1,252 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- Copyright N.P. Hessey, Nikhef, 2013 --> + +<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)> + <!ATTLIST geomodel name CDATA "Unnamed detector" + version CDATA "0.0" + xmlns CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx"> + + <!ELEMENT defines (var|vector|matrix)+> + + <!ELEMENT var EMPTY> + <!ATTLIST var name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT vector EMPTY> + <!ATTLIST vector name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT matrix EMPTY> + <!ATTLIST matrix name ID #REQUIRED + coldim CDATA #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT materials ((element|chemical|material)+)> + <!ATTLIST materials densitysf CDATA "1.0"> + + <!ELEMENT element EMPTY> + <!ATTLIST element name ID #REQUIRED + shortname NMTOKEN #REQUIRED + Z CDATA #REQUIRED + A CDATA #REQUIRED> + + <!ELEMENT chemical (elemcontent)+> + <!ATTLIST chemical name ID #REQUIRED> + <!ELEMENT elemcontent EMPTY> + <!ATTLIST elemcontent ref IDREF #REQUIRED + quantity CDATA #REQUIRED> + + <!ELEMENT material (elementref|materialref|chemicalref)+> + <!ATTLIST material name ID #REQUIRED + density CDATA #REQUIRED> + + <!ELEMENT elementref EMPTY> + <!ATTLIST elementref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT materialref EMPTY> + <!ATTLIST materialref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT chemicalref EMPTY> + <!ATTLIST chemicalref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT readoutgeometry (param*, sensorclass+)> + <!ELEMENT param EMPTY> + <!ATTLIST param name NMTOKEN #REQUIRED + value CDATA #REQUIRED> + <!ELEMENT sensorclass (param*, sensortype+)> + <!ATTLIST sensorclass name ID #REQUIRED> + <!ELEMENT sensortype (param*)> + <!ATTLIST sensortype name ID #REQUIRED> + + <!ELEMENT positionindex (addindex+)> + <!ELEMENT addindex EMPTY> + <!ATTLIST addindex name ID #REQUIRED> + + <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union|simplepolygonbrep)+)> + <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case --> + + <!ELEMENT simplepolygonbrep EMPTY> + <!ATTLIST simplepolygonbrep name ID #REQUIRED + xpoints CDATA #REQUIRED + ypoints CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT box EMPTY> + <!ATTLIST box name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT cons EMPTY> + <!ATTLIST cons name ID #REQUIRED + rmin1 CDATA #REQUIRED + rmin2 CDATA #REQUIRED + rmax1 CDATA #REQUIRED + rmax2 CDATA #REQUIRED + dz CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT generictrap EMPTY> + <!ATTLIST generictrap name ID #REQUIRED + x0 CDATA #REQUIRED + y0 CDATA #REQUIRED + x1 CDATA #REQUIRED + y1 CDATA #REQUIRED + x2 CDATA #REQUIRED + y2 CDATA #REQUIRED + x3 CDATA #REQUIRED + y3 CDATA #REQUIRED + x4 CDATA #REQUIRED + y4 CDATA #REQUIRED + x5 CDATA #REQUIRED + y5 CDATA #REQUIRED + x6 CDATA #REQUIRED + y6 CDATA #REQUIRED + x7 CDATA #REQUIRED + y7 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT para EMPTY> + <!ATTLIST para name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED + alpha CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED> + + <!ELEMENT pcon (addplane, addplane+)> + <!ELEMENT addplane EMPTY> + <!ATTLIST addplane zplane CDATA #REQUIRED + rminplane CDATA #REQUIRED + rmaxplane CDATA #REQUIRED> + + <!ATTLIST pcon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT pgon (addplane, addplane+)> + <!ATTLIST pgon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED + nsides CDATA #REQUIRED> + + <!ELEMENT trap EMPTY> + <!ATTLIST trap name ID #REQUIRED + zhalflength CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED + dydzn CDATA #REQUIRED + dxdyndzn CDATA #REQUIRED + dxdypdzn CDATA #REQUIRED + angleydzn CDATA #REQUIRED + dydzp CDATA #REQUIRED + dxdyndzp CDATA #REQUIRED + dxdypdzp CDATA #REQUIRED + angleydzp CDATA #REQUIRED> + + <!ELEMENT tube EMPTY> + <!ATTLIST tube name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT tubs EMPTY> + <!ATTLIST tubs name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT trd EMPTY> + <!ATTLIST trd name ID #REQUIRED + xhalflength1 CDATA #REQUIRED + xhalflength2 CDATA #REQUIRED + yhalflength1 CDATA #REQUIRED + yhalflength2 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST intersection name ID #REQUIRED> + + <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST subtraction name ID #REQUIRED> + + <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST union name ID #REQUIRED> + + <!ELEMENT shaperef EMPTY> + <!ATTLIST shaperef ref IDREF #REQUIRED> + + <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))> + <!ATTLIST transform name ID #IMPLIED + alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number --> + + <!ELEMENT transformation (scaling|rotation|translation)+> + + <!ELEMENT scaling EMPTY> + <!ATTLIST scaling x CDATA "1.0" + y CDATA "1.0" + z CDATA "1.0"> + + <!ELEMENT rotation EMPTY> + <!ATTLIST rotation xcos CDATA "0.0" + ycos CDATA "0.0" + zcos CDATA "0.0" + angle CDATA "0.0"> + + <!ELEMENT translation EMPTY> + <!ATTLIST translation x CDATA "0.0" + y CDATA "0.0" + z CDATA "0.0"> + + <!ATTLIST transformation name ID #REQUIRED> + <!ATTLIST transformation alignable (true|false) "false"> + + <!ELEMENT transformationref EMPTY> + <!ATTLIST transformationref ref IDREF #REQUIRED> + + <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*> + <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme --> + <!ATTLIST logvol name ID #REQUIRED + shape IDREF #REQUIRED + material IDREF #REQUIRED + sensitive IDREF #IMPLIED + alignable (true|false) "false" + splitLevel CDATA #IMPLIED> + + <!ELEMENT index EMPTY> + <!ATTLIST index ref IDREF #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT logvolref EMPTY> + <!ATTLIST logvolref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+> + <!ATTLIST assembly name ID #REQUIRED + alignable (true|false) "false"> + + <!ELEMENT assemblyref EMPTY> + <!ATTLIST assemblyref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))> + <!-- Removed logvol and assembly from multicopy content. There is no particular reason + why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding + the index stuff. If you need them, put them back. Got rid of transformref; never used. --> + <!-- loopvar: Set to a vector variable name or omit; see manual --> + <!-- alignable: Value is the alignment level-number --> + <!ATTLIST multicopy name ID #REQUIRED + n CDATA #REQUIRED + loopvar CDATA #IMPLIED + alignable CDATA #IMPLIED> + <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice --> + + <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+> + diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt b/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c474f1ea857484524cd598bb8b1093a6d077c8ce --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt @@ -0,0 +1,31 @@ +################################################################################ +# Package: GeoModelXml +################################################################################ + +# Declare the package name: +atlas_subdir( GeoModelXml ) + +# Declare the package's dependencies: +atlas_depends_on_subdirs( PUBLIC + AtlasPolicy + DetectorDescription/GeoModel/GeoModelKernel + PRIVATE + Control/StoreGate + DetectorDescription/GeoModel/GeoModelInterfaces + GaudiKernel ) + +# External dependencies: +find_package( CLHEP ) +find_package( XercesC ) +find_package( ZLIB ) + +# Component(s) in the package: +atlas_add_library( GeoModelXml + src/*.cxx + PUBLIC_HEADERS GeoModelXml + INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} + DEFINITIONS ${CLHEP_DEFINITIONS} + LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} ${ZLIB_LIBRARIES} GeoModelKernel StoreGateLib SGtests + PRIVATE_LINK_LIBRARIES GaudiKernel ) + +atlas_install_runtime( data/*.dtd ) diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx new file mode 100644 index 0000000000000000000000000000000000000000..77eb535070d9fb9f9adc151ac4c6dba28951928a --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx @@ -0,0 +1,26 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/shape/AddPlane.h" +#include <string> +#include <sstream> + +#include <xercesc/dom/DOM.hpp> +#include "xercesc/util/XMLString.hpp" + +using namespace xercesc; + +void AddPlane::process(const xercesc::DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane) { + + XMLCh * zplane_tmp = XMLString::transcode("zplane"); + std::istringstream(XMLString::transcode(element->getAttribute(zplane_tmp))) >> zPlane; + XMLCh * rminplane_tmp = XMLString::transcode("rminplane"); + std::istringstream(XMLString::transcode(element->getAttribute(rminplane_tmp))) >> rMinPlane; + XMLCh * rmaxplane_tmp = XMLString::transcode("rmaxplane"); + std::istringstream(XMLString::transcode(element->getAttribute(rmaxplane_tmp))) >> rMaxPlane; + XMLString::release(&zplane_tmp); + XMLString::release(&rminplane_tmp); + XMLString::release(&rmaxplane_tmp); + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..8a74efb97e724fbc4aa1bbd153487fb506bfb526 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx @@ -0,0 +1,32 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Processor for addbranch elements +// +// Process children and get list of things to be added to the tree. +// +#include "GeoModelXml/AddbranchProcessor.h" +#include <map> + +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/ProcessorRegistry.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace std; +using namespace xercesc; + +void AddbranchProcessor::process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { + + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + char *name2release = XMLString::transcode(child->getNodeName()); + string name(name2release); + XMLString::release(&name2release); + gmxUtil.processorRegistry.find(name)->process(dynamic_cast<const DOMElement *>(child), gmxUtil, toAdd); + } + } +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..2ee8ec511fe3cb326e65d9a1a7ed1d50a3c30df9 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx @@ -0,0 +1,121 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Processor for assembly elements +// +// Add name to list. +// Create a physvol using special logvol GmxUtil.getAssemblyLV() add it to list. +// ...by using material "special::ether" Geo2G4 turns this into a G4Assembly +// Process children and get list of things to be added to the physvol. +// Add them to the physvol. +// +#include "GeoModelXml/AssemblyProcessor.h" + +#include <map> + +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GeoNodeList.h" +#include "xercesc/util/XMLString.hpp" + +// using namespace CLHEP; + +using namespace std; +using namespace xercesc; + +void AssemblyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +GeoLogVol *lv; +GeoNameTag *physVolName; + + gmxUtil.positionIndex.incrementLevel(); + + XMLCh * name_tmp = XMLString::transcode("name"); + char *name2release = XMLString::transcode(element->getAttribute(name_tmp)); + string name(name2release); + XMLString::release(&name2release); + XMLString::release(&name_tmp); +// +// Look for the assembly in the map; if not yet there, add it +// + map<string, AssemblyStore>::iterator entry; + if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item +// +// Name +// + m_map[name] = AssemblyStore(); + AssemblyStore *store = &m_map[name]; + physVolName = new GeoNameTag(name); + store->name = physVolName; + store->id = 0; + } + else { // Already in the registry; use it. + physVolName = entry->second.name; + } + lv = gmxUtil.getAssemblyLV(); + toAdd.push_back(physVolName); + gmxUtil.positionIndex.setCopyNo(m_map[name].id); + toAdd.push_back(new GeoIdentifierTag(m_map[name].id++)); +// +// Process the assembly's children +// + GeoNodeList childrenAdd; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + DOMElement *el = dynamic_cast<DOMElement *> (child); + name2release = XMLString::transcode(el->getNodeName()); + string name(name2release); + XMLString::release(&name2release); + gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd); + } + } +// +// Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add +// + XMLCh * alignable_tmp = XMLString::transcode("alignable"); + char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp)); + string alignable(toRelease); + XMLString::release(&toRelease); + XMLString::release(&alignable_tmp); + if (alignable.compare(string("true")) == 0) { + GeoFullPhysVol *pv = new GeoFullPhysVol(lv); + for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { + pv->add(*node); + } + toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2]. + } + else { + GeoPhysVol *pv = new GeoPhysVol(lv); + for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { + pv->add(*node); + } + toAdd.push_back(pv); + } + + gmxUtil.positionIndex.decrementLevel(); + + return; +} + +void AssemblyProcessor::zeroId(const xercesc::DOMElement *element) { + + XMLCh * name_tmp = XMLString::transcode("name"); + char *name2release = XMLString::transcode(element->getAttribute(name_tmp)); + string name(name2release); + XMLString::release(&name2release); + XMLString::release(&name_tmp); +// +// Look for the assembly in the map; if not yet there, add it +// + map<string, AssemblyStore>::iterator entry; + if ((entry = m_map.find(name)) != m_map.end()) { + entry->second.id = 0; + } +/* else ... Not an error: it is usually just about to be made with id = 0; no action needed. */ +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..185a6b2e7ad536ff63f4cd0b0f2e694013f726a6 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx @@ -0,0 +1,56 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process assemblyref items: basically, just find the referenced assembly and call its processor. +// +#include "GeoModelXml/OutputDirector.h" +#include "GeoModelXml/AssemblyrefProcessor.h" +#include <string> + +#include "xercesc/util/XercesDefs.hpp" +#include <xercesc/dom/DOM.hpp> +#include "xercesc/util/XMLString.hpp" + +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GeoNodeList.h" + +using namespace std; +using namespace xercesc; + +void AssemblyrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +XMLCh *ref = XMLString::transcode("ref"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); +char *toRelease; +// +// Get the referenced element +// + idref = element->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); +// +// Check it is the right sort +// + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("assembly")) { + OUTPUT_STREAM; + msglog << MSG::FATAL << "Error in xml/gmx file: assemblyref " << XMLString::transcode(idref) << " referenced a " << + nodeName << " instead of an assembly.\n"; + exit(999); // Should do better... + } +// +// Process it +// + XMLCh * zeroid_tmp = XMLString::transcode("zeroid"); + const XMLCh *zeroid = element->getAttribute(zeroid_tmp); + if (XMLString::equals(zeroid, XMLString::transcode("true"))) { + gmxUtil.tagHandler.assembly.zeroId(elem); + } + gmxUtil.tagHandler.assembly.process(elem, gmxUtil, toAdd); + XMLString::release(&ref); + XMLString::release(&zeroid_tmp); + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a780a0d743288f0132b5d8e82066f4388aa98018 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx @@ -0,0 +1,56 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#include <string> + +#include "GeoModelXml/Element2GeoItem.h" +#include "GeoModelXml/OutputDirector.h" + +#include "xercesc/util/XercesDefs.hpp" +#include <xercesc/dom/DOM.hpp> +#include "xercesc/util/XMLString.hpp" + +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelKernel/RCBase.h" + +using namespace std; +using namespace xercesc; + +Element2GeoItem::Element2GeoItem() {} + +Element2GeoItem::~Element2GeoItem() {} + +const RCBase * Element2GeoItem::process(const xercesc::DOMElement *element, GmxUtil &gmxUtil) { + + char *name2release; + XMLCh * name_tmp = XMLString::transcode("name"); + + name2release = XMLString::transcode(element->getAttribute(name_tmp)); + string name(name2release); + XMLString::release(&name2release); + XMLString::release(&name_tmp); + + const RCBase *item; + map<string, const RCBase *>::iterator entry; + if (name == "") { // Unnamed item; cannot store in the map; make a new one + item = make(element, gmxUtil); + } + else if ((entry = m_map.find(name)) == m_map.end()) { // Not in; make a new one + item = make(element, gmxUtil); + m_map[name] = item; // And put it in the map + } + else { // Get it from the map + item = entry->second; + } + + return item; +} + +const RCBase * Element2GeoItem::make(const xercesc::DOMElement *element, GmxUtil & /* gmxUtil */) const { + char *name2release = XMLString::transcode(element->getNodeName()); + OUTPUT_STREAM; + msglog << MSG::FATAL << "Oh oh: called base class make() method of Element2GeoType object; tag " << name2release << endmsg; + XMLString::release(&name2release); + + exit(999); // Should improve on this +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ab6dab041e19e8f5a7c3785361ba2078be44309e --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx @@ -0,0 +1,24 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/Element2GeoItemRegistry.h" +#include "GeoModelXml/Element2GeoItem.h" + +Element2GeoItemRegistry::Element2GeoItemRegistry() { + m_defaultProcessor = new Element2GeoItem; +} + +Element2GeoItemRegistry::~Element2GeoItemRegistry() { + delete m_defaultProcessor; +} + +void Element2GeoItemRegistry::enregister(const std::string tagName, Element2GeoItem *processor) { + m_processor[tagName] = processor; +} + +Element2GeoItem * Element2GeoItemRegistry::find(const std::string name) { + std::map<std::string, Element2GeoItem *>::iterator it = m_processor.find(name); + + return it == m_processor.end()? m_defaultProcessor: it->second; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..881d970b72abb843752a59b6d97b91cc6350be01 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx @@ -0,0 +1,41 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Example element processor. This is useful for debugging etc: it helps +// get all elements processed, just printing out their name. Including +// children of referenced tags. Can be used for example as the default element +// processor in the processor registry. +// +// Parameters: +// The element to be processed; +// The GmxUtil for access to the Evaluator etc. +// A vector of *GeoGraphNode to add things to that need to be added to the GeoModel tree +// +// +#include "GeoModelXml/ElementProcessor.h" + +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include "xercesc/util/XercesDefs.hpp" +#include <xercesc/dom/DOM.hpp> + + +#include "GeoModelXml/GeoNodeList.h" +#include "GeoModelXml/ProcessorRegistry.h" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +ElementProcessor::ElementProcessor() {} + +void ElementProcessor::process(const DOMElement *element, GmxUtil & /* gmxUtil*/, GeoNodeList & /* toAdd */) { + + char *name2release = XMLString::transcode(element->getNodeName()); + std::string name(name2release); + XMLString::release(&name2release); + + OUTPUT_STREAM; + msglog << MSG::FATAL << "Error!!! Default element processor called for tag-name " << name << endmsg; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx new file mode 100644 index 0000000000000000000000000000000000000000..4315458a0306ee81b957285078293bfe8ba6c30c --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx @@ -0,0 +1,346 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/Gmx2Geo.h" +#include "GeoModelXml/OutputDirector.h" + +#include <string> +#include <iomanip> +#include <sstream> +#include <stdlib.h> + +#include <xercesc/util/XercesDefs.hpp> +#include <xercesc/dom/DOM.hpp> +#include <xercesc/dom/DOMLSParser.hpp> +#include <xercesc/util/PlatformUtils.hpp> + +#include "GeoModelKernel/GeoPhysVol.h" + +#include "ExpressionEvaluator/Evaluator.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GeoNodeList.h" +#include "GeoModelXml/ElementProcessor.h" +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GmxInterface.h" +#include "GeoModelXml/createdomdocument.h" + +using namespace std; + +Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInterface, unsigned int flags) { +// +// Create the xml tree (DOMDocument) +// + +// Logging: ref https://wiki.bnl.gov/dayabay/index.php?title=Logging +// Turn on logging in job-options with: MessageSvc.setDebug += {"GeoModelXml"} + OUTPUT_STREAM; + + DOMLSParser *parser = 0; + DOMDocument *doc = createDOMDocument(xmlFile, parser, flags); + if (!doc) {// Parsed badly + XMLPlatformUtils::Terminate(); + msglog << MSG::FATAL << "Error in xml file " << xmlFile << ". Exiting athena." << endmsg; + exit(0); + } +// +// Set up the CLHEP evaluator and the xml-tag processors, and store the GmxInterface: +// + GmxUtil gmxUtil(gmxInterface); +// +// Process the xml tree, creating all the GeoModel items and adding to the GeoModel tree. +// + const DOMElement *root = doc->getDocumentElement(); +// +// info message: name of detector +// + if (flags & 0x1) { + msglog << MSG::INFO << "Set up detector geometry from db-string \nwhich adds sub-detector "; + } + else { + msglog << MSG::INFO << "Set up detector geometry from file " << xmlFile << " which adds sub-detector "; + } + const DOMElement *element = dynamic_cast<const DOMElement*>(root); + XMLCh * name_tmp = XMLString::transcode("name"); + const XMLCh *attribute = element->getAttribute(name_tmp); + msglog << XMLString::transcode(attribute) << endmsg; +// +// Add all constant definitions to the evaluator, so they are ready if needed. +// + doDefines(doc, gmxUtil.eval); +// +// Set up all sensitive detector types (readout geometry) +// + doReadoutGeometry(doc, gmxUtil); +// +// Add all index names +// + doPositionIndex(doc, gmxUtil); +// +// The xml file ends with an addbranch element. We start there, process it, +// and it fills in the list of things to be added to the GeoModel graph. +// There is one and only one addbranch element according to the DTD. +// + XMLCh * addbranch_tmp = XMLString::transcode("addbranch"); + xercesc::DOMNodeList *addbranchs = doc->getElementsByTagName(addbranch_tmp); + const DOMElement *addbranch = dynamic_cast<const DOMElement *> (addbranchs->item(0)); + GeoNodeList toAdd; + gmxUtil.processorRegistry.find("addbranch")->process(addbranch, gmxUtil, toAdd); + for (GeoNodeList::iterator node = toAdd.begin(); node != toAdd.end(); ++node) { + addHere->add(*node); + } + + XMLString::release(&name_tmp); + XMLString::release(&addbranch_tmp); + XMLPlatformUtils::Terminate(); +} + +int Gmx2Geo::doDefines(DOMDocument *doc, Evaluator &eval) { +// +// Add all defines to the CLHEP::Evaluator +// +// +// It is better to store the evaluated number, not the expression +// 1: it avoids the parenthesis problem sum = a + b; 2 * sum != 2(a + b) +// 2: it finds undefined constants sooner (helps debugging) +// 3: anyway, everything is a constant so we might as well +// ...This means we need everything already defined before it is introduced +// ...Which means we must do matrices and vectors (which are only numbers) before vars. +// in case the user uses a vector-element when defining a var element +// + +const DOMElement *element; +// +//------------------------------------------------------------------------------------------- +// +// Turn var printout on and off with message level + OUTPUT_STREAM; + msglog << MSG::DEBUG << "\n\nGmx2Geo GmxUtil matrix, vector and var values:\n"; + msglog << MSG::DEBUG << "==============================================\n\n"; + + XMLCh * defines_tmp = XMLString::transcode("defines"); + XMLCh * vector_tmp = XMLString::transcode("vector"); + XMLCh * name_tmp = XMLString::transcode("name"); + XMLCh * value_tmp = XMLString::transcode("value"); + XMLCh * var_tmp = XMLString::transcode("var"); + XMLCh * matrix_tmp = XMLString::transcode("matrix"); + XMLCh * coldim_tmp = XMLString::transcode("coldim"); + + DOMNodeList *defines = doc->getElementsByTagName(defines_tmp); + int nDefines = defines->getLength(); + for (int i = 0; i < nDefines; ++i) { + element = dynamic_cast<DOMElement *>(defines->item(i)); + DOMNodeList *vars; + DOMElement *var; + int nVars; +// +// Vectors: a list of variables. Names subscripted by _k; values white-space separated numbers. +// + msglog << "\n\n Vectors\n =======\n\n"; + + vars = element->getElementsByTagName(vector_tmp); + nVars = vars->getLength(); + for (int j = 0; j < nVars; ++j) { + var = dynamic_cast<DOMElement*>(vars->item(j)); + char *name = XMLString::transcode(var->getAttribute(name_tmp)); + char *val = XMLString::transcode(var->getAttribute(value_tmp)); + string fullname(name); + fullname += '_'; + istringstream list(val); + double dble; + int k = 0; + do { + list >> dble; + msglog << fullname + to_string(k) << " = " << dble << endl; + eval.setVariable((fullname + to_string(k++)).c_str(), dble); + } while(list.good()); + XMLString::release(&name); + XMLString::release(&val); + } +// +// Matrices: a matrix of variables. Names subscripted by _j_k; values: white-space separated numbers. +// + msglog << "\n\n Matrices\n ========\n\n"; + + vars = element->getElementsByTagName(matrix_tmp); + nVars = vars->getLength(); + for (int j = 0; j < nVars; ++j) { + var = dynamic_cast<DOMElement*>(vars->item(j)); + char *name = XMLString::transcode(var->getAttribute(name_tmp)); + char *val = XMLString::transcode(var->getAttribute(value_tmp)); + int coldim; + istringstream(XMLString::transcode(var->getAttribute(coldim_tmp))) >> coldim; + string fullname(name); + fullname += '_'; + istringstream list(val); + double dble; + int k = 0; + do { + for (int col = 0; col < coldim; ++col) { + list >> dble; + msglog << fullname + to_string(k) + '_' + to_string(col) << " = " << dble << endl; + eval.setVariable((fullname + to_string(k) + '_' + to_string(col)).c_str(), dble); + if (!list.good()) break; + } + k++; + } while(list.good()); + XMLString::release(&name); + XMLString::release(&val); + } +// +// Vars: single variable +// + msglog << "\n\n Single variables\n ================\n\n"; + + vars = element->getElementsByTagName(var_tmp); + nVars = vars->getLength(); + for (int j = 0; j < nVars; ++j) { + var = dynamic_cast<DOMElement*>(vars->item(j)); + char *name = XMLString::transcode(var->getAttribute(name_tmp)); + char *val = XMLString::transcode(var->getAttribute(value_tmp)); + double evaluated = eval.evaluate(val); + if (eval.status() != Evaluator::OK) { + msglog << MSG::FATAL << "GeoModelXml Error processing CLHEP Evaluator expression. Error name " << + eval.error_name() << endl << "Message: "; + eval.print_error(); + msglog << val << endl; + msglog << string(eval.error_position(), '-') << '^' << '\n'; + msglog << "Exiting program." << endmsg; + exit(999); // Should do better... + } + eval.setVariable(name, evaluated); + msglog << name << "\t\t" << val << " = " << setprecision(10) << evaluated << endl; + XMLString::release(&name); + XMLString::release(&val); + } + } + + XMLString::release(&defines_tmp); + XMLString::release(&vector_tmp); + XMLString::release(&name_tmp); + XMLString::release(&value_tmp); + XMLString::release(&var_tmp); + XMLString::release(&matrix_tmp); + XMLString::release(&coldim_tmp); + + msglog << endmsg; + return 1; +} + +int Gmx2Geo::doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil) { + XMLCh * positionindex_tmp = XMLString::transcode("positionindex"); + XMLCh * addindex_tmp = XMLString::transcode("addindex"); + XMLCh * name_tmp = XMLString::transcode("name"); + + DOMNodeList *posIndex = doc->getElementsByTagName(positionindex_tmp); + int nPosIndex = posIndex->getLength(); // Probably limited to 0 or 1 by DTD + for (int i = 0; i < nPosIndex; ++i) { + const DOMElement *element = dynamic_cast<DOMElement *>(posIndex->item(i)); + DOMNodeList *addindexs = element->getElementsByTagName(addindex_tmp); + int nIndexs = addindexs->getLength(); + for (int j = 0; j < nIndexs; ++j) { + DOMElement *addindex = dynamic_cast<DOMElement*>(addindexs->item(j)); + string name = string(XMLString::transcode(addindex->getAttribute(name_tmp))); + gmxUtil.positionIndex.addIndex(name); + } + } + XMLString::release(&positionindex_tmp); + XMLString::release(&addindex_tmp); + XMLString::release(&name_tmp); + return 1; +} + +int Gmx2Geo::doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil) { +// +// We keep three parameter lists (each is a map of (parameter name, parameter value)), one at each +// level (readoutgeometry, sensorclass, sensortype). Currently just created new, copying previous one into +// it. In this way the sensortype parameter list has all parameters in it. Not efficient, but the list is always short? +// +char *name2release; +string tagName; +// +// Loop over all readoutgeometry elements +// + +XMLCh * readoutgeometry_tmp = XMLString::transcode("readoutgeometry"); +XMLCh * name_tmp = XMLString::transcode("name"); + +DOMNodeList *rgs = doc->getElementsByTagName(readoutgeometry_tmp); + int nRG = rgs->getLength(); + for (int i = 0; i < nRG; ++i) { + map<string, string> rgParams; // New empty list + const DOMElement *rg = dynamic_cast<DOMElement *>(rgs->item(i)); +// +// Loop over readoutgeometry children +// + for (DOMNode *rgChild = rg->getFirstChild(); rgChild != 0; rgChild = rgChild->getNextSibling()) { + if (rgChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data + name2release = XMLString::transcode(rgChild->getNodeName()); + tagName = name2release; + XMLString::release(&name2release); + if (tagName == "param") { + addParam(rgChild, rgParams); + } + else if (tagName == "sensorclass") { + map<string, string> scParams(rgParams); // Initialised with all previous params + const DOMElement *sensorClass = dynamic_cast<DOMElement *>(rgChild); + name2release = XMLString::transcode(sensorClass->getAttribute(name_tmp)); + string clas(name2release); // class is reserved word + XMLString::release(&name2release); +// +// Loop over sensorclass children +// + for (DOMNode *scChild = sensorClass->getFirstChild(); scChild != 0; scChild = scChild->getNextSibling()) { + if (scChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data + name2release = XMLString::transcode(scChild->getNodeName()); + tagName = name2release; + XMLString::release(&name2release); + if (tagName == "param") { + addParam(scChild, scParams); + } + else if (tagName == "sensortype") { + map<string, string> stParams(scParams); // Initialised with all previous params + const DOMElement *sensorType = dynamic_cast<DOMElement *>(scChild); + name2release = XMLString::transcode(sensorType->getAttribute(XMLString::transcode("name"))); + string name(name2release); + XMLString::release(&name2release); +// +// Loop over sensortype parameters +// + for (DOMNode *stChild = scChild->getFirstChild(); stChild != 0; stChild = stChild->getNextSibling()) { + if (stChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data + addParam(stChild, stParams); + } +// +// Call the user's call back routine to add this sensor type with its specific parameters +// + gmxUtil.gmxInterface()->addSensorType(clas, name, stParams); + } + } + } + } + } + + XMLString::release(&readoutgeometry_tmp); + XMLString::release(&name_tmp); + + return 1; +} + +void Gmx2Geo::addParam(DOMNode *node, map<string, string> ¶ms) { + XMLCh * name_tmp = XMLString::transcode("name"); + XMLCh * value_tmp = XMLString::transcode("value_tmp"); + + const DOMElement *param = dynamic_cast<DOMElement *>(node); + char *name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("name"))); + string name(name2release); + XMLString::release(&name2release); + name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("value"))); + string value(name2release); + XMLString::release(&name2release); + params[name] = value; + + XMLString::release(&name_tmp); + XMLString::release(&value_tmp); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx new file mode 100644 index 0000000000000000000000000000000000000000..bd3d222c99946cdea2b9b5712ad824fd3f26e7b1 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx @@ -0,0 +1,87 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Implement default GmxInterface, which just prints debug messages. +// User should over-ride all three methods. +// Use: create an instance of this, and pass a reference to it in the Gmx2Geo constructor. +// +#include "GeoModelXml/GmxInterface.h" +#include "GeoModelXml/OutputDirector.h" +#include "GeoModelKernel/GeoPVConstLink.h" +#include "GeoModelKernel/Query.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" +using namespace std; + +int GmxInterface::sensorId(map<string, int> &/*index*/) const { + static int sequentialId; + return sequentialId++; +} + +int GmxInterface::splitSensorId(map<string, int> &/*index*/, std::pair<std::string, int> &/*extraIndex*/, map<string, int> &/*updatedIndex*/) const { + static int sequentialId; + return sequentialId++; +} + +void GmxInterface::addSensorType(string clas, string type, map<string, string> params) { + OUTPUT_STREAM; + + msglog << MSG::DEBUG << "GmxInterface::addSensorType called for class " << clas << "; type " << type << + "\n Parameter names and values:\n"; + for (map<string, string>::iterator p = params.begin(); p != params.end(); ++p) { + msglog << " " << p->first << " = " << p->second << endmsg; + } +} + +void GmxInterface::addSensor(string name, map<string, int> &index, int sequentialId, GeoVFullPhysVol *fpv) { + OUTPUT_STREAM; + + msglog << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << + ". Indices: "; + for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) { + msglog << i->second << " "; + } + msglog << "\nSequential ID = " << sequentialId << endmsg; +} + +void GmxInterface::addSplitSensor(string name, map<string, int> &index, std::pair<std::string, int> &extraIndex, int sequentialId, GeoVFullPhysVol *fpv) { + OUTPUT_STREAM; + + msglog << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << + ". Indices: "; + for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) { + msglog << i->second << " "; + } + msglog << "\n and additional Indices " << extraIndex.first << " : "<< + extraIndex.second; + msglog << "\nSequential ID = " << sequentialId << endmsg; +} + +void GmxInterface::addAlignable(int level, map<std::string, int> &index, GeoVFullPhysVol *fpv, + GeoAlignableTransform */*transform*/) { +// +// Logvol name is not very useful (usually == AssemblyLV). Get PhysVol name (seems surprisingly awkward way needed) +// + OUTPUT_STREAM; +/* Cannot get this to work. + string name("New name"); + GeoPVConstLink parent = fpv->getParent(); + Query<unsigned int> cIndex = parent->indexOf(fpv); + if (cIndex.isValid()) { + name = parent->getNameOfChildVol(cIndex); + } + else { + name = string("Something Wrong, fullPV not found in parent in GmxInterface::addAlignable"); + } + msglog << MSG::DEBUG << "GmxInterface::addAlignable called for physvol name " << name << ". Level = " << level << ". Indices: "; +*/ + + msglog << MSG::DEBUG << "GmxInterface::addAlignable called for a physvol. Logvol name " << fpv->getLogVol()->getName() << + ". Level = " << level << ". Indices: "; + for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) { + msglog << i->second << " "; + } + msglog << endmsg; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ca4fc7166f9a8357ebc0c17968bf83043659cbcc --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx @@ -0,0 +1,196 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/GmxUtil.h" + +#include "GeoModelXml/OutputDirector.h" + +#ifndef STANDALONE_GMX +#include "StoreGate/StoreGateSvc.h" +#include "GeoModelInterfaces/StoredMaterialManager.h" +#endif + +#include "GeoModelKernel/GeoElement.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "GeoModelKernel/GeoBox.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelXml/GmxInterface.h" + +#include <cstdlib> +#include <sstream> +#include <cctype> +#include <limits> + +using namespace std; + +GmxUtil::GmxUtil(GmxInterface &gmxInterface) { + m_gmxInterface = &gmxInterface; +// +// Initialise the CLHEP::Evaluator +// + eval.setStdMath(); +// +// Fetch the material special::HyperUranium and make any shape with it to make a special logvol. +// When Geo2G4 finds any physvol using a logvol with material special::HyperUranium, it creates a G4Assembly +// instead of a G4Volume. +// + m_assemblyLV = makeAssemblyLV(); +// +// Register tag handlers that produce a vector of items to add to the tree. +// + processorRegistry.enregister("addbranch", &tagHandler.addbranch); + processorRegistry.enregister("logvol", &tagHandler.logvol); + processorRegistry.enregister("logvolref", &tagHandler.logvolref); + processorRegistry.enregister("assembly", &tagHandler.assembly); + processorRegistry.enregister("assemblyref", &tagHandler.assemblyref); + processorRegistry.enregister("transform", &tagHandler.transform); + processorRegistry.enregister("multicopy", &tagHandler.multicopy); + processorRegistry.enregister("index", &tagHandler.index); +// +// Register tag handlers that produce GeoNodes. Only useful for those tags which +// can appear in a long list in any order. So certainly all shapes; maybe others. +// + geoItemRegistry.enregister("simplepolygonbrep", (Element2GeoItem *) &tagHandler.simplepolygonbrep); + geoItemRegistry.enregister("box", (Element2GeoItem *) &tagHandler.box); + geoItemRegistry.enregister("cons", (Element2GeoItem *) &tagHandler.cons); + geoItemRegistry.enregister("generictrap", (Element2GeoItem *) &tagHandler.generictrap); + geoItemRegistry.enregister("para", (Element2GeoItem *) &tagHandler.para); + geoItemRegistry.enregister("pcon", (Element2GeoItem *) &tagHandler.pcon); + geoItemRegistry.enregister("pgon", (Element2GeoItem *) &tagHandler.pgon); + geoItemRegistry.enregister("trap", (Element2GeoItem *) &tagHandler.trap); + geoItemRegistry.enregister("trd", (Element2GeoItem *) &tagHandler.trd); + geoItemRegistry.enregister("tube", (Element2GeoItem *) &tagHandler.tube); + geoItemRegistry.enregister("tubs", (Element2GeoItem *) &tagHandler.tubs); + geoItemRegistry.enregister("intersection", (Element2GeoItem *) &tagHandler.intersection); + geoItemRegistry.enregister("union", (Element2GeoItem *) &tagHandler.onion); // union is reserved + geoItemRegistry.enregister("subtraction", (Element2GeoItem *) &tagHandler.subtraction); + geoItemRegistry.enregister("shaperef", (Element2GeoItem *) &tagHandler.shaperef); + geoItemRegistry.enregister("transformation", (Element2GeoItem *) &tagHandler.transformation); + geoItemRegistry.enregister("transformationref", (Element2GeoItem *) &tagHandler.transformationref); +} + +GmxUtil::~GmxUtil() { +} + +GmxInterface * GmxUtil::gmxInterface() { + return m_gmxInterface; +} + +double GmxUtil::evaluate(char const *expression) { + static string lastGoodExpression("none"); // It is helpful for debugging to get some idea of where we had got to... + string strExpression(expression); + + bool isWhiteSpace = true; + for(unsigned int i = 0; i < strExpression.length(); ++i){ + if(!std::isspace(strExpression[i])) { + isWhiteSpace = false; + break; + } + } + if (isWhiteSpace) { // Catch a common error early and give best message possible +#ifndef STANDALONE_GMX + OUTPUT_STREAM; + msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression: empty expression. Exiting program.\n" << + endmsg; +#endif + throw runtime_error(string("evaluate: empty or white space expression. Last good expression was " + lastGoodExpression)); + + } +// +// Process any []s. Contents are evaluated to in integer, then the [...] are replaced by +// string representation of that integer. Idea from Joakim Gradin. Re-coded by Nigel. +// Allows array elements to be accessed as array_[col-expression]_[row-expression]. +// + string noBrackets = debracket(strExpression); +// +// And evaluate the result +// + double result = eval.evaluate(noBrackets.c_str()); +#ifndef STANDALONE_GMX + if (eval.status() != HepTool::Evaluator::OK) { +#else + if (eval.status() != Evaluator::OK) { +#endif +#ifndef STANDALONE_GMX + OUTPUT_STREAM; + msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" << + eval.error_name() << ">" << endl << "Message: <"; + eval.print_error(); + msglog << ">. Original expression <" << expression << ">; Expression after de-bracketing:\n"; + msglog << noBrackets << endl; + msglog << string(eval.error_position(), '-') << '^' << '\n'; + msglog << "Exiting program.\n" << endmsg; +#endif + throw runtime_error(string("evaluate: invalid expression. Last good expression was <" + lastGoodExpression + ">")); + } + lastGoodExpression = strExpression; + return result; +} + +std::string GmxUtil::debracket(std::string expression) { +// +// Get the last brackets contents and evaluate it +// + size_t lastOpen = expression.find_last_of('['); + if (lastOpen == string::npos) { // None found + return expression; // Done + } + size_t nextClose = expression.find_first_of(']', lastOpen); + if (nextClose == string::npos) { +#ifndef STANDALONE_GMX + OUTPUT_STREAM; + msglog << MSG::ERROR << "debracket: unpaired opening [; expression was:\n " << expression << endmsg; +#endif + return expression; + } + string toEvaluate = expression.substr(lastOpen + 1, nextClose - lastOpen - 1); +// +// Evaluate it +// + stringstream result; + result << (int) eval.evaluate(toEvaluate.c_str()); +// +// Replace [sub-expr] with result +// + string newExpression = expression.substr(0, lastOpen) + result.str() + + expression.substr(nextClose + 1, string::npos); + + return debracket(newExpression); +} + +GeoLogVol * GmxUtil::makeAssemblyLV() { +#ifndef STANDALONE_GMX + StoreGateSvc *pDetStore = 0; + ISvcLocator *svcLocator = Gaudi::svcLocator(); + + OUTPUT_STREAM; + + StatusCode sc = svcLocator->service("DetectorStore", pDetStore); + if (sc.isFailure()) { + msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Detector Store" << endmsg; + } + else { + DataHandle<StoredMaterialManager> theMaterialManager; + sc = pDetStore->retrieve(theMaterialManager, "MATERIALS"); + if(sc.isFailure()) { + msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Material Manager" << endmsg; + } + else { + const GeoMaterial *assembly_material = theMaterialManager->getMaterial("special::HyperUranium"); + GeoBox *box = new GeoBox(1., 1., 1.); // Simplest shape; it is irrelevant + GeoLogVol *lv = new GeoLogVol(string("AssemblyLV"), box, assembly_material); + return lv; + } + } + return 0; +#else + GeoMaterial *assembly_material = new GeoMaterial("special::HyperUranium", 1.e-20); + GeoElement *vacuum = new GeoElement("vacuum", "Mt", 1, 1); + assembly_material->add(vacuum, 1.0); + assembly_material->lock(); + GeoBox *box = new GeoBox(1., 1., 1.); // Simplest shape; it is irrelevant + GeoLogVol *lv = new GeoLogVol(string("AssemblyLV"), box, assembly_material); + return lv; +#endif +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..34f123a92292e2677499327115e8d28a14f88fc3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Processor for index elements +// +#include <map> + +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/IndexProcessor.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace std; +using namespace xercesc; + +void IndexProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &/* toAdd */) { + + XMLCh * ref_tmp = XMLString::transcode("ref"); + XMLCh * value_tmp = XMLString::transcode("value"); + + char *name2release; + + name2release = XMLString::transcode(element->getAttribute(ref_tmp)); + string name(name2release); + XMLString::release(&name2release); + + name2release = XMLString::transcode(element->getAttribute(value_tmp)); + string value(name2release); + XMLString::release(&name2release); + + gmxUtil.positionIndex.setFormula(name, value); + + XMLString::release(&ref_tmp); + XMLString::release(&value_tmp); + + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..65a33e8a23f994768536c0f98c03ca5db43a8470 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx @@ -0,0 +1,222 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Processor for logvol elements +// +// Add name to list. +// Create a physvol using my logvol; add it to list. +// Process children and get list of things to be added to the physvol. +// Add them to the physvol. +// +#include "GeoModelXml/LogvolProcessor.h" +#include "GeoModelXml/OutputDirector.h" + +#include <map> + +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoFullPhysVol.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GeoNodeList.h" +#include "xercesc/util/XMLString.hpp" + +// using namespace CLHEP; + +using namespace std; +using namespace xercesc; + +void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +GeoLogVol *lv; +GeoNameTag *physVolName; + + OUTPUT_STREAM; + + gmxUtil.positionIndex.incrementLevel(); + + XMLCh * name_tmp = XMLString::transcode("name"); + char *name2release = XMLString::transcode(element->getAttribute(name_tmp)); + string name(name2release); + XMLString::release(&name2release); + XMLString::release(&name_tmp); +// +// Look for the logvol in the map; if not yet there, add it +// + map<string, LogVolStore>::iterator entry; + if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item +// +// Name +// + m_map[name] = LogVolStore(); + LogVolStore *store = &m_map[name]; + physVolName = new GeoNameTag(name); + store->name = physVolName; + store->id = 0; +// +// Get the shape. +// + DOMDocument *doc = element->getOwnerDocument(); + XMLCh * shape_tmp = XMLString::transcode("shape"); + const XMLCh *shape = element->getAttribute(shape_tmp); + DOMElement *refShape = doc->getElementById(shape); + // Check it is a shape... its parent should be a <shapes>. DTD cannot do this for us. + DOMNode *parent = refShape->getParentNode(); + if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("shapes")) != 0) { + + msglog << MSG::FATAL << "Processing logvol " << name << + ". Error in gmx file. An IDREF for a logvol shape did not refer to a shape.\n" << + "Shape ref was " << shape << "; exiting" << endmsg; + exit (1); // Need to improve... + } +// +// What sort of shape? +// + name2release = XMLString::transcode(refShape->getNodeName()); + string shapeType(name2release); + XMLString::release(&name2release); + XMLString::release(&shape_tmp); + + GeoShape *s = (GeoShape *) gmxUtil.geoItemRegistry.find(shapeType)->process(refShape, gmxUtil); +// +// Get the material +// + XMLCh * material_tmp = XMLString::transcode("material"); + const XMLCh *material = element->getAttribute(material_tmp); + DOMElement *refMaterial = doc->getElementById(material); + // Check it is a material... its parent should be a <materials>. DTD cannot do this for us. + parent = refMaterial->getParentNode(); + XMLCh * materials_tmp = XMLString::transcode("materials"); + if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) { + msglog << MSG::FATAL << "Processing logvol " << name << + ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" << + "Material ref was " << material << "; exiting" << endmsg; + exit (1); // Need to improve... + } + + GeoMaterial *m = (GeoMaterial *) gmxUtil.tagHandler.material.process(refMaterial, gmxUtil); + +// +// Make the LogVol and add it to the map ready for next time +// + lv = new GeoLogVol(name, s, m); + store->logVol = lv; + + XMLString::release(&material_tmp); + XMLString::release(&materials_tmp); + } + else { // Already in the registry; use it. + physVolName = entry->second.name; + lv = entry->second.logVol; + } + + +// +// Process the logvol children (side effect: sets formulae for indexes before calculating them) +// + GeoNodeList childrenAdd; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + DOMElement *el = dynamic_cast<DOMElement *> (child); + name2release = XMLString::transcode(el->getNodeName()); + string name(name2release); + XMLString::release(&name2release); + gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd); + } + } +// +// Make a list of things to be added +// + toAdd.push_back(physVolName); + XMLCh * sensitive_tmp = XMLString::transcode("sensitive"); + bool sensitive = element->hasAttribute(sensitive_tmp); + int sensId = 0; + //std::vector<int> extraSensIds;//extra Identfiers to be used in case we split this volume into multiple DetectorElements + map<string, int> index; + //map<string, int> updatedIndex;//extra indices to be used in case we split this volume + if (sensitive) { + gmxUtil.positionIndex.setCopyNo(m_map[name].id++); + gmxUtil.positionIndex.indices(index, gmxUtil.eval); + sensId = gmxUtil.gmxInterface()->sensorId(index); + // toAdd.push_back(new GeoIdentifierTag(m_map[name].id)); // Normal copy number + toAdd.push_back(new GeoIdentifierTag(sensId)); + } + else { + toAdd.push_back(new GeoIdentifierTag(m_map[name].id)); // Normal copy number + gmxUtil.positionIndex.setCopyNo(m_map[name].id++); + } + XMLString::release(&sensitive_tmp); + // + // Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add + // + XMLCh * alignable_tmp = XMLString::transcode("alignable"); + char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp)); + string alignable(toRelease); + XMLString::release(&toRelease); + XMLString::release(&alignable_tmp); + if (sensitive || (alignable.compare(string("true")) == 0)) { + GeoFullPhysVol *pv = new GeoFullPhysVol(lv); + for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { + pv->add(*node); + } + toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2]. + // + // Add sensitive volumes to detector manager via GmxInterface + // + if (sensitive) { + XMLCh * sensitive_tmp = XMLString::transcode("sensitive"); + name2release = XMLString::transcode(element->getAttribute(sensitive_tmp)); + string sensitiveName(name2release); + XMLString::release(&name2release); + XMLString::release(&sensitive_tmp); + //splitting sensors where we would like multiple DetectorElements per GeoVFullPhysVol (e.g.ITk Strips) + XMLCh * splitLevel_tmp = XMLString::transcode("splitLevel"); + bool split = element->hasAttribute(splitLevel_tmp); + char* splitString; + int splitLevel = 1; + if (split) { + splitString = XMLString::transcode(element->getAttribute(splitLevel_tmp)); + splitLevel = gmxUtil.evaluate(splitString); + XMLString::release(&splitString); + XMLString::release(&splitLevel_tmp); + for(int i=0;i<splitLevel;i++){ + std::string field = "eta_module";//eventually specify in Xml the field to split in? + std::pair<std::string,int> extraIndex(field,i); + gmxUtil.gmxInterface()->addSplitSensor(sensitiveName, index,extraIndex, sensId, dynamic_cast<GeoVFullPhysVol *> (pv)); + } + } + else gmxUtil.gmxInterface()->addSensor(sensitiveName, index, sensId, dynamic_cast<GeoVFullPhysVol *> (pv)); + } + } + else { + GeoPhysVol *pv = new GeoPhysVol(lv); + for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { + pv->add(*node); + } + toAdd.push_back(pv); + } + + gmxUtil.positionIndex.decrementLevel(); + return; +} + +void LogvolProcessor::zeroId(const xercesc::DOMElement *element) { + + XMLCh * name_tmp = XMLString::transcode("name"); + char *name2release = XMLString::transcode(element->getAttribute(name_tmp)); + string name(name2release); + XMLString::release(&name2release); + XMLString::release(&name_tmp); + // + // Look for the logvol in the map; if not yet there, add it + // + map<string, LogVolStore>::iterator entry; + if ((entry = m_map.find(name)) != m_map.end()) { + entry->second.id = 0; + } + /* else: Not an error: it is usually just about to be made with id = 0; no action needed. */ +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..7269b7ebc91fe35cc0b0e23a013ce0a871ab7671 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx @@ -0,0 +1,57 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process logvolref items: basically, just find the referenced logvol and call its processor. +// +#include "GeoModelXml/LogvolrefProcessor.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/GeoNodeList.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace std; +using namespace xercesc; + +void LogvolrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +XMLCh *ref = XMLString::transcode("ref"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); +char *toRelease; +// +// Get the referenced element +// + idref = element->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); +// +// Check it is the right sort +// + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("logvol")) { + OUTPUT_STREAM; + msglog << MSG::FATAL << "Error in xml/gmx file: logvolref " << XMLString::transcode(idref) << " referenced a " << nodeName << + " instead of a logvol." << endmsg; + exit(999); // Should do better... + } +// +// Process it +// + XMLCh * zeroid_tmp = XMLString::transcode("zeroid"); + XMLCh * true_tmp = XMLString::transcode("true"); + const XMLCh *zeroid = element->getAttribute(zeroid_tmp); + if (XMLString::equals(zeroid, true_tmp)) { + gmxUtil.tagHandler.logvol.zeroId(elem); + } + + gmxUtil.tagHandler.logvol.process(elem, gmxUtil, toAdd); + XMLString::release(&ref); + XMLString::release(&zeroid_tmp); + XMLString::release(&true_tmp); + + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx new file mode 100644 index 0000000000000000000000000000000000000000..75a1e43c1c2d1aedf4e8e095bb12ac90dc2fcd5d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeBox.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoBox.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeBox::MakeBox() {} + +const RCBase * MakeBox::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 3; +char const *parName[nParams] = {"xhalflength", "yhalflength", "zhalflength"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoBox(p[0], p[1], p[2]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx new file mode 100644 index 0000000000000000000000000000000000000000..7acac8dc1281530262a83902f003c92a50fe6b21 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeCons.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoCons.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeCons::MakeCons() {} + +const RCBase * MakeCons::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 7; +char const *parName[nParams] = {"rmin1", "rmin2", "rmax1", "rmax2", "dz", "sphi", "dphi"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoCons(p[0], p[1], p[2], p[3], p[4], p[5], p[6]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f6b6742c876ae5422a8f42f74702c4d384ff438d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx @@ -0,0 +1,56 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/MakeElement.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/Units.h" +#include "GeoModelKernel/GeoElement.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; +using namespace GeoModelKernelUnits; + +MakeElement::MakeElement() {} + +const RCBase * MakeElement::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { + char *name, *shortname, *z,*a; + XMLCh *name_tmp,*shortname_tmp,*z_tmp,*a_tmp; + double zVal, aVal; +// +// Get my Z +// + z_tmp = XMLString::transcode("Z"); + z = XMLString::transcode(element->getAttribute(z_tmp)); + zVal = gmxUtil.evaluate(z); + XMLString::release(&z); + XMLString::release(&z_tmp); +// +// Get my A +// + a_tmp = XMLString::transcode("A"); + a = XMLString::transcode(element->getAttribute(a_tmp)); + aVal = gmxUtil.evaluate(a); + XMLString::release(&a); + XMLString::release(&a_tmp); + // + // Get my names + // + name_tmp = XMLString::transcode("name"); + name = XMLString::transcode(element->getAttribute(name_tmp)); + shortname_tmp = XMLString::transcode("shortname"); + shortname = XMLString::transcode(element->getAttribute(shortname_tmp)); + // + // Create it + // + aVal *= gram/mole; + GeoElement *el = new GeoElement(name, shortname, zVal, aVal); + XMLString::release(&name); + XMLString::release(&shortname); + XMLString::release(&name_tmp); + XMLString::release(&shortname_tmp); + + return (const RCBase *) el; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx new file mode 100644 index 0000000000000000000000000000000000000000..df1a86fc8aa2e39b0cf75ca6ca88fa710cc36e2e --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx @@ -0,0 +1,48 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// *NOT*!!! Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +// GenericTraps would have 17 params, so Vakho built up a vector instead. +// So skeleton was automatically generated, then edited by hand. +// +#include "GeoModelXml/shape/MakeGenericTrap.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoGenericTrap.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + + +using namespace xercesc; + +MakeGenericTrap::MakeGenericTrap() {} + +const RCBase * MakeGenericTrap::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 17; +char const *parName[nParams] = {"x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", + "x4", "y4", "x5", "y5", "x6", "y6", "x7", "y7", "zhalflength"}; +double p; +char *toRelease; +std::vector<GeoTwoVector> vertices; +double x; +double y; + + for (int i = 0; i < (nParams - 1) / 2; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i]))); + x = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i + 1]))); + y = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + vertices.push_back(GeoTwoVector(x, y)); + } +// +// z-half-length +// + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[16]))); + p = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + + return new GeoGenericTrap(p, vertices); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx new file mode 100644 index 0000000000000000000000000000000000000000..49ab5599f6debe99b2d8b46e698ab6bea9cb2a3c --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx @@ -0,0 +1,64 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +// Then heavily modified +#include "GeoModelXml/shape/MakeIntersection.h" +#include <string> +#include "GeoModelXml/OutputDirector.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/GeoDefinitions.h" +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoTransform.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; +using namespace std; + +MakeIntersection::MakeIntersection() {} + +const RCBase * MakeIntersection::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +// +// Process child elements; first is first shaperef; then transform; then second shaperef. +// + GeoShape *first = 0; + GeoShape *second = 0; + GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); + int elementIndex = 0; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes + switch (elementIndex) { + case 0: { // First element is first shaperef + first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + case 1: { // Second element is transformation or transformationref + char *toRelease = XMLString::transcode(child->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + GeoTransform *geoXf = nodeName == "transformation"? +(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil): +(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil); + hepXf = geoXf->getTransform(); + break; + } + case 2: { // Third element is second shaperef + second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + default: // More than 3 elements? + OUTPUT_STREAM; + msglog << MSG::FATAL << "MakeIntersection: Incompatible DTD? got more than 3 child elements\n"; + } + elementIndex++; + } + } + + const GeoShapeIntersection *temp = &(first->intersect(*(GeoShape *) &(*(second) << hepXf))); + + return (RCBase *) temp; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx new file mode 100644 index 0000000000000000000000000000000000000000..48235001275144c763ec8b76dfc74c2af68d503e --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx @@ -0,0 +1,202 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/MakeMaterial.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoMaterial.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelKernel/Units.h" + +using namespace xercesc; +using namespace std; +using namespace GeoModelKernelUnits; + +MakeMaterial::MakeMaterial() {} + +const RCBase * MakeMaterial::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +char *name; +char *density; +char *densitySF; +double rho; +char *fracString; +double fraction; +char *qString; +XMLCh *ref = XMLString::transcode("ref"); +XMLCh *materials_tmp = XMLString::transcode("materials"); +XMLCh *density_tmp = XMLString::transcode("density"); +XMLCh *densitysf_tmp = XMLString::transcode("densitysf"); +XMLCh *name_tmp = XMLString::transcode("name"); +XMLCh* elementref_tmp = XMLString::transcode("elementref"); +XMLCh *fraction_tmp = XMLString::transcode("fraction"); +XMLCh *chemicalref_tmp = XMLString::transcode("chemicalref"); +XMLCh *elemcontent_tmp = XMLString::transcode("elemcontent"); +XMLCh *quantity_tmp = XMLString::transcode("quantity"); +XMLCh *materialref_tmp = XMLString::transcode("materialref"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); +char *toRelease; + + OUTPUT_STREAM; +// +// Get material density scale-factor for the block of materials this one is in +// + DOMNode *parent = element->getParentNode(); + if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) { + msglog << MSG::FATAL << "Asked to make a material for non-material element. Parent element was " << + XMLString::transcode(parent->getNodeName()) << "; error in gmx file; exiting" << endmsg; + exit(1); + } + double scaleFactor(1.0); + DOMElement *el = dynamic_cast<DOMElement *> (parent); +// if (el->hasAttribute(XMLString::transcode("densitysf"))) { // Guaranteed by DTD; don't recheck. + densitySF = XMLString::transcode(el->getAttribute(densitysf_tmp)); + scaleFactor = gmxUtil.evaluate(densitySF); +// } +// +// Get my name +// + name = XMLString::transcode(element->getAttribute(name_tmp)); +// +// Get my density +// + density = XMLString::transcode(element->getAttribute(density_tmp)); + rho = gmxUtil.evaluate(density) * scaleFactor; + XMLString::release(&density); +// +// Create it +// + GeoMaterial *material = new GeoMaterial(name, rho * g/cm3); + XMLString::release(&name); +// +// Add my element contents +// + DOMNodeList *elRefs = element->getElementsByTagName(elementref_tmp); + int nElRefs = elRefs->getLength(); + for (int i = 0; i < nElRefs; ++i) { + DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i)); + idref = elRef->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); + + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("element")) { + msglog << MSG::FATAL << "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." + << endmsg; + exit(999); // Should do better... + } + + GeoElement *geoElem = (GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil); + + fracString = XMLString::transcode(elRef->getAttribute(fraction_tmp)); + fraction = gmxUtil.evaluate(fracString); + XMLString::release(&fracString); + material->add(geoElem, fraction); + } +// +// Add my chemical contents +// + DOMNodeList *chemRefs = element->getElementsByTagName(chemicalref_tmp); + int nChemRefs = chemRefs->getLength(); + for (int i = 0; i < nChemRefs; ++i) { + DOMElement *chemRef = dynamic_cast<DOMElement *>(chemRefs->item(i)); + idref = chemRef->getAttribute(ref); + DOMElement *chem = doc->getElementById(idref); + + toRelease = XMLString::transcode(chem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("chemical")) { + msglog << MSG::FATAL << "Error in xml/gmx file: A chemref referenced a " << nodeName << " instead of a chemical." << + endmsg; + exit(999); // Should do better... + } + + fracString = XMLString::transcode(chemRef->getAttribute(fraction_tmp)); + fraction = gmxUtil.evaluate(fracString); + XMLString::release(&fracString); + + // Loop over chemical contents, adding each element to this material + DOMNodeList *chemEls = chem->getElementsByTagName(elemcontent_tmp); + int nChemEls = chemEls->getLength(); + vector<GeoElement *> geoElem; + vector<double> atomicWeight; + double molWeight = 0.0; + vector<double> formula; + for (int i = 0; i < nChemEls; ++i) { + DOMElement *chemEl = dynamic_cast<DOMElement *>(chemEls->item(i)); + idref = chemEl->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); + + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("element")) { + msglog << MSG::FATAL << + "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." << endmsg; + exit(999); // Should do better... + } + + geoElem.push_back((GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil)); + atomicWeight.push_back(geoElem.back()->getA()); + + qString = XMLString::transcode(chemEl->getAttribute(quantity_tmp)); + formula.push_back(gmxUtil.evaluate(qString)); + XMLString::release(&qString); + + molWeight += atomicWeight.back() * formula.back(); + } + for (int i = 0; i < nChemEls; ++i) { + material->add(geoElem[i], fraction * formula[i] * atomicWeight[i] / molWeight); + } + } + +// +// Add my material contents +// + elRefs = element->getElementsByTagName(materialref_tmp); + nElRefs = elRefs->getLength(); + for (int i = 0; i < nElRefs; ++i) { + DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i)); + idref = elRef->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); + + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("material")) { + msglog << MSG::FATAL << + "Error in xml/gmx file: A materialref referenced a " << nodeName << " instead of a material." << endmsg; + exit(999); // Should do better... + } + + GeoMaterial *geoMaterial = (GeoMaterial *) gmxUtil.tagHandler.material.process(elem, gmxUtil); + + fracString = XMLString::transcode(elRef->getAttribute(fraction_tmp)); + fraction = gmxUtil.evaluate(fracString); + XMLString::release(&fracString); + material->add(geoMaterial, fraction); + } + + material->lock(); // Calculate my params and prevent modification + + XMLString::release(&ref); + XMLString::release(&materials_tmp); + XMLString::release(&density_tmp); + XMLString::release(&densitysf_tmp); + XMLString::release(&name_tmp); + XMLString::release(&elementref_tmp); + XMLString::release(&fraction_tmp); + XMLString::release(&chemicalref_tmp); + XMLString::release(&elemcontent_tmp); + XMLString::release(&quantity_tmp); + XMLString::release(&materialref_tmp); + + + return (const RCBase *) material; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e1aaef2b76e48c82cc6b633b9e9b9dab77eb57c4 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakePara.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoPara.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakePara::MakePara() {} + +const RCBase * MakePara::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 6; +char const *parName[nParams] = {"xhalflength", "yhalflength", "zhalflength", "alpha", "theta", "phi"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoPara(p[0], p[1], p[2], p[3], p[4], p[5]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f333f5fddbdad46207339c20b50526d14501e5c0 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +// But then edited for AddPlane stuff +#include "GeoModelXml/shape/MakePcon.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoPcon.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakePcon::MakePcon() {} + +const RCBase * MakePcon::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 2; +char const *parName[nParams] = {"sphi", "dphi"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + GeoPcon *pcon = new GeoPcon(p[0], p[1]); +// +// Add planes +// + double zPlane = 0.; + double rMinPlane = 0.; + double rMaxPlane = 0.; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + toRelease = XMLString::transcode(child->getNodeName()); + std::string name(toRelease); + XMLString::release(&toRelease); + if (name == "addplane") { + gmxUtil.tagHandler.addplane.process(dynamic_cast<const DOMElement *>(child), zPlane, rMinPlane, rMaxPlane); + pcon->addPlane(zPlane, rMinPlane, rMaxPlane); + } + } + } + + return pcon; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a57daf51291dc8d8c75c90ec78eb015d5997b4ff --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx @@ -0,0 +1,50 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +// But then edited for AddPlane stuff +#include "GeoModelXml/shape/MakePgon.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoPgon.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakePgon::MakePgon() {} + +const RCBase * MakePgon::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 3; +char const *parName[nParams] = {"sphi", "dphi", "nsides"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + GeoPgon *pgon = new GeoPgon(p[0], p[1], p[2]); +// +// Add planes +// + double zPlane = 0.; + double rMinPlane = 0.; + double rMaxPlane = 0.; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + toRelease = XMLString::transcode(child->getNodeName()); + std::string name(toRelease); + XMLString::release(&toRelease); + if (name == "addplane") { + gmxUtil.tagHandler.addplane.process(dynamic_cast<const DOMElement *>(child), zPlane, rMinPlane, rMaxPlane); + pgon->addPlane(zPlane, rMinPlane, rMaxPlane); + } + } + } + + return pgon; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx new file mode 100644 index 0000000000000000000000000000000000000000..db97f3f0159be6d74f89d148e3e23be5ec59c265 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx @@ -0,0 +1,35 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/MakeRotation.h" +#include <xercesc/dom/DOM.hpp> +// #include <CLHEP/Geometry/Transform3D.h> +// #include <CLHEP/Geometry/Vector3D.h> +#include "GeoModelKernel/GeoDefinitions.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +MakeRotation::MakeRotation() {} + +using namespace xercesc; +// using namespace HepGeom; + +GeoTrf::Rotation3D MakeRotation::getTransform(const DOMElement *rotation, GmxUtil &gmxUtil) { + +const int nParams = 4; +char const *parName[nParams] = {"angle", "xcos", "ycos", "zcos"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(rotation->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + GeoTrf::Rotation3D temp; + temp = GeoTrf::AngleAxis3D(p[0], GeoTrf::Vector3D(p[1], p[2], p[3])); + + return temp; + +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx new file mode 100644 index 0000000000000000000000000000000000000000..fe8a6a1cf8120bbc05252acf96f7d324bde03da6 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx @@ -0,0 +1,51 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process transformationref items: basically, just find the referenced transform and call its processor. +// +#include "GeoModelXml/shape/MakeShaperef.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/GmxUtil.h" +#include "xercesc/util/XMLString.hpp" + +using namespace std; +using namespace xercesc; + +const RCBase *MakeShaperef::process(const DOMElement *element, GmxUtil &gmxUtil) const { +// +// Get the referenced shape +// + + XMLCh * ref_tmp = XMLString::transcode("ref"); + XMLCh * shapes_tmp = XMLString::transcode("shapes"); + + const XMLCh *idref = element->getAttribute(ref_tmp); + DOMDocument *doc = element->getOwnerDocument(); + DOMElement *shape = doc->getElementById(idref); +// +// Check it is the right sort: it's parent should be a shapes +// + DOMNode *parent = shape->getParentNode(); + if (XMLString::compareIString(parent->getNodeName(), shapes_tmp) != 0) { + OUTPUT_STREAM; + msglog << MSG::FATAL << "Error processing <shaperef> tag: An IDREF for a shape did not refer to a shape.\nShape ref was " << + idref << "; exiting" << endmsg; + exit (1); // Need to improve... + } +// +// Get what sort of shape +// + char *toRelease = XMLString::transcode(shape->getNodeName()); + string tag(toRelease); + XMLString::release(&toRelease); + XMLString::release(&ref_tmp); + XMLString::release(&shapes_tmp); +// +// Find and return it +// + return (RCBase *) gmxUtil.geoItemRegistry.find(tag)->process(shape, gmxUtil); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx new file mode 100644 index 0000000000000000000000000000000000000000..5eee9181c2b86ab369b8e7c5e69d9679e1f5c3d5 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx @@ -0,0 +1,79 @@ +/* + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration +*/ +#include <string> +#include <vector> +#include <sstream> +#include <stdexcept> + +#ifndef STANDALONE_GMX + #include "GeoModelXml/OutputDirector.h" + #include "GaudiKernel/IMessageSvc.h" +#endif + +#include "GeoModelXml/shape/MakeSimplePolygonBrep.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoSimplePolygonBrep.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" +using namespace xercesc; + +MakeSimplePolygonBrep::MakeSimplePolygonBrep() {} + +const RCBase * MakeSimplePolygonBrep::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 3; +char const *parName[nParams] = {"xpoints", "ypoints", "zhalflength"}; +double z; +std::vector <double> x; +std::vector <double> y; + +char *toRelease; + + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[0]))); + std::string xPoints(toRelease); + XMLString::release(&toRelease); + + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[1]))); + std::string yPoints(toRelease); + XMLString::release(&toRelease); + + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2]))); + z = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + + GeoSimplePolygonBrep * poly = new GeoSimplePolygonBrep(z); + + std::istringstream xSS(xPoints); + while (!xSS.eof()) { + std::string upToNextComma; + getline( xSS, upToNextComma, ';' ); + x.push_back(gmxUtil.evaluate(upToNextComma.c_str())); + } + + std::istringstream ySS(yPoints); + while (!ySS.eof()) { + std::string upToNextComma; + getline( ySS, upToNextComma, ';' ); + y.push_back(gmxUtil.evaluate(upToNextComma.c_str())); + } + + int nx = x.size(); + int ny = y.size(); + + if (nx < 3 || ny < 3 || nx != ny) { +#ifndef STANDALONE_GMX + OUTPUT_STREAM; + msglog << MSG::ERROR << "MakeSimplePolygonBrep: Bad xpoints and/or ypoints\n"; +#endif + throw std::runtime_error(std::string("MakeSimplePolygonBrep: Unequal number of x and y points, or less than 3\n\n") + + "xpoints was:\n" + xPoints + "\nypoints was:\n" + yPoints + "\n\n"); + } + + for (int i = 0; i < nx; ++i) { + poly->addVertex(x[i], y[i]); + } + + return poly; + +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx new file mode 100644 index 0000000000000000000000000000000000000000..699af4a9c7cbfb393be3dd61b14d86d934308c83 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx @@ -0,0 +1,65 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +// Then heavily modified +#include "GeoModelXml/shape/MakeSubtraction.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +// #include <CLHEP/Geometry/Transform3D.h> +#include "GeoModelKernel/GeoDefinitions.h" +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoTransform.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; +using namespace std; + +MakeSubtraction::MakeSubtraction() {} + +const RCBase * MakeSubtraction::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +// +// Process child elements; first is first shaperef; then transformation; then second shaperef. +// + GeoShape *first = 0; + GeoShape *second = 0; + GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); + int elementIndex = 0; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes + switch (elementIndex) { + case 0: { // First element is first shaperef + first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + case 1: { // Second element is transformation or transformationref + char *toRelease = XMLString::transcode(child->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + GeoTransform *geoXf = nodeName == "transformation"? +(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil): +(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil); + hepXf = geoXf->getTransform(); + break; + } + case 2: { // Third element is second shaperef + second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + default: // More than 3 elements? + OUTPUT_STREAM; + msglog << MSG::FATAL << "MakeSubtraction: Incompatible DTD? got more than 3 child elements" << endmsg; + } + elementIndex++; + } + } + + const GeoShapeSubtraction *temp = &(first->subtract(*(GeoShape *) &(*(second) << hepXf))); + + return (RCBase *) temp; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx new file mode 100644 index 0000000000000000000000000000000000000000..603b094b619fc9b5ecd5ed8a984e5426b652981b --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx @@ -0,0 +1,61 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/MakeTransformation.h" +#include <xercesc/dom/DOM.hpp> +// #include <CLHEP/Geometry/Transform3D.h> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +#include "GeoModelKernel/GeoDefinitions.h" + +using namespace xercesc; +using namespace std; + +MakeTransformation::MakeTransformation() {} + +const RCBase * MakeTransformation::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +char *name2release; + GeoTrf::Transform3D hepTransform=GeoTrf::Transform3D::Identity(); // Starts as Identity transform +// +// Add my element contents +// + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { + name2release = XMLString::transcode(child->getNodeName()); + string name(name2release); + DOMElement *el = dynamic_cast<DOMElement *>(child); + if (name == string("translation")) { + hepTransform = hepTransform * gmxUtil.tagHandler.translation.getTransform(el, gmxUtil); + } + else if (name == "rotation") { + hepTransform = hepTransform * gmxUtil.tagHandler.rotation.getTransform(el, gmxUtil); + } + else if (name == "scaling") { + +// TODO: figure out what to do in this case +// hepTransform = hepTransform * gmxUtil.tagHandler.scaling.getTransform(el, gmxUtil); + } + XMLString::release(&name2release); + } + } +// +// Create and return GeoModel transform +// + + XMLCh * alignable_tmp = XMLString::transcode("alignable"); + char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp)); + string alignable(toRelease); + XMLString::release(&toRelease); + XMLString::release(&alignable_tmp); + if (alignable.compare(string("true")) == 0) { + return (const RCBase *) new GeoAlignableTransform(hepTransform); + } + else { + return (const RCBase *) new GeoTransform(hepTransform); + } +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d3054df9eff4ea06a52d6b816154dd553c42862d --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process transformationref items: basically, just find the referenced transform and call its processor. +// +#include "GeoModelXml/MakeTransformationref.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GeoNodeList.h" +#include "xercesc/util/XMLString.hpp" + +using namespace std; +using namespace xercesc; + +const RCBase *MakeTransformationref::make(const DOMElement *element, GmxUtil &gmxUtil) const { +XMLCh *ref = XMLString::transcode("ref"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); +char *toRelease; +// +// Get the referenced element +// + idref = element->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); +// +// Check it is the right sort +// + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != string("transformation")) { + OUTPUT_STREAM; + msglog << MSG::FATAL << "Error in xml/gmx file: transformationref " << XMLString::transcode(idref) << " referenced a " << nodeName << + " instead of a transformation." << endmsg; + exit(999); // Should do better... + } +// +// Process it +// + XMLString::release(&ref); + + return gmxUtil.tagHandler.transformation.process(elem, gmxUtil); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx new file mode 100644 index 0000000000000000000000000000000000000000..7068dd222ffb8f1cfa57fe1c185eb8b26ba16235 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx @@ -0,0 +1,32 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/MakeTranslation.h" +#include <xercesc/dom/DOM.hpp> +//#include <CLHEP/Geometry/Transform3D.h> +//#include <CLHEP/Geometry/Vector3D.h> +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +#include "GeoModelKernel/GeoDefinitions.h" + +MakeTranslation::MakeTranslation() {} + +using namespace xercesc; +//using namespace HepGeom; + +GeoTrf::Translate3D MakeTranslation::getTransform(const DOMElement *translation, GmxUtil &gmxUtil) { + +const int nParams = 3; +char const *parName[nParams] = {"x", "y", "z"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(translation->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + return GeoTrf::Translate3D(p[0], p[1], p[2]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx new file mode 100644 index 0000000000000000000000000000000000000000..c7c64b3eb5833b195c5eaf3dc4fd6ff9a9fc2f89 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeTrap.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoTrap.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeTrap::MakeTrap() {} + +const RCBase * MakeTrap::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 11; +char const *parName[nParams] = {"zhalflength", "theta", "phi", "dydzn", "dxdyndzn", "dxdypdzn", "angleydzn", "dydzp", "dxdyndzp", "dxdypdzp", "angleydzp"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoTrap(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx new file mode 100644 index 0000000000000000000000000000000000000000..afe9dd86a33b0f1c5eb78ba8f6cba940bc2d0347 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeTrd.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoTrd.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeTrd::MakeTrd() {} + +const RCBase * MakeTrd::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 5; +char const *parName[nParams] = {"xhalflength1", "xhalflength2", "yhalflength1", "yhalflength2", "zhalflength"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoTrd(p[0], p[1], p[2], p[3], p[4]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx new file mode 100644 index 0000000000000000000000000000000000000000..b8690d063d92d65a539b3b2d769cf289510f81b8 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeTube.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoTube.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeTube::MakeTube() {} + +const RCBase * MakeTube::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 3; +char const *parName[nParams] = {"rmin", "rmax", "zhalflength"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoTube(p[0], p[1], p[2]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx new file mode 100644 index 0000000000000000000000000000000000000000..b0d4d79bfca7188f9ad57e7b06f1e2ee161a434c --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx @@ -0,0 +1,30 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape +#include "GeoModelXml/shape/MakeTubs.h" +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoTubs.h" +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; + +MakeTubs::MakeTubs() {} + +const RCBase * MakeTubs::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +const int nParams = 5; +char const *parName[nParams] = {"rmin", "rmax", "zhalflength", "sphi", "dphi"}; +double p[nParams]; +char *toRelease; + + for (int i = 0; i < nParams; ++i) { + toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i]))); + p[i] = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + } + + return new GeoTubs(p[0], p[1], p[2], p[3], p[4]); +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d23afc4ffe60ca12ce28bdfec01d5527e397e4a4 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx @@ -0,0 +1,63 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/shape/MakeUnion.h" +#include <string> +#include "GeoModelXml/OutputDirector.h" +#include <xercesc/dom/DOM.hpp> +// #include <CLHEP/Geometry/Transform3D.h> +#include "GeoModelKernel/RCBase.h" +#include "GeoModelKernel/GeoShape.h" +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoDefinitions.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GmxUtil.h" + +using namespace xercesc; +using namespace std; + +MakeUnion::MakeUnion() {} + +const RCBase * MakeUnion::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const { +// +// Process child elements; first is first shaperef; then transform; then second shaperef. +// + GeoShape *first = 0; + GeoShape *second = 0; + GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); + int elementIndex = 0; + for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) { + if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes + switch (elementIndex) { + case 0: { // First element is first shaperef + first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + case 1: { // Second element is transformation or transformationref + char *toRelease = XMLString::transcode(child->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + GeoTransform *geoXf = nodeName == "transformation"? +(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil): +(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil); + hepXf = geoXf->getTransform(); + break; + } + case 2: { // Third element is second shaperef + second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil); + break; + } + default: // More than 3 elements? + OUTPUT_STREAM; + msglog << MSG::FATAL << "MakeUnion: Incompatible DTD? got more than 3 child elements" << endmsg; + } + elementIndex++; + } + } + + const GeoShapeUnion *temp = &(first->add(*(GeoShape *) &(*(second) << hepXf))); + + return (RCBase *) temp; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..abf291e834b3805108694bdde12e2ff169bd7341 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx @@ -0,0 +1,257 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +// +// multicopy element processor. +// +// First time round, a loop creates all the Geo-transforms needed and stores them. First and subsequent calls, +// a second loop adds these to the toAdd list, along with copies of the object. The object-handler stores and +// deals with the object. This si needed to make sure sensitive volumes and alignable volumes are always added +// correctly. +// +// The copy number of the copied object can be zeroed each time the multicopy-element is processed if the +// zeroid attribute is set true. This has to be done here - if the attribute is given on a logvol or assembly ref, +// it would alwasy be zero. +// +// There are two ways of making the n transformations: +// loopvar attribute not set: The transformation is raised to the power i-1 +// loopvar set to a vector name: In the loop, before each transformation is created, the vector generic name is set +// equal to the next element of the vector. +// +#include "GeoModelXml/MulticopyProcessor.h" + +#include "GeoModelXml/OutputDirector.h" +#include <sstream> +#include <string> +#include <cstdlib> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/GeoTransform.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoDefinitions.h" + +#include "xercesc/util/XMLString.hpp" +#include "GeoModelXml/GeoNodeList.h" +#include "GeoModelXml/ProcessorRegistry.h" +#include "GeoModelXml/GmxUtil.h" + + +using namespace xercesc; +using namespace std; + +void MulticopyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +char *toRelease; +XMLCh *ref = XMLString::transcode("ref"); +XMLCh * alignable_tmp = XMLString::transcode("alignable"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); + + OUTPUT_STREAM; + + bool alignable = element->hasAttribute(alignable_tmp); +// +// How many copies? +// + int nCopies; + XMLCh * n_tmp = XMLString::transcode("n"); + toRelease = XMLString::transcode(element->getAttribute(n_tmp)); + nCopies = gmxUtil.evaluate(toRelease); + XMLString::release(&toRelease); + XMLString::release(&n_tmp); +// +// See if it is in the map; if so, xfList is already done. If not, fill xfList. +// + XMLCh * name_tmp = XMLString::transcode("name"); + toRelease = XMLString::transcode(element->getAttribute(name_tmp)); + string name(toRelease); + XMLString::release(&toRelease); + XMLString::release(&name_tmp); + map<string, GeoNodeList>::iterator entry; + GeoNodeList *xfList; + if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item +// +// Add empty node list to the map +// + m_map[name] = GeoNodeList(); + xfList = &m_map[name]; +// +// Loopvar Variable name +// + string varname, firstElement; + XMLCh * loopvar_tmp = XMLString::transcode("loopvar"); + bool hasVarname = (element->getAttributeNode(loopvar_tmp) != 0); + if (hasVarname) { + toRelease = XMLString::transcode(element->getAttribute(loopvar_tmp)); + varname = toRelease; + XMLString::release(&toRelease); + XMLString::release(&loopvar_tmp); + // Check it is a vector + firstElement = varname + "_0"; + if (!gmxUtil.eval.findVariable(firstElement.c_str())) { + msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name << + ". Found loopvar set to " << varname << ", but no vector with that name has been defined." << endmsg; + exit(999); // Should do better + } + } +// +// Get the transformation-element +// + DOMElement *elXf = element->getFirstElementChild(); + toRelease = XMLString::transcode(elXf->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + Element2GeoItem *xFormProcessor; + if (hasVarname) { + if (nodeName == "transformation") { // OK + xFormProcessor = (Element2GeoItem *) &(gmxUtil.tagHandler.transformation); + } + else { // Not OK + msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name << + ". \nIt gives loopvar therefore should have a <transformation> and not a <transformationref> (despite the DTD)\n"; + exit(999); // Should do better + } + } + else { + xFormProcessor = nodeName == "transformation"? + (Element2GeoItem *) &(gmxUtil.tagHandler.transformation): + (Element2GeoItem *) &(gmxUtil.tagHandler.transformationref); + } +// +// Produce all the transformations +// + GeoAlignableTransform *geoAXf; + GeoTransform *geoXf; + if (hasVarname) { + for (int i = 0; i < nCopies; ++i) { + gmxUtil.eval.setVariable(varname.c_str(), (varname + "_" + to_string(i)).c_str()); + if (alignable) { + geoAXf = (GeoAlignableTransform *) xFormProcessor->make(elXf, gmxUtil); + xfList->push_back((GeoGraphNode *) geoAXf); + } + else { + geoXf = (GeoTransform *) xFormProcessor->make(elXf, gmxUtil); + xfList->push_back((GeoGraphNode *) geoXf); + } + gmxUtil.eval.removeVariable(varname.c_str()); // Avoids a warning status in evaluator + } + } + else { +// +// If varname not given, we get the CLHEP xForm and raise it to the power i, so NOT applied to first object. +// No transform (i.e. identity) for the first; so one less transform than objects +// + GeoTrf::Transform3D hepXf0=GeoTrf::Transform3D::Identity(); + if (alignable) { + geoAXf = (GeoAlignableTransform *) xFormProcessor->make(elXf, gmxUtil); + hepXf0 = geoAXf->getTransform(); + } + else { + geoXf = (GeoTransform *) xFormProcessor->make(elXf, gmxUtil); + hepXf0 = geoXf->getTransform(); + } + GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); // Identity initially + for (int i = 0; i < nCopies; ++i) { + xfList->push_back((GeoGraphNode *) new GeoTransform(hepXf)); + hepXf = hepXf0 * hepXf; + } + } + } + else { + xfList = &entry->second; + } +// +// Get object to be copied +// + DOMElement *object = element->getLastElementChild(); + toRelease = XMLString::transcode(object->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + ElementProcessor *objectProcessor = gmxUtil.processorRegistry.find(nodeName); +// +// Zero its copy number. Only needed if an item is used in 2 or more multicopies; +// harmless in case of only one use. +// + if (nodeName == "logvolref") { + idref = object->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); + gmxUtil.tagHandler.logvol.zeroId(elem); + } + else if (nodeName == "assemblyref") { + idref = object->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); + gmxUtil.tagHandler.assembly.zeroId(elem); + } + else if (nodeName == "transform") { // Object is either an assemlyref or logvolref, and there is only one of these + XMLCh * logvolref_tmp = XMLString::transcode("logvolref"); + DOMNodeList *lvList = element->getElementsByTagName(logvolref_tmp); + if (lvList->getLength() > 0) { + const XMLCh *idref = dynamic_cast<DOMElement *> (lvList->item(0))->getAttribute(ref); + DOMElement *lv = doc->getElementById(idref); + gmxUtil.tagHandler.logvol.zeroId(lv); + XMLString::release(&logvolref_tmp); + } + else { + XMLCh * assemblyref_tmp = XMLString::transcode("assemblyref") ; + DOMNodeList *asList = element->getElementsByTagName(assemblyref_tmp); + if (asList->getLength() > 0) { + const XMLCh *idref = dynamic_cast<DOMElement *> (asList->item(0))->getAttribute(ref); + DOMDocument *doc = element->getOwnerDocument(); + DOMElement *as = doc->getElementById(idref); + gmxUtil.tagHandler.assembly.zeroId(as); + XMLString::release(&assemblyref_tmp); + } + else { + msglog << MSG::FATAL << + "multicopyprocessor: error in " << name << ". <transform> object was neither assemblyref nor logvolref\n" + << "Exiting Athena" << endmsg; + exit(999); // Should do better + } + } + } +// +// If alignable, add transformation to DetectorManager via GmxInterface. +// (NB. Alignable is messy because it involves both a transformation and an object as well as +// the multicopy or transform element to tell us when to insert it and what level of alignment +// is wanted; and passing info from one routine to another when you try to keep a uniform interface is +// difficult; and we only have partial GeoModel trees so we cannot use GeoModel tree traversal at this +// moment (comes back to no way of knowing if we have a GeoFullPV or GeoPV)). +// +// Also: no one is using it at the time of writing, so it is ***TOTALLY*** untested. +// It is done now to (i) make sure there ought to be a solution (ii) implement (imperfectly) +// a way now while things are fresh in my mind. +// + int level; + if (alignable) { + istringstream(XMLString::transcode(element->getAttribute(alignable_tmp))) >> level; + } +// +// Add transforms and physvols etc. to list to be added +// + map<string, int> index; + for (int copy = 0; copy < nCopies; ++copy) { + toAdd.push_back((*xfList)[copy]); + int lastTransform = toAdd.size() - 1; + objectProcessor->process(object, gmxUtil, toAdd); + if (alignable) { + + cout << "copy = " << copy << "; level = " << level << endl; + cout << "\nAdd Alignable named " << endl; + cout << ((GeoNameTag *) (toAdd[lastTransform + 1]))->getName() << endl; + cout << " with id " << endl; + cout << ((GeoIdentifierTag *) (toAdd[lastTransform + 2]))->getIdentifier() << endl; + + gmxUtil.positionIndex.incrementLevel(); // Logvol has unfortunately already decremented this; temp. restore it + gmxUtil.positionIndex.indices(index, gmxUtil.eval); + gmxUtil.gmxInterface()->addAlignable(level, index, (GeoVFullPhysVol *) toAdd[lastTransform + 3], + (GeoAlignableTransform *) toAdd[lastTransform]); + gmxUtil.positionIndex.decrementLevel(); // Put it back where it was + index.clear(); + } + } + + XMLString::release(&ref); + XMLString::release(&alignable_tmp); + +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx new file mode 100644 index 0000000000000000000000000000000000000000..162528e4d2c97ce5afb3731600c5274e6e6f0086 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx @@ -0,0 +1,115 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include <cstdlib> +#include "GeoModelXml/OutputDirector.h" +#include <vector> +#include <string> +#include "ExpressionEvaluator/Evaluator.h" +#include "GeoModelXml/PositionIndex.h" + +using namespace std; + +PositionIndex::PositionIndex() { + m_level = -1; // Level -1 represents the "world" with no Copy Number +} + +PositionIndex::~PositionIndex() {} + +int PositionIndex::level() { + return m_level; +} + +int PositionIndex::incrementLevel() { + ++m_level; + if ((int) m_copyNo.size() < m_level + 1) + m_copyNo.push_back(0); + return m_level; +} + +int PositionIndex::decrementLevel() { + return --m_level; +} + +int PositionIndex::copyNo(int level) { + if (level >= 0 && level <= m_level) { + return m_copyNo[level]; + } + else { + return 0; + } +} + +int PositionIndex::setCopyNo(int copyNo) { + m_copyNo[m_level] = copyNo; + return m_copyNo[m_level]; +} + +void PositionIndex::addIndex(std::string name) { + m_name.push_back(name); + m_formula[name] = "0"; +} + +string PositionIndex::name(int whichOne) { + if (whichOne >= 0 && whichOne < (int) m_name.size()) { + return m_name[whichOne]; + } + else { + return string(""); + } +} + +std::string PositionIndex::formula(std::string name) { + return m_formula[name]; +} + +void PositionIndex::setFormula(std::string name, std::string formula) { + m_formula[name] = formula; +} + +void PositionIndex::indices(map<string, int> &index, Evaluator &eval) { + index.clear(); // In case caller uses it many times +// +// Set Copy Number of each Level (CNL_i) up to current level +// + string name("CNL_"); + for (int i = 0; i <= m_level; ++i) { + eval.setVariable((name + to_string(i)).c_str(), m_copyNo[i]); + } +// +// Set rest to zero +// + for (int i = m_level + 1; true; ++i) { + string varName = name + to_string(i); + if (!eval.findVariable(varName.c_str())) break; + eval.setVariable(varName.c_str(), "0"); + } +// +// Evaluate each index in turn +// +// +// We loop over the vector of names to make sure we evaluate the CNL_n values in the order they +// are given in the <positionindex> element. Thus the user can select the order of evaluation, which is +// important when CNL_n are used in the formulae. Looping directly over a map<>::iterator would process them +// in alphabetical order. +// + for (vector <string>::iterator n = m_name.begin(); n < m_name.end(); ++n) { + string name = *n; + index[name] = (int) eval.evaluate(m_formula[name].c_str()); + if (eval.status() != Evaluator::OK) { + OUTPUT_STREAM; + msglog << MSG::FATAL << + "GeoModelXml Error processing Evaluator expression for PositionIndex. Error name " << + eval.error_name() << endl << "Message: "; + eval.print_error(); + msglog << m_formula[name] << endl << string(eval.error_position(), '-') << '^' << '\n' << "Exiting program." << + endmsg; + exit(999); // Should do better... + } +// +// And create a CLHEP variable with the same index-name in case the user needs it +// + eval.setVariable(name.c_str(), (double) index[name]); + } +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx new file mode 100644 index 0000000000000000000000000000000000000000..66ec8fb070810b8986e91eb9db2f57848cd479bd --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx @@ -0,0 +1,20 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/ProcessorRegistry.h" +#include "GeoModelXml/ElementProcessor.h" + +ProcessorRegistry::ProcessorRegistry() { + m_defaultProcessor = new ElementProcessor(); +} + +void ProcessorRegistry::enregister(const std::string tagName, ElementProcessor *processor) { + m_processor[tagName] = processor; +} + +ElementProcessor * ProcessorRegistry::find(const std::string name) { + std::map<std::string, ElementProcessor *>::iterator it = m_processor.find(name); + + return it == m_processor.end()? m_defaultProcessor: it->second; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx new file mode 100644 index 0000000000000000000000000000000000000000..49be4a154ea2b2b7c6b29a391004401ce33410e4 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx @@ -0,0 +1,39 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "GeoModelXml/StrictErrorHandler.h" +#include "xercesc/util/XMLString.hpp" +#include <xercesc/dom/DOMError.hpp> +#include <xercesc/dom/DOMLocator.hpp> +#include "GeoModelXml/OutputDirector.h" + +StrictErrorHandler::StrictErrorHandler(): m_SawErrors(false) {} +StrictErrorHandler::~StrictErrorHandler() {} + +using namespace xercesc; + +bool StrictErrorHandler::handleError(const xercesc::DOMError &domError) { + + OUTPUT_STREAM; + msglog << MSG::ERROR << "StrictErrorHandler: Handle an error\n"; + + m_SawErrors = true; + + switch (domError.getSeverity()) { + case (xercesc::DOMError::DOM_SEVERITY_WARNING): + msglog << "\nWarning at file \n"; + break; + case (xercesc::DOMError::DOM_SEVERITY_ERROR): + msglog << "\nError at file \n"; + break; + default: + msglog << "\nFatal Error at file \n"; + } + msglog << XMLString::transcode(domError.getLocation()->getURI()) + << ", line " << domError.getLocation()->getLineNumber() + << ", char " << domError.getLocation()->getColumnNumber() + << "\n Message: " << XMLString::transcode(domError.getMessage()) << endmsg; + + return true; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..55774d47102beb639fbc70574f195b30fd202117 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx @@ -0,0 +1,79 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Processor for transform elements +// +// Decide if I need alignable transforms from my second child +// Add transform from first child to list +// Create physvol using my second child; add it to list. +// +#include "GeoModelXml/TransformProcessor.h" + +#include <string> +#include <sstream> +#include <vector> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelKernel/GeoNameTag.h" +#include "GeoModelKernel/GeoIdentifierTag.h" +#include "GeoModelKernel/GeoLogVol.h" +#include "GeoModelKernel/GeoPhysVol.h" +#include "GeoModelKernel/GeoVFullPhysVol.h" +#include "GeoModelKernel/GeoAlignableTransform.h" +#include "GeoModelXml/GmxUtil.h" +#include "xercesc/util/XMLString.hpp" + + +// using namespace CLHEP; +using namespace std; +using namespace xercesc; + +void TransformProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +char *tagName; + XMLCh * alignable_tmp; + + alignable_tmp = XMLString::transcode("alignable"); + bool alignable = element->hasAttribute(alignable_tmp); + // + // Do second element first, to find what sort of transform is needed (shape or logvol etc.?) + // + GeoNodeList objectsToAdd; + DOMElement *object = element->getLastElementChild(); + tagName = XMLString::transcode(object->getTagName()); + string objectName(tagName); + gmxUtil.processorRegistry.find(objectName)->process(object, gmxUtil, objectsToAdd); + XMLString::release(&tagName); + XMLString::release(&alignable_tmp); + // + // Get the transformation + // + DOMElement *transformation = element->getFirstElementChild(); + tagName = XMLString::transcode(transformation->getTagName()); // transformation or transformationref + // ******* Should check here that an alignable transform is given an alignable transformation and object; to be done + toAdd.push_back((GeoGraphNode *)gmxUtil.geoItemRegistry.find(string(tagName))->process(transformation, gmxUtil)); + XMLString::release(&tagName); + // + // Add transformation to DetectorManager via GmxInterface, if it is alignable +// + if (alignable) { + int level; + alignable_tmp = XMLString::transcode("alignable"); + istringstream(XMLString::transcode(element->getAttribute(alignable_tmp))) >> level; + map<string, int> index; + gmxUtil.positionIndex.incrementLevel(); // Logvol has unfortunately already decremented this; temp. restore it + gmxUtil.positionIndex.indices(index, gmxUtil.eval); +// ****** Using "[2]" is an ugly way to reach the PV. Define const int in LogvolProcessor? + gmxUtil.gmxInterface()->addAlignable(level, index, (GeoVFullPhysVol *) objectsToAdd[2], + (GeoAlignableTransform *) toAdd.back()); + + gmxUtil.positionIndex.decrementLevel(); + XMLString::release(&alignable_tmp); + } +// +// And add the name and physvol etc. after the transformation +// + toAdd.insert(toAdd.end(), objectsToAdd.begin(), objectsToAdd.end()); + + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a375911755a98f56fd99b7882a66be0828642abe --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx @@ -0,0 +1,49 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Process transformref items: basically, just find the referenced transform and call its processor. +// +#include "GeoModelXml/TransformrefProcessor.h" +#include "GeoModelXml/OutputDirector.h" +#include <string> +#include <xercesc/dom/DOM.hpp> +#include "GeoModelXml/GmxUtil.h" +#include "GeoModelXml/GeoNodeList.h" +#include "xercesc/util/XMLString.hpp" + +using namespace std; +using namespace xercesc; + +void TransformrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { +XMLCh *ref = XMLString::transcode("ref"); +const XMLCh *idref; +DOMDocument *doc = element->getOwnerDocument(); +char *toRelease; +// +// Get the referenced element +// + idref = element->getAttribute(ref); + DOMElement *elem = doc->getElementById(idref); +// +// Check it is the right sort +// + toRelease = XMLString::transcode(elem->getNodeName()); + string nodeName(toRelease); + XMLString::release(&toRelease); + if (nodeName != "transform") { + OUTPUT_STREAM; + msglog << MSG::FATAL<< "Error in xml/gmx file: transformref " << XMLString::transcode(idref) << " referenced a " << nodeName << + " instead of a logvol." << endmsg; + exit(999); // Should do better... + } +// +// Process it +// + gmxUtil.tagHandler.transform.process(elem, gmxUtil, toAdd); + + XMLString::release(&ref); + + return; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx new file mode 100644 index 0000000000000000000000000000000000000000..2222a0186da1850f4e637f6fcd5df38a2da84f87 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx @@ -0,0 +1,119 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Read in the xml and create an in-memory copy of it. +// The first parameter is either the name of a file containing the xml, or a +// (possibly very long) string with the xml itself. The flags parameter indicates which. +// +// flags = 0 (default): file-name +// flags & 1? xml +// flags & 2? compressed xml +// +#include "GeoModelXml/createdomdocument.h" +#include <xercesc/util/PlatformUtils.hpp> +#include <xercesc/dom/DOMImplementation.hpp> +#include <xercesc/dom/DOMImplementationLS.hpp> +#include <xercesc/dom/DOMImplementationRegistry.hpp> +#include "GeoModelXml/StrictErrorHandler.h" +#include "xercesc/util/XMLString.hpp" +#include <iostream> +#include <stdexcept> + +using namespace std; +using namespace xercesc; + +string decompress(const string & compressed); + +DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int flags) { +// +// Initialise Xerces-C +// + try { + XMLPlatformUtils::Initialize(); + } + catch (const xercesc::XMLException &toCatch) { + char *message = XMLString::transcode(toCatch.getMessage()); + cout << "XercesC error during initialization: " << message << "\n"; + XMLString::release(&message); + return 0; + } +// +// Get a DOMLS parser (Document Object Model Load Save) +// + static const XMLCh gLS[] = {chLatin_L, chLatin_S, chNull}; + DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(gLS); + parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0); + DOMConfiguration *config = parser->getDomConfig(); + + config->setParameter(XMLUni::fgDOMNamespaces, true); + config->setParameter(XMLUni::fgXercesSchema, true); + config->setParameter(XMLUni::fgXercesHandleMultipleImports, true); + config->setParameter(XMLUni::fgXercesSchemaFullChecking, true); + config->setParameter(XMLUni::fgDOMValidateIfSchema, true); + config->setParameter(XMLUni::fgDOMDatatypeNormalization, true); +// The next is important if you want to insert elements into the tree. Without it, elements loaded +// from a file included via an !ENTITY are not writable. False should be the default, but for some reason the +// following is still needed + config->setParameter(xercesc::XMLUni::fgDOMEntities, false); + + // And create our error handler and install it + StrictErrorHandler errorHandler; + config->setParameter(XMLUni::fgDOMErrorHandler, &errorHandler); +// +// Parse the file +// + XMLCh *xmlCh(0); + xercesc::DOMDocument *doc; + try { + if (!(flags & 0x1)) { // String is a file name + doc = parser->parseURI(xmlFile.c_str()); + } + else { + string decompressed; + if (flags & 0x2) { // Decompress it + decompressed = decompress(xmlFile); +cout << "Decompressed it\n"; + } + else { + decompressed = xmlFile; + } + xmlCh = XMLString::transcode(decompressed.c_str()); +cout << "Transcoded it\n"; + DOMLSInput *input = impl->createLSInput(); + input->setStringData(xmlCh); + doc = parser->parse(input); +cout << "Parsed it\n"; + } + if (errorHandler.getSawErrors()) { + cout << "Oh oh, saw errors. \n"; +if (flags & 0x1) cout << "\n\n\n" << XMLString::transcode(xmlCh) << "\n\n\n"; + return 0; + } + else { + if (!(flags & 0x1)) { + std::cout << "File " << xmlFile << " successfully parsed.\n"; + } + else { + std::cout << "Database string successfully parsed.\n"; + } + } + } + catch (const XMLException &toCatch) { + char *message = XMLString::transcode(toCatch.getMessage()); + cout << "Parse-file xml exception: \n" << message << "\n"; + XMLString::release(&message); + return 0; + } + catch (const DOMException &toCatch) { + char *message = XMLString::transcode(toCatch.msg); + cout << "DOM exception: \n" << message << "\n"; + XMLString::release(&message); + return 0; + } +// You cannot delete the parser, even though you never refer to it again. It is needed +// to get DOMElement *root etc. +// delete parser; + return doc; +} diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx new file mode 100644 index 0000000000000000000000000000000000000000..6566366cb7c54fd98645251aa43b0ed0c1126ba3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx @@ -0,0 +1,60 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +// +// Decompress a gzipped string to its original form +// +#include <string> +#include <sstream> +#include <algorithm> +#include <stdexcept> + +extern "C" { + #include <zlib.h> +} + +using namespace std; + +string decompress(const string& str) { + + z_stream zs; // z_stream is zlib's control structure +// std::fill_n(&zs, 1, 0); +// memset(&zs, 0, sizeof(zs)); + zs.zalloc = NULL; + zs.zfree = NULL; + zs.opaque = NULL; + zs.next_in = (Bytef *)str.c_str(); + zs.avail_in = str.size(); + + // According to the official manual, 2nd param is windowsBits and is max. 15. But a web page somewhere + // said for gzip files, it should be 16 or'd (or added) to the usual windowsBits. By trial and error, the following works: + int returnCode = inflateInit2(&zs, 0x1f); + if (returnCode != Z_OK) + throw runtime_error(string("decompress: inflateInit2 failed, error code means: ") + string(zError(returnCode))); + + char outBuffer[32768]; + string output; + do { + zs.next_out = reinterpret_cast<Bytef*>(outBuffer); + zs.avail_out = sizeof(outBuffer); + + returnCode = inflate(&zs, 0); + + if (output.size() < zs.total_out) { + output.append(outBuffer, zs.total_out - output.size()); + } + + } while (returnCode == Z_OK); + + inflateEnd(&zs); + + if (returnCode != Z_STREAM_END) { // an error occurred that was not EOF + ostringstream oss; + oss << "decompress: Exception during zlib decompression (code: " << returnCode << "): " + << zs.msg; + throw runtime_error(oss.str()); + } + + return output; +} diff --git a/GeoModelTools/GeoModelXML/LICENSE b/GeoModelTools/GeoModelXML/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..c8f313a89ab99d4c3c3bda6be312aa07d2009497 --- /dev/null +++ b/GeoModelTools/GeoModelXML/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 GeoModelDev + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/GeoModelTools/GeoModelXML/README.md b/GeoModelTools/GeoModelXML/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4b722b4c368de19cfd5653ae03847499a0a027b3 --- /dev/null +++ b/GeoModelTools/GeoModelXML/README.md @@ -0,0 +1,68 @@ +# GeoModelXml + +This package contains a modernised version of Nigel Hessey's GeoModelXml to be +used with `gmex` (GeoModelExplorer) and the corresponding plugin (GMXPlugin) + +Installation requires that the [GeoModel](https://gitlab.cern.ch/GeoModelDev/GeoModel) suite is installed. Please refer to https://gitlab.cern.ch/GeoModelDev/GeoModel/-/blob/master/README.md for additional documentation. + + +## Nigel's documentation + +https://twiki.atlas-canada.ca/pub/AtlasCanada/ITk/gmx2geo.pdf + +## How to build it + +If `GeoModel` is installed: + +```bash +# Clone +git clone ssh://git@gitlab.cern.ch:7999/atlas/geomodelatlas/GeoModelATLAS.git + +# Configure, build, install locally: +mkdir build_geomodelatlas; cd build_geomodelatlas +cmake -DCMAKE_INSTALL_PREFIX=../install/ -DGEOMODELATLAS_BUILD_GEOMODELXML=1 ../GeoModelATLAS +make +make install + +cd .. +``` + +### Post-build setup + +**NOTE:** This is needed **on macOS only**, and only when using a **local** `install` folder (instead of system folders like `usr/local/`). + +This extra step tells the `GMXPlugin` where it can find the other libraries, when loaded as a plugin at runtime: + +```bash +# EXTRA STEP: Add a rpath, only needed on macOS and when using a local 'install' folder +install_name_tool -add_rpath install/lib install/lib/libGMXPlugin.dylib +``` + +## How to run it + +Running the GMXPlugin executes the xerces parser to parse the xml file. The expression evaluator only works if the system language is set to USEnglish, thus do: + +```bash +export LANG=en_US.UTF-8 +``` + +From e.g. your home directory + +```bash +cd install +export GMX_FILES="../GeoModelATLAS/GeoModelXML/data/example1.xml" +bin/gmex lib/libGMXPlugin.1.0.0.dylib (or .so on Linux) +``` + +Once `gmex` is open, click on the **Geo** tab, then check **DisplacedTube** and click on the "Eye" icon. + + +You can also display several `.xml` files at once by exporting a space separated string: + +```bash +cd install +export GMX_FILES="../GeoModelATLAS/GeoModelXml/data/example1.xml ../GeoModelATLAS/GeoModelXml/data/example2.xml ../GeoModelATLAS/GeoModelXml/data/example3.xml" +bin/gmex lib/libGMXPlugin.1.0.0.dylib (or .so on Linux) +``` + +Then, you see 3 items showing up in the **Geo** tab. diff --git a/GeoModelTools/GeoModelXML/data/example1.xml b/GeoModelTools/GeoModelXML/data/example1.xml new file mode 100644 index 0000000000000000000000000000000000000000..6047c5f833687f28fda24824c0918723638bcc51 --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/example1.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [ + +<!-- include the file where the materials are defined --> +<!ENTITY materials SYSTEM "materials.gmx" > + +]> + +<geomodel name="ITk_Example" version="1.0" + xmlns="http://www.nikhef.nl/%7Er29/gmx"> + + <!-- Definition of materials --> + <!-- Load materials --> + &materials; + + <!-- Definition of variables --> + <defines> + <var name="TubeInnerRadius" value="0" /> + <var name="TubeOuterRadius" value="600." /> + <var name="TubeHalfLength" value="1200." /> + </defines> + + <!-- Definition of shapes --> + <shapes> + <tube name="Tube" rmin="TubeInnerRadius" + rmax="TubeOuterRadius" + zhalflength="TubeHalfLength"/> + + <!--box name="Box" xhalflength="100" yhalflength="100" zhalflength="100" /--> + </shapes> + + <!-- Defining logical volumes --> + <!--logvol name="MyBox" shape="Box" material="N2"/--> + <logvol name="MyTube" shape="Tube" material="N2" /> + + <assembly name="DisplacedTube" > + <transform> + <transformation name="negativeShift"> + <translation z="-3000."/> + </transformation> + <logvolref ref="MyTube"/> + </transform> + </assembly> + + + + <!-- Adding volume branches --> + <addbranch> + <assemblyref ref="DisplacedTube" /> + </addbranch> + +</geomodel> diff --git a/GeoModelTools/GeoModelXML/data/example2.xml b/GeoModelTools/GeoModelXML/data/example2.xml new file mode 100644 index 0000000000000000000000000000000000000000..db8c48f609ce66b1f28e9b99f1f2ef1de02fd9eb --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/example2.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [ + +<!-- include the file where the materials are defined --> +<!ENTITY materials SYSTEM "materials.gmx" > + +]> + +<geomodel name="ITk_Example" version="1.0" + xmlns="http://www.nikhef.nl/%7Er29/gmx"> + + <!-- Definition of materials --> + <!-- Load materials --> + &materials; + + <!-- Definition of variables --> + <defines> + <var name="TubeInnerRadius" value="0" /> + <var name="TubeOuterRadius" value="600." /> + <var name="TubeHalfLength" value="1200." /> + </defines> + + <!-- Definition of shapes --> + <shapes> + <box name="Box" xhalflength="1000" yhalflength="2000" zhalflength="1500" /> + </shapes> + + <!-- Defining logical volumes --> + <logvol name="MyBox" shape="Box" material="N2"/> + + <assembly name="DisplacedBox" > + <transform> + <transformation name="positiveShift"> + <translation z="3000."/> + </transformation> + <logvolref ref="MyBox"/> + </transform> + </assembly> + + + <!-- Adding volume branches --> + <addbranch> + <assemblyref ref="DisplacedBox" /> + </addbranch> + +</geomodel> diff --git a/GeoModelTools/GeoModelXML/data/example3.xml b/GeoModelTools/GeoModelXML/data/example3.xml new file mode 100644 index 0000000000000000000000000000000000000000..f90fb06df457c05b845314e9e79b9dcf2ad9b022 --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/example3.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [ + +<!-- include the file where the materials are defined --> +<!ENTITY materials SYSTEM "materials.gmx" > + +]> + +<geomodel name="ITk_Example" version="1.0" + xmlns="http://www.nikhef.nl/%7Er29/gmx"> + + <!-- Definition of materials --> + <!-- Load materials --> + &materials; + + <!-- Definition of variables --> + <defines> + <var name="TubeInnerRadius" value="0" /> + <var name="TubeOuterRadius" value="600." /> + <var name="TubeHalfLength" value="1200." /> + </defines> + + <!-- Definition of shapes --> + <shapes> + <tube name="Tube" rmin="TubeInnerRadius" + rmax="TubeOuterRadius" + zhalflength="TubeHalfLength"/> + + <box name="Box" xhalflength="100" yhalflength="100" zhalflength="100" /> + </shapes> + + <!-- Defining logical volumes --> + <logvol name="MyBox" shape="Box" material="N2"/> + <logvol name="MyTube" shape="Tube" material="Air" > + <transform> + <transformation name="MyBoxShift" > + <translation z="250" /> + </transformation> + <logvolref ref="MyBox" /> + </transform> + </logvol> + + + <!-- Adding volume branches --> + <addbranch> + <logvolref ref="MyTube" /> + </addbranch> + +</geomodel> + diff --git a/GeoModelTools/GeoModelXML/data/geomodel.dtd b/GeoModelTools/GeoModelXML/data/geomodel.dtd new file mode 100644 index 0000000000000000000000000000000000000000..e0b0d314610b42f658d0c2bb244623168af97ea5 --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/geomodel.dtd @@ -0,0 +1,251 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- Copyright N.P. Hessey, Nikhef, 2013 --> + +<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)> + <!ATTLIST geomodel name CDATA "Unnamed detector" + version CDATA "0.0" + xmlns CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx"> + + <!ELEMENT defines (var|vector|matrix)+> + + <!ELEMENT var EMPTY> + <!ATTLIST var name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT vector EMPTY> + <!ATTLIST vector name ID #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT matrix EMPTY> + <!ATTLIST matrix name ID #REQUIRED + coldim CDATA #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT materials ((element|chemical|material)+)> + <!ATTLIST materials densitysf CDATA "1.0"> + + <!ELEMENT element EMPTY> + <!ATTLIST element name ID #REQUIRED + shortname NMTOKEN #REQUIRED + Z CDATA #REQUIRED + A CDATA #REQUIRED> + + <!ELEMENT chemical (elemcontent)+> + <!ATTLIST chemical name ID #REQUIRED> + <!ELEMENT elemcontent EMPTY> + <!ATTLIST elemcontent ref IDREF #REQUIRED + quantity CDATA #REQUIRED> + + <!ELEMENT material (elementref|materialref|chemicalref)+> + <!ATTLIST material name ID #REQUIRED + density CDATA #REQUIRED> + + <!ELEMENT elementref EMPTY> + <!ATTLIST elementref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT materialref EMPTY> + <!ATTLIST materialref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT chemicalref EMPTY> + <!ATTLIST chemicalref ref IDREF #REQUIRED + fraction CDATA #REQUIRED> + + <!ELEMENT readoutgeometry (param*, sensorclass+)> + <!ELEMENT param EMPTY> + <!ATTLIST param name NMTOKEN #REQUIRED + value CDATA #REQUIRED> + <!ELEMENT sensorclass (param*, sensortype+)> + <!ATTLIST sensorclass name ID #REQUIRED> + <!ELEMENT sensortype (param*)> + <!ATTLIST sensortype name ID #REQUIRED> + + <!ELEMENT positionindex (addindex+)> + <!ELEMENT addindex EMPTY> + <!ATTLIST addindex name ID #REQUIRED> + + <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union|simplepolygonbrep)+)> + <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case --> + + <!ELEMENT simplepolygonbrep EMPTY> + <!ATTLIST simplepolygonbrep name ID #REQUIRED + xpoints CDATA #REQUIRED + ypoints CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT box EMPTY> + <!ATTLIST box name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT cons EMPTY> + <!ATTLIST cons name ID #REQUIRED + rmin1 CDATA #REQUIRED + rmin2 CDATA #REQUIRED + rmax1 CDATA #REQUIRED + rmax2 CDATA #REQUIRED + dz CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT generictrap EMPTY> + <!ATTLIST generictrap name ID #REQUIRED + x0 CDATA #REQUIRED + y0 CDATA #REQUIRED + x1 CDATA #REQUIRED + y1 CDATA #REQUIRED + x2 CDATA #REQUIRED + y2 CDATA #REQUIRED + x3 CDATA #REQUIRED + y3 CDATA #REQUIRED + x4 CDATA #REQUIRED + y4 CDATA #REQUIRED + x5 CDATA #REQUIRED + y5 CDATA #REQUIRED + x6 CDATA #REQUIRED + y6 CDATA #REQUIRED + x7 CDATA #REQUIRED + y7 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT para EMPTY> + <!ATTLIST para name ID #REQUIRED + xhalflength CDATA #REQUIRED + yhalflength CDATA #REQUIRED + zhalflength CDATA #REQUIRED + alpha CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED> + + <!ELEMENT pcon (addplane, addplane+)> + <!ELEMENT addplane EMPTY> + <!ATTLIST addplane zplane CDATA #REQUIRED + rminplane CDATA #REQUIRED + rmaxplane CDATA #REQUIRED> + + <!ATTLIST pcon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT pgon (addplane, addplane+)> + <!ATTLIST pgon name ID #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED + nsides CDATA #REQUIRED> + + <!ELEMENT trap EMPTY> + <!ATTLIST trap name ID #REQUIRED + zhalflength CDATA #REQUIRED + theta CDATA #REQUIRED + phi CDATA #REQUIRED + dydzn CDATA #REQUIRED + dxdyndzn CDATA #REQUIRED + dxdypdzn CDATA #REQUIRED + angleydzn CDATA #REQUIRED + dydzp CDATA #REQUIRED + dxdyndzp CDATA #REQUIRED + dxdypdzp CDATA #REQUIRED + angleydzp CDATA #REQUIRED> + + <!ELEMENT tube EMPTY> + <!ATTLIST tube name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT tubs EMPTY> + <!ATTLIST tubs name ID #REQUIRED + rmin CDATA #REQUIRED + rmax CDATA #REQUIRED + zhalflength CDATA #REQUIRED + sphi CDATA #REQUIRED + dphi CDATA #REQUIRED> + + <!ELEMENT trd EMPTY> + <!ATTLIST trd name ID #REQUIRED + xhalflength1 CDATA #REQUIRED + xhalflength2 CDATA #REQUIRED + yhalflength1 CDATA #REQUIRED + yhalflength2 CDATA #REQUIRED + zhalflength CDATA #REQUIRED> + + <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST intersection name ID #REQUIRED> + + <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST subtraction name ID #REQUIRED> + + <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)> + <!ATTLIST union name ID #REQUIRED> + + <!ELEMENT shaperef EMPTY> + <!ATTLIST shaperef ref IDREF #REQUIRED> + + <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))> + <!ATTLIST transform name ID #IMPLIED + alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number --> + + <!ELEMENT transformation (scaling|rotation|translation)+> + + <!ELEMENT scaling EMPTY> + <!ATTLIST scaling x CDATA "1.0" + y CDATA "1.0" + z CDATA "1.0"> + + <!ELEMENT rotation EMPTY> + <!ATTLIST rotation xcos CDATA "0.0" + ycos CDATA "0.0" + zcos CDATA "0.0" + angle CDATA "0.0"> + + <!ELEMENT translation EMPTY> + <!ATTLIST translation x CDATA "0.0" + y CDATA "0.0" + z CDATA "0.0"> + + <!ATTLIST transformation name ID #REQUIRED> + <!ATTLIST transformation alignable (true|false) "false"> + + <!ELEMENT transformationref EMPTY> + <!ATTLIST transformationref ref IDREF #REQUIRED> + + <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*> + <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme --> + <!ATTLIST logvol name ID #REQUIRED + shape IDREF #REQUIRED + material IDREF #REQUIRED + sensitive IDREF #IMPLIED + alignable (true|false) "false"> + + <!ELEMENT index EMPTY> + <!ATTLIST index ref IDREF #REQUIRED + value CDATA #REQUIRED> + + <!ELEMENT logvolref EMPTY> + <!ATTLIST logvolref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+> + <!ATTLIST assembly name ID #REQUIRED + alignable (true|false) "false"> + + <!ELEMENT assemblyref EMPTY> + <!ATTLIST assemblyref ref IDREF #REQUIRED + zeroid (true|false) "false"> + + <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))> + <!-- Removed logvol and assembly from multicopy content. There is no particular reason + why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding + the index stuff. If you need them, put them back. Got rid of transformref; never used. --> + <!-- loopvar: Set to a vector variable name or omit; see manual --> + <!-- alignable: Value is the alignment level-number --> + <!ATTLIST multicopy name ID #REQUIRED + n CDATA #REQUIRED + loopvar CDATA #IMPLIED + alignable CDATA #IMPLIED> + <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice --> + + <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+> + diff --git a/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json b/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json new file mode 100644 index 0000000000000000000000000000000000000000..4e58ddc467cf951c854350c5ecb16861064ef31d --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json @@ -0,0 +1,193 @@ +{ + "MatVisAttributes": [ + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.3 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.3 + }, + "emissive": { + "B": 1.0, + "G": 0.0, + "R": 0.0 + }, + "name": [ + "Air" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 1.0, + "G": 0.0, + "R": 0.0 + }, + "transparency": 0.8 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.3 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.3 + }, + "emissive": { + "B": 0.0, + "G": 0.5, + "R": 0.0 + }, + "name": [ + "N2","ArCO2" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 0.0, + "G": 1.0, + "R": 0.0 + }, + "transparency": 0.5 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "emissive": { + "B": 0.0, + "G": 0.0, + "R": 0.4 + }, + "name": [ + "BeMetal" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 0.0, + "G": 0.0, + "R": 1.0 + }, + "transparency": 0.5 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "emissive": { + "B": 0.7, + "G": 0.7, + "R": 0.0 + }, + "name": [ + "SiliconMat" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 1.0, + "G": 1.0, + "R": 0.0 + }, + "transparency": 0.0 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "diffuse": { + "B": 0.7, + "G": 0.7, + "R": 0.6 + }, + "emissive": { + "B": 0.7, + "G": 0.7, + "R": 0.0 + }, + "name": [ + "AlMetal" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 1.0, + "G": 1.0, + "R": 0.0 + }, + "transparency": 0.0 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "emissive": { + "B": 0.0, + "G": 0.7, + "R": 0.7 + }, + "name": [ + "HybridPCB","Teflon" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 0.0, + "G": 1.0, + "R": 1.0 + }, + "transparency": 0.0 + }, + { + "ambient": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "diffuse": { + "B": 0.3, + "G": 0.3, + "R": 0.6 + }, + "emissive": { + "B": 0.33, + "G": 0.0, + "R": 0.33 + }, + "name": [ + "Bakelite" + ], + "shininess": 0.900000166893005, + "specular": { + "B": 0.0, + "G": 1.0, + "R": 1.0 + }, + "transparency": 0.0 + } + ] +} diff --git a/GeoModelTools/GeoModelXML/data/materials.gmx b/GeoModelTools/GeoModelXML/data/materials.gmx new file mode 100644 index 0000000000000000000000000000000000000000..b5591c0b084e912eea7615df7f1d5dfe0fef66d6 --- /dev/null +++ b/GeoModelTools/GeoModelXML/data/materials.gmx @@ -0,0 +1,61 @@ +<materials> + + <element name="Hydrogen" shortname="H" Z="1" A="1.00794"/> + <element name="Berylium" shortname="Be" Z="4" A="9.012182"/> + <element name="Carbon" shortname="C" Z="6" A="12.011"/> + <element name="Nitrogen" shortname="N" Z="7" A="14.00674"/> + <element name="Oxygen" shortname="O" Z="8" A="15.9994"/> + <element name="Aluminium" shortname="Al" Z="13" A="26.981539"/> + <element name="Silicon" shortname="Si" Z="14" A="28.0855"/> + <element name="Argon" shortname="Ar" Z="18" A="39.948"/> + <element name="Iron" shortname="Fe" Z="26" A="55.845"/> + <element name="Copper" shortname="Cu" Z="29" A="63.546"/> + <element name="Silver" shortname="Ag" Z="47" A="107.8682"/> + + + <material name="N2" density="1.2504e-3 * 273.15/293.15 * 96265/100000"> + <elementref fraction="1.00000" ref="Nitrogen"/> + </material> + + <material name="Air" density="1.205e-3"> + <elementref fraction="0.7541" ref="Nitrogen"/> + <elementref fraction="0.2321" ref="Oxygen"/> + <elementref fraction="0.0138" ref="Argon"/> + </material> + + <material name="ArgonGas" density="1.789e-3" > + <elementref fraction="1.00000" ref="Argon"/> + </material> + + <chemical name="CO2"> + <elemcontent ref="Carbon" quantity="1"/> + <elemcontent ref="Oxygen" quantity="2"/> + </chemical> + + <material name="CO2Gas" density="1.98e-3"> + <chemicalref fraction="1" ref="CO2"/> + </material> + + <chemical name="Phenol"> + <elemcontent ref="Carbon" quantity="6"/> + <elemcontent ref="Hydrogen" quantity="6"/> + <elemcontent ref="Oxygen" quantity="1"/> + </chemical> + + <chemical name="Formaldehyde"> + <elemcontent ref="Carbon" quantity="1"/> + <elemcontent ref="Hydrogen" quantity="2"/> + <elemcontent ref="Oxygen" quantity="1"/> + </chemical> + + <material name="Bakelite" density="1.3" > + <chemicalref ref="Phenol" fraction="0.5" /> + <chemicalref ref="Formaldehyde" fraction="0.5" /> + </material> + + <material name="ArCO2" density="1.79e-3" > + <materialref ref="ArgonGas" fraction="0.93" /> + <materialref ref="CO2Gas" fraction="0.7" /> + </material> + +</materials>