10 #include <IMPL/LCCollectionVec.h>
11 #include <EVENT/Track.h>
12 #include <IMPL/ReconstructedParticleImpl.h>
13 #include <IMPL/VertexImpl.h>
17 #include <UTIL/Operators.h>
18 #include <UTIL/LCTOOLS.h>
21 #include "marlin/VerbosityLevels.h"
23 #include <marlin/AIDAProcessor.h>
24 #include <marlin/Global.h>
26 #include <AIDA/IHistogramFactory.h>
31 using namespace lcio ;
32 using namespace marlin ;
44 std::list<Track*> tracks{} ;
45 double z0Significance=0. ;
47 TrackGroup( Track* trk){
48 tracks.push_back( trk ) ;
49 z0Significance = trk->getZ0() / trk->getCovMatrix()[ 9 ] ;
53 void merge( TrackGroup& other ){
54 tracks.merge( other.tracks ) ;
58 double z0SigMean = 0.;
60 for(
auto trk : tracks ){
61 z0SigMean += ( trk->getZ0() / trk->getCovMatrix()[ 9 ] ) ;
64 z0Significance = z0SigMean / ntrk ;
68 std::ostream& operator<<( std::ostream& os,
const TrackGroup& grp ){
70 os <<
" group with " << grp.tracks.size() <<
" elements - z0Significance = " << grp.z0Significance << std::endl ;
71 for(
auto trk : grp.tracks ){
72 os <<
" - trk: " << lcshort( trk ) << std::endl ;
82 _description =
"TrackZVertexGrouping: group tracks based on their Z0 significance";
85 registerInputCollection( LCIO::TRACK,
87 "Name of the Track input collection" ,
89 std::string(
"MarlinTrkTracks")
93 registerOutputCollection( LCIO::RECONSTRUCTEDPARTICLE,
95 "Name of the ReconstructedParticle output collection" ,
97 std::string(
"TrackGroupPFOs")
100 registerOutputCollection( LCIO::VERTEX,
101 "TrackGroupVertices",
102 "Name of the Vertex output collection" ,
104 std::string(
"TrackGroupVertices")
107 registerProcessorParameter(
"Z0SignificanceCut",
108 "Cut for merging track groups in Z0 significance",
118 streamlog_out(DEBUG) <<
" init called " << std::endl ;
138 streamlog_out(DEBUG2) <<
" process event: " << evt->getEventNumber()
139 <<
" in run: " << evt->getRunNumber() << std::endl ;
142 LCCollection* colTrk = nullptr ;
147 catch(lcio::Exception&){
149 <<
" not found in event - nothing to do ... " << std::endl ;
152 if( colTrk->getTypeName() != LCIO::TRACK ) {
155 <<
" not of type LCIO::TRACK " << std::endl ;
160 if( colTrk ==
nullptr )
165 int nTrkTotal = colTrk->getNumberOfElements() ;
168 std::vector<Track*> tracks ;
169 tracks.reserve( nTrkTotal ) ;
172 for(
int i=0; i< nTrkTotal ; ++i){
174 Track* trk =
dynamic_cast<Track*
>( colTrk->getElementAt( i ) ) ;
179 tracks.push_back( trk ) ;
186 std::list< TrackGroup > groups ;
187 for(
auto trk : tracks ){
188 groups.emplace_back( TrackGroup( trk ) ) ;
192 groups.sort( [](TrackGroup& a, TrackGroup& b) {
return a.z0Significance < b.z0Significance ; } ) ;
196 bool keepGoing = true ;
201 double deltaMin = 1.e9 ;
202 std::list< TrackGroup >::iterator smallestDistGroup = groups.end() ;
204 auto gEnd = groups.end() ;
205 std::advance( gEnd , - 1 ) ;
206 for(
auto gIt = groups.begin() ; gIt != gEnd ; ++gIt ) {
209 std::advance( nextGrp, 1 ) ;
210 double deltaZ0Sig = std::fabs( gIt->z0Significance - nextGrp->z0Significance ) ;
211 if( deltaZ0Sig < deltaMin ) {
212 deltaMin = deltaZ0Sig ;
213 smallestDistGroup = gIt ;
216 if( smallestDistGroup == groups.end() ){
224 auto nextGrp = smallestDistGroup ;
225 std::advance( nextGrp, 1 ) ;
227 smallestDistGroup->merge( *nextGrp ) ;
230 groups.erase( nextGrp ) ;
243 streamlog_out( DEBUG3 ) <<
" ============================================================== " << std::endl
244 <<
" found " << groups.size() <<
" groups " << std::endl ;
245 for(
auto grp : groups ) {
247 streamlog_out( DEBUG3 ) << grp << std::endl ;
259 for(
auto grp : groups ) {
261 IMPL::ReconstructedParticleImpl* pfo =
new IMPL::ReconstructedParticleImpl ;
266 for(
auto trk : grp.tracks){
267 pfo->addTrack( trk ) ;
268 z0Mean += trk->getZ0() ;
273 pfos->addElement( pfo ) ;
275 IMPL::VertexImpl* vtx =
new IMPL::VertexImpl ;
276 vtx->setAssociatedParticle( pfo ) ;
277 vtx->setPosition( 0., 0., z0Mean ) ;
280 vertices->addElement( vtx ) ;
293 streamlog_out( DEBUG ) <<
" --- check called ! " << std::endl ;
298 if( isFirstEvent() ){
301 AIDAProcessor::histogramFactory(
this ) ;
320 streamlog_out(MESSAGE) <<
"TrackZVertexGrouping::end() " << name()
321 <<
" processed " <<
_nEvt <<
" events in " <<
_nRun <<
" runs "
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
std::string _colNameTracks
Input collection name with Tracks.
Group Tracks into clusters with consistent z-positions of their vertex, based on the Z0 significance...
std::string _colNameTrkGroupVertices
virtual void init()
Called at the begin of the job before anything is read.
std::string _colNameTrkGroupPFOs
TrackZVertexGrouping aTrackZVertexGrouping
std::vector< LCCollection * > LCCollectionVec
virtual void end()
Called after data processing for clean up.
virtual void check(LCEvent *evt)
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.