11 m_par[i].push_back(param);
30double PixeldEdxData::dEdxPdf(
const double dedx,
const double signedP,
const double mass,
const std::array<double,9> &par,
const int offset)
const {
31 const auto p = std::abs(signedP);
33 double x0 =
getdEdx(p,mass,par);
35 double pLG[4]={1,1,1,1};
38 x0 = std::log(x0) - 9.4;
40 pLG[0] = par[offset]+par[offset+2];
41 pLG[3] = par[offset+1]+par[offset+3];
42 return asymGaus(dedx, pLG[1], pLG[0], pLG[3]);
44 else if (
m_fun==
"CB") {
45 x0 = std::log(x0) - 9.4;
48 pLG[2] = par[offset+1];
49 pLG[3] = par[offset+2];
50 return crystalBall(dedx, pLG[0], pLG[1], pLG[2], pLG[3]);
60 auto itr =
m_par.find(i);
61 if (itr!=
m_par.end()) {
62 const std::vector<double> ¶m = itr->second;
63 if (j<(
int)param.size()) {
72 std::array<double,3> vhypo{-2,-2,-2};
73 if (nGoodPixels<=0) {
return vhypo; }
75 const auto p = std::fabs(signedP);
77 const auto dedx = std::log(dedxArg)-9.4;
94 std::array<double,9> par{};
95 auto setNGoodPixels{nGoodPixels};
96 if (setNGoodPixels>5) { setNGoodPixels=5; }
97 if (p<0 &&
m_posneg) { setNGoodPixels += 5; }
98 for (
int i=0;i<npar;i++){
99 par[i] =
getPar(setNGoodPixels-1,i);
108 if (nGoodPixels<=0) {
return -2; }
111 const auto p = std::abs(signedP);
125 if (
fdEdxZero(xmed,par)==0) {
return xmed; }
134 if (nGoodPixels<=0) {
return -2; }
136 const auto p = std::abs(signedP);
138 else if (
m_bb==
"5p") {
return dEdx_5p(p,mass,par); }
144 const auto p = std::abs(signedP);
146 else if (
m_bb==
"5p") {
return dEdx_5p(p,mass,par); }
153 double A = std::pow(n/std::abs(alp),n)*std::exp(-std::pow(std::abs(alp),2)*0.5);
154 double B = n/std::abs(alp)-std::abs(alp);
155 double pull = (
x-x0)/sig;
156 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)));
158 return std::exp(-pull*pull*0.5)/N;
160 return A*std::pow(B+pull,-n)/N;
165 double sigp = sig*asym;
166 double sigm = sig/asym;
168 if (
x>x0) { fun = TMath::Gaus(
x,x0,sigp,
false); }
169 else { fun = TMath::Gaus(
x,x0,sigm,
false); }
170 return fun/(std::sqrt(2*
M_PI)*((sigp*0.5) + (sigm*0.5)));
175 double lambda = (
x-Ep)/R;
176 return std::sqrt(std::exp(-lambda-std::exp(-lambda))*M_1_PI*0.5);
180 double gamma = std::sqrt(xbg*xbg+1.);
181 double beta = std::sqrt(1.-1./(gamma*gamma));
182 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])));
191 double gamma = std::sqrt(xbg*xbg+1);
192 double beta = std::sqrt(1.-1./(gamma*gamma));
193 double fdedx = pp[0]/std::pow(beta,pp[2])*std::log(1+std::pow(std::abs(pp[1])*beta*gamma,pp[4]))-pp[3];
203 double gamma = std::sqrt(xbg*xbg+1);
204 double beta = std::sqrt(1-1/(gamma*gamma));
205 double beta2 = beta*beta;
206 double gamma2 = gamma*gamma;
207 double fdedx = (pp[0]/std::pow(beta2,pp[2]))*(std::log(std::abs(pp[1])*beta2*gamma2))-pp[0];
225 std::vector<float> vecResult(3,-1);
227 const auto & array {
getP(dedx,p,nGoodPixels)};
228 std::copy(array.begin(), array.end(),vecResult.begin());
Store pixel dEdx data in PixeldEdxData.
static double crystalBall(const double x, const double x0, const double sig, const double alp, const double n)
double getdEdx(const double p, const double mass, const int nGoodPixels) const
std::vector< float > getLikelihoods(const double dedx2, const double p2, const int nGoodPixels) const
static double dEdx_5p_BG(const double xbg, const std::array< double, 9 > &pp)
static double dEdx_BG(const double xbg, const std::array< double, 9 > &pp)
static constexpr double m_kMass
double getMass(const double dedx, const double signedP, const int nGoodPixels) const
void setMinimumdEdxForMass(const double mindedxMass)
void setBetheBlochType(const std::string &bb)
void setFunctionType(const std::string &fun)
static double dEdx_5p_aleph(const double p, double mass, const std::array< double, 9 > &pp)
static double dEdx_5p(const double p, const double mass, const std::array< double, 9 > &pp)
double getPar(const int i, const int j) const
double dEdxPdf(const double dedx, const double signedP, const double mass, const std::array< double, 9 > &par, const int offset) const
static double dEdx_def(const double p, const double mass, const std::array< double, 9 > &pp)
static constexpr double m_piMass
std::unordered_map< uint32_t, std::vector< double > > m_par
std::array< double, 9 > getFirstNPar(const double p, const int nGoodPixels, const int np) const
static double asymGaus(const double x, const double x0, const double sig, const double asym)
void setPar(const int i, const double param)
static double dEdx_5p_BG_aleph(const double xbg, const std::array< double, 9 > &pp)
static constexpr double m_pMass
double fdEdxZero(const double x, const std::array< double, 9 > &par) const
void setPosNeg(const bool posneg)
std::array< double, 3 > getP(const double dedxArg, const double signedP, const int nGoodPixels) const
static double moyal(const double x, const double Ep, const double R)
static double dEdx_3p(const double p, const double mass, const std::array< double, 9 > &pp)
hold the test vectors and ease the comparison