How to Reconstruct Tracks

This tutorial describes how track reconstruction in LCSim is done. It will explain the SeedTracker Algorithm, how to create tracking strategies for this algorithm and finally give example steering files for LCSim.

SeedTracker Algorithm

The SeedTracker algorithm is a generic track finding algorithm based on a helix fitter. It creates Tracks from a set of HelicalTrackHits. The HelicalTrackHits are 3D space points with a covariance matrix to estimate the error. These have to be created from SimTrackerHits during a digitization step. The whole fitting process is steered by strategies. A Strategy defines the role of each layer in the tracking device. These roles can be seed, confirm or extend and define which hits can be used to form the initial track candidates and which are just used to confirm and extend the track.

The algorithm is generic in that it can handle the track reconstruction of an all silicon tracking device independent of its geometry. The geometry information is decoupled by the use of strategies. A different detector layout requires a different set of strategies for a successful track reconstruction. The algorithm is also independent of the actual detector technology choice (Si pixels, Si strips, Si stereo strips and their sizes) because this is handles before and it just takes HelicalTrackHits as input.

Strategies

A strategy defines a role for each layer in the tracking device and thus steers the whole tracking process. There are three roles:
Seed
All combination of hits in the seed layers (usually 3) which can be connected by a helix form the set of track candidates. They do not have to be adjacent layers.
Confirm
The track candidates are then extrapolated to the confirmation layer (usually one) and either confirmed or rejected as a possible track.
Extension
All remaining layers are usually defined as extension layers. All hits in these layers can be used to extend a confirmed track candidate to the minimum number of required hits for a final track.
All these helix fits are controlled by a cut which can be set in the strategy.

This is an example of a barrel-only strategy using the outer vertex layers as seed layers and trying to extend the tracks throughout the main tracker:

<?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>clic01_sid</TargetDetector>
  <Strategy name="BARRELONLY_LOWPT">
    <!--Cutoffs-->
    <MinPT>0.2</MinPT>
    <MinHits>6</MinHits>
    <MinConfirm>1</MinConfirm>
    <MaxDCA>10.0</MaxDCA>
    <MaxZ0>10.0</MaxZ0>
    <MaxChisq>25.0</MaxChisq>
    <BadHitChisq>15.0</BadHitChisq>
    <!--Layers-->
    <Layers>
      <Layer type="Seed" layer_number="2" detector_name="VertexBarrel" be_flag="BARREL" />
      <Layer type="Seed" layer_number="3" detector_name="VertexBarrel" be_flag="BARREL" />
      <Layer type="Seed" layer_number="4" detector_name="VertexBarrel" be_flag="BARREL" />
      <Layer type="Confirm" layer_number="0" detector_name="TrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="1" detector_name="VertexBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="0" detector_name="VertexBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="1" detector_name="TrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="2" detector_name="TrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="3" detector_name="TrackerBarrel" be_flag="BARREL" />
      <Layer type="Extend" layer_number="4" detector_name="TrackerBarrel" be_flag="BARREL" />
    </Layers>
  </Strategy>
</StrategyList>

Strategy Building

A single strategy is usually not sufficient to find all tracks that should be found. For example one needs already two strategies to find tracks going through the barrel layers and tracks going through the endcap layers (plus any mixing of roles that you can think of).

In order to facilitate this process an automated strategy builder is available. It takes a training sample and some cuts to identify the tracks which should be found by the strategy. These cuts are , the impact parameters and , and the minimum number of hits produced. In addition the number of seed and confirm hits per strategy as well as the criteria for the helix fit have to be set. These values are taken from a prototype strategy in a previously created strategy XML file. If more than one strategy is in the XML the first one will be used as the prototype strategy.
Tip, idea Only the cutoffs are used from the prototype strategy, not the layers and their roles.

The strategy builder driver is located at: org.lcsim.recon.tracking.seedtracker.strategybuilder.StrategyBuilder. Its usage is shown in this example steering XML for LCSIM:

