Inclusive Secondary Vertex Finder



Particles like V0 (kshort, Lambda), tau, bottom (even some charm) hadrons, travel a (short but recognisable) distance from their birth place (primary vertex) and then decay into children particles at the secondary vertex. Some beyond standard models predict new particles, that live for a short amount of time and then decay. ATLAS has developed many packages/finders for secondary vertexing, including:

[a] InDetVKalVxInJetTool: for b-tagging

[b] (get)TauVertexFinder: in tauRec/python/

[c] InDetConversionFinderTools: photon conversion

[d] InDetV0FinderTool: kshort, Lambda

[e] VrtSecInclusive: a typical variant from InDetVKalVxInJetTool for Displaced Vertex, e.g. in SUSY Rhadrons.

Could one develop a single (or a chain/family of) C++ code as a secondary vertex finder that can replace [a]--[e] and be able to find all above mentioned secondary vertices? This is where the Inclusive Secondary Vertex Finder comes into play. Currently the inclusive Secondary Vertex finder is based on a re-running of the primary vertex finder with a special/inverted setup.

"Special setup" means:

  • The (pre)selection of tracks is inverted by the impact parameter d0. Conventionally one select tracks with smaller d0 (~<= 2.0 for primary or usual secondary vertex). But now tracks with with larger d0 are selected first.

  • The BeamConstraint is removed in the SecVtx seeding.

  • There are three improvements, in seedFinder, seedFilter and postFit-cleaning:
    • The seedFinder Mode3dTo1dFinder is replaced with Mode3dFromFsmw1dFinder, where we search for one mode in 3D rather patching up three 1D modes. There are some cases the mode (tracks concentration) in Z (even Radius) is not good enough, then we start from one 1D mode (say in phi) using the closest track-pair.

    • seedFilter : Hits are checked for the tracks that entered the seed, the momenta-direction of seed is checked against the primary vertex.

    • postFit-cleaning : the global fit quality, the distance between vertices are added in addition to track compatibility. Please find more details from:
  • Some other optimisation as one can see in below section.

Code whereabouts

The package is in the athena repository in git here:

The old code is on SVN:

Instructions for running the package on an xAOD straight out of the box

cd WorkArea;
mkdir IncSecVtxPackage;
cd IncSecVtxPackage;
asetup Athena,master,latest;
athena InDetRecExample/

To change the options in the InDetInclusiveSecVtx job options file, copy the content from here: into a file and then to run it's just:


If it has successfully run then there will be an output xAOD with a container “InclusiveSecVtx”. You can check this using the useful checkxAOD script: output.root

and then you can see the variables inside:

root -l output.root

Instructions for developing / tweaking the package

If you have not set up git please follow this link (

and make sure that you have a fork of the athena repository (as described here

ssh into lxplus

set up in the usual way and also set up git:

lsetup git;

create a work area e.g.:

mkdir IncSecVtxPackage;
cd IncSecVtxPackage;

clone the repository locally (replace YOUR_USER_NAME with your own username):

git clone

add the main repository as upstream:

cd athena;
git remote add upstream

create your branch and make sure that your local repository is completely up to date with the main repository (see

git fetch upstream;
git checkout -b master-my-topic upstream/master --no-track;
cd ..

create a file called package_filters.txt with the following contents:

+ InnerDetector/InDetRecAlgs/InDetInclusiveSecVtx
+ InnerDetector/InDetExample/InDetRecExample
- .*

to edit a tool etc just add another line with + and the path to the tool.

create your build directory:

mkdir build && cd build

setup the release:

asetup master,latest,Athena

and then run cmake:

cmake -DATLAS_PACKAGE_FILTER_FILE=../package_filters.txt ../athena/Projects/WorkDir;
source */;

create the run directory and run:

mkdir ../run && cd ../run;
athena InDetRecExample/

If it has successfully run then there will be an output xAOD with a container “InclusiveSecVtx”. You can check this using the useful checkxAOD script: output.root

and then you can see the variables inside:

root -l output.root

you can change the input file in: athena/InnerDetector/InDetExample/InDetRecExample/share/

If adding in new code please use the checkers:

Validate the output in xAOD (TO UPDATE)

This is currently being updated

Tune the run-time options for the SecVtx finder (TO UPDATE)

For the timebeing, below setup is used tentatively : ( Since 2017 June 6 please ignore below cuts untill this page will be updated again. ) InDetSecVtxTrackSelectionTool.minD0 = 2.0 ( dependence on the physics signal in seeking )

Mode3dFromFsmw1dFinder.Fraction = 0.5

Mode3dFromFsmw1dFinder.OnlyXYcorrelated = False

CrossDistancesSeedFinder.trackdistcutoff = 3. ,

CrossDistancesSeedFinder.maximumTracksNoCut = 300 ,

CrossDistancesSeedFinder.maximumDistanceCut = 3.0 ,

CrossDistancesSeedFinder.useweights = True ( the distance between two tracks )

AdaptiveVertexFitter.MaxIterations = 400 , ( just for safe, no apparent cost on CPU time )

AdaptiveVertexFitter.MaxDistToLinPoint = 0.5 ,

InDetSecVtxFinderTool.useBeamConstraint = False , ( important ! )

InDetSecVtxFinderTool.significanceCutSeeding = 18. ,

InDetSecVtxFinderTool.maximumChi2cutForSeeding = 13. ,

InDetIncSecVtxFinder.doVertexMerging = True ( need more investigation )

as kickoff test.

With these setup, one can get an SecVtx efficiency at ~60% while the fakes ( from V0 ) is about 10%, more details in

One can find these variables in InDetRecExample /share/ and modify them from ones physics/detector considerations. One can even find out other variables therein and tune them for possible optimisation.


  • Check new, much cleaner running script works as expect and then merge this into athena.
  • Make sure the alg can be ran as a tool, i.e. so eventloop or an athena analysis alg or derivations can use it.
  • fix error: CaloTPCnv/src/CaloCellPacker_400_500.cxx:1066 (void CaloCellPacker_400_500::unpack(const CaloCompactCellContainer&, const std::vector<int>&, CaloCellContainer&, DataPool<LArCell>&, DataPool<TileCell>&) const): Corrupted data: can't find DDE for cell with hash 187651
  • name change?! It's very similarly named to VSI, VrtSecInclusive.
  • make it so that it can run on ESD or higher up formats?
  • include the secondary vertex track selection tool options into the usual track selector tool?
  • see here for a discussion/meeting about where to go with this alg
MelissaRebeccaYexley - 2020-07-16
Edit | Attach | Watch | Print version | History: r25 < r24 < r23 < r22 < r21 | Backlinks | Raw View | WYSIWYG | More topic actions
Topic revision: r25 - 2020-07-25 - MelissaRebeccaYexley
    • Cern Search Icon Cern Search
    • TWiki Search Icon TWiki Search
    • Google Search Icon Google Search

    Main All webs login

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