Skip to content

Commit e65c864

Browse files
authored
Merge pull request #269 from fucd/silicon
REC: Silicon tracking
2 parents fa7204f + 13c93c8 commit e65c864

26 files changed

+730
-156
lines changed

Reconstruction/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ add_subdirectory(PFA)
44
add_subdirectory(SiliconTracking)
55
add_subdirectory(Tracking)
66
add_subdirectory(RecGenfitAlg)
7+
add_subdirectory(RecAssociationMaker)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Modules
2+
gaudi_add_module(RecAssociationMaker
3+
SOURCES src/TrackParticleRelationAlg.cpp
4+
5+
LINK GearSvc
6+
EventSeeder
7+
TrackSystemSvcLib
8+
DataHelperLib
9+
KiTrackLib
10+
Gaudi::GaudiKernel
11+
k4FWCore::k4FWCore
12+
${GEAR_LIBRARIES}
13+
${GSL_LIBRARIES}
14+
${LCIO_LIBRARIES}
15+
)
16+
install(TARGETS RecAssociationMaker
17+
EXPORT CEPCSWTargets
18+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
19+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
20+
COMPONENT dev)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#include "TrackParticleRelationAlg.h"
2+
3+
DECLARE_COMPONENT(TrackParticleRelationAlg)
4+
5+
TrackParticleRelationAlg::TrackParticleRelationAlg(const std::string& name, ISvcLocator* svcLoc)
6+
: GaudiAlgorithm(name, svcLoc){
7+
declareProperty("MCParticleCollection", m_inMCParticleColHdl, "Handle of the Input MCParticle collection");
8+
}
9+
10+
StatusCode TrackParticleRelationAlg::initialize() {
11+
for(auto name : m_inTrackCollectionNames) {
12+
m_inTrackColHdls.push_back(new DataHandle<edm4hep::TrackCollection> (name, Gaudi::DataHandle::Reader, this));
13+
m_outColHdls.push_back(new DataHandle<edm4hep::MCRecoTrackParticleAssociationCollection> (name+"ParticleAssociation", Gaudi::DataHandle::Writer, this));
14+
}
15+
16+
for(unsigned i=0; i<m_inAssociationCollectionNames.size(); i++) {
17+
m_inAssociationColHdls.push_back(new DataHandle<edm4hep::MCRecoTrackerAssociationCollection> (m_inAssociationCollectionNames[i], Gaudi::DataHandle::Reader, this));
18+
}
19+
20+
if(m_inAssociationColHdls.size()==0) {
21+
warning() << "no Association Collection input" << endmsg;
22+
return StatusCode::FAILURE;
23+
}
24+
25+
m_nEvt = 0;
26+
return GaudiAlgorithm::initialize();
27+
}
28+
29+
StatusCode TrackParticleRelationAlg::execute() {
30+
info() << "start Event " << m_nEvt << endmsg;
31+
32+
// MCParticle
33+
const edm4hep::MCParticleCollection* mcpCol = nullptr;
34+
try {
35+
mcpCol = m_inMCParticleColHdl.get();
36+
for (auto mcp : *mcpCol) {
37+
debug() << "id=" << mcp.id() << " pdgid=" << mcp.getPDG() << " charge=" << mcp.getCharge() << " genstat=" << mcp.getGeneratorStatus() << " simstat=" << mcp.getSimulatorStatus()
38+
<< " p=" << mcp.getMomentum() << endmsg;
39+
int nparents = mcp.parents_size();
40+
int ndaughters = mcp.daughters_size();
41+
for (int i=0; i<nparents; i++) {
42+
debug() << "<<<<<<" << mcp.getParents(i).id() << endmsg;
43+
}
44+
for (int i=0; i<ndaughters; i++) {
45+
debug() << "<<<<<<" << mcp.getDaughters(i).id() << endmsg;
46+
}
47+
}
48+
}
49+
catch ( GaudiException &e ) {
50+
debug() << "Collection " << m_inMCParticleColHdl.fullKey() << " is unavailable in event " << m_nEvt << endmsg;
51+
}
52+
if(!mcpCol) {
53+
warning() << "pass this event because MCParticle collection can not read" << endmsg;
54+
return StatusCode::SUCCESS;
55+
}
56+
57+
// Prepare map from hit to MCParticle
58+
std::map<edm4hep::TrackerHit, edm4hep::MCParticle> mapHitParticle;
59+
debug() << "reading Association" << endmsg;
60+
for (auto hdl : m_inAssociationColHdls) {
61+
const edm4hep::MCRecoTrackerAssociationCollection* assCol = nullptr;
62+
try {
63+
assCol = hdl->get();
64+
}
65+
catch ( GaudiException &e ) {
66+
debug() << "Collection " << hdl->fullKey() << " is unavailable in event " << m_nEvt << endmsg;
67+
return StatusCode::FAILURE;
68+
}
69+
for (auto ass: *assCol) {
70+
auto hit = ass.getRec();
71+
auto particle = ass.getSim().getMCParticle();
72+
mapHitParticle[hit] = particle;
73+
}
74+
}
75+
76+
// Handle all input TrackCollection
77+
for (unsigned icol=0; icol<m_inTrackColHdls.size(); icol++) {
78+
auto hdl = m_inTrackColHdls[icol];
79+
80+
const edm4hep::TrackCollection* trkCol = nullptr;
81+
try {
82+
trkCol = hdl->get();
83+
}
84+
catch ( GaudiException &e ) {
85+
debug() << "Collection " << hdl->fullKey() << " is unavailable in event " << m_nEvt << endmsg;
86+
}
87+
88+
auto outCol = m_outColHdls[icol]->createAndPut();
89+
if(!outCol) {
90+
error() << "Collection " << m_outColHdls[icol]->fullKey() << " cannot be created" << endmsg;
91+
return StatusCode::FAILURE;
92+
}
93+
94+
if(trkCol) {
95+
std::map<edm4hep::MCParticle, std::vector<edm4hep::TrackerHit> > mapParticleHits;
96+
97+
for (auto track: *trkCol) {
98+
std::map<edm4hep::MCParticle, int> mapParticleNHits;
99+
100+
// Count hits related to MCParticle
101+
int nhits = track.trackerHits_size();
102+
for (int ihit=0; ihit<nhits; ihit++) {
103+
auto hit = track.getTrackerHits(ihit);
104+
auto itHP = mapHitParticle.find(hit);
105+
if (itHP==mapHitParticle.end()) {
106+
warning() << "track " << track.id() << "'s hit " << hit.id() << "not in association list, will be ignored" << endmsg;
107+
}
108+
else {
109+
auto particle = itHP->second;
110+
if(!particle.isAvailable()) continue;
111+
debug() << "track " << track.id() << "'s hit " << hit.id() << " link to MCParticle " << particle.id() << endmsg;
112+
auto itPN = mapParticleNHits.find(particle);
113+
if (itPN!=mapParticleNHits.end()) itPN->second++;
114+
else mapParticleNHits[particle] = 1;
115+
116+
if (msgLevel(MSG::DEBUG)) mapParticleHits[particle].push_back(hit);
117+
}
118+
}
119+
debug() << "Total " << mapParticleNHits.size() << " particles link to the track " << track.id() << endmsg;
120+
121+
// Save to collection
122+
for (std::map<edm4hep::MCParticle, int>::iterator it=mapParticleNHits.begin(); it!=mapParticleNHits.end(); it++) {
123+
auto ass = outCol->create();
124+
ass.setWeight(it->second);
125+
ass.setRec(track);
126+
ass.setSim(it->first);
127+
}
128+
}
129+
130+
if (msgLevel(MSG::DEBUG)) {
131+
for (std::map<edm4hep::MCParticle, std::vector<edm4hep::TrackerHit> >::iterator it=mapParticleHits.begin(); it!=mapParticleHits.end(); it++) {
132+
auto particle = it->first;
133+
auto hits = it->second;
134+
debug() << "=== MCPaticle ===" << particle << endmsg;
135+
for (auto hit : hits) {
136+
debug() << hit << endmsg;
137+
}
138+
}
139+
}
140+
}
141+
}
142+
143+
m_nEvt++;
144+
return StatusCode::SUCCESS;
145+
}
146+
147+
StatusCode TrackParticleRelationAlg::finalize() {
148+
149+
return StatusCode::SUCCESS;
150+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef TrackParticleRelationAlg_h
2+
#define TrackParticleRelationAlg_h 1
3+
4+
#include "k4FWCore/DataHandle.h"
5+
#include "GaudiAlg/GaudiAlgorithm.h"
6+
7+
#include "edm4hep/MCParticleCollection.h"
8+
#include "edm4hep/TrackCollection.h"
9+
#include "edm4hep/MCRecoTrackerAssociationCollection.h"
10+
#include "edm4hep/MCRecoTrackParticleAssociationCollection.h"
11+
12+
class TrackParticleRelationAlg : public GaudiAlgorithm {
13+
public:
14+
// Constructor of this form must be provided
15+
TrackParticleRelationAlg( const std::string& name, ISvcLocator* pSvcLocator );
16+
17+
// Three mandatory member functions of any algorithm
18+
StatusCode initialize() override;
19+
StatusCode execute() override;
20+
StatusCode finalize() override;
21+
22+
private:
23+
// input MCParticle
24+
DataHandle<edm4hep::MCParticleCollection> m_inMCParticleColHdl{"MCParticle", Gaudi::DataHandle::Reader, this};
25+
// input Tracks to make relation
26+
std::vector<DataHandle<edm4hep::TrackCollection>* > m_inTrackColHdls;
27+
Gaudi::Property<std::vector<std::string> > m_inTrackCollectionNames{this, "TrackList", {"SiTracks"}};
28+
// input TrackerAssociation to link TrackerHit and SimTrackerHit
29+
std::vector<DataHandle<edm4hep::MCRecoTrackerAssociationCollection>* > m_inAssociationColHdls;
30+
Gaudi::Property<std::vector<std::string> > m_inAssociationCollectionNames{this, "TrackerAssociationList", {"VXDTrackerHitAssociation",
31+
"SITTrackerHitAssociation", "SETTrackerHitAssociation", "FTDTrackerHitAssociation"}};
32+
33+
// output TrackParticleAssociation
34+
std::vector<DataHandle<edm4hep::MCRecoTrackParticleAssociationCollection>* > m_outColHdls;
35+
36+
int m_nEvt;
37+
};
38+
#endif

Reconstruction/SiliconTracking/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ gaudi_add_module(SiliconTracking
77
src/TrackSubsetAlg.cpp
88
LINK GearSvc
99
EventSeeder
10+
TrackingLib
1011
TrackSystemSvcLib
1112
DataHelperLib
1213
KiTrackLib

Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp

+13-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "DataHelper/Navigation.h"
55

66
#include "edm4hep/TrackerHit.h"
7-
#include "edm4hep/TrackerHit.h"
7+
#include "edm4hep/TrackerHitPlane.h"
88
#include "edm4hep/Track.h"
99
#if __has_include("edm4hep/EDM4hepVersion.h")
1010
#include "edm4hep/EDM4hepVersion.h"
@@ -74,12 +74,16 @@ StatusCode ForwardTrackingAlg::initialize(){
7474
// can be printed. As this is mainly used for debugging it is not a steerable parameter.
7575
//if( _useCED )MarlinCED::init(this) ; //CED
7676

77+
// Set up the track fit tool
78+
m_fitTool = ToolHandle<ITrackFitterTool>(m_fitToolName.value());
79+
7780
if(m_dumpTime){
7881
NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name());
7982
if ( !nt1 ) {
8083
m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time");
8184
if ( 0 != m_tuple ) {
8285
m_tuple->addItem ("timeTotal", m_timeTotal ).ignore();
86+
m_tuple->addItem ("timeKalman", m_timeKalman ).ignore();
8387
}
8488
else {
8589
fatal() << "Cannot book MyTuples/Time"+name() <<endmsg;
@@ -306,7 +310,9 @@ StatusCode ForwardTrackingAlg::execute(){
306310
_map_sector_hits[ ftdHit->getSector() ].push_back( ftdHit );
307311
}
308312
}
309-
313+
314+
if(m_dumpTime&&m_tuple) m_timeKalman = 0;
315+
310316
if( !_map_sector_hits.empty() ){
311317
/**********************************************************************************************/
312318
/* Check if no sector is overflowing with hits */
@@ -661,7 +667,7 @@ StatusCode ForwardTrackingAlg::execute(){
661667
debug() << "\t\t---Save Tracks---" << endmsg ;
662668

663669
//auto trkCol = _outColHdl.createAndPut();
664-
670+
665671
for (unsigned int i=0; i < tracks.size(); i++){
666672
FTDTrack* myTrack = dynamic_cast< FTDTrack* >( tracks[i] );
667673

@@ -942,7 +948,7 @@ bool ForwardTrackingAlg::setCriteria( unsigned round ){
942948
}
943949

944950
void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){
945-
951+
auto stopwatch = TStopwatch();
946952
Fitter fitter( trackImpl , _trkSystem );
947953

948954
//trackImpl->trackStates().clear();
@@ -1024,6 +1030,9 @@ void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){
10241030
trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SET]);
10251031
trackImpl->addToSubDetectorHitNumbers(hitNumbers[UTIL::ILDDetID::ETD]);
10261032
#endif
1033+
1034+
if(m_dumpTime&&m_tuple) m_timeKalman += stopwatch.RealTime()*1000;
1035+
10271036
return;
10281037
}
10291038

Reconstruction/SiliconTracking/src/ForwardTrackingAlg.h

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "edm4hep/TrackerHit.h"
1616
#include "TrackSystemSvc/IMarlinTrkSystem.h"
17+
#include "Tracking/ITrackFitterTool.h"
1718
//#include "gear/BField.h"
1819

1920
#include "KiTrack/Segment.h"
@@ -239,6 +240,7 @@ class ForwardTrackingAlg : public GaudiAlgorithm {
239240

240241
NTuple::Tuple* m_tuple;
241242
NTuple::Item<float> m_timeTotal;
243+
NTuple::Item<float> m_timeKalman;
242244

243245
/** B field in z direction */
244246
double _Bz;
@@ -261,6 +263,7 @@ class ForwardTrackingAlg : public GaudiAlgorithm {
261263
Gaudi::Property<std::vector<float> > _critMinimaInit{this, "CriteriaMin", {} };
262264
Gaudi::Property<std::vector<float> > _critMaximaInit{this, "CriteriaMax", {} };
263265
Gaudi::Property<bool> m_dumpTime{this, "DumpTime", true};
266+
Gaudi::Property<std::string> m_fitToolName{this, "FitterTool", "KalTestTool/KalTest110"};
264267

265268
std::map<std::string, std::vector<float> > _critMinima;
266269
std::map<std::string, std::vector<float> > _critMaxima;
@@ -291,6 +294,7 @@ class ForwardTrackingAlg : public GaudiAlgorithm {
291294
unsigned _nTrackCandidatesPlus;
292295

293296
MarlinTrk::IMarlinTrkSystem* _trkSystem;
297+
ToolHandle<ITrackFitterTool> m_fitTool;
294298

295299
/** The quality of the output track collection */
296300
int _output_track_col_quality ;

0 commit comments

Comments
 (0)