How to access to Monte Carlo Truth information for the Recontructed Primary Vertices ?
This section describes the tool for extraction of the Monte Carlo truth information
for the Recontructed Primary Vertices.
Introduction
The association of the reconstructed primary vertices to Monte Carlo truth is a delicate task.
Even the definition of "the correctly reconstructed primary vertex" is ambiguous. One can rely on the
number of true Monte Carlo tracks or on the
distance between the Reconstructed and
Monte Carlo vertices. In an obvious way the definition depends on the use-case. For some application
the distance-based association is fine, for some application the definition based on
the count of number of tracks is fine.
LoKi offers the low-level utility which is able for each pair of Primary
Reconstructed and Primary Monte Carlo vertex to evaluate both quantities:
- Number of tracks from the Primary Monte Carlo Vertex, which are used in the Reconstructed Primary Vertex
-
-distance between the Reconstructed Primary vertex and Primary Monte Carlo Vertex
Basing on these two quantities one is able to make the decisions about the association for
the Reconstructed and Monte Carlo primary vertices. (As usual, my lines will not make a decision for you...)
Essentially the association is done for
all combinations of Reconstructed and Monte Carlo primary vertices..
Technicalities
The actual association is done in a form of the
relation tables which are used to describe the association of
Reconstructed Primary Vertices of C++ type
LHCb::RecVertex
with Monte Carlo primary vertices of C++ type
LHCb::MCVertex
.
Each link carries the certain
weight of the C++ type
std::pair
. The first element of the pair
represent the number of true tracks fro the given Monte Carlo vertex which are used for the Recontructed Primary Vertex, and the second element of the pair corresponds to
the

