15 inline float unsafe_asinhf(
float x) {
return unsafe_logf<3>(x +
std::sqrt(1.
f + x * x)); }
20 float eta = unsafe_asinhf(cotTheta);
21 return theLayersData[idxBin(eta)];
29 float ieta = eta / theDeltaEta;
30 if (
std::abs(ieta) >= theHalfNBins - 1.
e-3)
31 return (eta > 0) ?
max(2 * theHalfNBins - 1, 0) : 0;
33 return int(ieta + theHalfNBins);
41 const float BIG = 99999.;
47 theDeltaEta = (theHalfNBins != 0) ? etaMax / theHalfNBins : BIG;
49 theLayersData = vector<MSLayersAtAngle>(
max(2 * theHalfNBins, 1));
51 for (
int idxbin = 0; idxbin < 2 * theHalfNBins; idxbin++) {
52 float etaValue =
eta(idxbin);
53 float cotTheta = sinh(etaValue);
55 vector<MSLayer>
layers = layout.detLayers(etaValue, 0, iSetup);
56 vector<MSLayer> tmplay = layout.otherLayers(etaValue, iSetup);
57 layers.insert(layers.end(), tmplay.begin(), tmplay.end());
58 sort(layers.begin(), layers.end());
59 setX0(layers, etaValue, msX0data);
63 vector<MSLayer>::iterator it;
64 for (it = layers.begin(); it != layers.end(); it++) {
65 float x0 = getDataX0(*it).x0;
66 float sumX0D = theLayersData[idxbin].sumX0D(zero, it->crossing(line).first);
67 setDataX0(*it,
DataX0(x0, sumX0D, cotTheta));
68 theLayersData[idxbin].update(*it);
74 for (
int idxbin = 0; idxbin < 2 * theHalfNBins; idxbin++) {
75 float etaValue =
eta(idxbin);
76 for (
int isign = -1; isign <= 1; isign += 2) {
77 float z = isign * 15.9;
79 vector<MSLayer>
candidates = layout.detLayers(etaValue, z, iSetup);
80 vector<MSLayer>::iterator it;
81 for (it = candidates.begin(); it != candidates.end(); it++) {
90 found = theLayersData[
bin].findLayer(*it);
95 if (bin > 2 * theHalfNBins - 1)
97 found = theLayersData[
bin].findLayer(*it);
100 theLayersData[idxbin].update(*found);
126 const float BIG = 99999.;
127 float cotTheta = sinh(eta);
128 float sinTheta = 1 /
sqrt(1 +
sqr(cotTheta));
129 float cosTheta = cotTheta * sinTheta;
131 float sumX0atAngleLast = 0.;
132 vector<MSLayer>::iterator il;
133 for (il = layers.begin(); il != layers.end(); il++) {
135 float rL = (*il).crossing(line).first.r();
136 float rN = (il + 1 != layers.end()) ? (il + 1)->crossing(line).first.r() : BIG;
137 float rBound = (rL + rN) / 2.;
138 float sumX0atAngle = sumX0.
sumX0atEta(eta, rBound);
141 : (sumX0atAngle - sumX0atAngleLast) * fabs(cosTheta);
143 setDataX0(*il,
DataX0(dX0, 0, cotTheta));
144 sumX0atAngleLast = sumX0atAngle;
virtual float sumX0atEta(float eta, float r) const =0
const MSLayersAtAngle & layers(float cotTheta) const override
void init(const edm::EventSetup &iSetup) override
float eta(int idxBin) const
Abs< T >::type abs(const T &t)
static void setX0(std::vector< MSLayer > &, float eta, const SumX0AtEtaDataProvider &)
Square< F >::type sqr(const F &f)
int idxBin(float eta) const
const MSLayer * findLayer(const MSLayer &layer) const