<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>trainingSample.slcio</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">strategy.xml</output>
      <symmetrize type="boolean">true</symmetrize>
      <layerWeight type="String">layerWeights.xml</layerWeight>
      <strategyPrototype type="String">prototypeStrategy.xml</strategyPrototype>
      <minLayers type="int">6</minLayers>
      <numConfirmLayers type="int">1</numConfirmLayers>
      <numSeedLayers type="int">3</numSeedLayers>
      <verbose type="boolean">true</verbose>
    </driver>
  </drivers>
</lcsim>

In order to enforce certain tracking behavior (i.e. inside-out) weights can be applied to each layer in the strategy building process. These weights determine which layers are preferred as seed layers.

These weights are set in an XML file. This weights file was used to build the clic01_sid strategies and it enforces inside-out tracking.

<?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="true">clic01_sid</TargetDetector>
  <AdjacenceMultiplier>0.5</AdjacenceMultiplier>

  <Layers>
    <!--Barrel-->
    <Layer layer_number="4" detector_name="TrackerBarrel" be_flag="BARREL">2.01</Layer>
    <Layer layer_number="3" detector_name="TrackerBarrel" be_flag="BARREL">2.02</Layer>
    <Layer layer_number="2" detector_name="TrackerBarrel" be_flag="BARREL">2.03</Layer>
    <Layer layer_number="1" detector_name="TrackerBarrel" be_flag="BARREL">2.04</Layer>
    <Layer layer_number="0" detector_name="TrackerBarrel" be_flag="BARREL">2.05</Layer>
    <Layer layer_number="4" detector_name="VertexBarrel" be_flag="BARREL">3.06</Layer>
    <Layer layer_number="3" detector_name="VertexBarrel" be_flag="BARREL">3.07</Layer>
    <Layer layer_number="2" detector_name="VertexBarrel" be_flag="BARREL">3.08</Layer>
    <Layer layer_number="1" detector_name="VertexBarrel" be_flag="BARREL">0</Layer>
    <Layer layer_number="0" detector_name="VertexBarrel" be_flag="BARREL">0</Layer>
    <!--North Endcap-->
    <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.01</Layer>
    <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.02</Layer>
    <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.03</Layer>
    <Layer layer_number="0" detector_name="TrackerEndcap" be_flag="ENDCAP_NORTH">1.04</Layer>
    <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.05</Layer>
    <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.06</Layer>
    <Layer layer_number="0" detector_name="TrackerForward" be_flag="ENDCAP_NORTH">1.07</Layer>
    <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.08</Layer>
    <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.09</Layer>
    <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.10</Layer>
    <Layer layer_number="0" detector_name="VertexEndcap" be_flag="ENDCAP_NORTH">2.11</Layer>
    <!--South Endcap-->
    <Layer layer_number="3" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.01</Layer>
    <Layer layer_number="2" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.02</Layer>
    <Layer layer_number="1" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.03</Layer>
    <Layer layer_number="0" detector_name="TrackerEndcap" be_flag="ENDCAP_SOUTH">1.04</Layer>
    <Layer layer_number="2" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.05</Layer>
    <Layer layer_number="1" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.06</Layer>
    <Layer layer_number="0" detector_name="TrackerForward" be_flag="ENDCAP_SOUTH">1.07</Layer>
    <Layer layer_number="3" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.08</Layer>
    <Layer layer_number="2" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.09</Layer>
    <Layer layer_number="1" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.10</Layer>
    <Layer layer_number="0" detector_name="VertexEndcap" be_flag="ENDCAP_SOUTH">2.11</Layer>
  </Layers>
</LayerWeight>

Hit Making

The HitMaker takes care of converting SimTrackerHits into HelicalTrackHits. Each layer can be defined as a Si-pixel or Si-strip layer with a certain readout size. SimTrackerHits will be clustered together if they fall together in a pixel or strip. This process has to respect the geometry of the tracker. So hit making has to be different for detector models using (simplified) cylindrical trackers and models using planar trackers.

