25 RespPar[
HCAL][0][0] = pset.
getParameter<
double>(
"HadronBarrelResolution_Stochastic");
26 RespPar[
HCAL][0][1] = pset.
getParameter<
double>(
"HadronBarrelResolution_Constant");
27 RespPar[
HCAL][0][2] = pset.
getParameter<
double>(
"HadronBarrelResolution_Noise");
29 RespPar[
HCAL][1][0] = pset.
getParameter<
double>(
"HadronEndcapResolution_Stochastic");
30 RespPar[
HCAL][1][1] = pset.
getParameter<
double>(
"HadronEndcapResolution_Constant");
31 RespPar[
HCAL][1][2] = pset.
getParameter<
double>(
"HadronEndcapResolution_Noise");
33 RespPar[
VFCAL][0][0] = pset.
getParameter<
double>(
"HadronForwardResolution_Stochastic");
34 RespPar[
VFCAL][0][1] = pset.
getParameter<
double>(
"HadronForwardResolution_Constant");
35 RespPar[
VFCAL][0][2] = pset.
getParameter<
double>(
"HadronForwardResolution_Noise");
37 RespPar[
VFCAL][1][0] = pset.
getParameter<
double>(
"ElectronForwardResolution_Stochastic");
38 RespPar[
VFCAL][1][1] = pset.
getParameter<
double>(
"ElectronForwardResolution_Constant");
39 RespPar[
VFCAL][1][2] = pset.
getParameter<
double>(
"ElectronForwardResolution_Noise");
41 eResponseScale[0] = pset.
getParameter<
double>(
"eResponseScaleHB");
42 eResponseScale[1] = pset.
getParameter<
double>(
"eResponseScaleHE");
43 eResponseScale[2] = pset.
getParameter<
double>(
"eResponseScaleHF");
45 eResponsePlateau[0] = pset.
getParameter<
double>(
"eResponsePlateauHB");
46 eResponsePlateau[1] = pset.
getParameter<
double>(
"eResponsePlateauHE");
47 eResponsePlateau[2] = pset.
getParameter<
double>(
"eResponsePlateauHF");
49 eResponseExponent = pset.
getParameter<
double>(
"eResponseExponent");
50 eResponseCoefficient = pset.
getParameter<
double>(
"eResponseCoefficient");
73 maxHDetas[0] = HDeta[1] - HDeta[0];
74 maxHDetas[1] = HDeta[2] - HDeta[1];
75 maxHDetas[2] = HDeta[3] - HDeta[2];
79 parNames = pset.
getParameter<std::vector<std::string> >(
"parNames");
85 for (
int p = 0;
p < nPar;
p++) {
86 for (
int m = 0;
m < 3;
m++) {
87 for (
int d = 0;
d < 3;
d++) {
95 for (
int i = 0;
i < maxHDe[
d];
i++) {
99 for (
int j = 0;
j < maxHDetas[
d];
j++) {
109 PoissonParameters =
vec3(4);
110 std::string PoissonParName[] = {
"mean_overall",
"shift_overall",
"mean_between",
"shift_between"};
111 for (
int d = 0;
d < 4;
d++) {
113 for (
int i = 0;
i < maxHDe[3];
i++) {
114 PoissonParameters[
d].resize(maxHDe[3]);
115 for (
int j = 0;
j < maxHDetas[2];
j++) {
116 PoissonParameters[
d][
i].resize(maxHDetas[2]);
117 PoissonParameters[
d][
i][
j] = tmp1[
i * maxHDetas[2] +
j];
124 mipfraction =
vec3(3);
125 for (
int d = 0;
d < 3;
d++) {
127 std::string mipname = fraction + mipNames[0] + detNames[
d];
129 mipfraction[
d].resize(maxHDe[
d]);
130 for (
int i = 0;
i < maxHDe[
d];
i++) {
132 mipfraction[
d][
i].resize(maxHDetas[d]);
133 for (
int j = 0;
j < maxHDetas[
d];
j++) {
135 mipfraction[
d][
i][
j] = tmp1[
i * maxHDetas[
d] +
j];
151 double _barrelMUeta = pset.
getParameter<
double>(
"barrelMUeta");
152 double _endcapMUeta = pset.
getParameter<
double>(
"endcapMUeta");
153 barrelMUeta = endcapMUeta = maxMUeta;
154 for (
int i = 0;
i < maxMUeta;
i++) {
155 if (fabs(_barrelMUeta) <= etaGridMU[
i]) {
160 for (
int i = 0;
i < maxMUeta;
i++) {
161 if (fabs(_endcapMUeta) <= etaGridMU[
i]) {
166 int maxMUetas[] = {endcapMUeta - barrelMUeta, maxMUeta - endcapMUeta};
169 responseMU =
vec3(maxMUe,
vec2(maxMUeta,
vec1(maxMUbin, 0)));
175 for (
int i = 0;
i < maxMUe;
i++) {
176 for (
int j = 0;
j < maxMUeta;
j++) {
178 if (
j == barrelMUeta) {
180 eta_loc = barrelMUeta;
181 }
else if (
j == endcapMUeta) {
183 eta_loc = endcapMUeta;
186 for (
int k = 0;
k < maxMUbin;
k++) {
187 responseMU[
i][
j][
k] = _responseMU[loc][
i * maxMUetas[loc] * maxMUbin + (
j - eta_loc) * maxMUbin +
k];
191 LogInfo(
"FastCalorimetry") <<
" responseMU " <<
i <<
" " <<
j <<
" " <<
k <<
" = " << responseMU[
i][
j][
k]
201 maxEMeta = maxHDetas[2];
202 respFactorEM = pset.
getParameter<
double>(
"respFactorEM");
210 meanEM =
vec2(maxEMe,
vec1(maxEMeta, 0));
211 sigmaEM =
vec2(maxEMe,
vec1(maxEMeta, 0));
212 for (
int i = 0;
i < maxEMe;
i++) {
213 for (
int j = 0;
j < maxEMeta;
j++) {
214 meanEM[
i][
j] = respFactorEM * _meanEM[
i * maxEMeta +
j];
215 sigmaEM[
i][
j] = respFactorEM * _sigmaEM[
i * maxEMeta +
j];
237 for (
int i = 0;
i < maxEne;
i++) {
239 corrHFgEm[
i][
j] = _corrHFgEm[
i * maxEta +
j];
240 corrHFgHad[
i][
j] = _corrHFgHad[
i * maxEta +
j];
241 corrHFhEm[
i][
j] = _corrHFhEm[
i * maxEta +
j];
242 corrHFhHad[
i][
j] = _corrHFhHad[
i * maxEta +
j];
248 int ieta =
abs((
int)(eta / etaStep));
251 int det = getDet(ieta);
252 int deta = ieta - HDeta[det];
253 if (deta >= maxHDetas[det])
254 deta = maxHDetas[det] - 1;
258 for (
int i = 0;
i < maxHDe[det];
i++) {
259 if (energy < eGridHD[det][
i]) {
261 return mipfraction[det][0][deta];
268 return mipfraction[det][maxHDe[det] - 1]
271 double x1 = eGridHD[det][ie];
272 double x2 = eGridHD[det][ie + 1];
273 y1 = mipfraction[det][ie][deta];
274 y2 = mipfraction[det][ie + 1][deta];
276 mean = (y1 * (x2 -
energy) + y2 * (energy - x1)) / (x2 - x1);
282 int ieta =
abs((
int)(eta / etaStep));
298 if (ieta >= maxEMeta)
304 for (
int i = 0;
i < maxEMe;
i++) {
305 if (energy < eGridEM[
i]) {
317 mean = interEM(energy, ie, ieta, random);
321 else if (partype == 1) {
323 int det = getDet(ieta);
324 int deta = ieta - HDeta[det];
325 if (deta >= maxHDetas[det])
326 deta = maxHDetas[det] - 1;
331 for (
int i = 0;
i < maxHDe[det];
i++) {
332 if (energy < eGridHD[det][
i]) {
341 ie = maxHDe[det] - 2;
344 if (det == 2 && energy < 20 && deta > 5) {
345 for (
int i = 0;
i < maxHDe[3];
i++) {
346 if (energy < eGridHD[3][
i]) {
356 mean = interHD(mip, energy, ie, deta, det, random);
360 else if (partype == 2) {
363 for (
int i = 0;
i < maxMUeta;
i++) {
364 if (fabs(eta) < etaGridMU[
i]) {
372 if (ieta < maxMUeta) {
374 for (
int i = 0;
i < maxMUe;
i++) {
375 if (energy < eGridMU[
i]) {
387 mean = interMU(energy, ie, ieta, random);
396 LogInfo(
"FastCalorimetry") << std::endl
397 <<
" HCALResponse::responseHCAL, partype = " << partype <<
" E, eta = " << energy <<
" "
398 << eta <<
" mean = " << mean << std::endl;
408 for (
int i = 0;
i < maxMUbin;
i++) {
409 if (x > responseMU[ie][ieta][
i]) {
415 for (
int i = 0;
i < maxMUbin;
i++) {
416 if (x > responseMU[ie + 1][ieta][
i]) {
422 double x1 = eGridMU[ie];
423 double x2 = eGridMU[ie + 1];
424 double y1 = (bin1 + random->
flatShoot()) * muStep;
425 double y2 = (bin2 + random->
flatShoot()) * muStep;
429 LogInfo(
"FastCalorimetry") << std::endl
430 <<
" HCALResponse::interMU " << std::endl
431 <<
" x, x1-x2, y1-y2 = " << e <<
", " << x1 <<
"-" << x2 <<
" " << y1 <<
"-" << y2
436 double mean = (y1 * (x2 -
e) + y2 * (e - x1)) / (x2 - x1);
440 LogInfo(
"FastCalorimetry") << std::endl
441 <<
" HCALResponse::interMU " << std::endl
442 <<
" e, ie, ieta = " << e <<
" " << ie <<
" " << ieta << std::endl
443 <<
" response = " << mean << std::endl;
458 if (det == 2 && ieta > 5 && e < 20) {
459 for (
int p = 0;
p < 4;
p++) {
460 y1 = PoissonParameters[
p][ie][ieta];
461 y2 = PoissonParameters[
p][ie + 1][ieta];
463 x1 = eGridHD[det + 1][ie];
464 x2 = eGridHD[det + 1][ie + 1];
465 pars[
p] = (y1 * (x2 -
e) + y2 * (e - x1)) / (x2 - x1);
470 random->
poissonShoot((
int(PoissonShootNoNegative(pars[0], pars[1], random)) +
471 (
int(PoissonShootNoNegative(pars[2], pars[3], random))) / 4 + random->
flatShoot() / 4) *
477 x1 = eGridHD[det][ie];
478 x2 = eGridHD[det][ie + 1];
481 for (
int p = 0;
p < nPar;
p++) {
487 bool use_custom =
false;
491 if ((
p == 0 ||
p == 1) && e < x1) {
492 double tmp = (y1 * x2 - y2 * x1) / (x2 - x1);
494 custom = y1 * e / x1;
499 else if ((
p == 2 ||
p == 3 ||
p == 4 ||
p == 5)) {
500 if (e < x1 && y1 < y2) {
503 }
else if (e > x2 && y2 < y1) {
513 pars[
p] = (y1 * (x2 -
e) + y2 * (e - x1)) / (x2 - x1);
518 mean = cballShootNoNegative(pars[0], pars[1], pars[2], pars[3], pars[4], pars[5], random);
520 mean = gaussShootNoNegative(pars[0], pars[1], random);
526 double y1 = meanEM[ie][ieta];
527 double y2 = meanEM[ie + 1][ieta];
528 double x1 = eGridEM[ie];
529 double x2 = eGridEM[ie + 1];
533 LogInfo(
"FastCalorimetry") << std::endl
534 <<
" HCALResponse::interEM mean " << std::endl
535 <<
" x, x1-x2, y1-y2 = " << e <<
", " << x1 <<
"-" << x2 <<
" " << y1 <<
"-" << y2
540 double mean = (y1 * (x2 -
e) + y2 * (e - x1)) / (x2 - x1);
542 y1 = sigmaEM[ie][ieta];
543 y2 = sigmaEM[ie + 1][ieta];
547 LogInfo(
"FastCalorimetry") << std::endl
548 <<
" HCALResponse::interEM sigma" << std::endl
549 <<
" x, x1-x2, y1-y2 = " << e <<
", " << x1 <<
"-" << x2 <<
" " << y1 <<
"-" << y2
554 double sigma = (y1 * (x2 -
e) + y2 * (e - x1)) / (x2 - x1);
557 double rndm = gaussShootNoNegative(mean, sigma, random);
565 double s = eResponseScale[hit];
566 double n = eResponseExponent;
567 double p = eResponsePlateau[hit];
568 double c = eResponseCoefficient;
582 e *
sqrt(RespPar[
HCAL][hit][0] * RespPar[
HCAL][hit][0] / (e) + RespPar[
HCAL][hit][1] * RespPar[
HCAL][hit][1]);
585 double rndm = gaussShootNoNegative(response, resolution, random);
593 for (d = 0; d < 2; d++) {
594 if (ieta < HDeta[d + 1]) {
616 double out = cball.shoot(mu, sigma, aL, nL, aR, nR, random);
619 out = cball.shoot(mu, sigma, aL, nL, aR, nR, random);
636 for (
int i = 0;
i < maxEne;
i++) {
637 if (ee >= energyHF[
i])
645 if (ee < energyHF[0]) {
646 if (
abs(type) == 11 ||
abs(type) == 22) {
647 corrHFem[
i] = corrHFgEm[0][
i];
648 corrHFhad[
i] = corrHFgHad[0][
i];
650 corrHFem[
i] = corrHFhEm[0][
i];
651 corrHFhad[
i] = corrHFhHad[0][
i];
653 }
else if (jmin >= maxEne - 1) {
654 if (
abs(type) == 11 ||
abs(type) == 22) {
656 corrHFhad[
i] = corrHFgHad[
maxEta][
i];
659 corrHFhad[
i] = corrHFhHad[
maxEta][
i];
663 x2 = energyHF[jmin + 1];
664 if (
abs(type) == 11 ||
abs(type) == 22) {
665 y1em = corrHFgEm[jmin][
i];
666 y2em = corrHFgEm[jmin + 1][
i];
667 y1had = corrHFgHad[jmin][
i];
668 y2had = corrHFgHad[jmin + 1][
i];
670 y1em = corrHFhEm[jmin][
i];
671 y2em = corrHFhEm[jmin + 1][
i];
672 y1had = corrHFhHad[jmin][
i];
673 y2had = corrHFhHad[jmin + 1][
i];
675 corrHFem[
i] = y1em + (ee - x1) * ((y2em - y1em) / (x2 - x1));
676 corrHFhad[
i] = y1had + (ee - x1) * ((y2had - y1had) / (x2 - x1));
static std::vector< std::string > checklist log
const edm::EventSetup & c
double responseHCAL(int _mip, double energy, double eta, int partype, RandomEngineAndDistribution const *)
double flatShoot(double xmin=0.0, double xmax=1.0) const
double getHCALEnergyResponse(double e, int hit, RandomEngineAndDistribution const *)
double interEM(double e, int ie, int ieta, RandomEngineAndDistribution const *)
void correctHF(double e, int type)
Exp< T >::type exp(const T &t)
double PoissonShootNoNegative(double e, double sigma, RandomEngineAndDistribution const *)
std::vector< double > vec1
Abs< T >::type abs(const T &t)
double getMIPfraction(double energy, double eta)
double interHD(int mip, double e, int ie, int ieta, int det, RandomEngineAndDistribution const *)
Log< level::Info, false > LogInfo
double interMU(double e, int ie, int ieta, RandomEngineAndDistribution const *)
T getParameter(std::string const &) const
double gaussShoot(double mean=0.0, double sigma=1.0) const
unsigned int poissonShoot(double mean) const
HCALResponse(const edm::ParameterSet &pset)
double gaussShootNoNegative(double e, double sigma, RandomEngineAndDistribution const *)
double cballShootNoNegative(double mu, double sigma, double aL, double nL, double aR, double nR, RandomEngineAndDistribution const *)