Track strategy tuning

The LCSim Java package (nameley the SeedTracker driver) used for track reconstruction in the FPaDSim software chain relies on a list of “tracking strategies,” which is a list of tracking layer collections for seeding, confirming, and extending tracks. These collections must be optimized for a particular geometry configuration and can be tuned for minimum number of hits, max chi^2, etc. In order to optimize the strategies list, a representative data set must be simulated, containing a significant number of tracks that span the phase space and particle species to be tracked. This then serves as an input to the strategy list builder built into the LCSim package. Additionally, a set of configuration files specify the requirements of the track fit, and the parameters used for the seeding algorithm.

The ingredients for building the strategy list are…

  • traningSample.slcio - An LCIO file filled with simulated particles
  • strategyBuilder.xml - A configuration file for building the strategy list
  • prototypeStrategy.xml - A prototype tracking strategy
  • layerWeights.xml - A file for specifying weights for seed layers

trainingSample.slcio

Generated in FPaDSim with SLIC, this file serves as a broad representation of tracks to be fitted. A reasonable approach is to fill this file with various species of particles, each flatly distributed in pseudorapidity and an appropriate range of transverse momenta. It is possible to simulate the different particle species separately, and then concatenate the slcio files.

strategyBuilder.xml

An example file is found below. This file tells LCSim to run the StrategyBuilder driver, and gives seed parameters like minimum number of hit layers, and the number of layers used for seeding are specified.

<lcsim xmlns:lcsim="http://www.lcsim.org/schemas/lcsim/1.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
  <inputFiles>
    <file>${trainingSampleFile}</file>
  </inputFiles>
  <control>
    <numberOfEvents>-1</numberOfEvents>
    <verbose>false</verbose>
    <printDriverStatistics>true</printDriverStatistics>
    <printDriversDetailed>true</printDriversDetailed>
  </control>
  <execute>
    <driver name="StrategyBuilder"></driver>
  </execute>
  <drivers>
    <driver name="StrategyBuilder" type="org.lcsim.recon.tracking.seedtracker.strategybuilder.StrategyBuilder">
      <output type="String">${outputStrategyFile}</output>
      <symmetrize type="boolean">true</symmetrize>
      <layerWeight type="String">${layerWeightsFile}</layerWeight>
      <strategyPrototype type="String">${prototypeStrategyFile}</strategyPrototype>
      <minLayers type="int">5</minLayers>
      <numConfirmLayers type="int">1</numConfirmLayers>
      <numSeedLayers type="int">3</numSeedLayers>
      <verbose type="boolean">true</verbose>
    </driver>
  </drivers>
</lcsim>

prototypeStrategy.xml

An example file is found below. In this file, fit requirements like maximum chi^2 are specified.

<?xml version="1.0" encoding="UTF-8"?>
<StrategyList xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://lcsim.org/recon/tracking/seedtracker/strategybuilder/strategies.xsd">
  <TargetDetector>sieic5</TargetDetector>
  <Strategy name="Prototype Strategy">
    <MinPT>0.2</MinPT>
    <MinHits>5</MinHits>
    <MinConfirm>1</MinConfirm>
    <MaxDCA>5.0</MaxDCA>
    <MaxZ0>10.0</MaxZ0>
    <MaxChisq>10.0</MaxChisq>
    <BadHitChisq>5.0</BadHitChisq>
    <Layers>
      <Layer type="Seed" layer_number="1" detector_name="SiVertexBarrel" be_flag="BARREL" />
      <Layer type="Seed" layer_number="2" detector_name="SiVertexBarrel" be_flag="BARREL" />
      <Layer type="Seed" layer_number="3" detector_name="SiVertexBarrel" be_flag="BARREL" />
      <Layer type="Confirm" layer_number="1" detector_name="SiTrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="5" detector_name="SiVertexBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="1" detector_name="SiTrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="2" detector_name="SiTrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="3" detector_name="SiTrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="4" detector_name="SiTrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="5" detector_name="SiTrackerBarrel" be_flag="BARREL" />
    </Layers>
  </Strategy>