Cylindrical Tracker Geometries

This applies to the detector models sid01, sid02, clic000, clic01_sid, etc.

The hit making driver is located at org.lcsim.recon.tracking.seedtracker.ReconTracking.SiD02ReconHybridHitMaker. It wraps the steps of digitization, clustering and creation of HelicalTrackHits. It can be set to use full CCD simulation for the pixel detectors. There is no interface for changing the collection names of the input and output SimTrackerHit collections. Also the pixel sizes are hard coded, although they could in priciple be changed.

Since SiD02ReconHybridHitMaker does not obey the rules for XML steering drivers there are two wrappers to allow this. One driver with full CCD simulation and one without. They are located at org.lcsim.recon.tracking.seedtracker.steeringwrappers.SiD02HybridHitMakerNoCCD and org.lcsim.recon.tracking.seedtracker.steeringwrappers.SiD02HybridHitMakerCCD.

Example of a full track reconstruction steering XML for sid02 / clic01_sid:

<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>inputFile.slcio</file>
  </inputFiles>
  
  <control>
    <numberOfEvents>-1</numberOfEvents>
    <verbose>false</verbose>
    <printDriverStatistics>true</printDriverStatistics>
    <printDriversDetailed>true</printDriversDetailed>
  </control>
  
  <execute>
    <driver name="hitMaker"/>
    <driver name="seedTracker"/>
    <driver name="LCIODriver"/>
  </execute>

  <drivers>
    <driver name="hitMaker"
            type="org.lcsim.recon.tracking.seedtracker.steeringwrappers.SiD02HybridHitMakerNoCCD"/>
    <driver name="seedTracker"
            type="org.lcsim.recon.tracking.seedtracker.steeringwrappers.SeedTrackerWrapper">
      <strategyFile>myStrategyList.xml</strategyFile>
    </driver>
    <driver name="LCIODriver"
            type="org.lcsim.util.loop.LCIODriver">
      <outputFilePath>outputFile.slcio</outputFilePath>
      <writeOnlyCollections>VtxBarrHits VtxEndcapHits TkrBarrHits TkrEndcapHits TkrForwardHits MCParticle MCParticleEndPointEnergy</writeOnlyCollections>
      <writeOnlyCollections>Tracks HelicalTrackHits HelicalTrackHitRelations HelicalTrackMCRelations</writeOnlyCollections>
    </driver>
  </drivers>
</lcsim>

Planar Tracker Geometries

This applies to the detector models sidloi2, sidloi3, etc.

All the drivers needed respect the XML interface from the beginning. So you get the full control over all steps from digitization to hit making through your XML steering file.

This is an overview of all required drivers for a full track reconstruction:

org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver
Sets the collection names of the SimCalorimeterHits used by the digitization.
org.lcsim.recon.tracking.digitization.sisim.config.SiTrackerBarrelSensorSetup
Sets up the sizes and efficiencies for the main tracker barrel readout.
org.lcsim.recon.tracking.digitization.sisim.config.SiTrackerEndcap2SensorSetup
Sets up the sizes and efficiencies for the main tracker endcap readout.
org.lcsim.recon.tracking.digitization.sisim.config.SiVertexBarrelSensorSetup
Sets up the sizes and efficiencies for the vertex tracker barrel readout.
org.lcsim.recon.tracking.digitization.sisim.config.SiVertexEndcapSensorSetup
Sets up the sizes and efficiencies for the vertex tracker endcap readout.
org.lcsim.recon.tracking.digitization.sisim.config.StripDigiSetupDriver
Sets up the digitization for all strip detectors. Sets thresholds and clustering values.
org.lcsim.recon.tracking.digitization.sisim.config.PixelDigiSetupDriver
Sets up the digitization for all pixel detectors. Sets thresholds and clustering values.
org.lcsim.fit.helicaltrack.HelicalTrackHitDriver
Converts the digitized hits into HelicalTrackHits.
org.lcsim.recon.tracking.seedtracker.steeringwrappers.SeedTrackerWrapper
The tracking algorithm. Produces tracks from HelicalTrackHits.
org.lcsim.recon.util.CalInfoDriver
Gives certain information on the calorimeter geometry. Required to write out the tracks compatible to PandoraPFA.
org.lcsim.recon.tracking.seedtracker.SeedTrackerTrackStateDriver
Calculates track states at the front face of the calorimeters. This is required by PandoraPFA.
org.lcsim.util.loop.LCIODriver
The output driver. Sets the collections to be kept and written out.

