diff --git a/InnerDetector/InDetConditions/PixelConditionsData/PixelConditionsData/PixeldEdxData.h b/InnerDetector/InDetConditions/PixelConditionsData/PixelConditionsData/PixeldEdxData.h index ca53bc0c843c78dceba36d820aed72c971b6d668..5ed03adfbf840993b80f05644522341a23124f95 100755 --- a/InnerDetector/InDetConditions/PixelConditionsData/PixelConditionsData/PixeldEdxData.h +++ b/InnerDetector/InDetConditions/PixelConditionsData/PixelConditionsData/PixeldEdxData.h @@ -16,6 +16,7 @@ #include <string> #include <vector> #include <unordered_map> +#include <array> #include "AthenaKernel/CondCont.h" @@ -27,37 +28,37 @@ class PixeldEdxData { void setBetheBlochType(const std::string &bb); void setMinimumdEdxForMass(const double mindedxMass); - double dEdxPdf(double dedx, double p, double mass, std::array<double,9> par, int offset) const; - double fdEdx_zero(double x, std::array<double,9> par) const; + double dEdxPdf(const double dedx, const double signedP, const double mass, const std::array<double,9> & par, const int offset) const; + double fdEdxZero(const double x, const std::array<double,9> & par) const; - double getPar(int i, int j) const; - void getP(double dedx, double p, int nGoodPixels, std::array<double,3> vhypo) const; - void getFirstNPar(std::array<double,9> & par, double p, int nGoodPixels, int np) const; - double getMass(double dedx, double p, int nGoodPixels) const; - double getdEdx(double p, double mass, int nGoodPixels) const; - double getdEdx(double p, double mass, std::array<double,9> par) const; + double getPar(const int i, const int j) const; + std::array<double, 3> getP(const double dedxArg, const double signedP, const int nGoodPixels) const; + std::array<double,9> getFirstNPar( const double p, const int nGoodPixels, const int np) const; + double getMass(const double dedx, const double signedP, const int nGoodPixels) const; + double getdEdx(const double p, const double mass, const int nGoodPixels) const; + double getdEdx(const double p, const double mass, const std::array<double,9> & par) const; // Crystal Ball distribution - double Func1(double x,double x0,double sig,double alp,double n) const; + double crystalBall(const double x, const double x0,const double sig,const double alp,const double n) const; // Asymetric Gaussian distribution - double Func2(double x,double x0,double sig,double asym) const; + double asymGaus(const double x,const double x0,const double sig,const double asym) const; // Moyal distribution - double Func3(double x,double Ep,double R) const; + double moyal(const double x,const double Ep,const double R) const; - double dEdx_5p_BG_aleph(double xbg, std::array<double,9>& pp) const; - double dEdx_5p_aleph(double p,double mass, std::array<double,9>& pp) const; - double dEdx_5p_BG(double xbg, std::array<double,9>& pp) const; - double dEdx_5p(double p,double mass, std::array<double,9>& pp) const; - double dEdx_BG(double xbg, std::array<double,9>& pp) const; - double dEdx_def(double p,double mass, std::array<double,9>& pp) const; - double dEdx_3p(double p,double mass, std::array<double,9>& pp) const; + double dEdx_5p_BG_aleph(const double xbg, const std::array<double,9>& pp) const; + double dEdx_5p_aleph(const double p,double mass, const std::array<double,9>& pp) const; + double dEdx_5p_BG(const double xbg, const std::array<double,9>& pp) const; + double dEdx_5p(const double p,const double mass, const std::array<double,9>& pp) const; + double dEdx_BG(const double xbg, const std::array<double,9>& pp) const; + double dEdx_def(const double p,const double mass, const std::array<double,9>& pp) const; + double dEdx_3p(const double p, const double mass, const std::array<double,9>& pp) const; - std::vector<float> getLikelihoods(double dedx2, double p2, int nGoodPixels) const; + std::vector<float> getLikelihoods(const double dedx2, const double p2, const int nGoodPixels) const; private: - static constexpr double m_pi = 0.13957; - static constexpr double m_k = 0.49368; - static constexpr double m_p = 0.93827; + static constexpr double m_piMass = 0.13957; + static constexpr double m_kMass = 0.49368; + static constexpr double m_pMass = 0.93827; std::unordered_map<uint32_t,std::vector<double>> m_par; bool m_posneg; diff --git a/InnerDetector/InDetConditions/PixelConditionsData/src/PixeldEdxData.cxx b/InnerDetector/InDetConditions/PixelConditionsData/src/PixeldEdxData.cxx index a87af49fa64a33f5d3490a9f29a0ff7bd3ac73a5..c2451f38b03cfd11fb9edf75a7458179f7d0c279 100755 --- a/InnerDetector/InDetConditions/PixelConditionsData/src/PixeldEdxData.cxx +++ b/InnerDetector/InDetConditions/PixelConditionsData/src/PixeldEdxData.cxx @@ -3,8 +3,9 @@ */ #include "PixelConditionsData/PixeldEdxData.h" -#include "CLHEP/Units/SystemOfUnits.h" #include "TMath.h" +#include <cmath> +#include <algorithm> void PixeldEdxData::setPar(const int i, const double param) { m_par[i].push_back(param); @@ -26,36 +27,36 @@ void PixeldEdxData::setMinimumdEdxForMass(const double mindedxMass) { m_mindedxformass = mindedxMass; } -double PixeldEdxData::dEdxPdf(double dedx,double p,double mass, std::array<double,9> par, int offset) const { - p = fabs(p); +double PixeldEdxData::dEdxPdf(const double dedx,const double signedP,const double mass, const std::array<double,9> &par, const int offset) const { + const auto p = std::abs(signedP); double x0 = getdEdx(p,mass,par); double pLG[4]={1,1,1,1}; if (m_fun=="AG") { - x0 = log(x0) - 9.4; + x0 = std::log(x0) - 9.4; pLG[1] = x0; pLG[0] = par[offset]+par[offset+2]; pLG[3] = par[offset+1]+par[offset+3]; - return Func2(dedx, pLG[1], pLG[0], pLG[3]); + return asymGaus(dedx, pLG[1], pLG[0], pLG[3]); } else if (m_fun=="CB") { - x0 = log(x0) - 9.4; + x0 = std::log(x0) - 9.4; pLG[0] = x0; pLG[1] = par[offset]; pLG[2] = par[offset+1]; pLG[3] = par[offset+2]; - return Func1(dedx, pLG[0], pLG[1], pLG[2], pLG[3]); + return crystalBall(dedx, pLG[0], pLG[1], pLG[2], pLG[3]); } return 0; } -double PixeldEdxData::fdEdx_zero(double x, std::array<double,9> par) const { +double PixeldEdxData::fdEdxZero(const double x, const std::array<double,9> & par) const { return getdEdx(par[6],x,par)-par[5]; } -double PixeldEdxData::getPar(int i, int j) const { +double PixeldEdxData::getPar(const int i, const int j) const { auto itr = m_par.find(i); if (itr!=m_par.end()) { const std::vector<double> ¶m = itr->second; @@ -66,53 +67,48 @@ double PixeldEdxData::getPar(int i, int j) const { return 0; } -void PixeldEdxData::getP(double dedx, double p, int nGoodPixels, std::array<double,3> vhypo) const { - std::array<double,9> par; - - vhypo[0] = -2; - vhypo[1] = -2; - vhypo[2] = -2; - - if (nGoodPixels<=0) { return; } - getFirstNPar(par,p,nGoodPixels,9); - p = fabs(p); +std::array<double,3> +PixeldEdxData::getP(const double dedxArg, const double signedP, const int nGoodPixels) const { + std::array<double,3> vhypo{-2,-2,-2}; + if (nGoodPixels<=0) { return vhypo; } + const auto & par = getFirstNPar(signedP,nGoodPixels,9); + const auto p = std::fabs(signedP); - dedx = log(dedx)-9.4; + const auto dedx = std::log(dedxArg)-9.4; - double pk = dEdxPdf(dedx,p,m_k ,par,5); - double pp = dEdxPdf(dedx,p,m_p ,par,5); - double ppi = dEdxPdf(dedx,p,m_pi,par,5); + double pk = dEdxPdf(dedx,p,m_kMass ,par,5); + double pp = dEdxPdf(dedx,p,m_pMass ,par,5); + double ppi = dEdxPdf(dedx,p,m_piMass,par,5); if (ppi+pk+pp>=0) { - vhypo[0] = ppi; - vhypo[1] = pk; - vhypo[2] = pp; + vhypo = {ppi, pk,pp}; } else { - vhypo[0] = -1; - vhypo[1] = -1; - vhypo[2] = -1; + vhypo ={-1,-1,-1}; } - return; + return vhypo; } -void PixeldEdxData::getFirstNPar(std::array<double,9> & par, double p, int nGoodPixels, int npar) const { - if (nGoodPixels>5) { nGoodPixels=5; } - if (p<0 && m_posneg) { nGoodPixels += 5; } +std::array<double,9> +PixeldEdxData::getFirstNPar(const double p, const int nGoodPixels, const int npar) const { + std::array<double,9> par; + auto setNGoodPixels{nGoodPixels}; + if (setNGoodPixels>5) { setNGoodPixels=5; } + if (p<0 && m_posneg) { setNGoodPixels += 5; } for (int i=0;i<npar;i++){ - par[i] = getPar(nGoodPixels-1,i); + par[i] = getPar(setNGoodPixels-1,i); } + return par; } -double PixeldEdxData::getMass(double dedx, double p, int nGoodPixels) const { +double PixeldEdxData::getMass(const double dedx, const double signedP, const int nGoodPixels) const { - if (dedx<m_mindedxformass) { return m_pi; } + if (dedx<m_mindedxformass) { return m_piMass; } - std::array<double,9> par; if (nGoodPixels<=0) { return -2; } - getFirstNPar(par,p,nGoodPixels,5); + auto par = getFirstNPar(signedP,nGoodPixels,5); - p = fabs(p); + const auto p = std::abs(signedP); par[5] = dedx; par[6] = p; @@ -120,34 +116,32 @@ double PixeldEdxData::getMass(double dedx, double p, int nGoodPixels) const { double xmin=0; double xmax=14000; - double xmed = (xmin+xmax)/2; + double xmed = (xmin+xmax)*0.5; double prec=1e-6; - if (dedx<15000){ return m_pi; } + if (dedx<15000){ return m_piMass; } do { - if (fdEdx_zero(xmed,par)==0) { return xmed; } - if (fdEdx_zero(xmed,par)*fdEdx_zero(xmax,par)>0) { xmax=xmed; } + if (fdEdxZero(xmed,par)==0) { return xmed; } + if (fdEdxZero(xmed,par)*fdEdxZero(xmax,par)>0) { xmax=xmed; } else { xmin=xmed; } - xmed=(xmin+xmax)/2; + xmed=(xmin+xmax)*0.5; } while (std::abs(xmax-xmin)>prec); return xmed; } -double PixeldEdxData::getdEdx(double p, double mass, int nGoodPixels) const { - std::array<double,9> par; - +double PixeldEdxData::getdEdx(const double signedP, const double mass, const int nGoodPixels) const { if (nGoodPixels<=0) { return -2; } - getFirstNPar(par,p,nGoodPixels,5); - p = fabs(p); + const auto & par = getFirstNPar(signedP,nGoodPixels,5); + const auto p = std::abs(signedP); if (m_bb=="3p") { return dEdx_3p(p,mass,par); } else if (m_bb=="5p") { return dEdx_5p(p,mass,par); } else if (m_bb=="5p_aleph") { return dEdx_5p_aleph(p,mass,par); } return 0; } -double PixeldEdxData::getdEdx(double p, double mass, std::array<double,9> par) const { - p = fabs(p); +double PixeldEdxData::getdEdx(const double signedP, const double mass, const std::array<double,9> & par) const { + const auto p = std::abs(signedP); if (m_bb=="3p") { return dEdx_3p(p,mass,par); } else if (m_bb=="5p") { return dEdx_5p(p,mass,par); } else if (m_bb=="5p_aleph") { return dEdx_5p_aleph(p,mass,par); } @@ -155,88 +149,84 @@ double PixeldEdxData::getdEdx(double p, double mass, std::array<double,9> par) c } // Crystal Ball distribution -double PixeldEdxData::Func1(double x,double x0,double sig,double alp,double n) const { - double A = pow(n/fabs(alp),n)*exp(-pow(fabs(alp),2)/2); - double B = n/fabs(alp)-fabs(alp); +double PixeldEdxData::crystalBall(const double x,const double x0,const double sig,const double alp,const double n) const { + double A = std::pow(n/std::abs(alp),n)*std::exp(-std::pow(std::abs(alp),2)*0.5); + double B = n/std::abs(alp)-std::abs(alp); double pull = (x-x0)/sig; - double N = sig*(n/alp*(1/(n-1))*exp(-alp*alp/2)+sqrt(M_PI/2)*(1+erf(alp/sqrt(2)))); + double N = sig*(n/alp*(1/(n-1))*std::exp(-alp*alp*0.5)+std::sqrt(M_PI_2)*(1+std::erf(alp*M_SQRT1_2))); if (pull<alp){ - return exp(-pull*pull/2)/N; + return std::exp(-pull*pull*0.5)/N; } - return A*pow(B+pull,-n)/N; + return A*std::pow(B+pull,-n)/N; } // Asymetric Gaussian distribution -double PixeldEdxData::Func2(double x,double x0,double sig,double asym) const { +double PixeldEdxData::asymGaus(const double x,const double x0,const double sig,const double asym) const { double sigp = sig*asym; double sigm = sig/asym; double fun; if (x>x0) { fun = TMath::Gaus(x,x0,sigp,false); } else { fun = TMath::Gaus(x,x0,sigm,false); } - return fun/(sqrt(2*TMath::Pi())*(sigp/2+sigm/2)); + return fun/(std::sqrt(2*M_PI)*((sigp*0.5) + (sigm*0.5))); } // Moyal distribution -double PixeldEdxData::Func3(double x,double Ep,double R) const { +double PixeldEdxData::moyal(const double x,const double Ep,const double R) const { double lambda = (x-Ep)/R; - return sqrt(exp(-lambda-exp(-lambda))/(2*TMath::Pi())); + return std::sqrt(std::exp(-lambda-std::exp(-lambda))*M_1_PI*0.5); } -double PixeldEdxData::dEdx_5p_BG_aleph(double xbg, std::array<double,9>& pp) const { - double gamma = sqrt(xbg*xbg+1); - double beta = sqrt(1-1/(gamma*gamma)); - return pp[0]/pow(beta,pp[3])*(pp[1]-pow(beta,pp[3])-log(pp[2]+1/pow(beta*gamma,pp[4]))); +double PixeldEdxData::dEdx_5p_BG_aleph(const double xbg, const std::array<double,9>& pp) const { + double gamma = std::sqrt(xbg*xbg+1.); + double beta = std::sqrt(1.-1./(gamma*gamma)); + return pp[0]/std::pow(beta,pp[3])*(pp[1]-std::pow(beta,pp[3])-std::log(pp[2]+1./std::pow(beta*gamma,pp[4]))); } -double PixeldEdxData::dEdx_5p_aleph(double p,double mass, std::array<double,9>& pp) const { +double PixeldEdxData::dEdx_5p_aleph(const double p,const double mass, const std::array<double,9>& pp) const { double bg = p/mass; return dEdx_5p_BG_aleph(bg,pp); } -double PixeldEdxData::dEdx_5p_BG(double xbg, std::array<double,9>& pp) const { - double gamma = sqrt(xbg*xbg+1); - double beta = sqrt(1-1/(gamma*gamma)); - double fdedx = pp[0]/pow(beta,pp[2])*log(1+pow(std::abs(pp[1])*beta*gamma,pp[4]))-pp[3]; +double PixeldEdxData::dEdx_5p_BG(const double xbg, const std::array<double,9>& pp) const { + double gamma = std::sqrt(xbg*xbg+1); + double beta = std::sqrt(1.-1./(gamma*gamma)); + double fdedx = pp[0]/std::pow(beta,pp[2])*std::log(1+std::pow(std::abs(pp[1])*beta*gamma,pp[4]))-pp[3]; return fdedx; } -double PixeldEdxData::dEdx_5p(double p,double mass, std::array<double,9>& pp) const { +double PixeldEdxData::dEdx_5p(const double p,const double mass, const std::array<double,9>& pp) const { double bg = p/mass; return dEdx_5p_BG(bg,pp); } -double PixeldEdxData::dEdx_BG(double xbg, std::array<double,9>& pp) const { - double gamma = sqrt(xbg*xbg+1); - double beta = sqrt(1-1/(gamma*gamma)); +double PixeldEdxData::dEdx_BG(const double xbg, const std::array<double,9>& pp) const { + double gamma = std::sqrt(xbg*xbg+1); + double beta = std::sqrt(1-1/(gamma*gamma)); double beta2 = beta*beta; double gamma2 = gamma*gamma; - double fdedx = (pp[0]/pow(beta2,pp[2]))*(log(std::abs(pp[1])*beta2*gamma2))-pp[0]; + double fdedx = (pp[0]/std::pow(beta2,pp[2]))*(std::log(std::abs(pp[1])*beta2*gamma2))-pp[0]; return fdedx; } -double PixeldEdxData::dEdx_def(double p,double mass, std::array<double,9>& pp) const { +double PixeldEdxData::dEdx_def(const double p,const double mass, const std::array<double,9>& pp) const { double bg = p/mass; return dEdx_BG(bg,pp); } -double PixeldEdxData::dEdx_3p(double p,double mass, std::array<double,9>& pp) const { +double PixeldEdxData::dEdx_3p(const double p,const double mass, const std::array<double,9>& pp) const { double bg = p/mass; return dEdx_BG(bg,pp); } -std::vector<float> PixeldEdxData::getLikelihoods(double dedx2, double p2, int nGoodPixels) const { +std::vector<float> +PixeldEdxData::getLikelihoods(const double dedx2, const double p2, const int nGoodPixels) const { double dedx=dedx2; - double p=p2/1000; - std::vector<float> vhypo; - vhypo.resize(3); - vhypo[0] = vhypo[1] = vhypo[2] = -1; - if (nGoodPixels<=0) return vhypo; - std::array<double,3> vhypo2; - vhypo2[0] = vhypo2[1] = vhypo2[2] = -1; - getP(dedx,p,nGoodPixels,vhypo2); - vhypo[0]=vhypo2[0]; - vhypo[1]=vhypo2[1]; - vhypo[2]=vhypo2[2]; - return vhypo; + double p=p2*0.001; + std::vector<float> vecResult(3,-1); + if (nGoodPixels>0){ + const auto & array { getP(dedx,p,nGoodPixels)}; + std::copy(array.begin(), array.end(),vecResult.begin()); + } + return vecResult; }