</StrategyList>

layerWeights.xml

An example file is found below.

<?xml version="1.0" encoding="UTF-8"?>
<LayerWeight xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
             xs:noNamespaceSchemaLocation="http://lcsim.org/recon/tracking/seedtracker/strategybuilder/layerweights.xsd">
  <!--Based on layer weights for sid02.-->
  <!--Default used for any not already defined-->
  <DefaultReadoutEfficiency>1.0</DefaultReadoutEfficiency>
  <ReadoutEfficiencies>
    <ReadoutEfficiency readout="TkrBarrHits">1.</ReadoutEfficiency>
    <ReadoutEfficiency readout="TkrEndcapHits">1.</ReadoutEfficiency>
    <ReadoutEfficiency readout="VtxBarrHits">0.99</ReadoutEfficiency>
    <ReadoutEfficiency readout="VtxEndcapHits">0.99</ReadoutEfficiency>
    <ReadoutEfficiency readout="TkrForwardHits">0.99</ReadoutEfficiency>
  </ReadoutEfficiencies>
  <DefaultWeight>1.0</DefaultWeight>
  <TargetDetector divide_by_two_in_tracker_endcap="false" divide_by_two_in_tracker_forward="false">sieic5</TargetDetector>
  <AdjacenceMultiplier>0.5</AdjacenceMultiplier>
  <Layers>
    <!--Barrel-->
    <Layer layer_number="5" detector_name="TrackerBarrel" be_flag="BARREL">2.01</Layer>
    <Layer layer_number="4" detector_name="TrackerBarrel" be_flag="BARREL">2.02</Layer>
    <Layer layer_number="3" detector_name="TrackerBarrel" be_flag="BARREL">2.03</Layer>
    <Layer layer_number="2" detector_name="TrackerBarrel" be_flag="BARREL">2.04</Layer>
    <Layer layer_number="1" detector_name="TrackerBarrel" be_flag="BARREL">2.05</Layer>
    <Layer layer_number="5" detector_name="VertexBarrel" be_flag="BARREL">3.06</Layer>
    <Layer layer_number="4" detector_name="VertexBarrel" be_flag="BARREL">3.07</Layer>
    <Layer layer_number="3" detector_name="VertexBarrel" be_flag="BARREL">3.08</Layer>
    <Layer layer_number="2" detector_name="VertexBarrel" be_flag="BARREL">0</Layer>
    <Layer layer_number="1" detector_name="VertexBarrel" be_flag="BARREL">0</Layer>
    <!--North Endcap-->
    <Layer layer_number="4" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.01</Layer>
    <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.02</Layer>
    <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.03</Layer>
    <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.04</Layer>
    <Layer layer_number="3" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.05</Layer>
    <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.06</Layer>
    <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.07</Layer>
    <Layer layer_number="4" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.08</Layer>
    <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.09</Layer>
    <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.10</Layer>
    <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.11</Layer>
    <!--South Endcap-->
    <Layer layer_number="4" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.01</Layer>
    <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.02</Layer>
    <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.03</Layer>
    <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.04</Layer>
    <Layer layer_number="3" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.05</Layer>
    <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.06</Layer>
    <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.07</Layer>
    <Layer layer_number="4" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.08</Layer>
    <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.09</Layer>
    <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.10</Layer>
    <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.11</Layer>
  </Layers>
</LayerWeight>

Running the strategy builder

The strategies list can then be built by running the following command…

java -jar <lcsim distribution jar path> \
  -DprototypeStrategyFile=prototypeStrategy.xml \
  -DlayerWeightsFile=layerWeights.xml \
  -DtrainingSampleFile=trainingSample.slcio \
  -DoutputStrategyFile=trackingStrategies.xml \
  strategyBuilder.xml

The trackingStrategies.xml file is the output of the StrategyBuilder driver, which can then be passed to the SeedTracker driver during reconstruction.