Example of a full track reconstruction steering XML for sidloi3:

<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>input.slcio</file>
    </inputFiles>

    <control>
        <numberOfEvents>-1</numberOfEvents>
        <verbose>false</verbose>
    </control>

    <execute>
        <driver name="EventMarkerDriver"/>
        <driver name="VertexBarrelSetup"/>
        <driver name="VertexEndcapSetup"/>
        <driver name="TrackerBarrelSetup"/>
        <driver name="TrackerEndcapSetup"/>
        <driver name="ReadoutDriver"/>
        <driver name="TrackerDigi"/>
        <driver name="VertexDigi"/>
        <driver name="HelicalTrackHitDriver" />
        <driver name="SeedTracker" />
        <driver name="CalInfoDriver" />
        <driver name="MCTrackStateDriver"/>
        <driver name="Writer"/>
    </execute>

    <drivers>
        <driver name="EventMarkerDriver"
                type="org.lcsim.job.EventMarkerDriver"/>
        <driver name="ReadoutDriver"
                type="org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver">
            <readoutCollections>SiVertexBarrelHits SiVertexEndcapHits SiTrackerBarrelHits SiTrackerEndcapHits</readoutCollections>
        </driver>
        <driver name="TrackerBarrelSetup"
                type="org.lcsim.recon.tracking.digitization.sisim.config.SiTrackerBarrelSensorSetup">
            <subdetectorName>SiTrackerBarrel</subdetectorName>
            <readoutElectrodesPitch>0.050</readoutElectrodesPitch>
            <senseElectrodesPitch>0.025</senseElectrodesPitch>
            <transferEfficiencies>0.986 0.419</transferEfficiencies>
        </driver>
        <driver name="TrackerEndcapSetup"
                type="org.lcsim.recon.tracking.digitization.sisim.config.SiTrackerEndcap2SensorSetup">
            <subdetectorName>SiTrackerEndcap</subdetectorName>
            <readoutPitch>0.050</readoutPitch>
            <sensePitch>0.025</sensePitch>
            <transferEfficiencies>0.986 0.419</transferEfficiencies>
        </driver>
        <driver name="VertexBarrelSetup"
                type="org.lcsim.recon.tracking.digitization.sisim.config.SiVertexBarrelSensorSetup">
            <subdetectorName>SiVertexBarrel</subdetectorName>
            <readoutPitchX>0.02</readoutPitchX>
            <readoutPitchY>0.02</readoutPitchY>
            <sensePitchX>0.02</sensePitchX>
            <sensePitchY>0.02</sensePitchY>
            <transferEfficiency>1.0</transferEfficiency>
        </driver>
        <driver name="VertexEndcapSetup"
                type="org.lcsim.recon.tracking.digitization.sisim.config.SiVertexEndcapSensorSetup">
            <subdetectorName>SiVertexEndcap</subdetectorName>
            <readoutPitchX>0.02</readoutPitchX>
            <readoutPitchY>0.02</readoutPitchY>
            <sensePitchX>0.02</sensePitchX>
            <sensePitchY>0.02</sensePitchY>
            <transferEfficiency>1.0</transferEfficiency>
        </driver>
        <driver name="TrackerDigi"
                type="org.lcsim.recon.tracking.digitization.sisim.config.StripDigiSetupDriver">
            <subdetectorNames>SiTrackerBarrel SiTrackerEndcap</subdetectorNames>
            <rawHitsCollectionName>TKR_RawTrackerHits</rawHitsCollectionName>
            <trackerHitsCollectionName>TKR_TrackerHits</trackerHitsCollectionName> 
            <maxClusterSize>10</maxClusterSize>
            <noiseIntercept>0.</noiseIntercept>
            <noiseSlope>0.</noiseSlope>
            <noiseThreshold>6000.</noiseThreshold>
            <readoutNeighborThreshold>6000.</readoutNeighborThreshold>
            <seedThreshold>6000.</seedThreshold>
            <neighborThreshold>6000.</neighborThreshold>
            <centralStripAveragingThreshold>4</centralStripAveragingThreshold>
            <oneClusterErr>0.288675135</oneClusterErr>
            <twoClusterErr>0.2</twoClusterErr>
            <threeClusterErr>0.333333333</threeClusterErr>
            <fourClusterErr>0.5</fourClusterErr>
            <fiveClusterErr>1.0</fiveClusterErr>
        </driver>
        <driver name="VertexDigi" 
                type="org.lcsim.recon.tracking.digitization.sisim.config.PixelDigiSetupDriver">
            <subdetectorNames>SiVertexBarrel SiVertexEndcap</subdetectorNames> 
            <rawHitsCollectionName>VXD_RawTrackerHits</rawHitsCollectionName>
            <trackerHitsCollectionName>VXD_TrackerHits</trackerHitsCollectionName>
            <maxClusterSize>10</maxClusterSize>
            <noiseIntercept>0.</noiseIntercept>
            <noiseSlope>0.</noiseSlope>
            <noiseThreshold>100.</noiseThreshold>
            <readoutNeighborThreshold>100.</readoutNeighborThreshold>
            <seedThreshold>100.</seedThreshold>
            <neighborThreshold>100.</neighborThreshold>
            <oneClusterErr>0.288675135</oneClusterErr>
            <twoClusterErr>0.2</twoClusterErr>
            <threeClusterErr>0.333333333</threeClusterErr>
            <fourClusterErr>0.5</fourClusterErr>
            <fiveClusterErr>1.0</fiveClusterErr>
        </driver>
        <driver name="HelicalTrackHitDriver"
                type="org.lcsim.fit.helicaltrack.HelicalTrackHitDriver">
            <digiCollectionNames>VXD_TrackerHits TKR_TrackerHits</digiCollectionNames>
            <outputCollectionName>HelicalTrackHits</outputCollectionName>
        </driver>
        <driver name="SeedTracker"
                type="org.lcsim.recon.tracking.seedtracker.steeringwrappers.SeedTrackerWrapper">
            <strategyResource>org/lcsim/recon/tracking/seedtracker/strategies/sidloi3_ttbar_strategies.xml</strategyResource>
        </driver>
        <driver name="CalInfoDriver"   
                type="org.lcsim.recon.util.CalInfoDriver"/>
        <driver name="MCTrackStateDriver"
                type="org.lcsim.recon.tracking.seedtracker.SeedTrackerTrackStateDriver"/>
        <driver name="Writer"
                type="org.lcsim.util.loop.LCIODriver">
            <outputFilePath>reconstructed.slcio</outputFilePath>
            <writeOnlyCollections>EcalBarrelHits EcalEndcapHits HcalBarrelHits HcalEndcapHits Tracks StateAtECal StateAtEnd StateAtStart</writeOnlyCollections>
        </driver>
    </drivers>
</lcsim>
Edit | Attach | Watch | Print version | History: r3 < r2 < r1 | Backlinks | Raw View | WYSIWYG | More topic actions
Topic revision: r3 - 2010-07-12 - ChristianGrefe
 
    • Cern Search Icon Cern Search
    • TWiki Search Icon TWiki Search
    • Google Search Icon Google Search

    CLIC All webs login

This site is powered by the TWiki collaboration platform Powered by PerlCopyright & 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback