Commit c25e24e0 authored by Marco Clemencic's avatar Marco Clemencic
Browse files

v9r13

parent cc4ae6e8
// $Id: $
// ============================================================================
#ifndef KERNEL_HASHIDS_H
#define KERNEL_HASHIDS_H 1
// ============================================================================
// Include files
// ============================================================================
// GaudiKernel
// ============================================================================
#include "GaudiKernel/Kernel.h"
// ============================================================================
namespace LHCb
{
// ==========================================================================
// forward declarations
// ==========================================================================
class Particle ;
class ProtoParticle ;
class Track ;
class CaloHypo ;
class CaloCluster ;
class MuonPID ;
// ==========================================================================
/** @class HashIDs
*
* Trivial structure to get the "hash-ID" for some LHCb Event classes
* "Hash-ID" is defiend as hash from all underlying LHCbIDs.
*
* @author Vanya BELYAEV Ivan.Belyaev@cern.ch
* @date 2010-11-03
*
* Version $Revision:$
* Last Modification $Date$
* by $Author$
*/
class GAUDI_API HashIDs
{
public:
// ========================================================================
typedef std::vector<LHCb::LHCbID> LHCbIDs ;
// ========================================================================
public: // get the hash-ID
// ========================================================================
static std::size_t hashID ( const LHCb::Particle* p ) ;
static std::size_t hashID ( const LHCb::ProtoParticle* p ) ;
static std::size_t hashID ( const LHCb::Track* t ) ;
static std::size_t hashID ( const LHCb::CaloHypo* c ) ;
static std::size_t hashID ( const LHCb::CaloCluster* c ) ;
static std::size_t hashID ( const LHCb::MuonPID* m ) ;
// ========================================================================
public: // get th list of LHCbIDs
// ========================================================================
static void lhcbIDs ( const LHCb::Particle* p , LHCbIDs& ids ) ;
static void lhcbIDs ( const LHCb::ProtoParticle* p , LHCbIDs& ids ) ;
static void lhcbIDs ( const LHCb::Track* t , LHCbIDs& ids ) ;
static void lhcbIDs ( const LHCb::CaloHypo* c , LHCbIDs& ids ) ;
static void lhcbIDs ( const LHCb::CaloCluster* c , LHCbIDs& ids ) ;
static void lhcbIDs ( const LHCb::MuonPID* m , LHCbIDs& ids ) ;
// ========================================================================
public: // check the overlap
// ========================================================================
static std::pair<double,double> overlap
( const LHCb::Particle* p1 ,
const LHCb::Particle* p2 ) ;
static std::pair<double,double> overlap
( const LHCb::ProtoParticle* p1 ,
const LHCb::ProtoParticle* p2 ) ;
static std::pair<double,double> overlap
( const LHCb::Track* t1 ,
const LHCb::Track* t2 ) ;
static std::pair<double,double> overlap
( const LHCb::CaloCluster* c1 ,
const LHCb::CaloCluster* c2 ) ;
static std::pair<double,double> overlap
( const LHCb::CaloHypo* c1 ,
const LHCb::CaloHypo* c2 ) ;
static std::pair<double,double> overlap
( const LHCb::MuonPID* m1 ,
const LHCb::MuonPID* m2 ) ;
// ========================================================================
} ;
// ==========================================================================
} // end of namespace LHCb
// ============================================================================
// The END
// ============================================================================
#endif // KERNEL_HASHIDS_H
// ============================================================================
......@@ -4,7 +4,7 @@
#============================================================================
package DaVinciKernel
version v8r8p2
version v8r9
# Structure, i.e. directories to process.
#============================================================================
......
......@@ -17,6 +17,7 @@
#include "Kernel/TransporterFunctions.h"
#include "Kernel/DecayTree.h"
#include "Kernel/ParticleFilters.h"
#include "Kernel/HashIDs.h"
//#include "Kernel/DaVinciStringUtils.h"
#include "Kernel/DVAlgorithm.h" // Has to be last for compilation on Windows
// ============================================================================
......
......@@ -15,6 +15,8 @@
<field name="m_clonemap" transient="true" />
</class>
<class name = "LHCb::HashIDs" />
<exclusion>
<class name = "LHCb::DecayTree">
<method name="cloneMap"/>
......
......@@ -4,6 +4,25 @@
! Responsible : J.P. Palacios
!============================================================================
!======================== DaVinciKernel v8r9 2010-12-17 =====================
! 2010-08-27 - Juan Palacios
- src/Lib/DVAlgorithm.cpp
. Allow full InputLocations ending in "/Particles".
! 2010-11-13 - Vanya Belyaev
- DVAlgorithm:
remove "BlindVertexFitter"
! 2010-11-03 - Vanya Belyaev
- add function to evaluate 'unique-hash-ID' and to compare 'the-same' objects
- cmt/requirements
. Increase to v8r9
!======================== DaVinciKernel v8r8p2 2010-08-27 ===================
! 2010-08-27 - Juan Palacios
......
......@@ -103,7 +103,6 @@ DVAlgorithm::DVAlgorithm
//
m_vertexFitNames [ "Offline" ] = "OfflineVertexFitter" ;
m_vertexFitNames [ "Trigger" ] = "TrgVertexFitter" ;
m_vertexFitNames [ "Blind" ] = "BlindVertexFitter" ;
m_vertexFitNames [ "LoKi" ] = "LoKi::VertexFitter" ;
m_vertexFitNames [ "Kalman" ] = "LoKi::VertexFitter" ;
m_vertexFitNames [ "ParticleAdder" ] = "ParticleAdder" ;
......@@ -121,19 +120,22 @@ DVAlgorithm::DVAlgorithm
"Names of ParticleFilters" ) ;
//
declareProperty ( "ReFitPVs" , m_refitPVs, "Refit PV" ) ;
m_particleCombinerNames [ "Offline" ] = "OfflineVertexFitter" ;
m_particleCombinerNames [ "Trigger" ] = "TrgVertexFitter" ;
m_particleCombinerNames [ "Kalman" ] = "LoKi::VertexFitter" ;
m_particleCombinerNames [ "Blind" ] = "BlindVertexFitter" ;
m_particleCombinerNames [ "LoKi" ] = "LoKi::VertexFitter" ;
m_particleCombinerNames [ "ParticleAdder" ] = "ParticleAdder" ;
m_particleCombinerNames [ "Adder" ] = "ParticleAdder" ;
m_particleCombinerNames [ "Combiner" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "Momenta" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "Jet" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "LoKiFast" ] = "LoKi::FastVertexFitter" ;
m_particleCombinerNames [ "FastLoKi" ] = "LoKi::FastVertexFitter" ;
// ==========================================================================
// Note: there is no default value!
// ==========================================================================
m_particleCombinerNames [ "Offline" ] = "OfflineVertexFitter" ;
m_particleCombinerNames [ "Trigger" ] = "TrgVertexFitter" ;
m_particleCombinerNames [ "Kalman" ] = "LoKi::VertexFitter" ;
m_particleCombinerNames [ "LoKi" ] = "LoKi::VertexFitter" ;
m_particleCombinerNames [ "Smart" ] = "LoKi::SmartParticleCombiner" ;
m_particleCombinerNames [ "ParticleAdder" ] = "ParticleAdder" ;
m_particleCombinerNames [ "Adder" ] = "ParticleAdder" ;
m_particleCombinerNames [ "Combiner" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "MomentumCombiner" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "Momenta" ] = "MomentumCombiner" ;
m_particleCombinerNames [ "LoKiFast" ] = "LoKi::FastVertexFitter" ;
m_particleCombinerNames [ "FastLoKi" ] = "LoKi::FastVertexFitter" ;
declareProperty
( "ParticleCombiners" ,
m_particleCombinerNames ,
......@@ -142,7 +144,6 @@ DVAlgorithm::DVAlgorithm
m_particleReFitterNames [ "" ] = "OfflineVertexFitter" ;
m_particleReFitterNames [ "Offline" ] = "OfflineVertexFitter" ;
m_particleReFitterNames [ "Vertex" ] = "OfflineVertexFitter" ;
m_particleReFitterNames [ "Blind" ] = "BlindVertexFitter" ;
m_particleReFitterNames [ "Kalman" ] = "LoKi::VertexFitter" ;
m_particleReFitterNames [ "LoKi" ] = "LoKi::VertexFitter" ;
m_particleReFitterNames [ "Mass" ] = "LoKi::MassFitter" ;
......@@ -268,6 +269,11 @@ StatusCode DVAlgorithm::loadTools()
if (msgLevel(MSG::DEBUG)) {
debug() << ">>> Preloading PhysDesktop locations " << m_inputLocations << endmsg;
}
for ( std::vector<std::string>::iterator iloc = m_inputLocations.begin();
iloc != m_inputLocations.end(); ++iloc ) {
DaVinci::StringUtils::removeEnding(*iloc,"/Particles");
}
desktop()->setInputLocations(m_inputLocations);
std::vector<std::string> p2pvInputLocations;
......
// $Id: $
// ============================================================================
// Include files
// ============================================================================
// STD & STL
// ============================================================================
#include <set>
#include <iterator>
#include <algorithm>
// ============================================================================
// Event
// ============================================================================
#include "Event/Particle.h"
#include "Event/ProtoParticle.h"
#include "Event/VertexBase.h"
#include "Event/Vertex.h"
#include "Event/RecVertex.h"
#include "Event/RecVertex.h"
#include "Event/Track.h"
#include "Event/CaloHypo.h"
#include "Event/CaloCluster.h"
#include "Event/MuonPID.h"
// ============================================================================
// LHCbKernel
// ============================================================================
#include "Kernel/CaloCellIDHash.h"
// ============================================================================
// local
// ============================================================================
#include "Kernel/HashIDs.h"
// ============================================================================
// Boost
// ============================================================================
#include "boost/functional/hash.hpp"
// ============================================================================
/** @file
* Implementation file for class : LHCb::HashID
*
* @author Vanya BELYAEV Ivan.Belyaev@cern.ch
* @date 2010-11-03
*
* Version $Revision:$
* Last Modification $Date$
* by $Author$
*/
// ============================================================================
namespace
{
// ==========================================================================
/// the actual type for ordered list of _LHCbIDs
typedef std::set<LHCb::LHCbID> _LHCbIDs ;
// ==========================================================================
//
// add IDs from the sequence
template <class OBJECT>
inline std::size_t insert
( _LHCbIDs& ids ,
OBJECT begin ,
OBJECT end ) ;
//
// add ID
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::LHCbID& id )
{ return ids.insert ( id ).second ? 1 : 0 ; }
//
// add ID from Calorimeter Cell
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::CaloCellID& id )
{ return ids.insert ( id ).second ? 1 : 0 ; }
//
// insert IDs from set of IDs
inline std::size_t insert ( _LHCbIDs& ids , const _LHCbIDs& v )
{
std::size_t _size = ids.size() ;
ids.insert ( v.begin() , v.end() ) ;
return ids.size() - _size ;
}
// insert IDs from vector of IDs
inline std::size_t insert ( _LHCbIDs& ids , const std::vector<LHCb::LHCbID>& v )
{
std::size_t _size = ids.size() ;
ids.insert ( v.begin() , v.end() ) ;
return ids.size() - _size ;
}
//
// insert IDs from tracks
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::Track* t )
{
if ( 0 == t ) { return 0 ; }
return insert ( ids , t->lhcbIDs() ) ;
}
//
// insert IDs from MuonPIDs
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::MuonPID* m )
{
if ( 0 == m ) { return 0 ; }
return insert ( ids , m -> muonTrack() ) ;
}
//
// insert IDs from CaloDigit
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::CaloDigit* d )
{
if ( 0 == d ) { return 0 ; }
return insert ( ids , d -> cellID() ) ;
}
//
// insert IDs from CaloClusterEntry
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::CaloClusterEntry& e )
{ return insert ( ids , e.digit() ) ; }
//
// insert IDs from CaloCluster
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::CaloCluster* c )
{
if ( 0 == c ) { return 0 ; }
//
const LHCb::CaloCluster::Entries& entries = c->entries() ;
return insert ( ids ,
entries.begin () ,
entries.end () ) ;
}
//
// insert IDs from CaloHypo
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::CaloHypo* h )
{
if ( 0 == h ) { return 0 ; }
//
const LHCb::CaloHypo::Digits& digits = h -> digits () ;
const LHCb::CaloHypo::Clusters& clusters = h -> clusters () ;
const LHCb::CaloHypo::Hypos& hypos = h -> hypos () ;
return
insert ( ids , digits . begin () , digits . end () ) +
insert ( ids , clusters . begin () , clusters . end () ) +
insert ( ids , hypos . begin () , hypos . end () ) ;
}
//
// insert IDs from the protoparticle
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::ProtoParticle* p )
{
if ( 0 == p ) { return 0 ; }
//
const SmartRefVector<LHCb::CaloHypo>& calo = p -> calo () ;
return
insert ( ids , p -> track() ) +
insert ( ids , calo . begin () , calo . end () ) ;
}
//
// insert IDs from the particle
inline std::size_t insert ( _LHCbIDs& ids , const LHCb::Particle* p )
{
if ( 0 == p ) { return 0 ; }
//
const SmartRefVector<LHCb::Particle>& daughters = p -> daughters () ;
return
insert ( ids , p -> proto() ) +
insert ( ids , daughters . begin() , daughters . end () ) ;
}
//
// add IDs from the sequence
template <class OBJECT>
inline std::size_t insert
( _LHCbIDs& ids ,
OBJECT begin ,
OBJECT end )
{
//
std::size_t _size = ids.size() ;
for ( ; begin != end ; ++end ) { insert ( ids , *begin ) ; }
//
return ids.size() - _size ;
}
//
// calculate the actual ID
template <class OBJECT>
inline std::size_t _hash_id_ ( const OBJECT* obj )
{
if ( 0 == obj ) { return 0 ; }
//
_LHCbIDs ids ;
insert ( ids , obj ) ;
//
std::size_t seed = 0 ;
using namespace boost ;
for ( _LHCbIDs::const_iterator i = ids.begin() ; ids.end() != i ; ++i )
{ hash_combine ( seed , i->channelID () ) ; }
//
return seed ;
// ========================================================================
}
// ==========================================================================
template <class OBJECT>
inline void _lhcb_IDs_ ( const OBJECT* obj ,
LHCb::HashIDs::LHCbIDs& ids )
{
//
_LHCbIDs _ids ;
insert ( _ids , obj ) ;
//
ids.clear() ;
ids.insert ( ids.end() , _ids.begin() , _ids.end() ) ;
}
// ==========================================================================
inline double _frac ( const std::size_t n ,
const std::size_t N )
{
return
0 == n ? 0.0 :
0 == N ? 0.0 :
n == N ? 1.0 : double ( n ) / N ;
}
// ==========================================================================
template<typename TYPE>
class count_iterator
: public std::iterator<std::output_iterator_tag, void, void, void, void>
{
public:
// ========================================================================
/// Constructor
count_iterator() : m_count ( 0 ) {}
//
count_iterator& operator = ( const TYPE& /* value */ )
{
++m_count ;
return *this ;
}
//
count_iterator& operator* () { return *this; }
count_iterator& operator++ () { return *this; }
count_iterator& operator++ (int) { return *this; }
//
// ========================================================================
public:
// ========================================================================
/// the the counter
unsigned long count() const { return m_count ; }
// ========================================================================
private:
///
unsigned long m_count ;
// ========================================================================
};
// ==========================================================================
template <class OBJECT>
inline std::pair<double,double>
_overlap_ ( const OBJECT* obj1 ,
const OBJECT* obj2 )
{
//
if ( 0 == obj1 ) { return std::make_pair ( 0.0 , 0.0 ) ; }
if ( 0 == obj2 ) { return std::make_pair ( 0.0 , 0.0 ) ; }
if ( obj1 == obj2 ) { return std::make_pair ( 1.0 , 1.0 ) ; }
//
_LHCbIDs _ids1 ;
_LHCbIDs _ids2 ;
//
insert ( _ids1 , obj1 ) ;
insert ( _ids1 , obj1 ) ;
//
// LHCb::HashIDs::LHCbIDs ids ;
// ids.reserve ( std::min ( _ids1 . size () , _ids2 . size () ) ) ;
// std::set_intersection ( _ids1 . begin () , _ids1 . end () ,
// _ids1 . begin () , _ids1 . end () ,
// std::back_inserter ( ids ) ) ;
// const std::size_t _c = ids.size() ;
//
std::size_t _c =
std::set_intersection
( _ids1 . begin () , _ids1 . end () ,
_ids1 . begin () , _ids1 . end () ,
count_iterator<LHCb::LHCbID>() ).count() ;
//
return std::make_pair ( _frac ( _c , _ids1 . size () ) ,
_frac ( _c , _ids2 . size () ) ) ;
}
// ==========================================================================
} // end of anonymous namespace
// ============================================================================
// hash for MuonID
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::MuonPID* m )
{ return _hash_id_ ( m ) ; }
// ============================================================================
// hash for CaloCluster
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::CaloCluster* c )
{ return _hash_id_ ( c ) ; }
// ============================================================================
// hash for CaloHypo
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::CaloHypo* h )
{ return _hash_id_ ( h ) ; }
// ============================================================================
// hash for Track
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::Track* t )
{ return _hash_id_ ( t ) ; }
// ============================================================================
// hash for ProtoParticle
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::ProtoParticle* p )
{ return _hash_id_ ( p ) ; }
// ============================================================================
// hash for Particle
// ============================================================================
std::size_t LHCb::HashIDs::hashID ( const LHCb::Particle* p )
{ return _hash_id_ ( p ) ; }
// ============================================================================
// ============================================================================
// get IDs for Particle
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::Particle* p ,
LHCb::HashIDs::LHCbIDs& ids )
{ _lhcb_IDs_ ( p , ids ) ; }
// ============================================================================
// get IDs for ProtoParticle
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::ProtoParticle* p ,
LHCb::HashIDs::LHCbIDs& ids )
{ _lhcb_IDs_ ( p , ids ) ; }
// ============================================================================
// get IDs for Track
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::Track* t ,
LHCb::HashIDs::LHCbIDs& ids )
{
if ( 0 != t ) { ids = t->lhcbIDs() ; }
else { ids.clear() ; }
}
// ============================================================================
// get IDs for CaloHypo
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::CaloHypo* c ,
LHCb::HashIDs::LHCbIDs& ids )
{ _lhcb_IDs_ ( c , ids ) ; }
// ============================================================================
// get IDs for CaloCluster
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::CaloCluster* c ,
LHCb::HashIDs::LHCbIDs& ids )
{ _lhcb_IDs_ ( c , ids ) ; }
// ============================================================================
// get IDs for MuonPID
// ============================================================================
void LHCb::HashIDs::lhcbIDs ( const LHCb::MuonPID* m ,
LHCb::HashIDs::LHCbIDs& ids )
{ _lhcb_IDs_ ( m , ids ) ; }
// ===========================================================================
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::Particle* p1 ,
const LHCb::Particle* p2 )
{ return _overlap_ ( p1 , p2 ) ; }
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::ProtoParticle* p1 ,
const LHCb::ProtoParticle* p2 )
{ return _overlap_ ( p1 , p2 ) ; }
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::Track* t1 ,
const LHCb::Track* t2 )
{ return _overlap_ ( t1 , t2 ) ; }
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::CaloCluster* c1 ,
const LHCb::CaloCluster* c2 )
{ return _overlap_ ( c1 , c2 ) ; }
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::CaloHypo* c1 ,
const LHCb::CaloHypo* c2 )
{ return _overlap_ ( c1 , c2 ) ; }
// ============================================================================
std::pair<double,double>
LHCb::HashIDs::overlap ( const LHCb::MuonPID* m1 ,
const LHCb::MuonPID* m2 )
{ return _overlap_ ( m1 , m2 ) ; }
// ============================================================================
// ============================================================================