diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py index ccd1794f763d30de8da38944f0733e487fc42c59..3ffb496fd7749476b39b5940ffdedd672746065f 100755 --- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py +++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinder_Config.py @@ -207,12 +207,6 @@ class TrigFastTrackFinderBase(TrigFastTrackFinder): from TrigInDetConf.TrigInDetRecCommonTools import InDetTrigFastTrackSummaryTool self.TrackSummaryTool = InDetTrigFastTrackSummaryTool - if self.doResMon: - from TrigInDetTrackFitter.TrigInDetTrackFitterConf import TrigL2ResidualCalculator - resCalc = TrigL2ResidualCalculator(OfflineClusters=False) - ToolSvc += resCalc - self.TrigL2ResidualCalculator = resCalc - # Run3 monitoring self.MonTool = TrigFastTrackFinderMonitoring(type, self.doResMon) diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx index 38c0c5cd2b07b8082c4a54f733d0e24a217b979d..55dd30897b76ee2c3e2ba0ef878f9453e7b21f8b 100644 --- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx +++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx @@ -54,7 +54,6 @@ #include "TrigInDetToolInterfaces/ITrigL2LayerNumberTool.h" #include "TrigInDetToolInterfaces/ITrigSpacePointConversionTool.h" #include "TrigInDetToolInterfaces/ITrigL2SpacePointTruthTool.h" -#include "TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h" #include "TrigInDetToolInterfaces/TrigL2HitResidual.h" #include "TrigInDetToolInterfaces/ITrigInDetTrackFitter.h" @@ -86,7 +85,6 @@ TrigFastTrackFinder::TrigFastTrackFinder(const std::string& name, ISvcLocator* p HLT::FexAlgo(name, pSvcLocator), m_numberingTool("TrigL2LayerNumberTool"), m_spacePointTool("TrigSpacePointConversionTool"), - m_trigL2ResidualCalculator("TrigL2ResidualCalculator"), m_trackMaker("InDet::SiTrackMaker_xk/InDetTrigSiTrackMaker"), m_trigInDetTrackFitter("TrigInDetTrackFitter"), m_trigZFinder("TrigZFinder/TrigZFinder", this ), @@ -161,7 +159,6 @@ TrigFastTrackFinder::TrigFastTrackFinder(const std::string& name, ISvcLocator* p declareProperty( "initialTrackMaker", m_trackMaker); declareProperty( "trigInDetTrackFitter", m_trigInDetTrackFitter ); declareProperty( "trigZFinder", m_trigZFinder ); - declareProperty( "TrigL2ResidualCalculator", m_trigL2ResidualCalculator ); declareProperty("TrackSummaryTool", m_trackSummaryTool); declareProperty( "doResMon", m_doResMonitoring = true); @@ -248,16 +245,6 @@ HLT::ErrorCode TrigFastTrackFinder::hltInitialize() { return HLT::BAD_JOB_SETUP; } - if (m_doResMonitoring) { - sc = m_trigL2ResidualCalculator.retrieve(); - if ( sc.isFailure() ) { - msg() << MSG::FATAL <<"Unable to locate Residual calculator tool " << m_trigL2ResidualCalculator << endmsg; - return HLT::BAD_JOB_SETUP; - } - } else { - m_trigL2ResidualCalculator.disable(); - } - //Get ID helper if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) { ATH_MSG_ERROR("Could not get AtlasDetectorID helper AtlasID"); @@ -671,7 +658,7 @@ StatusCode TrigFastTrackFinder::findTracks(InDet::SiTrackMakerEventData_xk &trac mnt_timer_TrackFitter.start(); // Run3 monitoring - m_trigInDetTrackFitter->fit(initialTracks, outputTracks, m_particleHypothesis); + m_trigInDetTrackFitter->fit(initialTracks, outputTracks, ctx, m_particleHypothesis); if( outputTracks.empty() ) { ATH_MSG_DEBUG("REGTEST / No tracks fitted"); @@ -1018,12 +1005,12 @@ void TrigFastTrackFinder::fillMon(const TrackCollection& tracks, const TrigVerte // tighter selection for unbiased residuals bool goodTrack = std::fabs(pT)>1000. && (nPix + nSct/2) > 3 && nSct > 0; if (goodTrack && m_doResMonitoring) { - runResidualMonitoring(*track); + runResidualMonitoring(*track, ctx); } } } -void TrigFastTrackFinder::runResidualMonitoring(const Trk::Track& track) const { +void TrigFastTrackFinder::runResidualMonitoring(const Trk::Track& track, const EventContext& ctx) const { // Run3 monitoring ----------> std::vector<float> mnt_layer_IBL; @@ -1124,7 +1111,7 @@ void TrigFastTrackFinder::runResidualMonitoring(const Trk::Track& track) const { std::vector<TrigL2HitResidual> vResid; vResid.clear(); - StatusCode scRes = m_trigL2ResidualCalculator->getUnbiasedResiduals(track,vResid); + StatusCode scRes = m_trigInDetTrackFitter->getUnbiasedResiduals(track,vResid, ctx); if(!scRes.isSuccess()) return; for(std::vector<TrigL2HitResidual>::iterator it=vResid.begin();it!=vResid.end();++it) { Identifier id = it->identify(); diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.h b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.h index b4e54a9b26e0bec3e6547918436040d82be68b57..b00c6cf14acb4bea9d90bdbb860dd3db39fe88f4 100644 --- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.h +++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.h @@ -35,7 +35,6 @@ class ITrigL2LayerNumberTool; class ITrigSpacePointConversionTool; -class ITrigL2ResidualCalculator; class ITrigInDetTrackFitter; class ITrigZFinder; class TrigRoiDescriptor; @@ -100,7 +99,6 @@ protected: ToolHandle<ITrigL2LayerNumberTool> m_numberingTool; ToolHandle<ITrigSpacePointConversionTool> m_spacePointTool; - ToolHandle<ITrigL2ResidualCalculator> m_trigL2ResidualCalculator; ToolHandle<InDet::ISiTrackMaker> m_trackMaker; // Track maker ToolHandle<ITrigInDetTrackFitter> m_trigInDetTrackFitter; ToolHandle<ITrigZFinder> m_trigZFinder; @@ -153,7 +151,7 @@ protected: // Monitoring member functions void fillMon(const TrackCollection& tracks, const TrigVertexCollection& vertices, const TrigRoiDescriptor& roi, const EventContext& ctx) const; - void runResidualMonitoring(const Trk::Track& track) const; + void runResidualMonitoring(const Trk::Track& track, const EventContext&) const; //Setup functions void getBeamSpot(float&, float&, const EventContext&) const; diff --git a/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigInDetTrackFitter.h b/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigInDetTrackFitter.h index e6262dbe1b1ac9e732f063491fe9d5fde70d6895..4127c2436f8173583a98b01a7ae62ead7c6730f6 100755 --- a/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigInDetTrackFitter.h +++ b/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigInDetTrackFitter.h @@ -7,9 +7,14 @@ #include <vector> #include "GaudiKernel/IAlgTool.h" -#include "TrigInDetEvent/TrigInDetTrackCollection.h" #include "TrkTrack/TrackCollection.h" +namespace Trk { + class Track; +} + +class TrigL2HitResidual; + static const InterfaceID IID_ITrigInDetTrackFitter("ITrigInDetTrackFitter", 1 , 0); class ITrigInDetTrackFitter: virtual public IAlgTool @@ -19,7 +24,8 @@ class ITrigInDetTrackFitter: virtual public IAlgTool static const InterfaceID& interfaceID() { return IID_ITrigInDetTrackFitter; } - virtual void fit(const TrackCollection&, TrackCollection&, const Trk::ParticleHypothesis& matEffects) const = 0; + virtual void fit(const TrackCollection&, TrackCollection&, const EventContext&, const Trk::ParticleHypothesis& matEffects) const = 0; + virtual StatusCode getUnbiasedResiduals(const Trk::Track&, std::vector<TrigL2HitResidual>&, const EventContext&) const = 0; }; #endif diff --git a/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h b/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h deleted file mode 100644 index c6b9f0e10e7a9a386179bdab1af65be98870dfae..0000000000000000000000000000000000000000 --- a/Trigger/TrigTools/TrigInDetToolInterfaces/TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef __ITRIGL2RESIDUALCALCULATOR_H__ -#define __ITRIGL2RESIDUALCALCULATOR_H__ - -#include "GaudiKernel/IAlgTool.h" -#include <vector> - -namespace Trk { - class Track; -} -class TrigL2HitResidual; - -static const InterfaceID IID_ITrigL2ResidualCalculator("ITrigL2ResidualCalculator",1,0); - - - /** @class ITrigL2ResidualCalculator - - provides the abstract interface for the LVL2 ID tool that calculates smoothed residuals - of Pixel and SCT hits - - @author D.Emeliyanov <http://consult.cern.ch/xwho> - */ - - class ITrigL2ResidualCalculator : virtual public IAlgTool { - - public: - /** other standard AlgTool methods */ - - static const InterfaceID& interfaceID () //!< the Tool's interface - { return IID_ITrigL2ResidualCalculator; } - - virtual StatusCode getUnbiasedResiduals(const Trk::Track&, std::vector<TrigL2HitResidual>&) const = 0; - }; - -#endif diff --git a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.cxx b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.cxx index 64b117ebe1e288fe5bf68b3d602b6ca419d0ebe7..17d64310126298f6a62f8d4664767d75c1b336fd 100644 --- a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.cxx +++ b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.cxx @@ -41,6 +41,10 @@ #include "AthenaBaseComps/AthMsgStreamMacros.h" #include "AthenaBaseComps/AthCheckMacros.h" +#include "AtlasDetDescr/AtlasDetectorID.h" +#include "InDetIdentifier/SCT_ID.h" +#include "InDetIdentifier/PixelID.h" +#include "TrigInDetToolInterfaces/TrigL2HitResidual.h" #include "TrkRIO_OnTrack/RIO_OnTrack.h" #include "TrkPrepRawData/PrepRawData.h" @@ -50,20 +54,18 @@ #include "TrkEventPrimitives/FitQuality.h" #include "TrkEventPrimitives/FitQualityOnSurface.h" +#include "MagFieldConditions/AtlasFieldCacheCondObj.h" TrigInDetTrackFitter::TrigInDetTrackFitter(const std::string& t, const std::string& n, const IInterface* p ): AthAlgTool(t,n,p), - m_MagFieldSvc("AtlasFieldSvc",this->name()), m_trackMaker("TrigDkfTrackMakerTool") { declareInterface< ITrigInDetTrackFitter >( this ); - declareProperty( "AthenaFieldService", m_MagFieldSvc, "AlasFieldService"); declareProperty( "doMultScattering", m_doMultScatt = true); declareProperty( "doBremmCorrection", m_doBremm=false); declareProperty( "Chi2Cut", m_DChi2 = 1000.0); - declareProperty( "OfflineClusters", m_offlineClusters = true); declareProperty( "correctClusterPos", m_correctClusterPos = false); declareProperty( "ROTcreator", m_ROTcreator, "ROTcreatorTool" ); m_nTracksTotal = 0; @@ -74,12 +76,17 @@ TrigInDetTrackFitter::TrigInDetTrackFitter(const std::string& t, StatusCode TrigInDetTrackFitter::initialize() { - ATH_CHECK(m_MagFieldSvc.retrieve()); ATH_CHECK(m_trackMaker.retrieve()); if (m_correctClusterPos) { ATH_CHECK(m_ROTcreator.retrieve()); } + ATH_CHECK( m_fieldCondObjInputKey.initialize()); + ATH_CHECK(detStore()->retrieve(m_idHelper, "AtlasID")); + ATH_CHECK(detStore()->retrieve(m_pixelId, "PixelID")); + ATH_CHECK(detStore()->retrieve(m_sctId, "SCT_ID")); + return StatusCode::SUCCESS; + } StatusCode TrigInDetTrackFitter::finalize() @@ -95,10 +102,10 @@ StatusCode TrigInDetTrackFitter::finalize() return StatusCode::SUCCESS; } -void TrigInDetTrackFitter::getMagneticField(double r[3],double* B) const { +void TrigInDetTrackFitter::getMagneticField(double r[3],double* B, MagField::AtlasFieldCache& fieldCache) const { B[0]=0.0;B[1]=0.0;B[2]=0.0; double field[3]; - m_MagFieldSvc->getField(r,field);//field is returned in kT + fieldCache.getField(r,field);//field is returned in kT for(int i=0;i<3;i++) B[i]=field[i]/Gaudi::Units::kilogauss;//convert to kG } @@ -126,7 +133,8 @@ void TrigInDetTrackFitter::correctScale(Trk::TrkTrackState* pTS) const { Trk::TrkTrackState* TrigInDetTrackFitter::extrapolate(Trk::TrkTrackState* pTS, Trk::TrkPlanarSurface* pSB, - Trk::TrkPlanarSurface* pSE) const + Trk::TrkPlanarSurface* pSE, + MagField::AtlasFieldCache& fieldCache) const { const double C=0.02999975/1000.0;//using GeV internally const double minStep=30.0; @@ -154,7 +162,6 @@ Trk::TrkTrackState* TrigInDetTrackFitter::extrapolate(Trk::TrkTrackState* pTS, int nStep,nStepMax; double sl,ds,path=0.0; - //m_numericalJacobian(pTS,pSB,pSE,J); double sint,cost,sinf,cosf; sint=sin(pTS->getTrackState(3));cosf=cos(pTS->getTrackState(2)); sinf=sin(pTS->getTrackState(2));cost=cos(pTS->getTrackState(3)); @@ -193,7 +200,7 @@ Trk::TrkTrackState* TrigInDetTrackFitter::extrapolate(Trk::TrkTrackState* pTS, for(i=0;i<4;i++) D[i]=pSE->getPar(i); for(i=0;i<3;i++) gPi[i]=gP[i]; - getMagneticField(gP,gB); + getMagneticField(gP,gB, fieldCache); for(i=0;i<3;i++) gBi[i]=gB[i]; @@ -248,7 +255,7 @@ Trk::TrkTrackState* TrigInDetTrackFitter::extrapolate(Trk::TrkTrackState* pTS, V[1]=gV[1]+Av*DVy; V[2]=gV[2]+Av*DVz; - getMagneticField(P,gB); + getMagneticField(P,gB,fieldCache); for(i=0;i<3;i++) gBf[i]=gB[i]; for(i=0;i<3;i++) @@ -551,18 +558,24 @@ Trk::TrkTrackState* TrigInDetTrackFitter::extrapolate(Trk::TrkTrackState* pTS, return pTE; } -void TrigInDetTrackFitter::fit(const TrackCollection& inputTracks, TrackCollection& fittedTracks, const Trk::ParticleHypothesis& matEffects) const +void TrigInDetTrackFitter::fit(const TrackCollection& inputTracks, TrackCollection& fittedTracks, const EventContext& ctx, const Trk::ParticleHypothesis& matEffects) const { + MagField::AtlasFieldCache fieldCache; + + SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx}; + const AtlasFieldCacheCondObj* fieldCondObj{*readHandle}; + + fieldCondObj->getInitializedCache (fieldCache); fittedTracks.reserve(inputTracks.size()); for(auto trIt = inputTracks.begin(); trIt != inputTracks.end(); ++trIt) { - Trk::Track* fittedTrack = fitTrack(**trIt, matEffects); + Trk::Track* fittedTrack = fitTrack(**trIt, fieldCache, matEffects); if (fittedTrack!=nullptr) { fittedTracks.push_back(fittedTrack); } } } -Trk::Track* TrigInDetTrackFitter::fitTrack(const Trk::Track& recoTrack, const Trk::ParticleHypothesis& matEffects) const { +Trk::Track* TrigInDetTrackFitter::fitTrack(const Trk::Track& recoTrack, MagField::AtlasFieldCache& fieldCache, const Trk::ParticleHypothesis& matEffects) const { const Trk::TrackParameters* trackPars = recoTrack.perigeeParameters(); if(trackPars==nullptr) { @@ -628,7 +641,7 @@ Trk::Track* TrigInDetTrackFitter::fitTrack(const Trk::Track& recoTrack, const Tr Trk::TrkPlanarSurface* pSE=nullptr; for(auto pnIt = vpTrkNodes.begin(); pnIt!=vpTrkNodes.end(); ++pnIt) { pSE=(*pnIt)->getSurface(); - Trk::TrkTrackState* pNS=extrapolate(pTS,pSB,pSE); + Trk::TrkTrackState* pNS=extrapolate(pTS,pSB,pSE,fieldCache); pSB=pSE; if(pNS!=nullptr) { @@ -823,3 +836,192 @@ Trk::TrackStateOnSurface* TrigInDetTrackFitter::createTrackStateOnSurface(Trk::T pTSS = new Trk::TrackStateOnSurface(pRIO, 0, pFQ, 0, typePattern); return pTSS; } + +StatusCode TrigInDetTrackFitter::getUnbiasedResiduals(const Trk::Track& pT, + std::vector<TrigL2HitResidual>& vResid, const EventContext& ctx) const { + + const Trk::TrackParameters* trackPars = pT.perigeeParameters(); + if(trackPars==nullptr) { + ATH_MSG_WARNING("Fit Failed -- TrkTrack has no parameters"); + return StatusCode::FAILURE; + } + + MagField::AtlasFieldCache fieldCache; + + SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx}; + const AtlasFieldCacheCondObj* fieldCondObj{*readHandle}; + + fieldCondObj->getInitializedCache (fieldCache); + std::vector<Trk::TrkBaseNode*> vpTrkNodes; + std::vector<Trk::TrkTrackState*> vpTrackStates; + vResid.clear(); + double trk_theta = trackPars->parameters()[Trk::theta]; + double trk_qOverP = trackPars->parameters()[Trk::qOverP]; + double Pt = sin(trk_theta)/trk_qOverP; + if(fabs(Pt)<100.0) + { + ATH_MSG_DEBUG("TrigL2ResidualCalculator failed -- Estimated Pt is too low "<<Pt); + return StatusCode::FAILURE; + } + + // 1. Create filtering nodes + + bool trackResult = m_trackMaker->createDkfTrack(pT,vpTrkNodes, m_DChi2); + if(!trackResult) + { + ATH_MSG_DEBUG("TrigDkfTrackMaker failed"); + return StatusCode::FAILURE; + } + + int nNodeIndex=-1; + bool OK=true; + std::vector<Trk::TrkBaseNode*>::iterator pnIt,pnEnd(vpTrkNodes.end()); + + for(std::vector<Trk::TrkBaseNode*>::iterator pNodeIt=vpTrkNodes.begin();pNodeIt!=vpTrkNodes.end(); + ++pNodeIt) + { + nNodeIndex++; + Trk::TrkBaseNode* pMaskedNode=(*pNodeIt); + Trk::TrkTrackState* pMaskedState=NULL; + + // 2. Create initial track state: + + double Rk[5]; + Rk[0] = trackPars->parameters()[Trk::d0]; + Rk[1] = trackPars->parameters()[Trk::z0]; + Rk[2] = trackPars->parameters()[Trk::phi0]; + if(Rk[2]>M_PI) Rk[2]-=2*M_PI; + if(Rk[2]<-M_PI) Rk[2]+=2*M_PI; + trk_theta = trackPars->parameters()[Trk::theta]; + Rk[3] = trk_theta; + Rk[4] = 1000.0*trackPars->parameters()[Trk::qOverP];//MeV->GeV + //No need to correct scale back - not returning track + + // 3. Main algorithm: filter and smoother (Rauch-Tung-Striebel) + + Trk::TrkTrackState* pTS = new Trk::TrkTrackState(Rk); + double Gk[5][5] = {{100.0, 0, 0, 0, 0}, + {0, 100.0, 0, 0, 0}, + {0, 0, 0.01, 0, 0}, + {0, 0, 0, 0.01, 0}, + {0, 0, 0, 0, 0.1}}; + pTS->setTrackCovariance(Gk); + if(m_doMultScatt) + pTS->setScatteringMode(1); + if(m_doBremm) + pTS->setScatteringMode(2); + vpTrackStates.push_back(pTS); + + ATH_MSG_DEBUG("Initial params: locT="<<Rk[0]<<" locL="<<Rk[1]<<" phi="<<Rk[2] + <<" theta="<<Rk[3]<<" Q="<<Rk[4]<<" pT="<<sin(Rk[3])/Rk[4]); + + OK=true; + Trk::TrkPlanarSurface *pSB=NULL,*pSE; + + for(pnIt=vpTrkNodes.begin();pnIt!=pnEnd;++pnIt) + { + pSE=(*pnIt)->getSurface(); + Trk::TrkTrackState* pNS=extrapolate(pTS,pSB,pSE,fieldCache); + + pSB=pSE; + if(pNS!=NULL) + { + vpTrackStates.push_back(pNS); + + (*pnIt)->validateMeasurement(pNS); + ATH_MSG_DEBUG("dChi2="<<(*pnIt)->getChi2()); + if((*pnIt)!=pMaskedNode) + { + (*pnIt)->updateTrackState(pNS); + } + else + { + pMaskedState=pNS; + } + pTS=pNS; + Pt=sin(pTS->getTrackState(3))/pTS->getTrackState(4); + if(fabs(Pt)<0.2) + { + ATH_MSG_DEBUG("Estimated Pt is too low "<<Pt<<" - skipping fit"); + OK=false;break; + } + } + else + { + OK=false;break; + } + } + if(OK) + { + std::vector<Trk::TrkTrackState*>::reverse_iterator ptsrIt(vpTrackStates.rbegin()), + ptsrEnd(vpTrackStates.rend()); + + for(;ptsrIt!=ptsrEnd;++ptsrIt) + { + (*ptsrIt)->runSmoother(); + } + + pMaskedNode->validateMeasurement(pMaskedState); + + double r[2],V[2][2]; + + int nSize=pMaskedNode->getResiduals(r); + nSize=pMaskedNode->getInverseResidualVariance(V); + const Trk::PrepRawData* pPRD = pMaskedNode->getPrepRawData(); + + Identifier id = pPRD->identify(); + + Region region = Region::Undefined; + if(m_idHelper->is_pixel(id)) + { + region=(m_pixelId->is_barrel(id)) ? Region::PixBarrel: Region::PixEndcap; + if (m_pixelId->is_blayer(id)) { + region = Region::IBL; + } + } + if(m_idHelper->is_sct(id)) + { + region=(m_sctId->is_barrel(id)) ? Region::SctBarrel : Region::SctEndcap; + } + if(nSize==1) { + if(V[0][0]>0.0) { + vResid.push_back(TrigL2HitResidual(id,region,r[0],r[0]*sqrt(V[0][0]))); + } + else { + OK=false; + break; + } + } + else { + if((V[0][0]>0.0) && (V[1][1]>0.0)) { + vResid.push_back(TrigL2HitResidual(id,region,r[0],r[0]*sqrt(V[0][0]), + r[1],r[1]*sqrt(V[1][1]))); + } + else { + OK=false; + break; + } + } + } + else + { + ATH_MSG_DEBUG("Forward Kalman filter: extrapolation failure "); + vResid.clear(); + } + for(std::vector<Trk::TrkTrackState*>::iterator ptsIt=vpTrackStates.begin(); + ptsIt!=vpTrackStates.end();++ptsIt) delete (*ptsIt); + vpTrackStates.clear(); + if(!OK) break; + } + pnIt=vpTrkNodes.begin();pnEnd=vpTrkNodes.end(); + for(;pnIt!=pnEnd;++pnIt) + { + delete((*pnIt)->getSurface()); + delete (*pnIt); + } + vpTrkNodes.clear(); + + if(OK) return StatusCode::SUCCESS; + else return StatusCode::FAILURE; + +} diff --git a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.h b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.h index e24815fc4679ffe8daf251f3eeb400ba618bf8a4..31d9f0eebb625b33a39f33617f87c17453468698 100755 --- a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.h +++ b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigInDetTrackFitter.h @@ -9,14 +9,14 @@ #include "GaudiKernel/ToolHandle.h" #include "GaudiKernel/ServiceHandle.h" -#include "MagFieldInterfaces/IMagFieldSvc.h" #include "TrigInDetToolInterfaces/ITrigInDetTrackFitter.h" #include "TrigInDetToolInterfaces/ITrigDkfTrackMakerTool.h" #include "TrkToolInterfaces/IRIO_OnTrackCreator.h" +// MagField cache +#include "MagFieldConditions/AtlasFieldCacheCondObj.h" +#include "MagFieldElements/AtlasFieldCache.h" -class TrigTimer; - namespace Trk { class TrkBaseNode; class TrkTrackState; @@ -25,9 +25,10 @@ namespace Trk { class TrackStateOnSurface; } -namespace MagField { - class IMagFieldSvc; -} +class AtlasDetectorID; +class PixelID; +class SCT_ID; +class TrigL2HitResidual; class TrigInDetTrackFitter: public AthAlgTool, virtual public ITrigInDetTrackFitter { @@ -35,14 +36,17 @@ class TrigInDetTrackFitter: public AthAlgTool, virtual public ITrigInDetTrackFit TrigInDetTrackFitter( const std::string&, const std::string&, const IInterface* ); virtual StatusCode initialize(); virtual StatusCode finalize(); - Trk::Track* fitTrack(const Trk::Track&, const Trk::ParticleHypothesis& matEffects = Trk::pion) const; - void fit(const TrackCollection&, TrackCollection&, const Trk::ParticleHypothesis& matEffects = Trk::pion) const; + Trk::Track* fitTrack(const Trk::Track&, MagField::AtlasFieldCache&, const Trk::ParticleHypothesis& matEffects = Trk::pion) const; + void fit(const TrackCollection&, TrackCollection&, const EventContext&, const Trk::ParticleHypothesis& matEffects = Trk::pion) const; + StatusCode getUnbiasedResiduals(const Trk::Track&, std::vector<TrigL2HitResidual>&, const EventContext&) const; + private: Trk::TrkTrackState* extrapolate(Trk::TrkTrackState*, Trk::TrkPlanarSurface*, - Trk::TrkPlanarSurface*) const; - void getMagneticField(double[3],double*) const; + Trk::TrkPlanarSurface*, + MagField::AtlasFieldCache&) const; + void getMagneticField(double[3],double*, MagField::AtlasFieldCache&) const; void correctScale(Trk::TrkTrackState*) const; @@ -57,11 +61,14 @@ private: double m_DChi2; bool m_doMultScatt; bool m_doBremm; - bool m_offlineClusters; bool m_correctClusterPos; - ServiceHandle<MagField::IMagFieldSvc> m_MagFieldSvc; ToolHandle<ITrigDkfTrackMakerTool> m_trackMaker; ToolHandle<Trk::IRIO_OnTrackCreator> m_ROTcreator; + SG::ReadCondHandleKey<AtlasFieldCacheCondObj> m_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"}; + const PixelID* m_pixelId; + const SCT_ID* m_sctId; + const AtlasDetectorID* m_idHelper; + }; diff --git a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.cxx b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.cxx deleted file mode 100644 index 335c67e71b8d77f4839c4332d25f08e0cc5b9041..0000000000000000000000000000000000000000 --- a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.cxx +++ /dev/null @@ -1,709 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -//////////////////////////////////////////////////////////////////////////////// -// TrigL2ResidualCalculator tool -// ------------------------------- -// ATLAS Collaboration -// -// 11.11.2009 Package created -// -// Author: Dmitry Emeliyanov, RAL -// e-mail: D.Emeliyanov@rl.ac.uk -// -//////////////////////////////////////////////////////////////////////////////// - -#include <cmath> -#include <iostream> - -#include "GaudiKernel/SystemOfUnits.h" - -#include "AtlasDetDescr/AtlasDetectorID.h" -#include "InDetIdentifier/SCT_ID.h" -#include "InDetIdentifier/PixelID.h" - -#include "TrkTrack/Track.h" -#include "TrkParameters/TrackParameters.h" - -//#include "TrkSurfaces/Surface.h" -//#include "TrkSurfaces/TrapezoidBounds.h" -//#include "TrkParameters/MeasuredPerigee.h" - -#include "TrkPrepRawData/PrepRawData.h" -#include "TrkDistributedKalmanFilter/TrkBaseNode.h" -#include "TrkDistributedKalmanFilter/TrkFilteringNodes.h" -#include "TrkDistributedKalmanFilter/TrkTrackState.h" -#include "TrkDistributedKalmanFilter/TrkPlanarSurface.h" -#include "MagFieldInterfaces/IMagFieldSvc.h" - -//#include "TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h" -#include "TrigInDetToolInterfaces/TrigL2HitResidual.h" -#include "TrigL2ResidualCalculator.h" - -TrigL2ResidualCalculator::TrigL2ResidualCalculator(const std::string& t, - const std::string& n, - const IInterface* p ) : - AthAlgTool(t,n,p), - m_MagFieldSvc("AtlasFieldSvc",this->name()), - m_trackMaker("TrigDkfTrackMakerTool") -{ - declareInterface< ITrigL2ResidualCalculator >( this ); - - declareProperty( "AthenaFieldService", m_MagFieldSvc, "AtlasFieldSvc"); - declareProperty( "doMultScattering", m_doMultScatt = true); - declareProperty( "doBremmCorrection", m_doBremm=false); - declareProperty( "Chi2Cut", m_DChi2 = 1000.0); - declareProperty( "OfflineClusters", m_offlineClusters = true); -} - -StatusCode TrigL2ResidualCalculator::initialize() -{ - StatusCode sc = AthAlgTool::initialize(); - - - if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) { - ATH_MSG_FATAL("Could not get AtlasDetectorID helper AtlasID"); - return StatusCode::FAILURE; - } - - if (detStore()->retrieve(m_pixelId, "PixelID").isFailure()) { - ATH_MSG_FATAL("Could not get Pixel ID helper"); - return StatusCode::FAILURE; - } - if (detStore()->retrieve(m_sctId, "SCT_ID").isFailure()) { - ATH_MSG_FATAL("Could not get SCT ID helper"); - return StatusCode::FAILURE; - } - ATH_MSG_INFO("Using Athena magnetic field service"); - sc = m_MagFieldSvc.retrieve(); - if(sc.isFailure()) - { - ATH_MSG_ERROR("Unable to retrieve Athena MagFieldService"); - return StatusCode::FAILURE; - } - sc=m_trackMaker.retrieve(); - if(sc.isFailure()) - { - ATH_MSG_ERROR("Could not retrieve "<<m_trackMaker); - return sc; - } - ATH_MSG_INFO("TrigL2ResidualCalculator constructed "); - return sc; -} - - -void TrigL2ResidualCalculator::getMagneticField(double r[3],double* B) const -{ - B[0]=0.0;B[1]=0.0;B[2]=0.0; - double field[3]; - m_MagFieldSvc->getField(r,field);//field is returned in kT - for(int i=0;i<3;i++) B[i]=field[i]/Gaudi::Units::kilogauss;//convert to kG -} - -Trk::TrkTrackState* TrigL2ResidualCalculator::extrapolate(Trk::TrkTrackState* pTS, - Trk::TrkPlanarSurface* pSB, - Trk::TrkPlanarSurface* pSE) const -{ - const double C=0.02999975/1000.0;//using GeV internally - const double minStep=30.0; - - double J[5][5],Rf[5],AG[5][5],Gf[5][5],A[5][5]; - int i,j,m; - - bool samePlane=false; - - if(pSB!=NULL) - { - double diff=0.0; - for(i=0;i<4;i++) diff+=fabs(pSE->getPar(i)-pSB->getPar(i)); - if(diff<1e-5) { - samePlane=true; - //std::cout<<"Starting plane and target plane are the same !"<<std::endl; - } - } - - if(!samePlane) { - - double gP[3],gPi[3],lP[3],gV[3],a,b,c,s,J0[7][5],descr,CQ,Ac,Av,Cc; - double V[3],P[3],M[3][3],D[4],Jm[7][7], - J1[5][7],gB[3],gBi[3],gBf[3],dBds[3],Buf[5][7],DVx,DVy,DVz; - int nStep,nStepMax; - double sl,ds,path=0.0; - - //m_numericalJacobian(pTS,pSB,pSE,J); - double sint,cost,sinf,cosf; - sint=sin(pTS->getTrackState(3));cosf=cos(pTS->getTrackState(2)); - sinf=sin(pTS->getTrackState(2));cost=cos(pTS->getTrackState(3)); - gV[0]=sint*cosf;gV[1]=sint*sinf;gV[2]=cost;CQ=C*pTS->getTrackState(4); - - memset(&J0[0][0],0,sizeof(J0)); - - if(pSB!=NULL) - { - double L[3][3]; - lP[0]=pTS->getTrackState(0);lP[1]=pTS->getTrackState(1);lP[2]=0.0; - pSB->transformPointToGlobal(lP,gP); - for(i=0;i<3;i++) for(j=0;j<3;j++) L[i][j]=pSB->getInvRotMatrix(i,j); - - J0[0][0]=L[0][0];J0[0][1]=L[0][1]; - J0[1][0]=L[1][0];J0[1][1]=L[1][1]; - J0[2][0]=L[2][0];J0[2][1]=L[2][1]; - J0[3][2]=-sinf*sint;J0[3][3]=cosf*cost; - J0[4][2]= cosf*sint;J0[4][3]=sinf*cost; - J0[5][3]=-sint; - J0[6][4]=1.0; - } - else - { - gP[0]=-pTS->getTrackState(0)*sinf; - gP[1]= pTS->getTrackState(0)*cosf; - gP[2]= pTS->getTrackState(1); - J0[0][0]=-sinf;J0[0][2]=-pTS->getTrackState(0)*cosf; - J0[1][0]= cosf;J0[1][2]=-pTS->getTrackState(0)*sinf; - J0[2][1]=1.0; - J0[3][2]=-sinf*sint;J0[3][3]=cosf*cost; - J0[4][2]= cosf*sint;J0[4][3]=sinf*cost; - J0[5][3]=-sint; - J0[6][4]=1.0; - } - for(i=0;i<4;i++) D[i]=pSE->getPar(i); - for(i=0;i<3;i++) gPi[i]=gP[i]; - - getMagneticField(gP,gB); - - for(i=0;i<3;i++) gBi[i]=gB[i]; - - c=D[0]*gP[0]+D[1]*gP[1]+D[2]*gP[2]+D[3]; - b=D[0]*gV[0]+D[1]*gV[1]+D[2]*gV[2]; - a=0.5*CQ*(gB[0]*(D[1]*gV[2]-D[2]*gV[1])+ - gB[1]*(D[2]*gV[0]-D[0]*gV[2])+ - gB[2]*(D[0]*gV[1]-D[1]*gV[0])); - - descr=b*b-4.0*a*c; - - if(descr<0.0) - { - // printf("D<0 - extrapolation failed\n"); - return NULL; - } - - bool useExpansion=true; - double ratio = 4*a*c/(b*b); - - if(fabs(ratio)>0.1) - useExpansion = false; - - if(useExpansion) { - sl=-c/b; - sl=sl*(1-a*sl/b); - } - else { - int signb = (b<0.0)?-1:1; - sl = (-b+signb*sqrt(descr))/(2*a); - } - - if(fabs(sl)<minStep) nStepMax=1; - else - { - nStepMax=(int)(fabs(sl)/minStep)+1; - } - if((nStepMax<0)||(nStepMax>1000)) - { - return NULL; - } - Av=sl*CQ; - Ac=0.5*sl*Av; - DVx=gV[1]*gB[2]-gV[2]*gB[1]; - DVy=gV[2]*gB[0]-gV[0]*gB[2]; - DVz=gV[0]*gB[1]-gV[1]*gB[0]; - - P[0]=gP[0]+gV[0]*sl+Ac*DVx; - P[1]=gP[1]+gV[1]*sl+Ac*DVy; - P[2]=gP[2]+gV[2]*sl+Ac*DVz; - V[0]=gV[0]+Av*DVx; - V[1]=gV[1]+Av*DVy; - V[2]=gV[2]+Av*DVz; - - getMagneticField(P,gB); - - for(i=0;i<3;i++) gBf[i]=gB[i]; - for(i=0;i<3;i++) - { - dBds[i]=(gBf[i]-gBi[i])/sl; - gB[i]=gBi[i]; - } - nStep=nStepMax;path=0.0; - while(nStep>0) - { - c=D[0]*gP[0]+D[1]*gP[1]+D[2]*gP[2]+D[3]; - b=D[0]*gV[0]+D[1]*gV[1]+D[2]*gV[2]; - a=0.5*CQ*(gB[0]*(D[1]*gV[2]-D[2]*gV[1])+ - gB[1]*(D[2]*gV[0]-D[0]*gV[2])+ - gB[2]*(D[0]*gV[1]-D[1]*gV[0])); - - ratio = 4*a*c/(b*b); - if(fabs(ratio)>0.1) - useExpansion = false; - else useExpansion = true; - - if(useExpansion) { - sl=-c/b; - sl=sl*(1-a*sl/b); - } - else { - descr=b*b-4.0*a*c; - if(descr<0.0) - { - // printf("D<0 - extrapolation failed\n"); - return NULL; - } - int signb = (b<0.0)?-1:1; - sl = (-b+signb*sqrt(descr))/(2*a); - } - - ds=sl/nStep;path+=ds; - Av=ds*CQ; - Ac=0.5*ds*Av; - DVx=gV[1]*gB[2]-gV[2]*gB[1]; - DVy=gV[2]*gB[0]-gV[0]*gB[2]; - DVz=gV[0]*gB[1]-gV[1]*gB[0]; - - P[0]=gP[0]+gV[0]*ds+Ac*DVx; - P[1]=gP[1]+gV[1]*ds+Ac*DVy; - P[2]=gP[2]+gV[2]*ds+Ac*DVz; - V[0]=gV[0]+Av*DVx; - V[1]=gV[1]+Av*DVy; - V[2]=gV[2]+Av*DVz; - for(i=0;i<3;i++) - { - gV[i]=V[i];gP[i]=P[i]; - } - for(i=0;i<3;i++) gB[i]+=dBds[i]*ds; - nStep--; - } - pSE->transformPointToLocal(gP,lP); - Rf[0]=lP[0];Rf[1]=lP[1]; - Rf[2]=atan2(V[1],V[0]); - - if(fabs(V[2])>1.0) - { - return NULL; - } - - Rf[3]=acos(V[2]); - Rf[4]=pTS->getTrackState(4); - - gV[0]=sint*cosf;gV[1]=sint*sinf;gV[2]=cost; - - for(i=0;i<4;i++) D[i]=pSE->getPar(i); - for(i=0;i<3;i++) gP[i]=gPi[i]; - - for(i=0;i<3;i++) - { - gB[i]=0.5*(gBi[i]+gBf[i]); - } - - c=D[0]*gP[0]+D[1]*gP[1]+D[2]*gP[2]+D[3]; - b=D[0]*gV[0]+D[1]*gV[1]+D[2]*gV[2]; - a=CQ*(gB[0]*(D[1]*gV[2]-D[2]*gV[1])+ - gB[1]*(D[2]*gV[0]-D[0]*gV[2])+ - gB[2]*(D[0]*gV[1]-D[1]*gV[0])); - - ratio = 4*a*c/(b*b); - if(fabs(ratio)>0.1) - useExpansion = false; - else useExpansion = true; - - if(useExpansion) { - s=-c/b; - s=s*(1-a*s/b); - } - else { - descr=b*b-4.0*a*c; - if(descr<0.0) - { - // printf("D<0 - extrapolation failed\n"); - return NULL; - } - int signb = (b<0.0)?-1:1; - s = (-b+signb*sqrt(descr))/(2*a); - } - - Av=s*CQ; - Ac=0.5*s*Av; - Cc=0.5*s*s*C; - - DVx=gV[1]*gB[2]-gV[2]*gB[1]; - DVy=gV[2]*gB[0]-gV[0]*gB[2]; - DVz=gV[0]*gB[1]-gV[1]*gB[0]; - - P[0]=gP[0]+gV[0]*s+Ac*DVx; - P[1]=gP[1]+gV[1]*s+Ac*DVy; - P[2]=gP[2]+gV[2]*s+Ac*DVz; - - V[0]=gV[0]+Av*DVx;V[1]=gV[1]+Av*DVy;V[2]=gV[2]+Av*DVz; - - pSE->transformPointToLocal(P,lP); - - memset(&Jm[0][0],0,sizeof(Jm)); - - for(i=0;i<3;i++) for(j=0;j<3;j++) M[i][j]=pSE->getRotMatrix(i,j); - - double coeff[3], dadVx,dadVy,dadVz,dadQ,dsdx,dsdy,dsdz,dsdVx,dsdVy,dsdVz,dsdQ; - coeff[0]=-c*c/(b*b*b); - coeff[1]=c*(1.0+3.0*c*a/(b*b))/(b*b); - coeff[2]=-(1.0+2.0*c*a/(b*b))/b; - - dadVx=0.5*CQ*(-D[1]*gB[2]+D[2]*gB[1]); - dadVy=0.5*CQ*( D[0]*gB[2]-D[2]*gB[0]); - dadVz=0.5*CQ*(-D[0]*gB[1]+D[1]*gB[0]); - dadQ=0.5*C*(D[0]*DVx+D[1]*DVy+D[2]*DVz); - - dsdx=coeff[2]*D[0]; - dsdy=coeff[2]*D[1]; - dsdz=coeff[2]*D[2]; - dsdVx=coeff[0]*dadVx+coeff[1]*D[0]; - dsdVy=coeff[0]*dadVy+coeff[1]*D[1]; - dsdVz=coeff[0]*dadVz+coeff[1]*D[2]; - dsdQ=coeff[0]*dadQ; - - Jm[0][0]=1.0+V[0]*dsdx; - Jm[0][1]= V[0]*dsdy; - Jm[0][2]= V[0]*dsdz; - - Jm[0][3]= s+V[0]*dsdVx; - Jm[0][4]= V[0]*dsdVy+Ac*gB[2]; - Jm[0][5]= V[0]*dsdVz-Ac*gB[1]; - Jm[0][6]= V[0]*dsdQ+Cc*DVx; - - Jm[1][0]= V[1]*dsdx; - Jm[1][1]=1.0+V[1]*dsdy; - Jm[1][2]= V[1]*dsdz; - - Jm[1][3]= V[1]*dsdVx-Ac*gB[2]; - Jm[1][4]= s+V[1]*dsdVy; - Jm[1][5]= V[1]*dsdVz+Ac*gB[0]; - Jm[1][6]= V[1]*dsdQ+Cc*DVy; - - Jm[2][0]= V[2]*dsdx; - Jm[2][1]= V[2]*dsdy; - Jm[2][2]=1.0+V[2]*dsdz; - Jm[2][3]= V[2]*dsdVx+Ac*gB[1]; - Jm[2][4]= V[2]*dsdVy-Ac*gB[0]; - Jm[2][5]= s+V[2]*dsdVz; - Jm[2][6]= V[2]*dsdQ+Cc*DVz; - - Jm[3][0]=dsdx*CQ*DVx; - Jm[3][1]=dsdy*CQ*DVx; - Jm[3][2]=dsdz*CQ*DVx; - - Jm[3][3]=1.0+dsdVx*CQ*DVx; - Jm[3][4]=CQ*(dsdVy*DVx+s*gB[2]); - Jm[3][5]=CQ*(dsdVz*DVx-s*gB[1]); - - Jm[3][6]=(CQ*dsdQ+C*s)*DVx; - - Jm[4][0]=dsdx*CQ*DVy; - Jm[4][1]=dsdy*CQ*DVy; - Jm[4][2]=dsdz*CQ*DVy; - - Jm[4][3]=CQ*(dsdVx*DVy-s*gB[2]); - Jm[4][4]=1.0+dsdVy*CQ*DVy; - Jm[4][5]=CQ*(dsdVz*DVy+s*gB[0]); - - Jm[4][6]=(CQ*dsdQ+C*s)*DVy; - - Jm[5][0]=dsdx*CQ*DVz; - Jm[5][1]=dsdy*CQ*DVz; - Jm[5][2]=dsdz*CQ*DVz; - Jm[5][3]=CQ*(dsdVx*DVz+s*gB[1]); - Jm[5][4]=CQ*(dsdVy*DVz-s*gB[0]); - Jm[5][5]=1.0+dsdVz*CQ*DVz; - Jm[5][6]=(CQ*dsdQ+C*s)*DVz; - - Jm[6][6]=1.0; - - memset(&J1[0][0],0,sizeof(J1)); - - J1[0][0]=M[0][0];J1[0][1]=M[0][1];J1[0][2]=M[0][2]; - J1[1][0]=M[1][0];J1[1][1]=M[1][1];J1[1][2]=M[1][2]; - J1[2][3]=-V[1]/(V[0]*V[0]+V[1]*V[1]); - J1[2][4]= V[0]/(V[0]*V[0]+V[1]*V[1]); - J1[3][5]=-1.0/sqrt(1-V[2]*V[2]); - J1[4][6]=1.0; - - for(i=0;i<7;i++) - { - for(j=0;j<2;j++) - Buf[j][i]=J1[j][0]*Jm[0][i]+J1[j][1]*Jm[1][i]+J1[j][2]*Jm[2][i]; - Buf[2][i]=J1[2][3]*Jm[3][i]+J1[2][4]*Jm[4][i]; - Buf[3][i]=J1[3][5]*Jm[5][i]; - Buf[4][i]=Jm[6][i]; - } - - if(pSB!=NULL) - { - for(i=0;i<5;i++) - { - J[i][0]=Buf[i][0]*J0[0][0]+Buf[i][1]*J0[1][0]+Buf[i][2]*J0[2][0]; - J[i][1]=Buf[i][0]*J0[0][1]+Buf[i][1]*J0[1][1]+Buf[i][2]*J0[2][1]; - J[i][2]=Buf[i][3]*J0[3][2]+Buf[i][4]*J0[4][2]; - J[i][3]=Buf[i][3]*J0[3][3]+Buf[i][4]*J0[4][3]+Buf[i][5]*J0[5][3]; - J[i][4]=Buf[i][6]; - } - } - else - { - for(i=0;i<5;i++) - { - J[i][0]=Buf[i][0]*J0[0][0]+Buf[i][1]*J0[1][0]; - J[i][1]=Buf[i][2]; - J[i][2]=Buf[i][0]*J0[0][2]+Buf[i][1]*J0[1][2]+Buf[i][3]*J0[3][2]+Buf[i][4]*J0[4][2]; - J[i][3]=Buf[i][3]*J0[3][3]+Buf[i][4]*J0[4][3]+Buf[i][5]*J0[5][3]; - J[i][4]=Buf[i][6]; - } - } - } - else { - Rf[0]=pTS->getTrackState(0); - Rf[1]=pTS->getTrackState(1); - Rf[2]=pTS->getTrackState(2); - Rf[3]=pTS->getTrackState(3); - Rf[4]=pTS->getTrackState(4); - memset(&J[0][0],0,sizeof(J)); - for(i=0;i<5;i++) J[i][i]=1.0; - } - - for(i=0;i<5;i++) for(j=0;j<5;j++) - { - AG[i][j]=0.0;for(m=0;m<5;m++) AG[i][j]+=J[i][m]*pTS->getTrackCovariance(m,j); - } - for(i=0;i<5;i++) for(j=i;j<5;j++) - { - Gf[i][j]=0.0; - for(m=0;m<5;m++) Gf[i][j]+=AG[i][m]*J[j][m]; - Gf[j][i]=Gf[i][j]; - } - - Trk::TrkTrackState* pTE=new Trk::TrkTrackState(pTS); - - //workaround to keep using existing TrkTrackState code - double Rtmp[5]; - - for(i=0;i<4;i++) Rtmp[i] = Rf[i]; - Rtmp[4] = 0.001*Rf[4];//GeV->MeV - - pTE->setTrackState(Rtmp); - pTE->setTrackCovariance(Gf); - pTE->attachToSurface(pSE); - - // pTE->applyMaterialEffects(); - if(m_doMultScatt) - pTE->applyMultipleScattering(); - - pTE->setTrackState(Rf);//restore - - if(m_doBremm) - pTE->applyEnergyLoss(1); - - AmgSymMatrix(5) Gi; - for(i=0;i<5;i++) for(j=i;j<5;j++) - { - Gi(i,j)=pTE->getTrackCovariance(i,j); - Gi.fillSymmetric(i, j, pTE->getTrackCovariance(i,j)); - } - Gi = Gi.inverse(); - - for(i=0;i<5;i++) for(j=0;j<5;j++) - { - A[i][j]=0.0; - for(m=0;m<5;m++) A[i][j]+=AG[m][i]*Gi(m,j); - } - pTE->setPreviousState(pTS); - pTE->setSmootherGain(A); - - return pTE; -} - -StatusCode TrigL2ResidualCalculator::getUnbiasedResiduals(const Trk::Track& pT, - std::vector<TrigL2HitResidual>& vResid) const { - - const Trk::TrackParameters* trackPars = pT.perigeeParameters(); - if(trackPars==nullptr) { - ATH_MSG_WARNING("Fit Failed -- TrkTrack has no parameters"); - return StatusCode::FAILURE; - } - std::vector<Trk::TrkBaseNode*> vpTrkNodes; - std::vector<Trk::TrkTrackState*> vpTrackStates; - vResid.clear(); - double trk_theta = trackPars->parameters()[Trk::theta]; - double trk_qOverP = trackPars->parameters()[Trk::qOverP]; - double Pt = sin(trk_theta)/trk_qOverP; - if(fabs(Pt)<100.0) - { - ATH_MSG_DEBUG("TrigL2ResidualCalculator failed -- Estimated Pt is too low "<<Pt); - return StatusCode::FAILURE; - } - - // 1. Create filtering nodes - - bool trackResult = m_trackMaker->createDkfTrack(pT,vpTrkNodes, m_DChi2); - if(!trackResult) - { - ATH_MSG_DEBUG("TrigDkfTrackMaker failed"); - return StatusCode::FAILURE; - } - - int nNodeIndex=-1; - bool OK=true; - std::vector<Trk::TrkBaseNode*>::iterator pnIt,pnEnd(vpTrkNodes.end()); - - for(std::vector<Trk::TrkBaseNode*>::iterator pNodeIt=vpTrkNodes.begin();pNodeIt!=vpTrkNodes.end(); - ++pNodeIt) - { - nNodeIndex++; - Trk::TrkBaseNode* pMaskedNode=(*pNodeIt); - Trk::TrkTrackState* pMaskedState=NULL; - - // 2. Create initial track state: - - double Rk[5]; - Rk[0] = trackPars->parameters()[Trk::d0]; - Rk[1] = trackPars->parameters()[Trk::z0]; - Rk[2] = trackPars->parameters()[Trk::phi0]; - if(Rk[2]>M_PI) Rk[2]-=2*M_PI; - if(Rk[2]<-M_PI) Rk[2]+=2*M_PI; - trk_theta = trackPars->parameters()[Trk::theta]; - Rk[3] = trk_theta; - Rk[4] = 1000.0*trackPars->parameters()[Trk::qOverP];//MeV->GeV - //No need to correct scale back - not returning track - - // 3. Main algorithm: filter and smoother (Rauch-Tung-Striebel) - - Trk::TrkTrackState* pTS = new Trk::TrkTrackState(Rk); - double Gk[5][5] = {{100.0, 0, 0, 0, 0}, - {0, 100.0, 0, 0, 0}, - {0, 0, 0.01, 0, 0}, - {0, 0, 0, 0.01, 0}, - {0, 0, 0, 0, 0.1}}; - pTS->setTrackCovariance(Gk); - if(m_doMultScatt) - pTS->setScatteringMode(1); - if(m_doBremm) - pTS->setScatteringMode(2); - vpTrackStates.push_back(pTS); - - ATH_MSG_DEBUG("Initial params: locT="<<Rk[0]<<" locL="<<Rk[1]<<" phi="<<Rk[2] - <<" theta="<<Rk[3]<<" Q="<<Rk[4]<<" pT="<<sin(Rk[3])/Rk[4]); - - OK=true; - Trk::TrkPlanarSurface *pSB=NULL,*pSE; - - for(pnIt=vpTrkNodes.begin();pnIt!=pnEnd;++pnIt) - { - pSE=(*pnIt)->getSurface(); - Trk::TrkTrackState* pNS=extrapolate(pTS,pSB,pSE); - - pSB=pSE; - if(pNS!=NULL) - { - vpTrackStates.push_back(pNS); - - (*pnIt)->validateMeasurement(pNS); - ATH_MSG_DEBUG("dChi2="<<(*pnIt)->getChi2()); - if((*pnIt)!=pMaskedNode) - { - (*pnIt)->updateTrackState(pNS); - } - else - { - pMaskedState=pNS; - } - pTS=pNS; - Pt=sin(pTS->getTrackState(3))/pTS->getTrackState(4); - if(fabs(Pt)<0.2) - { - ATH_MSG_DEBUG("Estimated Pt is too low "<<Pt<<" - skipping fit"); - OK=false;break; - } - } - else - { - OK=false;break; - } - } - if(OK) - { - std::vector<Trk::TrkTrackState*>::reverse_iterator ptsrIt(vpTrackStates.rbegin()), - ptsrEnd(vpTrackStates.rend()); - - for(;ptsrIt!=ptsrEnd;++ptsrIt) - { - (*ptsrIt)->runSmoother(); - } - - pMaskedNode->validateMeasurement(pMaskedState); - - double r[2],V[2][2]; - - int nSize=pMaskedNode->getResiduals(r); - nSize=pMaskedNode->getInverseResidualVariance(V); - const Trk::PrepRawData* pPRD = pMaskedNode->getPrepRawData(); - - Identifier id = pPRD->identify(); - - Region region = Region::Undefined; - if(m_idHelper->is_pixel(id)) - { - region=(m_pixelId->is_barrel(id)) ? Region::PixBarrel: Region::PixEndcap; - if (m_pixelId->is_blayer(id)) { - region = Region::IBL; - } - } - if(m_idHelper->is_sct(id)) - { - region=(m_sctId->is_barrel(id)) ? Region::SctBarrel : Region::SctEndcap; - } - if(nSize==1) { - if(V[0][0]>0.0) { - vResid.push_back(TrigL2HitResidual(id,region,r[0],r[0]*sqrt(V[0][0]))); - } - else { - OK=false; - break; - } - } - else { - if((V[0][0]>0.0) && (V[1][1]>0.0)) { - vResid.push_back(TrigL2HitResidual(id,region,r[0],r[0]*sqrt(V[0][0]), - r[1],r[1]*sqrt(V[1][1]))); - } - else { - OK=false; - break; - } - } - } - else - { - ATH_MSG_DEBUG("Forward Kalman filter: extrapolation failure "); - vResid.clear(); - } - for(std::vector<Trk::TrkTrackState*>::iterator ptsIt=vpTrackStates.begin(); - ptsIt!=vpTrackStates.end();++ptsIt) delete (*ptsIt); - vpTrackStates.clear(); - if(!OK) break; - } - pnIt=vpTrkNodes.begin();pnEnd=vpTrkNodes.end(); - for(;pnIt!=pnEnd;++pnIt) - { - delete((*pnIt)->getSurface()); - delete (*pnIt); - } - vpTrkNodes.clear(); - - if(OK) return StatusCode::SUCCESS; - else return StatusCode::FAILURE; - -} diff --git a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.h b/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.h deleted file mode 100644 index c8d01009f81968880bb8fe230d190507d1092160..0000000000000000000000000000000000000000 --- a/Trigger/TrigTools/TrigInDetTrackFitter/src/TrigL2ResidualCalculator.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef __TRIGL2RESIDUALCALCULATOR_H__ -#define __TRIGL2RESIDUALCALCULATOR_H__ - -#include "AthenaBaseComps/AthAlgTool.h" -#include "GaudiKernel/ToolHandle.h" -#include "GaudiKernel/ServiceHandle.h" - -#include "TrigInDetToolInterfaces/ITrigL2ResidualCalculator.h" -#include "TrigInDetToolInterfaces/ITrigDkfTrackMakerTool.h" - -class AtlasDetectorID; -class PixelID; -class SCT_ID; -class TrigL2HitResidual; - -namespace Trk { - class TrkBaseNode; - class TrkTrackState; - class TrkPlanarSurface; - class Track; -} - -namespace MagField { - class IMagFieldSvc; -} - -class TrigL2ResidualCalculator: public AthAlgTool, virtual public ITrigL2ResidualCalculator -{ - public: - - TrigL2ResidualCalculator( const std::string&, const std::string&, const IInterface* ); - virtual StatusCode initialize(); - - StatusCode getUnbiasedResiduals(const Trk::Track&, std::vector<TrigL2HitResidual>&) const; - -private: - - Trk::TrkTrackState* extrapolate(Trk::TrkTrackState*, - Trk::TrkPlanarSurface*, - Trk::TrkPlanarSurface*) const; - void getMagneticField(double[3],double*) const; - - double m_DChi2; - bool m_doMultScatt; - bool m_doBremm; - bool m_offlineClusters; - ServiceHandle<MagField::IMagFieldSvc> m_MagFieldSvc; - ToolHandle<ITrigDkfTrackMakerTool> m_trackMaker; - const PixelID* m_pixelId; - const SCT_ID* m_sctId; - const AtlasDetectorID* m_idHelper; -}; - -#endif diff --git a/Trigger/TrigTools/TrigInDetTrackFitter/src/components/TrigInDetTrackFitter_entries.cxx b/Trigger/TrigTools/TrigInDetTrackFitter/src/components/TrigInDetTrackFitter_entries.cxx index eb424e52f93547b1f399cd0d03bea805114d5a3f..e4f8d28075c31fc98f2b3a78e105a3b030f4490b 100644 --- a/Trigger/TrigTools/TrigInDetTrackFitter/src/components/TrigInDetTrackFitter_entries.cxx +++ b/Trigger/TrigTools/TrigInDetTrackFitter/src/components/TrigInDetTrackFitter_entries.cxx @@ -1,7 +1,5 @@ #include "../TrigInDetTrackFitter.h" #include "../TrigDkfTrackMakerTool.h" -#include "../TrigL2ResidualCalculator.h" DECLARE_COMPONENT( TrigInDetTrackFitter ) DECLARE_COMPONENT( TrigDkfTrackMakerTool ) -DECLARE_COMPONENT( TrigL2ResidualCalculator )