diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.cxx b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.cxx index e4e82bdbfccbd83270f41bbbd20e15aade85ce90..2d16af875b3396cdc1a406b3370994fccc0c4340 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.cxx @@ -20,10 +20,7 @@ namespace Muon { MdtMathSegmentFinder::MdtMathSegmentFinder (const std::string& t, const std::string& n, const IInterface* p) : AthAlgTool (t, n, p), m_dcslFitProvider(""), - m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool"), - m_segmentFinder(0), - m_dcslFitter(0), - m_fitter(0) + m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool") { declareInterface <IMdtSegmentFinder> (this); @@ -65,97 +62,96 @@ namespace Muon { if( AthAlgTool::initialize().isFailure() ) return StatusCode::FAILURE; + if( !m_dcslFitProvider.empty() ){ + ATH_CHECK( m_dcslFitProvider.retrieve() ); + ATH_MSG_INFO(" Using fitter from " << m_dcslFitProvider); + } + + if( !m_idHelperTool.empty() ){ + ATH_CHECK( m_idHelperTool.retrieve() ); + } + return StatusCode::SUCCESS; + } + + StatusCode MdtMathSegmentFinder::finalize() + { + + return AthAlgTool::finalize(); + } + + const TrkDriftCircleMath::SegVec MdtMathSegmentFinder::findSegments (const TrkDriftCircleMath::DCVec& dcvec, + const TrkDriftCircleMath::CLVec& clvec, + const TrkDriftCircleMath::Road& road, + const TrkDriftCircleMath::DCStatistics& dcstats, + const TrkDriftCircleMath::ChamberGeometry* multiGeo = 0 ) const + { + + // setup finder - m_segmentFinder = new TrkDriftCircleMath::SegmentFinder(m_roadWidth,m_mdtAssociationPullCut,false); + std::unique_ptr<TrkDriftCircleMath::SegmentFinder> segmentFinder (new TrkDriftCircleMath::SegmentFinder(m_roadWidth,m_mdtAssociationPullCut,false)); // set debug level - m_segmentFinder->debugLevel(m_finderDebugLevel); + segmentFinder->debugLevel(m_finderDebugLevel); // configure uasge of chamber position for angular seeding - m_segmentFinder->setUseChamberPhi( m_useChamberTheta ); - + segmentFinder->setUseChamberPhi( m_useChamberTheta ); + // enable dropping of hits - m_segmentFinder->setDropHits( m_doDrop ); + segmentFinder->setDropHits( m_doDrop ); // enable seed cleaing - m_segmentFinder->setSeedCleaning( m_enableSeedCleaning ); + segmentFinder->setSeedCleaning( m_enableSeedCleaning ); - // enable seed cleaing - m_segmentFinder->setSingleMultiLayerScan( m_doSingleMultiLayerScan ); + // do single multilayer scan? + segmentFinder->setSingleMultiLayerScan( m_doSingleMultiLayerScan ); // set chi2/ndof threshold for cleaning of segments - m_segmentFinder->setChi2DropCut( m_chi2PerDofDrop ); + segmentFinder->setChi2DropCut( m_chi2PerDofDrop ); // set ratio for dropping segments with many empty tubes - m_segmentFinder->setRatioEmptyTubesCut( m_ratioEmptyTubesCut ); + segmentFinder->setRatioEmptyTubesCut( m_ratioEmptyTubesCut ); // set sort mode segment finder - m_segmentFinder->setSortSegmentsUsingAllHits( m_doAllHitSort ); + segmentFinder->setSortSegmentsUsingAllHits( m_doAllHitSort ); // set RPC pull cut - m_segmentFinder->setRPCPullCut( m_rpcAssociationPullCut ); + segmentFinder->setRPCPullCut( m_rpcAssociationPullCut ); // set TGC pull cut - m_segmentFinder->setTGCPullCut( m_tgcAssociationPullCut ); + segmentFinder->setTGCPullCut( m_tgcAssociationPullCut ); // set MDT outlier recovery - m_segmentFinder->setRecoverMDT( m_recoverMdtOutliers ); + segmentFinder->setRecoverMDT( m_recoverMdtOutliers ); // set removal of single outliers - m_segmentFinder->setRemoveSingleOutliers( m_removeSingleOutliers ); + segmentFinder->setRemoveSingleOutliers( m_removeSingleOutliers ); // set the curved segment finder - m_segmentFinder->setCurvedSegmentFinder( m_doCurvedSegmentFinder ); + segmentFinder->setCurvedSegmentFinder( m_doCurvedSegmentFinder ); // set removal of single outliers - m_segmentFinder->setDeltaCutT0( m_deltaCutT0Segments ); + segmentFinder->setDeltaCutT0( m_deltaCutT0Segments ); // reset defaults // set removal of single outliers - m_segmentFinder->setResidualCutT0( m_residualCutT0Segments ); + segmentFinder->setResidualCutT0( m_residualCutT0Segments ); - // set removal of single outliers - m_segmentFinder->setUseSegmentQuality( m_useSegmentQuality ); + // set use of segment quality + segmentFinder->setUseSegmentQuality( m_useSegmentQuality ); + std::unique_ptr<TrkDriftCircleMath::DCSLFitter> dcslFitter; if( !m_dcslFitProvider.empty() ){ - ATH_CHECK( m_dcslFitProvider.retrieve() ); - ATH_MSG_INFO(" Using fitter from " << m_dcslFitProvider); - m_fitter = m_dcslFitProvider->getFitter(); - m_segmentFinder->setFitter( m_fitter ); - m_dcslFitter = new TrkDriftCircleMath::DCSLFitter(); + segmentFinder->setFitter( m_dcslFitProvider->getFitter() ); } - - if( !m_idHelperTool.empty() ){ - ATH_CHECK( m_idHelperTool.retrieve() ); + else{ + dcslFitter=std::make_unique<TrkDriftCircleMath::DCSLFitter>(); + segmentFinder->setFitter( dcslFitter.get() ); } - return StatusCode::SUCCESS; - } - - StatusCode MdtMathSegmentFinder::finalize() - { - - delete m_segmentFinder; - delete m_dcslFitter; - return AthAlgTool::finalize(); - } - - const TrkDriftCircleMath::SegVec MdtMathSegmentFinder::findSegments (const TrkDriftCircleMath::DCVec& dcvec, - const TrkDriftCircleMath::CLVec& clvec, - const TrkDriftCircleMath::Road& road, - const TrkDriftCircleMath::DCStatistics& dcstats, - const TrkDriftCircleMath::ChamberGeometry* multiGeo = 0 ) const - { - // reset defaults - if( m_fitter ) { - m_segmentFinder->setFitter( m_fitter ); - } - m_segmentFinder->setSeedCleaning( m_enableSeedCleaning ); // set angle prediction from road - m_segmentFinder->setPhiRoad( road.angle(), road.chamberAngle(), road.width(), m_doRoadAngleSeeding, m_doIPAngleSeeding ); + segmentFinder->setPhiRoad( road.angle(), road.chamberAngle(), road.width(), m_doRoadAngleSeeding, m_doIPAngleSeeding ); // set pointer to geometry - m_segmentFinder->setMdtGeometry( multiGeo ); - m_segmentFinder->setSingleMultiLayerScan( m_doSingleMultiLayerScan ); + segmentFinder->setMdtGeometry( multiGeo ); // set seed cleaning bool highOccupancy = false; @@ -194,7 +190,7 @@ namespace Muon { << " nhits " << nmdtHits << " cut " << m_maxHitsPerFullSearch); return TrkDriftCircleMath::SegVec(); } - + // enable seed cleaning if( highOccupancy || nmdtHits > m_maxHitsPerFullSearch ) { @@ -202,22 +198,18 @@ namespace Muon { ATH_MSG_DEBUG(" switch to fast search: occupancy " << occupancyMax << " cut " << m_occupancyThreshold << " nhits " << nmdtHits << " cut " << m_maxHitsPerFullSearch); - // to speed up reconstruction use default fitter if special is selected - if( !m_dcslFitProvider.empty() ) { - m_segmentFinder->setFitter( m_dcslFitter ); + // to speed up reconstruction use default fitter + if( !m_dcslFitProvider.empty() ){ + dcslFitter=std::make_unique<TrkDriftCircleMath::DCSLFitter>(); + segmentFinder->setFitter( dcslFitter.get() ); } // use tight road cuts and only look for pointing segments - m_segmentFinder->setPhiRoad( road.chamberAngle(), road.chamberAngle(), m_tightRoadCut ); - - // only perform two layer scan - m_segmentFinder->setSingleMultiLayerScan( false ); + segmentFinder->setPhiRoad( road.chamberAngle(), road.chamberAngle(), m_tightRoadCut ); } - m_segmentFinder->setSingleMultiLayerScan( m_doSingleMultiLayerScan ); - - return m_segmentFinder->findSegments(dcvec,clvec); + return segmentFinder->findSegments(dcvec,clvec); } diff --git a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.h b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.h index 34dd62c73b07f0efaf795533cda24a649f764ab2..5412882f4f7666e2121774655aa91acef64c08fb 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.h +++ b/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/MdtMathSegmentFinder.h @@ -73,9 +73,6 @@ namespace Muon { bool m_useSegmentQuality; //<! use segment quality in hit dropping instead of chi2 unsigned int m_maxHitsPerFullSearch; //<! maximum number of hits, above will use faster search mode - mutable TrkDriftCircleMath::SegmentFinder* m_segmentFinder; //<! pointer to actual finder - mutable TrkDriftCircleMath::DCSLFitter* m_dcslFitter; //<! pointer to default fitter - mutable TrkDriftCircleMath::DCSLFitter* m_fitter; //<! pointer to selected fitter }; }