<?xml version="1.0" encoding="UTF-8"?>
<lccdd>
  <comment> 
    ---------------
    Silicon Tracker
    ---------------


    Some references:
    With some added info on ITS3 chip from
    https://indico.bnl.gov/event/10677/contributions/45591/attachments/33204/53254/20210318-IR2%40EIC-SVT.pdf
    To be used as standin until we get more detailed specs from the working group on the tracker.

    Note: initial implementation with hard-coded values,
    TODO: add parametrization
  </comment>

  <define>

    <constant name="TrackerBarrelSpaceFrame_width"   value="42.0*mm"/>
    <constant name="TrackerBarrelSpaceFrame_height"  value="sqrt(3.0)*42.0*mm/2.0"/>
    <constant name="TrackerSensor_thickness"   value="0.03*mm"/>
    <constant name="TrackerBarrel_thickness"         value="0.55/100*9.37*cm"/>
    <constant name="TrackerBarrelService_thickness"  value="TrackerBarrel_thickness-TrackerSensor_thickness"/>

    <comment>
      Layer_rOffset is used to add inside space so the _rmin value is the nominal sensor radius.
    </comment>
    <constant name="TrackerBarrelLayer_rOffset" value="0.5*cm"/>
    <constant name="TrackerBarrelInner_rmin1"       value="21.0*cm"/>
    <constant name="TrackerBarrelInner_rmin2"       value="TrackerBarrelInner_rmin1 + TrackerBarrelSpaceFrame_width"/>
    <constant name="TrackerBarrelInner_length1"     value="54.0*cm"/>
    <constant name="TrackerBarrelInner_length2"     value="60.0*cm"/>

    <constant name="TrackerBarrelOuter_rmin1"       value="39.3*cm"/>
    <constant name="TrackerBarrelOuter_rmin2"       value="TrackerBarrelOuter_rmin1 + TrackerBarrelSpaceFrame_width"/>
    <constant name="TrackerBarrelOuter_length1"     value="105.0*cm"/>
    <constant name="TrackerBarrelOuter_length2"     value="114.0*cm"/>

    <constant name="TrackerBarrelInner_thickness"  value="TrackerBarrelInner_rmin2 - TrackerBarrelInner_rmin1"/>
    <constant name="TrackerBarrelOuter_thickness"  value="TrackerBarrelOuter_rmin2 - TrackerBarrelOuter_rmin1"/>
    <constant name="TrackerBarrelInner_length"     value="TrackerBarrelInner_length2"/>
    <constant name="TrackerBarrelOuter_length"     value="TrackerBarrelOuter_length2"/>

    <comment>
      Here we are assuming the two endcaps (P and N) are symmetric.
    </comment>
    <constant name="TrackerEndcap_thickness"        value="0.25/100*9.37*cm"/>
    <constant name="TrackerEndcapService_thickness" value="TrackerEndcap_thickness-TrackerSensor_thickness"/>
    <constant name="TrackerEndcapLayer_length"      value="5.0*cm"/>

    <constant name="TrackerEndcapInner_nLayers"          value="2"/>
    <constant name="TrackerEndcapOuter_nLayers"          value="3"/>

    <constant name="TrackerEndcapInner_zmin"        value="TrackerBarrelInner_length/2.0"/>
    <constant name="TrackerEndcapInner_zmax"        value="TrackerEndcapInner_zmin + 2.0*TrackerEndcapLayer_length "/>
    <constant name="TrackerEndcapInner_length"        value="TrackerEndcapInner_zmax- TrackerEndcapInner_zmin"/>
    <constant name="TrackerEndcapInnerLayer_dz"        value="TrackerEndcapInner_length/TrackerEndcapInner_nLayers"/>

    <constant name="TrackerEndcapOuter_zmin"        value="TrackerBarrelOuter_length/2.0"/>
    <constant name="TrackerEndcapOuter_zmax"        value="CentralTracking_length/2.0"/>
    <constant name="TrackerEndcapOuter_length"        value="TrackerEndcapOuter_zmax- TrackerEndcapOuter_zmin"/>
    <constant name="TrackerEndcapOuterLayer_dz"        value="TrackerEndcapOuter_length/TrackerEndcapOuter_nLayers"/>

    <constant name="TrackerEndcapInner_rmin1" value="Beampipe_rmax+1.0*cm"/>
    <constant name="TrackerEndcapInner_rmin2" value="Beampipe_rmax+1.0*cm"/>
    <constant name="TrackerEndcapOuter_rmin"  value="3.18*cm"/>

    <constant name="TrackerEndcapInner_rmax1" value="18.5*cm"/>
    <constant name="TrackerEndcapInner_rmax2" value="18.5*cm + TrackerBarrelInner_thickness"/>
    <constant name="TrackerEndcapOuter_rmax"  value="43.23*cm"/>


    <comment> TODO: These should be computed </comment>
    <constant name="TrackerBarrelInner_NModules" value="30"/>
    <constant name="TrackerBarrelOuter_NModules" value="56"/>

  </define>

  <display>
  </display>

  <detectors>

    <comment>
      -----------------------------------
      Inner Tracker Subassembly (group 1)
      -----------------------------------
      Note: Endcap trackers are using SimpleDiskTracker construction.
            This should be changed to something more detailed in the future.
    </comment>
    <detector id="TrackerSubAssemblyLayer1_ID"
      name="TrackerSubAssemblyLayer1"
      type="DD4hep_SubdetectorAssembly"
      vis="TrackerSubAssemblyVis">
      <composite name="TrackerEndcapN_Layer1"/>
      <composite name="TrackerEndcapP_Layer1"/>
      <composite name="TrackerBarrel_Layer1"/>
    </detector>

    <detector
      id="TrackerBarrel_Layer1_ID"
      name="TrackerBarrel_Layer1"
      type="athena_TrackerBarrel"
      readout="TrackerBarrelHits"
      insideTrackingVolume="true">
      <dimensions
        rmin="TrackerBarrelInner_rmin1-TrackerBarrelLayer_rOffset"
        rmax="TrackerBarrelInner_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelInner_thickness"
        length="TrackerBarrelInner_length"/>
      <comment>
        Tracker Barrel Modules
      </comment>
      <module name="TrackerBarrelInner_Module1" vis="PurpleVis">
        <frame 
          width="TrackerBarrelSpaceFrame_width"  
          height="TrackerBarrelSpaceFrame_height" 
          length="TrackerBarrelInner_length1"
          thickness="0.1*mm" material="CarbonFiber_25percent" vis="BlueGreenVis" />
        <module_component name="silicon" 
          width="TrackerBarrelSpaceFrame_width"
          length="TrackerBarrelInner_length1-0.1*mm" thickness="0.05*mm" material="Silicon" sensitive="true">
          <position z="-0.025*mm" y="0*mm"/>
        </module_component>
      </module>
      <comment>
        Tracker Barrel Inner Layers
      </comment>
      <layer module="TrackerBarrelInner_Module1" id="1" vis="VertexVis">
        <barrel_envelope
          inner_r="TrackerBarrelInner_rmin1-TrackerBarrelLayer_rOffset"
          outer_r="TrackerBarrelInner_rmin1-TrackerBarrelLayer_rOffset + TrackerBarrelInner_thickness"
          z_length="TrackerBarrelInner_length1"/>
        <rphi_layout phi_tilt="10.0*degree" nphi="TrackerBarrelInner_NModules" phi0="0.0" rc="TrackerBarrelInner_rmin1" dr="0.0 * mm"/>
        <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
      </layer>
      <layer module="TrackerBarrelInner_Module1" id="2" vis="VertexVis">
        <barrel_envelope
          inner_r="TrackerBarrelInner_rmin2-TrackerBarrelLayer_rOffset"
          outer_r="TrackerBarrelInner_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelInner_thickness"
          z_length="TrackerBarrelInner_length2"/>
        <rphi_layout phi_tilt="10.0*degree" nphi="TrackerBarrelInner_NModules" phi0="0.0" rc="TrackerBarrelInner_rmin2" dr="0.0 * mm"/>
        <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
      </layer>
    </detector>

    <detector id="TrackerEndcapP_Layer1_ID" 
      name="TrackerEndcapP_Layer1" 
      type="athena_SimpleDiskTracker"
      insideTrackingVolume="true" 
      reflect="false" vis="AnlRed">
      <position x="0" y="0" z="0"/>
      <layer id="1" vis="AnlOrange"
        inner_z="TrackerEndcapInner_zmin + 0*TrackerEndcapInnerLayer_dz" 
        inner_r="TrackerEndcapInner_rmin1" 
        outer_r="TrackerEndcapInner_rmax1">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="2" vis="AnlOrange"
        inner_z="TrackerEndcapInner_zmin + 1*TrackerEndcapInnerLayer_dz" 
        inner_r="TrackerEndcapInner_rmin2" 
        outer_r="TrackerEndcapInner_rmax2">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
    </detector>

    <detector id="TrackerEndcapN_Layer1_ID" 
      name="TrackerEndcapN_Layer1" 
      type="athena_SimpleDiskTracker"
      insideTrackingVolume="true" 
      reflect="true" vis="AnlRed">
      <position x="0" y="0" z="0"/>
      <layer id="1" vis="AnlOrange"
        inner_z="TrackerEndcapInner_zmin + 0*TrackerEndcapInnerLayer_dz" 
        inner_r="TrackerEndcapInner_rmin1" 
        outer_r="TrackerEndcapInner_rmax1">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="2" vis="AnlOrange"
        inner_z="TrackerEndcapInner_zmin + 1*TrackerEndcapInnerLayer_dz" 
        inner_r="TrackerEndcapInner_rmin2" 
        outer_r="TrackerEndcapInner_rmax2">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
    </detector>

    <comment>
      -----------------------------------
      Outer Tracker Subassembly (group 2)
      -----------------------------------
    </comment>
    <detector id="TrackerSubAssemblyLayer2_ID"
      name="TrackerSubAssemblyLayer2"
      type="DD4hep_SubdetectorAssembly"
      vis="TrackerSubAssemblyVis">
      <composite name="TrackerEndcapN_Layer2"/>
      <composite name="TrackerEndcapP_Layer2"/>
      <composite name="TrackerBarrel_Layer2"/>
    </detector>
    <detector
      id="TrackerBarrel_Layer2_ID"
      name="TrackerBarrel_Layer2"
      type="athena_TrackerBarrel"
      readout="TrackerBarrelHits"
      insideTrackingVolume="true">
      <dimensions
        rmin="TrackerBarrelOuter_rmin1-TrackerBarrelLayer_rOffset"
        rmax="TrackerBarrelOuter_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelOuter_thickness"
        length="TrackerBarrelOuter_length"/>
      <comment>
        Tracker Barrel Modules
      </comment>
      <module name="TrackerBarrelOuter_Module1" vis="PurpleVis">
        <frame 
          width="TrackerBarrelSpaceFrame_width"  
          height="TrackerBarrelSpaceFrame_height" 
          length="TrackerBarrelOuter_length1"
          thickness="0.1*mm" material="CarbonFiber_25percent" vis="BlueGreenVis" />
        <module_component name="silicon" 
          width="TrackerBarrelSpaceFrame_width"
          length="TrackerBarrelOuter_length1-0.1*mm" 
          thickness="0.05*mm" material="Silicon" sensitive="true">
          <position z="-0.025*mm" y="0*mm"/>
        </module_component>
      </module>
      <comment>
        Tracker Barrel Inner Layers
      </comment>
      <layer module="TrackerBarrelOuter_Module1" id="1" vis="VertexVis">
        <barrel_envelope
          inner_r="TrackerBarrelOuter_rmin1-TrackerBarrelLayer_rOffset"
          outer_r="TrackerBarrelOuter_rmin1-TrackerBarrelLayer_rOffset + TrackerBarrelOuter_thickness"
          z_length="TrackerBarrelOuter_length"/>
        <rphi_layout phi_tilt="10.0*degree" nphi="TrackerBarrelOuter_NModules" phi0="0.0" rc="TrackerBarrelOuter_rmin1" dr="0.0 * mm"/>
        <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
      </layer>
      <layer module="TrackerBarrelOuter_Module1" id="2" vis="VertexVis">
        <barrel_envelope
          inner_r="TrackerBarrelOuter_rmin2-TrackerBarrelLayer_rOffset"
          outer_r="TrackerBarrelOuter_rmin2-TrackerBarrelLayer_rOffset + TrackerBarrelOuter_thickness"
          z_length="TrackerBarrelOuter_length"/>
        <rphi_layout phi_tilt="10.0*degree" nphi="TrackerBarrelOuter_NModules" phi0="0.0" rc="TrackerBarrelOuter_rmin2" dr="0.0 * mm"/>
        <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
      </layer>
    </detector>

    <detector id="TrackerEndcapP_Layer2_ID" 
      name="TrackerEndcapP_Layer2" 
      type="athena_SimpleDiskTracker"
      insideTrackingVolume="true" 
      reflect="false" vis="AnlRed">
      <position x="0" y="0" z="0"/>
      <layer id="1" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 0*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="2" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 1*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="3" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 2*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
    </detector>

    <detector id="TrackerEndcapN_Layer2_ID" 
      name="TrackerEndcapN_Layer2" 
      type="athena_SimpleDiskTracker"
      insideTrackingVolume="true" 
      reflect="true" vis="AnlRed">
      <position x="0" y="0" z="0"/>
      <layer id="1" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 0*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="2" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 1*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
      <layer id="3" vis="AnlOrange"
        inner_z="TrackerEndcapOuter_zmin + 2*TrackerEndcapOuterLayer_dz" 
        inner_r="TrackerEndcapOuter_rmin" 
        outer_r="TrackerEndcapOuter_rmax">
        <slice material="Silicon" thickness="0.5*mm" vis="AnlOrange" />
      </layer>
    </detector>

  </detectors>

  <readouts>
    <readout name="TrackerBarrelHits">
      <segmentation type="CartesianGridXY" grid_size_x="0.150*mm" grid_size_y="0.150*mm" />
      <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id>
    </readout>
    <readout name="TrackerEndcapHits">
      <segmentation type="CartesianGridXY" grid_size_x="0.20*mm" grid_size_y="0.20*mm" />
      <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id>
    </readout>
  </readouts>


</lccdd>