diff --git a/source/Digitisers/include/DDTPCDigiProcessor.h b/source/Digitisers/include/DDTPCDigiProcessor.h index dfee072..88974a8 100644 --- a/source/Digitisers/include/DDTPCDigiProcessor.h +++ b/source/Digitisers/include/DDTPCDigiProcessor.h @@ -58,6 +58,10 @@ class Voxel_tpc; class TPCModularEndplate ; +namespace UTIL { + class LCRelationNavigator; +} + /** ====== DDTPCDigiProcessor ======
* * This Processor depends on Circle.h from MarlinUtil @@ -138,8 +142,8 @@ class DDTPCDigiProcessor : public marlin::Processor { */ virtual void end() ; - void writeVoxelToHit( Voxel_tpc* aVoxel) ; - void writeMergedVoxelsToHit( std::vector * hitList ) ; + void writeVoxelToHit( Voxel_tpc* aVoxel, UTIL::LCRelationNavigator& hitSimHitNav) ; + void writeMergedVoxelsToHit( std::vector * hitList, UTIL::LCRelationNavigator& hitSimHitNav ) ; void plotHelixHitResidual(MCParticle *mcp, CLHEP::Hep3Vector *thisPointRPhi); double getPadPhi( CLHEP::Hep3Vector* thisPointRPhi, CLHEP::Hep3Vector* firstPointRPhi, CLHEP::Hep3Vector* middlePointRPhi, CLHEP::Hep3Vector* lastPointRPhi); double getPadTheta( CLHEP::Hep3Vector* firstPointRPhi, CLHEP::Hep3Vector* middlePointRPhi, CLHEP::Hep3Vector* lastPointRPhi ); @@ -204,7 +208,6 @@ class DDTPCDigiProcessor : public marlin::Processor { int lenpos{}; LCCollectionVec* _trkhitVec{}; - LCCollectionVec* _relCol{}; CellIDEncoder* _cellid_encoder {}; int _NSimTPCHits{}; diff --git a/source/Digitisers/src/DDTPCDigiProcessor.cc b/source/Digitisers/src/DDTPCDigiProcessor.cc index db91de6..e9157d9 100644 --- a/source/Digitisers/src/DDTPCDigiProcessor.cc +++ b/source/Digitisers/src/DDTPCDigiProcessor.cc @@ -32,6 +32,7 @@ // #include "UTIL/LCTrackerConf.h" #include +#include // --- DD4hep --- #include "DD4hep/Detector.h" @@ -500,12 +501,8 @@ void DDTPCDigiProcessor::processEvent( LCEvent * evt ) // created the collection which will be written out _trkhitVec = new LCCollectionVec( LCIO::TRACKERHIT ) ; - _relCol = new LCCollectionVec(LCIO::LCRELATION); - - // to store the weights - LCFlagImpl lcFlag(0) ; - lcFlag.setBit( LCIO::LCREL_WEIGHTED ) ; - _relCol->setFlag( lcFlag.getFlag() ) ; + // relations from created trackerhits to the SimTrackerHits that caused them + auto hitSimHitNav = UTIL::LCRelationNavigator(LCIO::TRACKERHIT, LCIO::SIMTRACKERHIT); _cellid_encoder = new CellIDEncoder( lcio::LCTrackerCellID::encoding_string() , _trkhitVec ) ; @@ -1017,7 +1014,7 @@ void DDTPCDigiProcessor::processEvent( LCEvent * evt ) } if(seed_hit->getNumberOfAdjacent()==0){ // no adjacent hits so smear and write to hit collection - writeVoxelToHit(seed_hit); + writeVoxelToHit(seed_hit, hitSimHitNav); } else if(seed_hit->getNumberOfAdjacent() < (_maxMerge)){ // potential 3-hit cluster, can use simple average merge. @@ -1028,7 +1025,7 @@ void DDTPCDigiProcessor::processEvent( LCEvent * evt ) if( clusterSize <= _maxMerge ){ // merge cluster seed_hit->setIsMerged(); - writeMergedVoxelsToHit(hitsToMerge); + writeMergedVoxelsToHit(hitsToMerge, hitSimHitNav); } delete hitsToMerge; } @@ -1074,7 +1071,8 @@ void DDTPCDigiProcessor::processEvent( LCEvent * evt ) // add the collection to the event evt->addCollection( _trkhitVec , _TPCTrackerHitsCol ) ; - evt->addCollection( _relCol , _outRelColName ) ; + auto relCol = hitSimHitNav.createLCCollection(); + evt->addCollection( relCol , _outRelColName ) ; // delete voxels for (unsigned int i = 0; i<_tpcRowHits.size(); ++i){ @@ -1149,7 +1147,7 @@ void DDTPCDigiProcessor::end() // } -void DDTPCDigiProcessor::writeVoxelToHit( Voxel_tpc* aVoxel){ +void DDTPCDigiProcessor::writeVoxelToHit( Voxel_tpc* aVoxel, UTIL::LCRelationNavigator& hitSimHitNav){ Voxel_tpc* seed_hit = aVoxel; @@ -1261,13 +1259,8 @@ void DDTPCDigiProcessor::writeVoxelToHit( Voxel_tpc* aVoxel){ trkHit->rawHits().push_back( _tpcHitMap[seed_hit] ); } - LCRelationImpl* rel = new LCRelationImpl; - - rel->setFrom (trkHit); - rel->setTo (_tpcHitMap[seed_hit]); - rel->setWeight( 1.0 ); - _relCol->addElement(rel); - + hitSimHitNav.addRelation(trkHit, _tpcHitMap[seed_hit], 1.0); + _trkhitVec->addElement( trkHit ); _NRecTPCHits++; } @@ -1298,7 +1291,7 @@ void DDTPCDigiProcessor::writeVoxelToHit( Voxel_tpc* aVoxel){ #endif } -void DDTPCDigiProcessor::writeMergedVoxelsToHit( vector * hitsToMerge){ +void DDTPCDigiProcessor::writeMergedVoxelsToHit( vector * hitsToMerge, UTIL::LCRelationNavigator& hitSimHitNav){ TrackerHitImpl* trkHit = new TrackerHitImpl ; @@ -1324,13 +1317,9 @@ void DDTPCDigiProcessor::writeMergedVoxelsToHit( vector * hitsToMerg trkHit->rawHits().push_back( _tpcHitMap[hitsToMerge->at(ihitCluster)] ); } - LCRelationImpl* rel = new LCRelationImpl; - - rel->setFrom (trkHit); - rel->setTo (_tpcHitMap[ hitsToMerge->at(ihitCluster) ]); - rel->setWeight( float(1.0/number_of_hits_to_merge) ); - _relCol->addElement(rel); - + hitSimHitNav.addRelation(trkHit, + _tpcHitMap[hitsToMerge->at(ihitCluster)], + float(1.0/number_of_hits_to_merge)); } double avgZ = sumZ/(hitsToMerge->size());