diff --git a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecVertexFinding.py b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecVertexFinding.py index 1e02be2a53c59d42fafdcbc1021feab6855d76f5..3fe9d48dcdb73c7c39073d730e01c6f418866cee 100644 --- a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecVertexFinding.py +++ b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredSecVertexFinding.py @@ -137,11 +137,10 @@ class ConfiguredSecVertexFinding: InDet__SingleTrackConversionTool) InDetSingleTrackSecVtx = InDet__SingleTrackConversionTool( name=prefix+"SingleTrackTool", - ConversionFinderHelperTool=InDetSecVxHelper, - Extrapolator=Extrapolator, MaxBLayerHits=VertexCuts.SingleTrk_MaxBLayerHits(), MinInitialHitRadius=VertexCuts.SingleTrk_MinInitialHitRadius(), - MinInitialHitRadius_noBlay=VertexCuts.SingleTrk_MinInitialHitRadius_noBlay(), + MinInitialHitRadius_noBlay=( + VertexCuts.SingleTrk_MinInitialHitRadius_noBlay()), MinRatioOfHLhits=VertexCuts.SingleTrk_MinRatioOfHLhits()) if (printConfig): print(InDetSingleTrackSecVtx) diff --git a/InnerDetector/InDetRecTools/InDetConversionFinderTools/InDetConversionFinderTools/SingleTrackConversionTool.h b/InnerDetector/InDetRecTools/InDetConversionFinderTools/InDetConversionFinderTools/SingleTrackConversionTool.h index 31a7e6465dfa6e6d41bb7235557aa661cf5f065f..aa61e7a52b033e8689fc1ae2cb5454ba9d75af70 100644 --- a/InnerDetector/InDetRecTools/InDetConversionFinderTools/InDetConversionFinderTools/SingleTrackConversionTool.h +++ b/InnerDetector/InDetRecTools/InDetConversionFinderTools/InDetConversionFinderTools/SingleTrackConversionTool.h @@ -40,10 +40,6 @@ public: virtual StatusCode initialize() override; virtual StatusCode finalize() override; - /** Build single track conversion candidate. Trk::Track interface. */ - xAOD::Vertex* buildSingleTrackConversion(const Trk::Track* track) const; - /** Select single track conversion candidates. Trk::Track interface. */ - bool selectSingleTrackConversion(const Trk::Track* track) const; /** Build single track conversion candidate. xAOD::TrackParticle interface. */ xAOD::Vertex* buildSingleTrackParticleConversion( const xAOD::TrackParticle*, @@ -52,18 +48,6 @@ public: bool selectSingleTrackParticleConversion(const xAOD::TrackParticle*) const; protected: - /** Conversion helper tool. */ - ToolHandle<InDet::ConversionFinderUtils> m_helpertool{ - this, - "ConversionFinderHelperTool", - "InDet::ConversionFinderUtils", - "Helper for conversion finding" - }; - //!< Track extrapolator tool. - ToolHandle<Trk::IExtrapolator> m_extrapolator{ this, - "Extrapolator", - "", - "Track Extrapolator Tool" }; double m_minInitR; /** Minimum initial hit radius in order to consider track as coming from photon conversion */ double m_minInitR_noBLay; /** Minimum initial hit radius in order to consider diff --git a/InnerDetector/InDetRecTools/InDetConversionFinderTools/src/SingleTrackConversionTool.cxx b/InnerDetector/InDetRecTools/InDetConversionFinderTools/src/SingleTrackConversionTool.cxx index 51e28aa3b52df046010e137a75dc75bdade030ec..6374a5b25bd3fcf4d963df324e5cd174ff8fc420 100644 --- a/InnerDetector/InDetRecTools/InDetConversionFinderTools/src/SingleTrackConversionTool.cxx +++ b/InnerDetector/InDetRecTools/InDetConversionFinderTools/src/SingleTrackConversionTool.cxx @@ -77,23 +77,6 @@ namespace InDet { // init method // ------------------------------------------------------- StatusCode SingleTrackConversionTool::initialize() { - - /* Get the track selector tool from ToolSvc */ - if ( m_helpertool.retrieve().isFailure() ) { - ATH_MSG_FATAL("Failed to retrieve tool " << m_helpertool); - return StatusCode::FAILURE; - } - ATH_MSG_INFO("Retrieved tool " << m_helpertool); - - - /* Get the extrapolator */ - if (m_extrapolator.retrieve().isFailure()) { - ATH_MSG_FATAL("Failed to retrieve tool " << m_extrapolator); - return StatusCode::FAILURE; - } - ATH_MSG_INFO("Retrieved tool " << m_extrapolator); - - return StatusCode::SUCCESS; } @@ -104,234 +87,6 @@ namespace InDet { return StatusCode::SUCCESS; } - // ------------------------------------------------------- - // Create a RecVertex at the first measurement of the track - // ------------------------------------------------------- - xAOD::Vertex* - SingleTrackConversionTool::buildSingleTrackConversion( - const Trk::Track* track) const - { - - // some local variables - const Trk::TrackParameters* tp = nullptr; - AmgSymMatrix(5) em ; - em.setZero(); - Amg::Vector3D gp ; - gp.setZero(); - // double chi2 = 0.; int Ndf = 0; - - // get track states on surface - const DataVector<const Trk::TrackStateOnSurface>* tsos = track->trackStateOnSurfaces(); - if(!tsos) return nullptr; - - // iterate over them - DataVector<const Trk::TrackStateOnSurface>::const_iterator its,itse = tsos->end(); - for(its=tsos->begin();its!=itse;++its) { - - // check if this is the first measurement - if((*its)->type(Trk::TrackStateOnSurface::Measurement)) { - - // get the parameters at this surface - tp = (*its)->trackParameters(); - if(!tp) { - ATH_MSG_WARNING ("Require parameters at first measurement, conversion finder logic broken"); - return nullptr; - } - - em = *(tp->covariance()); - gp = (tp->position()); - break; - } - } - - if(!tp) { - return nullptr; - } - - // - // --- Need to compute a global position covariance matrix as J.C.JT - // - - // get transform - const Amg::Transform3D T( tp->associatedSurface().transform()); - - // this will be the new transform - AmgSymMatrix(3) nCovVtx; - - // ME: use the surface to find out what we do, do not hardcode the geoemtry - - if ( Trk::Surface::Plane == tp->associatedSurface().type() ){ - - ///The local position parameters covariance matrix C (2x2) - double p11 = em(Trk::locX, Trk::locX); - double p12 = em(Trk::locX, Trk::locY); - double p21 = em(Trk::locY, Trk::locX); - double p22 = em(Trk::locY, Trk::locY); - - ///The Jacobian matrix J (3x2) - double Ax[3] = {T(0,0),T(1,0),T(2,0)}; - double Ay[3] = {T(0,1),T(1,1),T(2,1)}; - double a11 = Ax[0]; double a12 = Ay[0]; - double a21 = Ax[1]; double a22 = Ay[1]; - double a31 = Ax[2]; double a32 = Ay[2]; - - ///The A = J.C (3x2) - double A11 = a11*p11 + a12*p21; double A12 = a11*p12 + a12*p22; - double A21 = a21*p11 + a22*p21; double A22 = a21*p12 + a22*p22; - double A31 = a31*p11 + a32*p21; double A32 = a31*p12 + a32*p22; - - ///The A.JT = J.C.JT (3x3) - double P11 = a11*A11 + A12*a12; double P12 = A11*a21 + A12*a22; double P13 = A11*a31 + A12*a32; - double P21 = A21*a11 + A22*a12; double P22 = A21*a21 + A22*a22; double P23 = A21*a31 + A22*a32; - double P31 = A31*a11 + A32*a12; double P32 = A31*a21 + A32*a22; double P33 = A31*a31 + A32*a32; - - ///Construct the new covariance matrix (3x3) - nCovVtx(0,0) = P11; nCovVtx(0,1) = P12; nCovVtx(0,2) = P13; - nCovVtx(1,0) = P21; nCovVtx(1,1) = P22; nCovVtx(1,2) = P23; - nCovVtx(2,0) = P31; nCovVtx(2,1) = P32; nCovVtx(2,2) = P33; - } - else if ( Trk::Surface::Line == tp->associatedSurface().type() ) { - - //The local position parameters covariance matrix C (2x2) - double p11 = em(Trk::locR, Trk::locR); - double p12 = em(Trk::locR, Trk::locZ); - double p21 = em(Trk::locZ, Trk::locR); - double p22 = em(Trk::locZ, Trk::locZ); - - ///The straight line surface (wire) global directions - double A[3] = {T(0,2),T(1,2),T(2,2)}; - - ///The particle global direction - double Px = tp->momentum().x(); - double Py = tp->momentum().y(); - double Pz = tp->momentum().z(); - - ///The Jacobian matrix J (3x2) - double Bx = A[1]*Pz-A[2]*Py; - double By = A[2]*Px-A[0]*Pz; - double Bz = A[0]*Py-A[1]*Px; - double Bn = 1./sqrt(Bx*Bx+By*By+Bz*Bz); Bx*=Bn; By*=Bn; Bz*=Bn; - double a11 = Bx; double a12 = A[0]; - double a21 = By; double a22 = A[1]; - double a31 = Bz; double a32 = A[2]; - - ///The A = J.C (3x2) - double A11 = a11*p11 + a12*p21; double A12 = a11*p12 + a12*p22; - double A21 = a21*p11 + a22*p21; double A22 = a21*p12 + a22*p22; - double A31 = a31*p11 + a32*p21; double A32 = a31*p12 + a32*p22; - - ///The A.JT = J.C.JT (3x3) - double P11 = a11*A11 + A12*a12; double P12 = A11*a21 + A12*a22; double P13 = A11*a31 + A12*a32; - double P21 = A21*a11 + A22*a12; double P22 = A21*a21 + A22*a22; double P23 = A21*a31 + A22*a32; - double P31 = A31*a11 + A32*a12; double P32 = A31*a21 + A32*a22; double P33 = A31*a31 + A32*a32; - - ///Construct the new covariance matrix (3x3) - nCovVtx(0,0) = P11; nCovVtx(0,1) = P12; nCovVtx(0,2) = P13; - nCovVtx(1,0) = P21; nCovVtx(1,1) = P22; nCovVtx(1,2) = P23; - nCovVtx(2,0) = P31; nCovVtx(2,1) = P32; nCovVtx(2,2) = P33; - } - else { - ATH_MSG_ERROR ("Wrong type of surface, not supported !"); - return nullptr; - } - - // Create the corresponding vector of tracks at that RecVertex. Contains one - // track with a new redefined measured perigee. - std::vector<Trk::VxTrackAtVertex> tmpVTAV; - - // get the perigee - Trk::PerigeeSurface perigeeSurface(gp); - const Trk::TrackParameters* perpar = m_extrapolator->extrapolate( - *tp, perigeeSurface, Trk::anyDirection, false, Trk::pion); - if(!perpar || !perpar->covariance() ){ - ATH_MSG_WARNING ("Perigee creation for single track at its first measurement failed, should never happen !"); - return nullptr; - } - - - Trk::TrackParameters* pp = perpar->clone(); - delete perpar; - Trk::VxTrackAtVertex trkV(1., pp); - - Trk::LinkToTrack * linkTT = new Trk::LinkToTrack(); - - linkTT->setElement(track); - trkV.setOrigTrack(linkTT); - tmpVTAV.push_back(trkV); - - xAOD::Vertex* vertex = new xAOD::Vertex(); - vertex->makePrivateStore(); - vertex->setPosition(gp); - vertex->setCovariancePosition(nCovVtx); - vertex->setVertexType(xAOD::VxType::ConvVtx); - vertex->setFitQuality( 0, 0); - for (unsigned int i = 0; i < tmpVTAV.size() ; ++i) { - Trk::VxTrackAtVertex vtxTrack = tmpVTAV[i]; - vertex->vxTrackAtVertex().push_back(vtxTrack); - } - - return vertex; - } - - // ------------------------------------------------------- - // preselection cuts on tracks - // ------------------------------------------------------- - bool - SingleTrackConversionTool::selectSingleTrackConversion( - const Trk::Track* track) const - { - - const Trk::TrackParameters* trkPar = m_helpertool->getTrkParameters(track); - - if (!trkPar) { - return false; - } - - /* - * This should be already present from previous - * steps - */ - const Trk::TrackSummary* tSum =track->trackSummary(); - if (!tSum) { - return false; - } - bool pass = true; - - const bool expectedHitInBLayer = - tSum->get(Trk::expectInnermostPixelLayerHit); - if (expectedHitInBLayer) { - // ME: cut on minInitR if blayer is ok - if (trkPar->position().perp() < m_minInitR) - pass = false; - } else { - // ME: cut on minInitR_NBLay if blayer is off - if (trkPar->position().perp() < m_minInitR_noBLay) - pass = false; - } - - int nTrtHits = tSum->get(Trk::numberOfTRTHits); - int nTrtOutliers = tSum->get(Trk::numberOfTRTOutliers); - int ntrt = nTrtHits + nTrtOutliers; - int nTrtXenonHits = tSum->get(Trk::numberOfTRTXenonHits); - - if (ntrt > 0 && - (!m_PIDonlyForXe || - nTrtXenonHits == ntrt)) { // only check TRT PID if m_PIDonlyForXe is - // false or all TRT hits are Xenon hits - double prob = tSum->getPID(Trk::eProbabilityHT); - if (prob < m_singleThreshold) - pass = false; - } - - // do we reject tracks with blayer ? - int nBLHits = tSum->get(Trk::numberOfInnermostPixelLayerHits) + - tSum->get(Trk::numberOfInnermostPixelLayerOutliers); - if (nBLHits > m_maxBLhits) - pass = false; - - delete tSum; - return pass; - } // ------------------------------------------------------- // building single track conversions from a particle