-distance between the Recontructed Primary vertex and Primary Monte Carlo Vertex.
The actual types for
direct relations (Recontructed PV

Monte Carlo PV) is defined through the
typedef
LHCb::PV2MC
in the file
$DAVINCIMCKERNEL/Kernel/PV2MC.h
.
The actual types for
inverse relations ( Monte Carlo PV

Reconstructed PV) is defined through the typedef
LHCb::MC2MV
in
$DAVINCIMCKERNEL/Kernel/PV2MC.h
.
The configuration
The relation table is created by the algorithm
LoKi_PV2MCAlg
.
The location of the relation tabel in Transient Event Store is defined to be
LHCb::PV2MCLocation::Default
(see
here
)
It is possible to run the algorithm explicitl, but it is also possible to use
DataOnDemandSvc
to build the table on-demand.
The proper configuration is activated by inclusion of the line:
1000# define the configurtaion through Data-On-Demand
1010import LoKiPhysMC.PV2MC_Configuration
The direct usage of the relation table
The relation table could be extracted from the Gaudi Transient Store using the regular method
get
:
1000// get the relation table from TES:
1010const LHCb::PV2MC* table = get<LHCb::PV2MC> ( LHCb::PV2MCLocation::Default ) ;
For the given recontructed primary vertex one can extract all links in one go:
1000// get one primary vertex:
1010const LHCb::RecVertex* primary = ... ;
1020
1030// extract from the relation table all related Monte Carlo primary vertices:
1040LHCb::PV2MC::Range links = table->relations ( primary ) ;
1050
1060info () << " number of links: " << links.size() << endreq ;
Please note that number of links will be always equal to number of the primary Monte Carlo vertices.
And one can make a loop over all the related Monte Carlo primary vertices and ot get the association information:
1000// the explicit loop over all links
1010for ( LHCb::MV2MC::Range::iterator ilink = links.begin() ; links.end() != ilink ; ++ilink )
1020{
1030 // get the Monte Carlo primary vertex:
1040 const LHCb::MCVertex* mc = ilink -> to () ; ///< get the related Monte Carlo primary vertex
1050 // get the number of tracks form this Monte Carlo vertex:
1060 const unsigned int nTracks = ilink -> weight() . first ;
1070 // get chi2 distance between recontucted and Monte Carlo vertices:
1080 const double chi2 = ilink -> weight() . second ;
1090
1100 info () << " \t\tThe link # " << ( ilink-links.begin() )
1110 << " MC-key = " << mc->key()
1120 << " # tracks = " << nTracks
1130 << " chi2 = " << chi2 << endreq ;
1140}
The complete example, tested with
DaVinci v19r6
is attached to this page as
DV_PV2MC_Ex1.cpp
, the configuration file
is available as
DV_PV2MC_Ex1.opts
The usage of the relation table through IPV2MC
tool
One can also access the relation table though the helper tool, which implements
IPV2MC
abstract interface.
The abstract interafce is defined in the file
$DAVINCIMCKERNELROOT/Kernel/IPV2MC.h
.
Essentially it provides few methods for accession the following tables:
- the direct relation table
LHCb::PV2MC
for Recontructed to Monte Carlo Primary Vertices
- the inverse relation table
LHCb::MC2PV
for Monte Carlo to Recontructed Primary Vertices
- the direct relation table
LHCb::PV2Collision
for Recontructed Primary Vertices to Generator Collisions
- the inverse relation table
LHCb::Collision2PV
for Generator Collision
objects to the Recontructed Primary Vertices
All types are defined in the file
$DAVINCIMCKERNELROOT/Kernel/PV2MC.h
and essentially the various template for the generic class
IRelationWeighted
.
The usage of the tool is fairly trivial:
1000#include "Kernel/IPV2MC.h"
1010
1020class MyAlg : public DVAlgorithm
1030{
1040...
1050private:
1060 // the tool
1070 IPV2MC* m_pv2mc ; ///< the tool
1080};
1090
1100StatusCode MyAlf::initialize()
1110{
1120 ...
1130 m_pv2mc = tool<IPV2MC>( "LoKi_PV2MC/PV2MC:PUBLIC" , this ) ;
1140...
1150}
As soon as the ltool is aquired one can get the relation tables directly form the tool:
1000// get the relation table from the tool:
1010
1020const LHCb::PV2MC* table = m_pv2mc -> pv2MC() ;
The complete example, tested with
DaVinci v19r6
is attached to this page as
DV_PV2MC_Ex2.cpp
, the configuration file
is available as
DV_PV2MC_Ex1.opts
How to get the list of all Primary Monte Carlo vertices?
There are few ways to get the list of all Primary Monte Carlo vertices.
Probably the most simple one is by usage of
LHCb::MCVertex::isPrimary
method:
1000// get all Monte Carlo vertices from TES:
1010const LHCb::MCVertex::Container* mcvertices = get<LHCb::MCVertex::Container> ( LHCb::MCVertexLocation::Default ) ;
1020
1030// prepare the output container of vertices:
1040typedef std::vector<const LHCb::MCVertex*> VERTICES ;
1050VERTICES primaries ;
1060
1070// select all Monte Carlo Primary Vertices:
1080for ( LHCb::MCVertex::Container::const_iterator imc = mcvertices->begin() ; mcvertices->end() != imc ; ++imc )
1090{
1100 const LHCb::MCVertex* mcv = *imc ;
1110 if ( 0 == mcv || !mcv->isPrimary() ) { continue ; }
1120 primaries.push_back ( mcv ) ;
1130}
How to get the corresponding Primary Monte Carlo vertex for Monte Carlo objects?
For any Monte Carlo object one can directly access the corresponding Monte Carlo primary vertex using the function
LoKi::MC2Collision::primaryVertex
from the
file
$DAVINCIMCKERNELROOT/Kernel/MC2Collision.h
:
1000#include "Kernel/MC2Collision.h"
1010
1020
1030// *ANY* Monte Carlo object:
1040MCOBJECT* object = ... ;
1050
1060// get the corresponding Monte Carlo Primary vertex
1070const LHCb::MCVertex* mcpv = LHCb::MC2Collision::primaryVertex ( object ) ;
The functions are defined for the following Monte Carlo Objects:
Versions
Please note that one needs to "getpack" the version of
Phys/LoKiPhysMC
package which is
v6r2 or more recent.
--
Vanya BELYAEV - 05 Nov 2007