File indexing completed on 2024-09-07 04:37:12
0001 #ifndef FUNCTIONS_H
0002 #define FUNCTIONS_H
0003
0004 #include <iostream>
0005 #include <vector>
0006 #include <cmath>
0007 #include "TMath.h"
0008 #include "TString.h"
0009 #include "TF1.h"
0010 #include "TRandom.h"
0011 #include "MuonAnalysis/MomentumScaleCalibration/interface/SigmaPtDiff.h"
0012
0013
0014
0015
0016 struct ParameterSet {
0017 ParameterSet() {}
0018 ParameterSet(const TString& inputName, const double& inputStep, const double& inputMini, const double& inputMaxi)
0019 : step(inputStep), mini(inputMini), maxi(inputMaxi) {
0020 std::cout << "setting name = " << inputName << std::endl;
0021 name = inputName;
0022 }
0023 TString name;
0024 double step, mini, maxi;
0025 };
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 template <class T>
0040 class scaleFunctionBase {
0041 public:
0042 virtual double scale(
0043 const double& pt, const double& eta, const double& phi, const int chg, const T& parScale) const = 0;
0044 virtual ~scaleFunctionBase() = 0;
0045
0046 virtual void resetParameters(std::vector<double>* scaleVec) const {
0047 std::cout << "ERROR: the resetParameters method must be defined in each scale function" << std::endl;
0048 std::cout << "Please add it to the scaleFunction you are using" << std::endl;
0049 exit(1);
0050 }
0051
0052 virtual void setParameters(double* Start,
0053 double* Step,
0054 double* Mini,
0055 double* Maxi,
0056 int* ind,
0057 TString* parname,
0058 const T& parScale,
0059 const std::vector<int>& parScaleOrder,
0060 const int muonType) = 0;
0061 virtual void setParameters(double* Start,
0062 double* Step,
0063 double* Mini,
0064 double* Maxi,
0065 int* ind,
0066 TString* parname,
0067 const T& parResol,
0068 const std::vector<int>& parResolOrder,
0069 const std::vector<double>& parStep,
0070 const std::vector<double>& parMin,
0071 const std::vector<double>& parMax,
0072 const int muonType) {
0073 std::cout << "The method setParameters must be implemented for this scale function" << std::endl;
0074 exit(1);
0075 }
0076 virtual int parNum() const { return parNum_; }
0077
0078 protected:
0079 int parNum_;
0080
0081 virtual void setPar(double* Start,
0082 double* Step,
0083 double* Mini,
0084 double* Maxi,
0085 int* ind,
0086 TString* parname,
0087 const T& parScale,
0088 const std::vector<int>& parScaleOrder,
0089 double* thisStep,
0090 double* thisMini,
0091 double* thisMaxi,
0092 TString* thisParName) {
0093 for (int iPar = 0; iPar < this->parNum_; ++iPar) {
0094 Start[iPar] = parScale[iPar];
0095 Step[iPar] = thisStep[iPar];
0096 Mini[iPar] = thisMini[iPar];
0097 Maxi[iPar] = thisMaxi[iPar];
0098 ind[iPar] = parScaleOrder[iPar];
0099 parname[iPar] = thisParName[iPar];
0100 }
0101 }
0102 virtual void setPar(double* Start,
0103 double* Step,
0104 double* Mini,
0105 double* Maxi,
0106 int* ind,
0107 TString* parname,
0108 const T& parResol,
0109 const std::vector<int>& parResolOrder,
0110 const std::vector<ParameterSet>& parSet) {
0111 if (int(parSet.size()) != this->parNum_) {
0112 std::cout << "Error: wrong number of parameter initializations = " << parSet.size()
0113 << ". Number of parameters is " << this->parNum_ << std::endl;
0114 exit(1);
0115 }
0116 for (int iPar = 0; iPar < this->parNum_; ++iPar) {
0117 Start[iPar] = parResol[iPar];
0118 Step[iPar] = parSet[iPar].step;
0119 Mini[iPar] = parSet[iPar].mini;
0120 Maxi[iPar] = parSet[iPar].maxi;
0121 ind[iPar] = parResolOrder[iPar];
0122 parname[iPar] = parSet[iPar].name;
0123 }
0124 }
0125 };
0126
0127
0128
0129
0130
0131 template <class T>
0132 inline scaleFunctionBase<T>::~scaleFunctionBase() {
0133 }
0134
0135
0136
0137 template <class T>
0138 class scaleFunctionType0 : public scaleFunctionBase<T> {
0139 public:
0140 scaleFunctionType0() {
0141
0142
0143 this->parNum_ = 0;
0144 }
0145 double scale(const double& pt, const double& eta, const double& phi, const int chg, const T& parScale) const override {
0146 return pt;
0147 }
0148 void resetParameters(std::vector<double>* scaleVec) const override {}
0149 void setParameters(double* Start,
0150 double* Step,
0151 double* Mini,
0152 double* Maxi,
0153 int* ind,
0154 TString* parname,
0155 const T& parScale,
0156 const std::vector<int>& parScaleOrder,
0157 const int muonType) override {}
0158 };
0159
0160
0161
0162
0163 template <class T>
0164 class scaleFunctionType50 : public scaleFunctionBase<T> {
0165 public:
0166 scaleFunctionType50() { this->parNum_ = 27; }
0167 double scale(const double& pt, const double& eta, const double& phi, const int chg, const T& parScale) const override {
0168 double ampl(0), phase(0), twist(0), ampl2(0), freq2(0), phase2(0);
0169
0170
0171 if (eta < parScale[4]) {
0172 ampl = parScale[1];
0173 phase = parScale[2];
0174 ampl2 = parScale[21];
0175 freq2 = parScale[22];
0176 phase2 = parScale[23];
0177 twist =
0178 parScale[3] * (eta - parScale[4]) + parScale[7] * (parScale[4] - parScale[8]) + parScale[11] * parScale[8];
0179
0180 } else if (parScale[4] <= eta && eta < parScale[8]) {
0181 ampl = parScale[5];
0182 phase = parScale[6];
0183 twist = parScale[7] * (eta - parScale[8]) + parScale[11] * parScale[8];
0184
0185 } else if (parScale[8] <= eta && eta < parScale[12]) {
0186 ampl = parScale[9];
0187 phase = parScale[10];
0188 twist = parScale[11] * eta;
0189
0190 } else if (parScale[12] <= eta && eta < parScale[16]) {
0191 ampl = parScale[13];
0192 phase = parScale[14];
0193 twist = parScale[15] * (eta - parScale[12]) + parScale[11] * parScale[12];
0194
0195 } else if (parScale[16] < eta) {
0196 ampl = parScale[17];
0197 phase = parScale[18];
0198 ampl2 = parScale[24];
0199 freq2 = parScale[25];
0200 phase2 = parScale[26];
0201 twist = parScale[19] * (eta - parScale[16]) + parScale[15] * (parScale[16] - parScale[12]) +
0202 parScale[11] * parScale[12];
0203 }
0204
0205
0206 double curv = (1. + parScale[0]) * ((double)chg / pt - twist - ampl * sin(phi + phase) -
0207 ampl2 * sin((int)freq2 * phi + phase2) - 0.5 * parScale[20]);
0208 return 1. / ((double)chg * curv);
0209 }
0210
0211 void resetParameters(std::vector<double>* scaleVec) const override {
0212
0213 for (int i = 0; i < this->parNum_; ++i) {
0214 scaleVec->push_back(0);
0215 }
0216 }
0217 void setParameters(double* Start,
0218 double* Step,
0219 double* Mini,
0220 double* Maxi,
0221 int* ind,
0222 TString* parname,
0223 const T& parScale,
0224 const std::vector<int>& parScaleOrder,
0225 const int muonType) override {
0226 double thisStep[] = {0.000001, 0.000001, 0.01, 0.000001, 0.01, 0.000001, 0.01, 0.000001, 0.01,
0227 0.000001, 0.01, 0.000001, 0.01, 0.000001, 0.01, 0.000001, 0.01, 0.000001,
0228 0.01, 0.000001, 0.000001, 0.000001, 0.01, 0.01, 0.000001, 0.01, 0.01};
0229
0230 TString thisParName[] = {"Curv global scale",
0231 "Phi ampl eta vbwd",
0232 "Phi phase eta vbwd",
0233 "Twist eta vbwd",
0234 "vbwd/bwd bndry",
0235 "Phi ampl eta bwd",
0236 "Phi phase eta bwd",
0237 "Twist eta bwd",
0238 "bwd/bar bndry",
0239 "Phi ampl eta bar",
0240 "Phi phase eta bar",
0241 "Twist eta bar",
0242 "bar/fwd bndry",
0243 "Phi ampl eta fwd",
0244 "Phi phase eta fwd",
0245 "Twist eta fwd",
0246 "fwd/vfwd bndry",
0247 "Phi ampl eta vfwd",
0248 "Phi phase eta vfwd",
0249 "Twist eta vfwd",
0250 "Charge depend bias",
0251 "Phi ampl eta vbwd (2nd harmon.)",
0252 "Phi freq. eta vbwd (2nd harmon.)",
0253 "Phi phase eta vbwd (2nd harmon.)",
0254 "Phi ampl eta vfwd (2nd harmon.)",
0255 "Phi freq. eta vfwd (2nd harmon.)",
0256 "Phi phase eta vfwd (2nd harmon.)"};
0257
0258 if (muonType == 1) {
0259 double thisMini[] = {-0.1, -0.3, -3.1416, -0.3, -2.6, -0.3, -3.1416, -0.3, -2.6,
0260 -0.3, -3.1416, -0.3, 0., -0.3, -3.1416, -0.3, 0., -0.3,
0261 -3.1416, -0.3, -0.1, -0.3, 1., -3.1416, -0.3, 1., -3.1416};
0262 double thisMaxi[] = {0.1, 0.3, 3.1416, 0.3, 0., 0.3, 3.1416, 0.3, 0., 0.3, 3.1416, 0.3, 2.6, 0.3,
0263 3.1416, 0.3, 2.6, 0.3, 3.1416, 0.3, 0.1, 0.3, 5., 3.1416, 0.3, 5., 3.1416};
0264 this->setPar(
0265 Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, thisStep, thisMini, thisMaxi, thisParName);
0266 } else {
0267 double thisMini[] = {-0.1, -0.3, -3.1416, -0.3, -2.6, -0.3, -3.1416, -0.3, -2.6,
0268 -0.3, -3.1416, -0.3, 0., -0.3, -3.1416, -0.3, 0., -0.3,
0269 -3.1416, -0.3, -0.1, -0.3, 1., -3.1416, -0.3, 1., -3.1416};
0270 double thisMaxi[] = {0.1, 0.3, 3.1416, 0.3, 0., 0.3, 3.1416, 0.3, 0., 0.3, 3.1416, 0.3, 2.6, 0.3,
0271 3.1416, 0.3, 2.6, 0.3, 3.1416, 0.3, 0.1, 0.3, 5., 3.1416, 0.3, 5., 3.1416};
0272 this->setPar(
0273 Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, thisStep, thisMini, thisMaxi, thisParName);
0274 }
0275 }
0276 void setParameters(double* Start,
0277 double* Step,
0278 double* Mini,
0279 double* Maxi,
0280 int* ind,
0281 TString* parname,
0282 const T& parScale,
0283 const std::vector<int>& parScaleOrder,
0284 const std::vector<double>& parStep,
0285 const std::vector<double>& parMin,
0286 const std::vector<double>& parMax,
0287 const int muonType) override {
0288 if ((int(parStep.size()) != this->parNum_) || (int(parMin.size()) != this->parNum_) ||
0289 (int(parMax.size()) != this->parNum_)) {
0290 std::cout << "Error: par step or min or max do not match with number of parameters" << std::endl;
0291 std::cout << "parNum = " << this->parNum_ << std::endl;
0292 std::cout << "parStep.size() = " << parStep.size() << std::endl;
0293 std::cout << "parMin.size() = " << parMin.size() << std::endl;
0294 std::cout << "parMax.size() = " << parMax.size() << std::endl;
0295 exit(1);
0296 }
0297 std::vector<ParameterSet> parSet(this->parNum_);
0298
0299 parSet[0] = ParameterSet("Curv global scale", parStep[0], parMin[0], parMax[0]);
0300 parSet[1] = ParameterSet("Phi ampl vbwd", parStep[1], parMin[1], parMax[1]);
0301 parSet[2] = ParameterSet("Phi phase vbwd", parStep[2], parMin[2], parMax[2]);
0302 parSet[3] = ParameterSet("Twist vbwd", parStep[3], parMin[3], parMax[3]);
0303 parSet[4] = ParameterSet("vbwd/bwd bndry", parStep[4], parMin[4], parMax[4]);
0304 parSet[5] = ParameterSet("Phi ampl bwd", parStep[5], parMin[5], parMax[5]);
0305 parSet[6] = ParameterSet("Phi phase bwd", parStep[6], parMin[6], parMax[6]);
0306 parSet[7] = ParameterSet("Twist bwd", parStep[7], parMin[7], parMax[7]);
0307 parSet[8] = ParameterSet("bwd/bar bndry", parStep[8], parMin[8], parMax[8]);
0308 parSet[9] = ParameterSet("Phi ampl bar", parStep[9], parMin[9], parMax[9]);
0309 parSet[10] = ParameterSet("Phi phase bar", parStep[10], parMin[10], parMax[10]);
0310 parSet[11] = ParameterSet("Twist bar", parStep[11], parMin[11], parMax[11]);
0311 parSet[12] = ParameterSet("bar/fwd bndry", parStep[12], parMin[12], parMax[12]);
0312 parSet[13] = ParameterSet("Phi ampl fwd", parStep[13], parMin[13], parMax[13]);
0313 parSet[14] = ParameterSet("Phi phase fwd", parStep[14], parMin[14], parMax[14]);
0314 parSet[15] = ParameterSet("Twist fwd", parStep[15], parMin[15], parMax[15]);
0315 parSet[16] = ParameterSet("fwd/vfwd bndry", parStep[16], parMin[16], parMax[16]);
0316 parSet[17] = ParameterSet("Phi ampl vfwd", parStep[17], parMin[17], parMax[17]);
0317 parSet[18] = ParameterSet("Phi phase vfwd", parStep[18], parMin[18], parMax[18]);
0318 parSet[19] = ParameterSet("Twist vfwd", parStep[19], parMin[19], parMax[19]);
0319 parSet[20] = ParameterSet("Charge depend bias", parStep[20], parMin[20], parMax[20]);
0320 parSet[21] = ParameterSet("Phi ampl vbwd (2nd)", parStep[21], parMin[21], parMax[21]);
0321 parSet[22] = ParameterSet("Phi freq vbwd (2nd)", parStep[22], parMin[22], parMax[22]);
0322 parSet[23] = ParameterSet("Phi phase vbwd (2nd)", parStep[23], parMin[23], parMax[23]);
0323 parSet[24] = ParameterSet("Phi ampl vfwd (2nd)", parStep[24], parMin[24], parMax[24]);
0324 parSet[25] = ParameterSet("Phi freq vfwd (2nd)", parStep[25], parMin[25], parMax[25]);
0325 parSet[26] = ParameterSet("Phi phase vfwd (2nd)", parStep[26], parMin[26], parMax[26]);
0326
0327 std::cout << "setting parameters" << std::endl;
0328 for (int i = 0; i < this->parNum_; ++i) {
0329 std::cout << "parStep[" << i << "] = " << parStep[i] << ", parMin[" << i << "] = " << parMin[i] << ", parMax["
0330 << i << "] = " << parMin[i] << std::endl;
0331 }
0332 this->setPar(Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, parSet);
0333 }
0334 };
0335
0336
0337
0338
0339
0340
0341 template <class T>
0342 class scaleFunctionType64 : public scaleFunctionBase<T> {
0343 public:
0344 scaleFunctionType64() { this->parNum_ = 50; }
0345 double scale(const double& pt, const double& eta, const double& phi, const int chg, const T& parScale) const override {
0346 double deltaK(0);
0347 double p0 = parScale[0];
0348
0349 if (eta < -2.1 && eta > -2.4 && phi < -2.35619449019 && phi > -3.14159265359)
0350 deltaK = parScale[1];
0351 else if (eta < -2.1 && eta > -2.4 && phi < -1.57079632679 && phi > -2.35619449019)
0352 deltaK = parScale[2];
0353 else if (eta < -2.1 && eta > -2.4 && phi < -0.785398163397 && phi > -1.57079632679)
0354 deltaK = parScale[3];
0355 else if (eta < -2.1 && eta > -2.4 && phi < 0.0 && phi > -0.785398163397)
0356 deltaK = parScale[4];
0357 else if (eta < -2.1 && eta > -2.4 && phi < 0.785398163397 && phi > 0.0)
0358 deltaK = parScale[5];
0359 else if (eta < -2.1 && eta > -2.4 && phi < 1.57079632679 && phi > 0.785398163397)
0360 deltaK = parScale[6];
0361 else if (eta < -2.1 && eta > -2.4 && phi < 2.35619449019 && phi > 1.57079632679)
0362 deltaK = parScale[7];
0363 else if (eta < -2.1 && eta > -2.4 && phi < 3.14159265359 && phi > 2.35619449019)
0364 deltaK = -(parScale[1] + parScale[2] + parScale[3] + parScale[4] + parScale[5] + parScale[6] + parScale[7]);
0365
0366 else if (eta < -1.5 && eta > -2.1 && phi < -2.35619449019 && phi > -3.14159265359)
0367 deltaK = parScale[8];
0368 else if (eta < -1.5 && eta > -2.1 && phi < -1.57079632679 && phi > -2.35619449019)
0369 deltaK = parScale[9];
0370 else if (eta < -1.5 && eta > -2.1 && phi < -0.785398163397 && phi > -1.57079632679)
0371 deltaK = parScale[10];
0372 else if (eta < -1.5 && eta > -2.1 && phi < 0.0 && phi > -0.785398163397)
0373 deltaK = parScale[11];
0374 else if (eta < -1.5 && eta > -2.1 && phi < 0.785398163397 && phi > 0.0)
0375 deltaK = parScale[12];
0376 else if (eta < -1.5 && eta > -2.1 && phi < 1.57079632679 && phi > 0.785398163397)
0377 deltaK = parScale[13];
0378 else if (eta < -1.5 && eta > -2.1 && phi < 2.35619449019 && phi > 1.57079632679)
0379 deltaK = parScale[14];
0380 else if (eta < -1.5 && eta > -2.1 && phi < 3.14159265359 && phi > 2.35619449019)
0381 deltaK = -(parScale[8] + parScale[9] + parScale[10] + parScale[11] + parScale[12] + parScale[13] + parScale[14]);
0382
0383 else if (eta < -0.9 && eta > -1.5 && phi < -2.35619449019 && phi > -3.14159265359)
0384 deltaK = parScale[15];
0385 else if (eta < -0.9 && eta > -1.5 && phi < -1.57079632679 && phi > -2.35619449019)
0386 deltaK = parScale[16];
0387 else if (eta < -0.9 && eta > -1.5 && phi < -0.785398163397 && phi > -1.57079632679)
0388 deltaK = parScale[17];
0389 else if (eta < -0.9 && eta > -1.5 && phi < 0.0 && phi > -0.785398163397)
0390 deltaK = parScale[18];
0391 else if (eta < -0.9 && eta > -1.5 && phi < 0.785398163397 && phi > 0.0)
0392 deltaK = parScale[19];
0393 else if (eta < -0.9 && eta > -1.5 && phi < 1.57079632679 && phi > 0.785398163397)
0394 deltaK = parScale[20];
0395 else if (eta < -0.9 && eta > -1.5 && phi < 2.35619449019 && phi > 1.57079632679)
0396 deltaK = parScale[21];
0397 else if (eta < -0.9 && eta > -1.5 && phi < 3.14159265359 && phi > 2.35619449019)
0398 deltaK =
0399 -(parScale[15] + parScale[16] + parScale[17] + parScale[18] + parScale[19] + parScale[20] + parScale[21]);
0400
0401 else if (eta < 0.9 && eta > -0.9 && phi < -2.35619449019 && phi > -3.14159265359)
0402 deltaK = parScale[22];
0403 else if (eta < 0.9 && eta > -0.9 && phi < -1.57079632679 && phi > -2.35619449019)
0404 deltaK = parScale[23];
0405 else if (eta < 0.9 && eta > -0.9 && phi < -0.785398163397 && phi > -1.57079632679)
0406 deltaK = parScale[24];
0407 else if (eta < 0.9 && eta > -0.9 && phi < 0.0 && phi > -0.785398163397)
0408 deltaK = parScale[25];
0409 else if (eta < 0.9 && eta > -0.9 && phi < 0.785398163397 && phi > 0.0)
0410 deltaK = parScale[26];
0411 else if (eta < 0.9 && eta > -0.9 && phi < 1.57079632679 && phi > 0.785398163397)
0412 deltaK = parScale[27];
0413 else if (eta < 0.9 && eta > -0.9 && phi < 2.35619449019 && phi > 1.57079632679)
0414 deltaK = parScale[28];
0415 else if (eta < 0.9 && eta > -0.9 && phi < 3.14159265359 && phi > 2.35619449019)
0416 deltaK =
0417 -(parScale[22] + parScale[23] + parScale[24] + parScale[25] + parScale[26] + parScale[27] + parScale[28]);
0418
0419 else if (eta < 1.5 && eta > 0.9 && phi < -2.35619449019 && phi > -3.14159265359)
0420 deltaK = parScale[29];
0421 else if (eta < 1.5 && eta > 0.9 && phi < -1.57079632679 && phi > -2.35619449019)
0422 deltaK = parScale[30];
0423 else if (eta < 1.5 && eta > 0.9 && phi < -0.785398163397 && phi > -1.57079632679)
0424 deltaK = parScale[31];
0425 else if (eta < 1.5 && eta > 0.9 && phi < 0.0 && phi > -0.785398163397)
0426 deltaK = parScale[32];
0427 else if (eta < 1.5 && eta > 0.9 && phi < 0.785398163397 && phi > 0.0)
0428 deltaK = parScale[33];
0429 else if (eta < 1.5 && eta > 0.9 && phi < 1.57079632679 && phi > 0.785398163397)
0430 deltaK = parScale[34];
0431 else if (eta < 1.5 && eta > 0.9 && phi < 2.35619449019 && phi > 1.57079632679)
0432 deltaK = parScale[35];
0433 else if (eta < 1.5 && eta > 0.9 && phi < 3.14159265359 && phi > 2.35619449019)
0434 deltaK =
0435 -(parScale[29] + parScale[30] + parScale[31] + parScale[32] + parScale[33] + parScale[34] + parScale[35]);
0436
0437 else if (eta < 2.1 && eta > 1.5 && phi < -2.35619449019 && phi > -3.14159265359)
0438 deltaK = parScale[36];
0439 else if (eta < 2.1 && eta > 1.5 && phi < -1.57079632679 && phi > -2.35619449019)
0440 deltaK = parScale[37];
0441 else if (eta < 2.1 && eta > 1.5 && phi < -0.785398163397 && phi > -1.57079632679)
0442 deltaK = parScale[38];
0443 else if (eta < 2.1 && eta > 1.5 && phi < 0.0 && phi > -0.785398163397)
0444 deltaK = parScale[39];
0445 else if (eta < 2.1 && eta > 1.5 && phi < 0.785398163397 && phi > 0.0)
0446 deltaK = parScale[40];
0447 else if (eta < 2.1 && eta > 1.5 && phi < 1.57079632679 && phi > 0.785398163397)
0448 deltaK = parScale[41];
0449 else if (eta < 2.1 && eta > 1.5 && phi < 2.35619449019 && phi > 1.57079632679)
0450 deltaK = parScale[42];
0451 else if (eta < 2.1 && eta > 1.5 && phi < 3.14159265359 && phi > 2.35619449019)
0452 deltaK =
0453 -(parScale[36] + parScale[37] + parScale[38] + parScale[39] + parScale[40] + parScale[41] + parScale[42]);
0454
0455 else if (eta < 2.4 && eta > 2.1 && phi < -2.35619449019 && phi > -3.14159265359)
0456 deltaK = parScale[43];
0457 else if (eta < 2.4 && eta > 2.1 && phi < -1.57079632679 && phi > -2.35619449019)
0458 deltaK = parScale[44];
0459 else if (eta < 2.4 && eta > 2.1 && phi < -0.785398163397 && phi > -1.57079632679)
0460 deltaK = parScale[45];
0461 else if (eta < 2.4 && eta > 2.1 && phi < 0.0 && phi > -0.785398163397)
0462 deltaK = parScale[46];
0463 else if (eta < 2.4 && eta > 2.1 && phi < 0.785398163397 && phi > 0.0)
0464 deltaK = parScale[47];
0465 else if (eta < 2.4 && eta > 2.1 && phi < 1.57079632679 && phi > 0.785398163397)
0466 deltaK = parScale[48];
0467 else if (eta < 2.4 && eta > 2.1 && phi < 2.35619449019 && phi > 1.57079632679)
0468 deltaK = parScale[49];
0469 else if (eta < 2.4 && eta > 2.1 && phi < 3.14159265359 && phi > 2.35619449019)
0470 deltaK =
0471 -(parScale[43] + parScale[44] + parScale[45] + parScale[46] + parScale[47] + parScale[48] + parScale[49]);
0472 else {
0473 std::cout << "This should really not happen, this muon has eta = " << eta << "and phi = " << phi << std::endl;
0474 exit(1);
0475 }
0476
0477
0478 double curv = (double)chg / pt;
0479 return 1. / ((double)chg * (1 + p0) * (curv + deltaK));
0480 }
0481
0482 void resetParameters(std::vector<double>* scaleVec) const override {
0483
0484 for (int i = 0; i < this->parNum_; ++i) {
0485 scaleVec->push_back(0);
0486 }
0487 }
0488 void setParameters(double* Start,
0489 double* Step,
0490 double* Mini,
0491 double* Maxi,
0492 int* ind,
0493 TString* parname,
0494 const T& parScale,
0495 const std::vector<int>& parScaleOrder,
0496 const int muonType) override {
0497 double thisStep[] = {0.000001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0498 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0499 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0500 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0501 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001};
0502
0503 TString thisParName[] = {"Curv global scale", "deltaK bin1", "deltaK bin2", "deltaK bin3", "deltaK bin4",
0504 "deltaK bin5", "deltaK bin6", "deltaK bin7", "deltaK bin8", "deltaK bin9",
0505 "deltaK bin10", "deltaK bin11", "deltaK bin12", "deltaK bin13", "deltaK bin14",
0506 "deltaK bin15", "deltaK bin16", "deltaK bin17", "deltaK bin18", "deltaK bin19",
0507 "deltaK bin20", "deltaK bin21", "deltaK bin22", "deltaK bin23", "deltaK bin24",
0508 "deltaK bin25", "deltaK bin26", "deltaK bin27", "deltaK bin28", "deltaK bin29",
0509 "deltaK bin30", "deltaK bin31", "deltaK bin32", "deltaK bin33", "deltaK bin34",
0510 "deltaK bin35", "deltaK bin36", "deltaK bin37", "deltaK bin38", "deltaK bin39",
0511 "deltaK bin40", "deltaK bin41", "deltaK bin42", "deltaK bin43", "deltaK bin44",
0512 "deltaK bin45", "deltaK bin46", "deltaK bin47", "deltaK bin48", "deltaK bin49"};
0513
0514 if (muonType == 1) {
0515 double thisMini[] = {-0.1, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0516 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0517 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0518 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0519 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005};
0520 double thisMaxi[] = {0.1, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0521 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0522 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0523 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005};
0524 this->setPar(
0525 Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, thisStep, thisMini, thisMaxi, thisParName);
0526 } else {
0527 double thisMini[] = {-0.1, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0528 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0529 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0530 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005,
0531 -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005, -0.005};
0532 double thisMaxi[] = {0.1, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0533 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0534 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005,
0535 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005};
0536 this->setPar(
0537 Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, thisStep, thisMini, thisMaxi, thisParName);
0538 }
0539 }
0540 void setParameters(double* Start,
0541 double* Step,
0542 double* Mini,
0543 double* Maxi,
0544 int* ind,
0545 TString* parname,
0546 const T& parScale,
0547 const std::vector<int>& parScaleOrder,
0548 const std::vector<double>& parStep,
0549 const std::vector<double>& parMin,
0550 const std::vector<double>& parMax,
0551 const int muonType) override {
0552 if ((int(parStep.size()) != this->parNum_) || (int(parMin.size()) != this->parNum_) ||
0553 (int(parMax.size()) != this->parNum_)) {
0554 std::cout << "Error: par step or min or max do not match with number of parameters" << std::endl;
0555 std::cout << "parNum = " << this->parNum_ << std::endl;
0556 std::cout << "parStep.size() = " << parStep.size() << std::endl;
0557 std::cout << "parMin.size() = " << parMin.size() << std::endl;
0558 std::cout << "parMax.size() = " << parMax.size() << std::endl;
0559 exit(1);
0560 }
0561 std::vector<ParameterSet> parSet(this->parNum_);
0562
0563 parSet[0] = ParameterSet("Curv global scale", parStep[0], parMin[0], parMax[0]);
0564 parSet[1] = ParameterSet("deltaK bin1", parStep[1], parMin[1], parMax[1]);
0565 parSet[2] = ParameterSet("deltaK bin2", parStep[2], parMin[2], parMax[2]);
0566 parSet[3] = ParameterSet("deltaK bin3", parStep[3], parMin[3], parMax[3]);
0567 parSet[4] = ParameterSet("deltaK bin4", parStep[4], parMin[4], parMax[4]);
0568 parSet[5] = ParameterSet("deltaK bin5", parStep[5], parMin[5], parMax[5]);
0569 parSet[6] = ParameterSet("deltaK bin6", parStep[6], parMin[6], parMax[6]);
0570 parSet[7] = ParameterSet("deltaK bin7", parStep[7], parMin[7], parMax[7]);
0571 parSet[8] = ParameterSet("deltaK bin9", parStep[8], parMin[8], parMax[8]);
0572 parSet[9] = ParameterSet("deltaK bin10", parStep[9], parMin[9], parMax[9]);
0573 parSet[10] = ParameterSet("deltaK bin11", parStep[10], parMin[10], parMax[10]);
0574 parSet[11] = ParameterSet("deltaK bin12", parStep[11], parMin[11], parMax[11]);
0575 parSet[12] = ParameterSet("deltaK bin13", parStep[12], parMin[12], parMax[12]);
0576 parSet[13] = ParameterSet("deltaK bin14", parStep[13], parMin[13], parMax[13]);
0577 parSet[14] = ParameterSet("deltaK bin15", parStep[14], parMin[14], parMax[14]);
0578 parSet[15] = ParameterSet("deltaK bin17", parStep[15], parMin[15], parMax[15]);
0579 parSet[16] = ParameterSet("deltaK bin18", parStep[16], parMin[16], parMax[16]);
0580 parSet[17] = ParameterSet("deltaK bin19", parStep[17], parMin[17], parMax[17]);
0581 parSet[18] = ParameterSet("deltaK bin20", parStep[18], parMin[18], parMax[18]);
0582 parSet[19] = ParameterSet("deltaK bin21", parStep[19], parMin[19], parMax[19]);
0583 parSet[20] = ParameterSet("deltaK bin22", parStep[20], parMin[20], parMax[20]);
0584 parSet[21] = ParameterSet("deltaK bin23", parStep[21], parMin[21], parMax[21]);
0585 parSet[22] = ParameterSet("deltaK bin25", parStep[22], parMin[22], parMax[22]);
0586 parSet[23] = ParameterSet("deltaK bin26", parStep[23], parMin[23], parMax[23]);
0587 parSet[24] = ParameterSet("deltaK bin27", parStep[24], parMin[24], parMax[24]);
0588 parSet[25] = ParameterSet("deltaK bin28", parStep[25], parMin[25], parMax[25]);
0589 parSet[26] = ParameterSet("deltaK bin29", parStep[26], parMin[26], parMax[26]);
0590 parSet[27] = ParameterSet("deltaK bin30", parStep[27], parMin[27], parMax[27]);
0591 parSet[28] = ParameterSet("deltaK bin31", parStep[28], parMin[28], parMax[28]);
0592 parSet[29] = ParameterSet("deltaK bin33", parStep[29], parMin[29], parMax[29]);
0593 parSet[30] = ParameterSet("deltaK bin34", parStep[30], parMin[30], parMax[30]);
0594 parSet[31] = ParameterSet("deltaK bin35", parStep[31], parMin[31], parMax[31]);
0595 parSet[32] = ParameterSet("deltaK bin36", parStep[32], parMin[32], parMax[32]);
0596 parSet[33] = ParameterSet("deltaK bin37", parStep[33], parMin[33], parMax[33]);
0597 parSet[34] = ParameterSet("deltaK bin38", parStep[34], parMin[34], parMax[34]);
0598 parSet[35] = ParameterSet("deltaK bin39", parStep[35], parMin[35], parMax[35]);
0599 parSet[36] = ParameterSet("deltaK bin41", parStep[36], parMin[36], parMax[36]);
0600 parSet[37] = ParameterSet("deltaK bin42", parStep[37], parMin[37], parMax[37]);
0601 parSet[38] = ParameterSet("deltaK bin43", parStep[38], parMin[38], parMax[38]);
0602 parSet[39] = ParameterSet("deltaK bin44", parStep[39], parMin[39], parMax[39]);
0603 parSet[40] = ParameterSet("deltaK bin45", parStep[40], parMin[40], parMax[40]);
0604 parSet[41] = ParameterSet("deltaK bin46", parStep[41], parMin[41], parMax[41]);
0605 parSet[42] = ParameterSet("deltaK bin47", parStep[42], parMin[42], parMax[42]);
0606 parSet[43] = ParameterSet("deltaK bin49", parStep[43], parMin[43], parMax[43]);
0607 parSet[44] = ParameterSet("deltaK bin50", parStep[44], parMin[44], parMax[44]);
0608 parSet[45] = ParameterSet("deltaK bin51", parStep[45], parMin[45], parMax[45]);
0609 parSet[46] = ParameterSet("deltaK bin52", parStep[46], parMin[46], parMax[46]);
0610 parSet[47] = ParameterSet("deltaK bin53", parStep[47], parMin[47], parMax[47]);
0611 parSet[48] = ParameterSet("deltaK bin54", parStep[48], parMin[48], parMax[48]);
0612 parSet[49] = ParameterSet("deltaK bin55", parStep[49], parMin[49], parMax[49]);
0613
0614 std::cout << "setting parameters" << std::endl;
0615 for (int i = 0; i < this->parNum_; ++i) {
0616 std::cout << "parStep[" << i << "] = " << parStep[i] << ", parMin[" << i << "] = " << parMin[i] << ", parMax["
0617 << i << "] = " << parMin[i] << std::endl;
0618 }
0619 this->setPar(Start, Step, Mini, Maxi, ind, parname, parScale, parScaleOrder, parSet);
0620 }
0621 };
0622
0623
0624 scaleFunctionBase<double*>* scaleFunctionService(const int identifier);
0625
0626
0627 scaleFunctionBase<std::vector<double> >* scaleFunctionVecService(const int identifier);
0628
0629
0630
0631
0632
0633 class smearFunctionBase {
0634 public:
0635 virtual void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) = 0;
0636 smearFunctionBase() {
0637 cotgth_ = 0.;
0638 gRandom_ = new TRandom();
0639 }
0640 virtual ~smearFunctionBase() = 0;
0641
0642 protected:
0643 void smearEta(double& eta) {
0644 double theta;
0645 if (cotgth_ != 0) {
0646 theta = atan(1 / cotgth_);
0647 } else {
0648 theta = TMath::Pi() / 2;
0649 }
0650 if (theta < 0)
0651 theta += TMath::Pi();
0652 eta = -log(tan(theta / 2));
0653 }
0654 double cotgth_;
0655 TRandom* gRandom_;
0656 };
0657 inline smearFunctionBase::~smearFunctionBase() {}
0658
0659
0660
0661 class smearFunctionType0 : public smearFunctionBase {
0662 public:
0663 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {}
0664 };
0665
0666
0667 class smearFunctionType1 : public smearFunctionBase {
0668 public:
0669 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0670 pt = pt * (1.0 + y[0] * parSmear[0] * pt);
0671 phi = phi * (1.0 + y[1] * parSmear[1]);
0672 double tmp = 2 * atan(exp(-eta));
0673 cotgth_ = cos(tmp) / sin(tmp) * (1.0 + y[2] * parSmear[2]);
0674 smearEta(eta);
0675 }
0676 };
0677
0678 class smearFunctionType2 : public smearFunctionBase {
0679 public:
0680 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0681 pt = pt * (1.0 + y[0] * parSmear[0] * pt + y[1] * parSmear[1] * std::fabs(eta));
0682 phi = phi * (1.0 + y[2] * parSmear[2]);
0683 double tmp = 2 * atan(exp(-eta));
0684 cotgth_ = cos(tmp) / sin(tmp) * (1.0 + y[3] * parSmear[3]);
0685 smearEta(eta);
0686 }
0687 };
0688
0689 class smearFunctionType3 : public smearFunctionBase {
0690 public:
0691 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0692 pt = pt * (1.0 + y[0] * parSmear[0] * pt + y[1] * parSmear[1] * std::fabs(eta));
0693 phi = phi * (1.0 + y[2] * parSmear[2]);
0694 double tmp = 2 * atan(exp(-eta));
0695 cotgth_ = cos(tmp) / sin(tmp) * (1.0 + y[3] * parSmear[3] + y[4] * parSmear[4] * std::fabs(eta));
0696 smearEta(eta);
0697 }
0698 };
0699
0700
0701
0702 class smearFunctionType4 : public smearFunctionBase {
0703 public:
0704 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0705 pt = pt * (1.0 + y[0] * parSmear[0] * pt + y[1] * parSmear[1] * std::fabs(eta) + y[5] * parSmear[5] * pow(pt, 2));
0706 phi = phi * (1.0 + y[2] * parSmear[2]);
0707 double tmp = 2 * atan(exp(-eta));
0708 cotgth_ = cos(tmp) / sin(tmp) * (1.0 + y[3] * parSmear[3] + y[4] * parSmear[4] * std::fabs(eta));
0709 smearEta(eta);
0710 }
0711 };
0712
0713 class smearFunctionType5 : public smearFunctionBase {
0714 public:
0715 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0716 pt = pt * (1.0 + y[0] * parSmear[0] * pt + y[1] * parSmear[1] * std::fabs(eta) + y[5] * parSmear[5] * pow(pt, 2));
0717 phi = phi * (1.0 + y[2] * parSmear[2] + y[6] * parSmear[6] * pt);
0718 double tmp = 2 * atan(exp(-eta));
0719 cotgth_ = cos(tmp) / sin(tmp) * (1.0 + y[3] * parSmear[3] + y[4] * parSmear[4] * std::fabs(eta));
0720 smearEta(eta);
0721 }
0722 };
0723
0724
0725 class smearFunctionType6 : public smearFunctionBase {
0726 public:
0727 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0728 double sigmaSmear = 0;
0729 double sigmaPtAl = 0;
0730 double sigmaPtMisal = 0;
0731 double ptPart = parSmear[0] + parSmear[1] * 1 / pt + pt * parSmear[2];
0732 double fabsEta = std::fabs(eta);
0733
0734 sigmaPtAl = parSmear[14] * etaByPoints(eta, parSmear[15]);
0735
0736 if (std::fabs(eta) <= 1.4) {
0737 sigmaPtMisal = ptPart + parSmear[3] + parSmear[4] * std::fabs(eta) + parSmear[5] * eta * eta;
0738 sigmaSmear = sqrt(std::fabs(pow(sigmaPtMisal, 2) - pow(sigmaPtAl, 2)));
0739 pt = pt * gRandom_->Gaus(1, sigmaSmear);
0740 } else if (eta > 1.4) {
0741 double par =
0742 parSmear[3] + parSmear[4] * 1.4 + parSmear[5] * 1.4 * 1.4 -
0743 (parSmear[6] + parSmear[7] * (1.4 - parSmear[8]) + parSmear[9] * (1.4 - parSmear[8]) * (1.4 - parSmear[8]));
0744 sigmaPtMisal = par + ptPart + parSmear[6] + parSmear[7] * std::fabs((fabsEta - parSmear[8])) +
0745 parSmear[9] * (fabsEta - parSmear[8]) * (fabsEta - parSmear[8]);
0746 sigmaSmear = sqrt(std::fabs(pow(sigmaPtMisal, 2) - pow(sigmaPtAl, 2)));
0747 pt = pt * gRandom_->Gaus(1, sigmaSmear);
0748 } else {
0749 double par = parSmear[3] + parSmear[4] * 1.4 + parSmear[5] * 1.4 * 1.4 -
0750 (parSmear[10] + parSmear[11] * (1.4 - parSmear[12]) +
0751 parSmear[13] * (1.4 - parSmear[12]) * (1.4 - parSmear[12]));
0752 sigmaPtMisal = par + ptPart + parSmear[10] + parSmear[11] * std::fabs((fabsEta - parSmear[12])) +
0753 parSmear[13] * (fabsEta - parSmear[12]) * (fabsEta - parSmear[12]);
0754 sigmaSmear = sqrt(std::fabs(pow(sigmaPtMisal, 2) - pow(sigmaPtAl, 2)));
0755 pt = pt * gRandom_->Gaus(1, sigmaSmear);
0756 }
0757 }
0758
0759 protected:
0760
0761
0762
0763
0764 double etaByPoints(const double& inEta, const double& border) {
0765 Double_t eta = std::fabs(inEta);
0766 if (0. <= eta && eta <= 0.2)
0767 return 0.00942984;
0768 else if (0.2 < eta && eta <= 0.4)
0769 return 0.0104489;
0770 else if (0.4 < eta && eta <= 0.6)
0771 return 0.0110521;
0772 else if (0.6 < eta && eta <= 0.8)
0773 return 0.0117338;
0774 else if (0.8 < eta && eta <= 1.0)
0775 return 0.0138142;
0776 else if (1.0 < eta && eta <= 1.2)
0777 return 0.0165826;
0778 else if (1.2 < eta && eta <= 1.4)
0779 return 0.0183663;
0780 else if (1.4 < eta && eta <= 1.6)
0781 return 0.0169904;
0782 else if (1.6 < eta && eta <= 1.8)
0783 return 0.0173289;
0784 else if (1.8 < eta && eta <= 2.0)
0785 return 0.0205821;
0786 else if (2.0 < eta && eta <= 2.2)
0787 return 0.0250032;
0788 else if (2.2 < eta && eta <= 2.4)
0789 return 0.0339477;
0790
0791 else if (2.4 < eta && eta <= 2.6)
0792 return border;
0793 return (0.);
0794 }
0795 };
0796
0797 class smearFunctionType7 : public smearFunctionBase {
0798 public:
0799 void smear(double& pt, double& eta, double& phi, const double* y, const std::vector<double>& parSmear) override {
0800 double sigmaSquared = sigmaPtDiff.squaredDiff(eta);
0801 TF1 G("G", "[0]*exp(-0.5*pow(x,2)/[1])", -5., 5.);
0802 double norm = 1 / (sqrt(2 * TMath::Pi() * sigmaSquared));
0803 G.SetParameter(0, norm);
0804 G.SetParameter(1, sigmaSquared);
0805 pt = pt * (1 - G.GetRandom());
0806 }
0807 SigmaPtDiff sigmaPtDiff;
0808 };
0809
0810
0811 smearFunctionBase* smearFunctionService(const int identifier);
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827 template <class T>
0828 class resolutionFunctionBase {
0829 public:
0830 virtual double sigmaPt(const double& pt, const double& eta, const T& parval) = 0;
0831 virtual double sigmaPtError(const double& pt, const double& eta, const T& parval, const T& parError) { return 0.; }
0832 virtual double sigmaPhi(const double& pt, const double& eta, const T& parval) = 0;
0833 virtual double sigmaCotgTh(const double& pt, const double& eta, const T& parval) = 0;
0834 virtual double covPt1Pt2(
0835 const double& pt1, const double& eta1, const double& pt2, const double& eta2, const T& parval) {
0836 return 0.;
0837 }
0838 resolutionFunctionBase() {}
0839 virtual ~resolutionFunctionBase() = 0;
0840
0841 virtual void setParameters(double* Start,
0842 double* Step,
0843 double* Mini,
0844 double* Maxi,
0845 int* ind,
0846 TString* parname,
0847 const T& parResol,
0848 const std::vector<int>& parResolOrder,
0849 const int muonType) {};
0850 virtual void setParameters(double* Start,
0851 double* Step,
0852 double* Mini,
0853 double* Maxi,
0854 int* ind,
0855 TString* parname,
0856 const T& parResol,
0857 const std::vector<int>& parResolOrder,
0858 const std::vector<double>& parStep,
0859 const std::vector<double>& parMin,
0860 const std::vector<double>& parMax,
0861 const int muonType) {
0862 std::cout << "The method setParameters must be implemented for this resolution function" << std::endl;
0863 exit(1);
0864 }
0865 virtual int parNum() const { return parNum_; }
0866
0867 protected:
0868 int parNum_;
0869
0870 virtual void setPar(double* Start,
0871 double* Step,
0872 double* Mini,
0873 double* Maxi,
0874 int* ind,
0875 TString* parname,
0876 const T& parResol,
0877 const std::vector<int>& parResolOrder,
0878 double* thisStep,
0879 double* thisMini,
0880 double* thisMaxi,
0881 TString* thisParName) {
0882 for (int iPar = 0; iPar < this->parNum_; ++iPar) {
0883 Start[iPar] = parResol[iPar];
0884 Step[iPar] = thisStep[iPar];
0885 Mini[iPar] = thisMini[iPar];
0886 Maxi[iPar] = thisMaxi[iPar];
0887 ind[iPar] = parResolOrder[iPar];
0888 parname[iPar] = thisParName[iPar];
0889 }
0890 }
0891 virtual void setPar(double* Start,
0892 double* Step,
0893 double* Mini,
0894 double* Maxi,
0895 int* ind,
0896 TString* parname,
0897 const T& parResol,
0898 const std::vector<int>& parResolOrder,
0899 const std::vector<ParameterSet>& parSet) {
0900 if (int(parSet.size()) != this->parNum_) {
0901 std::cout << "Error: wrong number of parameter initializations = " << parSet.size()
0902 << ". Number of parameters is " << this->parNum_ << std::endl;
0903 exit(1);
0904 }
0905 for (int iPar = 0; iPar < this->parNum_; ++iPar) {
0906 Start[iPar] = parResol[iPar];
0907 Step[iPar] = parSet[iPar].step;
0908 Mini[iPar] = parSet[iPar].mini;
0909 Maxi[iPar] = parSet[iPar].maxi;
0910 ind[iPar] = parResolOrder[iPar];
0911 parname[iPar] = parSet[iPar].name;
0912 }
0913 }
0914 };
0915 template <class T>
0916 inline resolutionFunctionBase<T>::~resolutionFunctionBase() {
0917 }
0918
0919
0920
0921
0922
0923
0924
0925 template <class T>
0926 class resolutionFunctionType0 : public resolutionFunctionBase<T> {
0927 public:
0928 resolutionFunctionType0() {
0929
0930 this->parNum_ = 0;
0931 }
0932 double sigmaPt(const double& pt, const double& eta, const T& parval) override { return 0; }
0933 double sigmaCotgTh(const double& pt, const double& eta, const T& parval) override { return 0; }
0934 double sigmaPhi(const double& pt, const double& eta, const T& parval) override { return 0.; }
0935
0936 double sigmaPtError(const double& pt, const double& eta, const T& parval, const T& parError) override { return 0; }
0937 void setParameters(double* Start,
0938 double* Step,
0939 double* Mini,
0940 double* Maxi,
0941 int* ind,
0942 TString* parname,
0943 const T& parResol,
0944 const std::vector<int>& parResolOrder,
0945 const int muonType) override {}
0946 void setParameters(double* Start,
0947 double* Step,
0948 double* Mini,
0949 double* Maxi,
0950 int* ind,
0951 TString* parname,
0952 const T& parResol,
0953 const std::vector<int>& parResolOrder,
0954 const std::vector<double>& parStep,
0955 const std::vector<double>& parMin,
0956 const std::vector<double>& parMax,
0957 const int muonType) override {}
0958 };
0959
0960
0961 template <class T>
0962 class resolutionFunctionType45 : public resolutionFunctionBase<T> {
0963 public:
0964 int etaBin(const double& eta) {
0965
0966
0967 if (eta < -2.0)
0968 return 1;
0969 if (eta < -1.8)
0970 return 2;
0971 if (eta < -1.6)
0972 return 3;
0973 if (eta < -1.2)
0974 return 4;
0975 if (eta < -0.8)
0976 return 5;
0977 if (eta < 0.)
0978 return 6;
0979 if (eta < 0.8)
0980 return 7;
0981 if (eta < 1.2)
0982 return 8;
0983 if (eta < 1.6)
0984 return 9;
0985 if (eta < 1.8)
0986 return 10;
0987 if (eta < 2.0)
0988 return 11;
0989 return 12;
0990 }
0991
0992 resolutionFunctionType45() { this->parNum_ = 13; }
0993
0994 double sigmaPt(const double& pt, const double& eta, const T& parval) override {
0995 return (parval[0] * pt + parval[etaBin(eta)]);
0996 }
0997 double sigmaCotgTh(const double& pt, const double& eta, const T& parval) override { return 0; }
0998 double sigmaPhi(const double& pt, const double& eta, const T& parval) override { return 0.; }
0999
1000
1001 double sigmaPtError(const double& pt, const double& eta, const T& parval, const T& parError) override {
1002
1003 return sqrt(pow(pt * parError[0], 2) + pow(parError[etaBin(eta)], 2));
1004 }
1005
1006 void setParameters(double* Start,
1007 double* Step,
1008 double* Mini,
1009 double* Maxi,
1010 int* ind,
1011 TString* parname,
1012 const T& parResol,
1013 const std::vector<int>& parResolOrder,
1014 const int muonType) override {
1015 std::vector<ParameterSet> parSet(this->parNum_);
1016
1017 parSet[0] = ParameterSet("Pt res. sc.", 0.002, -0.1, 0.1);
1018 parSet[1] = ParameterSet("eta bin 1", 0.00002, -0.01, 0.01);
1019 parSet[2] = ParameterSet("eta bin 2", 0.00002, -0.01, 0.01);
1020 parSet[3] = ParameterSet("eta bin 3", 0.00002, -0.01, 0.01);
1021 parSet[4] = ParameterSet("eta bin 4", 0.00002, -0.01, 0.01);
1022 parSet[5] = ParameterSet("eta bin 5", 0.00002, -0.01, 0.01);
1023 parSet[6] = ParameterSet("eta bin 6", 0.00002, -0.01, 0.01);
1024 parSet[7] = ParameterSet("eta bin 7", 0.00002, -0.01, 0.01);
1025 parSet[8] = ParameterSet("eta bin 8", 0.00002, -0.01, 0.01);
1026 parSet[9] = ParameterSet("eta bin 9", 0.00002, -0.01, 0.01);
1027 parSet[10] = ParameterSet("eta bin 10", 0.00002, -0.01, 0.01);
1028 parSet[11] = ParameterSet("eta bin 11", 0.00002, -0.01, 0.01);
1029 parSet[12] = ParameterSet("eta bin 12", 0.00002, -0.01, 0.01);
1030
1031 std::cout << "setting parameters" << std::endl;
1032 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1033 }
1034
1035 void setParameters(double* Start,
1036 double* Step,
1037 double* Mini,
1038 double* Maxi,
1039 int* ind,
1040 TString* parname,
1041 const T& parResol,
1042 const std::vector<int>& parResolOrder,
1043 const std::vector<double>& parStep,
1044 const std::vector<double>& parMin,
1045 const std::vector<double>& parMax,
1046 const int muonType) override {
1047 if ((int(parStep.size()) != this->parNum_) || (int(parMin.size()) != this->parNum_) ||
1048 (int(parMax.size()) != this->parNum_)) {
1049 std::cout << "Error: par step or min or max do not match with number of parameters" << std::endl;
1050 std::cout << "parNum = " << this->parNum_ << std::endl;
1051 std::cout << "parStep.size() = " << parStep.size() << std::endl;
1052 std::cout << "parMin.size() = " << parMin.size() << std::endl;
1053 std::cout << "parMax.size() = " << parMax.size() << std::endl;
1054 exit(1);
1055 }
1056 std::vector<ParameterSet> parSet(this->parNum_);
1057
1058 parSet[0] = ParameterSet("Pt res. sc.", parStep[0], parMin[0], parMax[0]);
1059 parSet[1] = ParameterSet("eta bin 1", parStep[1], parMin[1], parMax[1]);
1060 parSet[2] = ParameterSet("eta bin 2", parStep[2], parMin[2], parMax[2]);
1061 parSet[3] = ParameterSet("eta bin 3", parStep[3], parMin[3], parMax[3]);
1062 parSet[4] = ParameterSet("eta bin 4", parStep[4], parMin[4], parMax[4]);
1063 parSet[5] = ParameterSet("eta bin 5", parStep[5], parMin[5], parMax[5]);
1064 parSet[6] = ParameterSet("eta bin 6", parStep[6], parMin[6], parMax[6]);
1065 parSet[7] = ParameterSet("eta bin 7", parStep[7], parMin[7], parMax[7]);
1066 parSet[8] = ParameterSet("eta bin 8", parStep[8], parMin[8], parMax[8]);
1067 parSet[9] = ParameterSet("eta bin 9", parStep[9], parMin[9], parMax[9]);
1068 parSet[10] = ParameterSet("eta bin 10", parStep[10], parMin[10], parMax[10]);
1069 parSet[11] = ParameterSet("eta bin 11", parStep[11], parMin[11], parMax[11]);
1070 parSet[12] = ParameterSet("eta bin 12", parStep[12], parMin[12], parMax[12]);
1071
1072 std::cout << "setting parameters" << std::endl;
1073 for (int i = 0; i < this->parNum_; ++i) {
1074 std::cout << "parStep[" << i << "] = " << parStep[i] << ", parMin[" << i << "] = " << parMin[i] << ", parMax["
1075 << i << "] = " << parMin[i] << std::endl;
1076 }
1077 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1078 }
1079 };
1080
1081
1082 template <class T>
1083 class resolutionFunctionType46 : public resolutionFunctionBase<T> {
1084 public:
1085 int etaBin(const double& eta) {
1086
1087
1088 if (eta < -2.0)
1089 return 1;
1090 if (eta < -1.8)
1091 return 2;
1092 if (eta < -1.6)
1093 return 3;
1094 if (eta < -1.2)
1095 return 4;
1096 if (eta < -0.8)
1097 return 5;
1098 if (eta < 0.)
1099 return 6;
1100 if (eta < 0.8)
1101 return 7;
1102 if (eta < 1.2)
1103 return 8;
1104 if (eta < 1.6)
1105 return 9;
1106 if (eta < 1.8)
1107 return 10;
1108 if (eta < 2.0)
1109 return 11;
1110 return 12;
1111 }
1112
1113 resolutionFunctionType46() { this->parNum_ = 13; }
1114
1115 double sigmaPt(const double& pt, const double& eta, const T& parval) override {
1116 return sqrt(pow(parval[0] * pt, 2) + pow(parval[etaBin(eta)], 2));
1117 }
1118 double sigmaCotgTh(const double& pt, const double& eta, const T& parval) override { return 0; }
1119 double sigmaPhi(const double& pt, const double& eta, const T& parval) override { return 0.; }
1120
1121
1122 double sigmaPtError(const double& pt, const double& eta, const T& parval, const T& parError) override {
1123
1124 double r = sqrt(pow(parval[0] * pt, 2) + pow(parval[etaBin(eta)], 2));
1125 return sqrt(pow(pt * pt * parval[0] * parError[0], 2) + pow(parval[etaBin(eta)] * parError[etaBin(eta)], 2)) / r;
1126 }
1127
1128 void setParameters(double* Start,
1129 double* Step,
1130 double* Mini,
1131 double* Maxi,
1132 int* ind,
1133 TString* parname,
1134 const T& parResol,
1135 const std::vector<int>& parResolOrder,
1136 const int muonType) override {
1137 std::vector<ParameterSet> parSet(this->parNum_);
1138
1139 parSet[0] = ParameterSet("Pt res. sc.", 0.0002, 0., 0.1);
1140 parSet[1] = ParameterSet("eta bin 1", 0.00002, 0., 0.01);
1141 parSet[2] = ParameterSet("eta bin 2", 0.00002, 0., 0.01);
1142 parSet[3] = ParameterSet("eta bin 3", 0.00002, 0., 0.01);
1143 parSet[4] = ParameterSet("eta bin 4", 0.00002, 0., 0.01);
1144 parSet[5] = ParameterSet("eta bin 5", 0.00002, 0., 0.01);
1145 parSet[6] = ParameterSet("eta bin 6", 0.00002, 0., 0.01);
1146 parSet[7] = ParameterSet("eta bin 7", 0.00002, 0., 0.01);
1147 parSet[8] = ParameterSet("eta bin 8", 0.00002, 0., 0.01);
1148 parSet[9] = ParameterSet("eta bin 9", 0.00002, 0., 0.01);
1149 parSet[10] = ParameterSet("eta bin 10", 0.00002, 0., 0.01);
1150 parSet[11] = ParameterSet("eta bin 11", 0.00002, 0., 0.01);
1151 parSet[12] = ParameterSet("eta bin 12", 0.00002, 0., 0.01);
1152
1153 std::cout << "setting parameters" << std::endl;
1154 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1155 }
1156
1157 void setParameters(double* Start,
1158 double* Step,
1159 double* Mini,
1160 double* Maxi,
1161 int* ind,
1162 TString* parname,
1163 const T& parResol,
1164 const std::vector<int>& parResolOrder,
1165 const std::vector<double>& parStep,
1166 const std::vector<double>& parMin,
1167 const std::vector<double>& parMax,
1168 const int muonType) override {
1169 if ((int(parStep.size()) != this->parNum_) || (int(parMin.size()) != this->parNum_) ||
1170 (int(parMax.size()) != this->parNum_)) {
1171 std::cout << "Error: par step or min or max do not match with number of parameters" << std::endl;
1172 std::cout << "parNum = " << this->parNum_ << std::endl;
1173 std::cout << "parStep.size() = " << parStep.size() << std::endl;
1174 std::cout << "parMin.size() = " << parMin.size() << std::endl;
1175 std::cout << "parMax.size() = " << parMax.size() << std::endl;
1176 exit(1);
1177 }
1178 std::vector<ParameterSet> parSet(this->parNum_);
1179
1180 parSet[0] = ParameterSet("Pt res. sc.", parStep[0], parMin[0], parMax[0]);
1181 parSet[1] = ParameterSet("eta bin 1", parStep[1], parMin[1], parMax[1]);
1182 parSet[2] = ParameterSet("eta bin 2", parStep[2], parMin[2], parMax[2]);
1183 parSet[3] = ParameterSet("eta bin 3", parStep[3], parMin[3], parMax[3]);
1184 parSet[4] = ParameterSet("eta bin 4", parStep[4], parMin[4], parMax[4]);
1185 parSet[5] = ParameterSet("eta bin 5", parStep[5], parMin[5], parMax[5]);
1186 parSet[6] = ParameterSet("eta bin 6", parStep[6], parMin[6], parMax[6]);
1187 parSet[7] = ParameterSet("eta bin 7", parStep[7], parMin[7], parMax[7]);
1188 parSet[8] = ParameterSet("eta bin 8", parStep[8], parMin[8], parMax[8]);
1189 parSet[9] = ParameterSet("eta bin 9", parStep[9], parMin[9], parMax[9]);
1190 parSet[10] = ParameterSet("eta bin 10", parStep[10], parMin[10], parMax[10]);
1191 parSet[11] = ParameterSet("eta bin 11", parStep[11], parMin[11], parMax[11]);
1192 parSet[12] = ParameterSet("eta bin 12", parStep[12], parMin[12], parMax[12]);
1193
1194 std::cout << "setting parameters" << std::endl;
1195 for (int i = 0; i < this->parNum_; ++i) {
1196 std::cout << "parStep[" << i << "] = " << parStep[i] << ", parMin[" << i << "] = " << parMin[i] << ", parMax["
1197 << i << "] = " << parMin[i] << std::endl;
1198 }
1199 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1200 }
1201 };
1202
1203
1204 template <class T>
1205 class resolutionFunctionType47 : public resolutionFunctionBase<T> {
1206 public:
1207 int etaBin(const double& eta) {
1208
1209
1210 if (eta < -2.0)
1211 return 1;
1212 if (eta < -1.8)
1213 return 2;
1214 if (eta < -1.6)
1215 return 3;
1216 if (eta < -1.2)
1217 return 4;
1218 if (eta < -0.8)
1219 return 5;
1220 if (eta < 0.)
1221 return 6;
1222 if (eta < 0.8)
1223 return 7;
1224 if (eta < 1.2)
1225 return 8;
1226 if (eta < 1.6)
1227 return 9;
1228 if (eta < 1.8)
1229 return 10;
1230 if (eta < 2.0)
1231 return 11;
1232 return 12;
1233 }
1234
1235 resolutionFunctionType47() { this->parNum_ = 14; }
1236
1237 double sigmaPt(const double& pt, const double& eta, const T& parval) override {
1238 return sqrt(pow(parval[0] * pt, 2) + pow(parval[etaBin(eta)], 2) + pow(parval[13], 2));
1239 }
1240 double sigmaCotgTh(const double& pt, const double& eta, const T& parval) override { return 0; }
1241 double sigmaPhi(const double& pt, const double& eta, const T& parval) override { return 0.; }
1242
1243 double covPt1Pt2(
1244 const double& pt1, const double& eta1, const double& pt2, const double& eta2, const T& parval) override {
1245 return parval[14];
1246 }
1247
1248
1249 double sigmaPtError(const double& pt, const double& eta, const T& parval, const T& parError) override {
1250
1251 double r = sqrt(pow(parval[0] * pt, 2) + pow(parval[etaBin(eta)], 2) + pow(parval[13], 2));
1252 return sqrt(pow(pt * pt * parval[0] * parError[0], 2) + pow(parval[etaBin(eta)] * parError[etaBin(eta)], 2) +
1253 pow(parval[13] * parError[13], 2)) /
1254 r;
1255 }
1256
1257 void setParameters(double* Start,
1258 double* Step,
1259 double* Mini,
1260 double* Maxi,
1261 int* ind,
1262 TString* parname,
1263 const T& parResol,
1264 const std::vector<int>& parResolOrder,
1265 const int muonType) override {
1266 std::vector<ParameterSet> parSet(this->parNum_);
1267
1268 parSet[0] = ParameterSet("Pt res. sc.", 0.0002, 0., 0.1);
1269 parSet[1] = ParameterSet("eta bin 1", 0.00002, 0., 0.01);
1270 parSet[2] = ParameterSet("eta bin 2", 0.00002, 0., 0.01);
1271 parSet[3] = ParameterSet("eta bin 3", 0.00002, 0., 0.01);
1272 parSet[4] = ParameterSet("eta bin 4", 0.00002, 0., 0.01);
1273 parSet[5] = ParameterSet("eta bin 5", 0.00002, 0., 0.01);
1274 parSet[6] = ParameterSet("eta bin 6", 0.00002, 0., 0.01);
1275 parSet[7] = ParameterSet("eta bin 7", 0.00002, 0., 0.01);
1276 parSet[8] = ParameterSet("eta bin 8", 0.00002, 0., 0.01);
1277 parSet[9] = ParameterSet("eta bin 9", 0.00002, 0., 0.01);
1278 parSet[10] = ParameterSet("eta bin 10", 0.00002, 0., 0.01);
1279 parSet[11] = ParameterSet("eta bin 11", 0.00002, 0., 0.01);
1280 parSet[12] = ParameterSet("eta bin 12", 0.00002, 0., 0.01);
1281 parSet[13] = ParameterSet("cov(pt1,pt2)", 0.00002, 0., 0.01);
1282
1283 std::cout << "setting parameters" << std::endl;
1284 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1285 }
1286
1287 void setParameters(double* Start,
1288 double* Step,
1289 double* Mini,
1290 double* Maxi,
1291 int* ind,
1292 TString* parname,
1293 const T& parResol,
1294 const std::vector<int>& parResolOrder,
1295 const std::vector<double>& parStep,
1296 const std::vector<double>& parMin,
1297 const std::vector<double>& parMax,
1298 const int muonType) override {
1299 if ((int(parStep.size()) != this->parNum_) || (int(parMin.size()) != this->parNum_) ||
1300 (int(parMax.size()) != this->parNum_)) {
1301 std::cout << "Error: par step or min or max do not match with number of parameters" << std::endl;
1302 std::cout << "parNum = " << this->parNum_ << std::endl;
1303 std::cout << "parStep.size() = " << parStep.size() << std::endl;
1304 std::cout << "parMin.size() = " << parMin.size() << std::endl;
1305 std::cout << "parMax.size() = " << parMax.size() << std::endl;
1306 exit(1);
1307 }
1308 std::vector<ParameterSet> parSet(this->parNum_);
1309
1310 parSet[0] = ParameterSet("Pt res. sc.", parStep[0], parMin[0], parMax[0]);
1311 parSet[1] = ParameterSet("eta bin 1", parStep[1], parMin[1], parMax[1]);
1312 parSet[2] = ParameterSet("eta bin 2", parStep[2], parMin[2], parMax[2]);
1313 parSet[3] = ParameterSet("eta bin 3", parStep[3], parMin[3], parMax[3]);
1314 parSet[4] = ParameterSet("eta bin 4", parStep[4], parMin[4], parMax[4]);
1315 parSet[5] = ParameterSet("eta bin 5", parStep[5], parMin[5], parMax[5]);
1316 parSet[6] = ParameterSet("eta bin 6", parStep[6], parMin[6], parMax[6]);
1317 parSet[7] = ParameterSet("eta bin 7", parStep[7], parMin[7], parMax[7]);
1318 parSet[8] = ParameterSet("eta bin 8", parStep[8], parMin[8], parMax[8]);
1319 parSet[9] = ParameterSet("eta bin 9", parStep[9], parMin[9], parMax[9]);
1320 parSet[10] = ParameterSet("eta bin 10", parStep[10], parMin[10], parMax[10]);
1321 parSet[11] = ParameterSet("eta bin 11", parStep[11], parMin[11], parMax[11]);
1322 parSet[12] = ParameterSet("eta bin 12", parStep[12], parMin[12], parMax[12]);
1323 parSet[13] = ParameterSet("cov(pt1,pt2)", parStep[13], parMin[13], parMax[13]);
1324
1325 std::cout << "setting parameters" << std::endl;
1326 for (int i = 0; i < this->parNum_; ++i) {
1327 std::cout << "parStep[" << i << "] = " << parStep[i] << ", parMin[" << i << "] = " << parMin[i] << ", parMax["
1328 << i << "] = " << parMin[i] << std::endl;
1329 }
1330 this->setPar(Start, Step, Mini, Maxi, ind, parname, parResol, parResolOrder, parSet);
1331 }
1332 };
1333
1334
1335
1336
1337
1338
1339 resolutionFunctionBase<double*>* resolutionFunctionService(const int identifier);
1340
1341
1342 resolutionFunctionBase<std::vector<double> >* resolutionFunctionVecService(const int identifier);
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368 class backgroundFunctionBase {
1369 public:
1370 backgroundFunctionBase(const double& lowerLimit, const double& upperLimit)
1371 : lowerLimit_(lowerLimit), upperLimit_(upperLimit) {}
1372 virtual ~backgroundFunctionBase() { delete functionForIntegral_; };
1373 virtual double operator()(const double* parval, const double& mass, const double& eta) const = 0;
1374 virtual double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const {
1375 return operator()(parval, mass, eta1);
1376 }
1377 virtual int parNum() const { return parNum_; }
1378
1379 virtual void setParameters(double* Start,
1380 double* Step,
1381 double* Mini,
1382 double* Maxi,
1383 int* ind,
1384 TString* parname,
1385 const std::vector<double>::const_iterator& parBgrIt,
1386 const std::vector<int>::const_iterator& parBgrOrderIt,
1387 const int muonType) = 0;
1388 virtual TF1* functionForIntegral(const std::vector<double>::const_iterator& parBgrIt) const {
1389 functionForIntegral_ = new FunctionForIntegral(this, parBgrIt);
1390 TF1* backgroundFunctionForIntegral =
1391 new TF1("backgroundFunctionForIntegral", functionForIntegral_, lowerLimit_, upperLimit_, this->parNum_);
1392 return (backgroundFunctionForIntegral);
1393 }
1394 virtual double fracVsEta(const double* parval, const double& eta1, const double& eta2) const { return 1.; }
1395
1396 protected:
1397 int parNum_;
1398 double lowerLimit_;
1399 double upperLimit_;
1400
1401 virtual void setPar(double* Start,
1402 double* Step,
1403 double* Mini,
1404 double* Maxi,
1405 int* ind,
1406 TString* parname,
1407 const std::vector<double>::const_iterator& parBgrIt,
1408 const std::vector<int>::const_iterator& parBgrOrderIt,
1409 double* thisStep,
1410 double* thisMini,
1411 double* thisMaxi,
1412 TString* thisParName) {
1413 for (int iPar = 0; iPar < this->parNum_; ++iPar) {
1414 Start[iPar] = *(parBgrIt + iPar);
1415 Step[iPar] = thisStep[iPar];
1416 Mini[iPar] = thisMini[iPar];
1417 Maxi[iPar] = thisMaxi[iPar];
1418 ind[iPar] = *(parBgrOrderIt + iPar);
1419
1420 }
1421 }
1422 class FunctionForIntegral {
1423 public:
1424 FunctionForIntegral(const backgroundFunctionBase* function, const std::vector<double>::const_iterator& parBgrIt)
1425 : function_(function) {
1426 parval_ = new double[function_->parNum()];
1427 for (int i = 0; i < function_->parNum(); ++i) {
1428 parval_[i] = *(parBgrIt + i);
1429 }
1430 }
1431 ~FunctionForIntegral() { delete parval_; }
1432 double operator()(const double* mass, const double*) const {
1433
1434 return ((*function_)(parval_, *mass, 0.));
1435 }
1436
1437 protected:
1438 const backgroundFunctionBase* function_;
1439 double* parval_;
1440 };
1441 mutable FunctionForIntegral* functionForIntegral_;
1442 };
1443
1444
1445
1446 class backgroundFunctionType1 : public backgroundFunctionBase {
1447 public:
1448
1449
1450
1451
1452
1453
1454 backgroundFunctionType1(const double& lowerLimit, const double& upperLimit)
1455 : backgroundFunctionBase(lowerLimit, upperLimit) {
1456 this->parNum_ = 2;
1457 }
1458 double operator()(const double* parval, const double& mass, const double& eta) const override {
1459 double a = 1.;
1460 double b = parval[1];
1461
1462 double norm = -(a * lowerLimit_ + b * lowerLimit_ * lowerLimit_ / 2.);
1463
1464 if (-a / b > upperLimit_)
1465 norm += a * upperLimit_ + b * upperLimit_ * upperLimit_ / 2.;
1466 else
1467 norm += -a * a / (2 * b);
1468
1469 if (mass < -a / b && norm != 0)
1470 return (a + b * mass) / norm;
1471 else
1472 return 0;
1473 }
1474 void setParameters(double* Start,
1475 double* Step,
1476 double* Mini,
1477 double* Maxi,
1478 int* ind,
1479 TString* parname,
1480 const std::vector<double>::const_iterator& parBgrIt,
1481 const std::vector<int>::const_iterator& parBgrOrderIt,
1482 const int muonType) override {
1483 double thisStep[] = {0.01, 0.01};
1484 TString thisParName[] = {"Constant", "Linear"};
1485 if (muonType == 1) {
1486 double thisMini[] = {0.0, -300.};
1487 double thisMaxi[] = {1.0, 0.};
1488 this->setPar(
1489 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1490 } else {
1491 double thisMini[] = {0.0, -300.};
1492 double thisMaxi[] = {1.0, 0.};
1493 this->setPar(
1494 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1495 }
1496 }
1497 };
1498
1499
1500 class backgroundFunctionType2 : public backgroundFunctionBase {
1501 public:
1502
1503
1504
1505
1506
1507 backgroundFunctionType2(const double& lowerLimit, const double& upperLimit)
1508 : backgroundFunctionBase(lowerLimit, upperLimit) {
1509 this->parNum_ = 2;
1510 }
1511 double operator()(const double* parval, const double& mass, const double& eta) const override {
1512 double Bgrp2 = parval[1];
1513 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
1514 if (norm != 0)
1515 return exp(-Bgrp2 * mass) / norm;
1516 else
1517 return 0.;
1518 }
1519 void setParameters(double* Start,
1520 double* Step,
1521 double* Mini,
1522 double* Maxi,
1523 int* ind,
1524 TString* parname,
1525 const std::vector<double>::const_iterator& parBgrIt,
1526 const std::vector<int>::const_iterator& parBgrOrderIt,
1527 const int muonType) override {
1528 double thisStep[] = {0.01, 0.01};
1529 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
1530 if (muonType == 1) {
1531 double thisMini[] = {0.0, 0.};
1532 double thisMaxi[] = {1.0, 10.};
1533 this->setPar(
1534 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1535 } else {
1536 double thisMini[] = {0.0, 0.};
1537 double thisMaxi[] = {1.0, 10.};
1538 this->setPar(
1539 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1540 }
1541 }
1542
1543
1544
1545
1546
1547
1548 };
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602 class backgroundFunctionType4 : public backgroundFunctionBase {
1603 public:
1604
1605
1606
1607
1608
1609 backgroundFunctionType4(const double& lowerLimit, const double& upperLimit)
1610 : backgroundFunctionBase(lowerLimit, upperLimit) {
1611 this->parNum_ = 4;
1612 }
1613 double operator()(const double* parval, const double& mass, const double& eta) const override {
1614 double Bgrp2 = parval[1] + parval[2] * eta * eta;
1615 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
1616 if (norm != 0)
1617 return exp(-Bgrp2 * mass) / norm;
1618 else
1619 return 0.;
1620 }
1621 void setParameters(double* Start,
1622 double* Step,
1623 double* Mini,
1624 double* Maxi,
1625 int* ind,
1626 TString* parname,
1627 const std::vector<double>::const_iterator& parBgrIt,
1628 const std::vector<int>::const_iterator& parBgrOrderIt,
1629 const int muonType) override {
1630 double thisStep[] = {0.01, 0.01, 0.01, 0.01};
1631 TString thisParName[] = {
1632 "Bgr fraction", "Bgr slope", "Bgr slope eta^2 dependence", "background fraction eta dependence"};
1633 if (muonType == 1) {
1634 double thisMini[] = {0.0, 0., 0., -1.};
1635 double thisMaxi[] = {1.0, 10., 10., 1.};
1636 this->setPar(
1637 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1638 } else {
1639 double thisMini[] = {0.0, 0., -1., -1.};
1640 double thisMaxi[] = {1.0, 10., 1., 1.};
1641 this->setPar(
1642 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1643 }
1644 }
1645
1646
1647
1648
1649 };
1650
1651
1652
1653 class backgroundFunctionType5 : public backgroundFunctionBase {
1654 public:
1655
1656
1657
1658
1659 backgroundFunctionType5(const double& lowerLimit, const double& upperLimit)
1660 : backgroundFunctionBase(lowerLimit, upperLimit) {
1661 this->parNum_ = 3;
1662 }
1663 double operator()(const double* parval, const double& mass, const double& eta) const override {
1664 double b = parval[1];
1665
1666 double a = 1 + parval[2] * eta * eta;
1667
1668 double norm = -(a * lowerLimit_ + b * lowerLimit_ * lowerLimit_ / 2.);
1669
1670 if (-a / b > upperLimit_)
1671 norm += a * upperLimit_ + b * upperLimit_ * upperLimit_ / 2.;
1672 else
1673 norm += -a * a / (2 * b);
1674
1675 if (mass < -a / b && norm != 0)
1676 return (a + b * mass) / norm;
1677 else
1678 return 0;
1679 }
1680 void setParameters(double* Start,
1681 double* Step,
1682 double* Mini,
1683 double* Maxi,
1684 int* ind,
1685 TString* parname,
1686 const std::vector<double>::const_iterator& parBgrIt,
1687 const std::vector<int>::const_iterator& parBgrOrderIt,
1688 const int muonType) override {
1689 double thisStep[] = {0.01, 0.01, 0.01};
1690 TString thisParName[] = {"Bgr fraction", "Constant", "Linear"};
1691 if (muonType == 1) {
1692 double thisMini[] = {0.0, 0., -300.};
1693 double thisMaxi[] = {1.0, 300., 0.};
1694 this->setPar(
1695 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1696 } else {
1697 double thisMini[] = {0.0, 0., -300.};
1698 double thisMaxi[] = {1.0, 300., 0.};
1699 this->setPar(
1700 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1701 }
1702 }
1703 };
1704
1705
1706
1707 class backgroundFunctionType6 : public backgroundFunctionBase {
1708 public:
1709 backgroundFunctionType6(const double& lowerLimit, const double& upperLimit)
1710 : backgroundFunctionBase(lowerLimit, upperLimit) {
1711 this->parNum_ = 2;
1712 }
1713 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
1714 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
1715 double Bgrp2 = 0.;
1716 if (fabs(eta1) <= 1.3 && fabs(eta2) <= 1.3) {
1717 Bgrp2 = -1.20528;
1718 } else if ((fabs(eta1) <= 1.6 && fabs(eta1) > 1.3) && (fabs(eta2) <= 1.6 && fabs(eta2) > 1.3)) {
1719 Bgrp2 = 0.234713;
1720 } else if (fabs(eta1) > 1.6 && fabs(eta2) > 1.6) {
1721 Bgrp2 = -0.667103;
1722 } else if ((fabs(eta1) <= 1.3 && (fabs(eta2) > 1.3 && fabs(eta2) <= 1.6)) ||
1723 (fabs(eta2) <= 1.3 && (fabs(eta1) > 1.3 && fabs(eta1) <= 1.6))) {
1724 Bgrp2 = -0.656904;
1725 } else if ((fabs(eta1) <= 1.3 && fabs(eta2) > 1.6) || (fabs(eta2) <= 1.3 && fabs(eta1) > 1.6)) {
1726 Bgrp2 = 0.155328;
1727 } else if (((fabs(eta1) > 1.3 && fabs(eta1) <= 1.6) && fabs(eta2) > 1.6) ||
1728 ((fabs(eta2) > 1.3 && fabs(eta2) <= 1.6) && fabs(eta1) > 1.6)) {
1729 Bgrp2 = -0.177154;
1730 } else {
1731 std::cout << "WARNING: this should not happen for eta1 = " << eta1 << " and eta2 = " << eta2 << std::endl;
1732 Bgrp2 = -0.667103;
1733 }
1734 Bgrp2 *= -1.;
1735 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
1736 if (norm != 0)
1737 return exp(-Bgrp2 * mass) / norm;
1738 else
1739 return 0.;
1740 }
1741 void setParameters(double* Start,
1742 double* Step,
1743 double* Mini,
1744 double* Maxi,
1745 int* ind,
1746 TString* parname,
1747 const std::vector<double>::const_iterator& parBgrIt,
1748 const std::vector<int>::const_iterator& parBgrOrderIt,
1749 const int muonType) override {
1750 double thisStep[] = {0.01, 0.01};
1751 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
1752 if (muonType == 1) {
1753 double thisMini[] = {0.0, 0.};
1754 double thisMaxi[] = {1.0, 10.};
1755 this->setPar(
1756 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1757 } else {
1758 double thisMini[] = {0.0, 0.};
1759 double thisMaxi[] = {1.0, 10.};
1760 this->setPar(
1761 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1762 }
1763 }
1764
1765 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override {
1766 if (fabs(eta1) <= 1.3 && fabs(eta2) <= 1.3) {
1767 return (1. - 0.910903);
1768 } else if ((fabs(eta1) <= 1.6 && fabs(eta1) > 1.3) && (fabs(eta2) <= 1.6 && fabs(eta2) > 1.3)) {
1769 return (1. - 0.801469);
1770 } else if (fabs(eta1) > 1.6 && fabs(eta2) > 1.6) {
1771 return (1. - 0.658196);
1772 } else if ((fabs(eta1) <= 1.3 && (fabs(eta2) > 1.3 && fabs(eta2) <= 1.6)) ||
1773 (fabs(eta2) <= 1.3 && (fabs(eta1) > 1.3 && fabs(eta1) <= 1.6))) {
1774 return (1. - 0.873411);
1775 } else if ((fabs(eta1) <= 1.3 && fabs(eta2) > 1.6) || (fabs(eta2) <= 1.3 && fabs(eta1) > 1.6)) {
1776 return (1. - 0.784674);
1777 } else if (((fabs(eta1) > 1.3 && fabs(eta1) <= 1.6) && fabs(eta2) > 1.6) ||
1778 ((fabs(eta2) > 1.3 && fabs(eta2) <= 1.6) && fabs(eta1) > 1.6)) {
1779 return (1. - 0.714398);
1780 } else {
1781 std::cout << "WARNING: this should not happen for eta1 = " << eta1 << " and eta2 = " << eta2 << std::endl;
1782 return (1. - 0.658196);
1783 }
1784 }
1785 };
1786
1787
1788
1789 class backgroundFunctionType7 : public backgroundFunctionBase {
1790 public:
1791 backgroundFunctionType7(const double& lowerLimit, const double& upperLimit)
1792 : backgroundFunctionBase(lowerLimit, upperLimit) {
1793 this->parNum_ = 2;
1794 }
1795 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
1796 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
1797 double Bgrp2 = 0.;
1798 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 0. && fabs(eta2) < 0.9)) {
1799 Bgrp2 = (-1.42465);
1800 } else if ((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 0.9 && fabs(eta2) < 1.3)) {
1801 Bgrp2 = (-1.38576);
1802 } else if ((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) {
1803 Bgrp2 = (-0.333728);
1804 } else if ((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) {
1805 Bgrp2 = (0.94066);
1806 } else if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) {
1807 Bgrp2 = (0.371026);
1808 } else if ((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) {
1809 Bgrp2 = (-0.959101);
1810 } else if ((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) {
1811 Bgrp2 = (-1.13829);
1812 } else if ((fabs(eta1) >= 1.9 && fabs(eta1) < 2.0) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) {
1813 Bgrp2 = (-0.921581);
1814 } else if ((fabs(eta1) >= 2.0 && fabs(eta1) < 1000.) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) {
1815 Bgrp2 = (-0.664338);
1816 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 0.9 && fabs(eta2) < 1.3)) ||
1817 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 0.9 && fabs(eta1) < 1.3))) {
1818 Bgrp2 = (-1.07581);
1819 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) ||
1820 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.3 && fabs(eta1) < 1.5))) {
1821 Bgrp2 = (-0.250272);
1822 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
1823 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
1824 Bgrp2 = (0.101785);
1825 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
1826 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
1827 Bgrp2 = (0.360397);
1828 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
1829 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
1830 Bgrp2 = (0.689136);
1831 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1832 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1833 Bgrp2 = (0.860723);
1834 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1835 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1836 Bgrp2 = (1.21908);
1837 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1838 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1839 Bgrp2 = (2.4453);
1840 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) ||
1841 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.3 && fabs(eta1) < 1.5))) {
1842 Bgrp2 = (-1.14152);
1843 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
1844 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
1845 Bgrp2 = (-0.77241);
1846 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
1847 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
1848 Bgrp2 = (-0.516479);
1849 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
1850 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
1851 Bgrp2 = (-0.361401);
1852 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1853 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1854 Bgrp2 = (-0.33143);
1855 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1856 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1857 Bgrp2 = (-0.20813);
1858 } else if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1859 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1860 Bgrp2 = (0.158002);
1861 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
1862 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
1863 Bgrp2 = (0.273222);
1864 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
1865 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
1866 Bgrp2 = (0.247639);
1867 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
1868 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
1869 Bgrp2 = (-0.148616);
1870 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1871 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1872 Bgrp2 = (-0.413175);
1873 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1874 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1875 Bgrp2 = (-0.230031);
1876 } else if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1877 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1878 Bgrp2 = (-0.122756);
1879 } else if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
1880 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
1881 Bgrp2 = (0.650851);
1882 } else if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
1883 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
1884 Bgrp2 = (-0.0985001);
1885 } else if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1886 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1887 Bgrp2 = (-0.402548);
1888 } else if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1889 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1890 Bgrp2 = (-0.27401);
1891 } else if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1892 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1893 Bgrp2 = (-0.22863);
1894 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
1895 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
1896 Bgrp2 = (-0.436959);
1897 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1898 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1899 Bgrp2 = (-0.506041);
1900 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1901 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1902 Bgrp2 = (-0.31618);
1903 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1904 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1905 Bgrp2 = (-0.365653);
1906 } else if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
1907 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
1908 Bgrp2 = (-1.16783);
1909 } else if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1910 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1911 Bgrp2 = (-0.730701);
1912 } else if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1913 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1914 Bgrp2 = (-0.5271);
1915 } else if (((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
1916 ((fabs(eta2) >= 1.8 && fabs(eta2) < 1.9) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
1917 Bgrp2 = (-0.99893);
1918 } else if (((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1919 ((fabs(eta2) >= 1.8 && fabs(eta2) < 1.9) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1920 Bgrp2 = (-0.687263);
1921 } else if (((fabs(eta1) >= 1.9 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
1922 ((fabs(eta2) >= 1.9 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
1923 Bgrp2 = (-0.722394);
1924 } else {
1925 std::cout << "WARNING: this should not happen for eta1 = " << eta1 << " and eta2 = " << eta2 << std::endl;
1926 Bgrp2 = -0.664338;
1927 }
1928 Bgrp2 *= -1.;
1929 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
1930 if (norm != 0)
1931 return exp(-Bgrp2 * mass) / norm;
1932 else
1933 return 0.;
1934 }
1935 void setParameters(double* Start,
1936 double* Step,
1937 double* Mini,
1938 double* Maxi,
1939 int* ind,
1940 TString* parname,
1941 const std::vector<double>::const_iterator& parBgrIt,
1942 const std::vector<int>::const_iterator& parBgrOrderIt,
1943 const int muonType) override {
1944 double thisStep[] = {0.01, 0.01};
1945 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
1946 if (muonType == 1) {
1947 double thisMini[] = {0.0, 0.};
1948 double thisMaxi[] = {1.0, 10.};
1949 this->setPar(
1950 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1951 } else {
1952 double thisMini[] = {0.0, 0.};
1953 double thisMaxi[] = {1.0, 10.};
1954 this->setPar(
1955 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
1956 }
1957 }
1958
1959 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override {
1960 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 0. && fabs(eta2) < 0.9)) {
1961 return (1. - 0.915365);
1962 }
1963 if ((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 0.9 && fabs(eta2) < 1.3)) {
1964 return (1. - 0.914149);
1965 }
1966 if ((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) {
1967 return (1. - 0.855918);
1968 }
1969 if ((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) {
1970 return (1. - 0.70221);
1971 }
1972 if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) {
1973 return (1. - 0.701489);
1974 }
1975 if ((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) {
1976 return (1. - 0.651162);
1977 }
1978 if ((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) {
1979 return (1. - 0.639839);
1980 }
1981 if ((fabs(eta1) >= 1.9 && fabs(eta1) < 2.0) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) {
1982 return (1. - 0.64915);
1983 }
1984 if ((fabs(eta1) >= 2.0 && fabs(eta1) < 1000.) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) {
1985 return (1. - 0.687878);
1986 }
1987 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 0.9 && fabs(eta2) < 1.3)) ||
1988 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 0.9 && fabs(eta1) < 1.3))) {
1989 return (1. - 0.903486);
1990 }
1991 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) ||
1992 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.3 && fabs(eta1) < 1.5))) {
1993 return (1. - 0.882516);
1994 }
1995 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
1996 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
1997 return (1. - 0.85477);
1998 }
1999 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
2000 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
2001 return (1. - 0.804919);
2002 }
2003 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
2004 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
2005 return (1. - 0.75411);
2006 }
2007 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2008 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2009 return (1. - 0.714128);
2010 }
2011 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2012 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2013 return (1. - 0.645403);
2014 }
2015 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.9) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2016 ((fabs(eta2) >= 0. && fabs(eta2) < 0.9) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2017 return (1. - 0.588049);
2018 }
2019 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.3 && fabs(eta2) < 1.5)) ||
2020 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.3 && fabs(eta1) < 1.5))) {
2021 return (1. - 0.901123);
2022 }
2023 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
2024 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
2025 return (1. - 0.87852);
2026 }
2027 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
2028 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
2029 return (1. - 0.862266);
2030 }
2031 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
2032 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
2033 return (1. - 0.846385);
2034 }
2035 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2036 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2037 return (1. - 0.825401);
2038 }
2039 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2040 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2041 return (1. - 0.812449);
2042 }
2043 if (((fabs(eta1) >= 0.9 && fabs(eta1) < 1.3) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2044 ((fabs(eta2) >= 0.9 && fabs(eta2) < 1.3) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2045 return (1. - 0.753754);
2046 }
2047 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.5 && fabs(eta2) < 1.6)) ||
2048 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.5 && fabs(eta1) < 1.6))) {
2049 return (1. - 0.794143);
2050 }
2051 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
2052 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
2053 return (1. - 0.761375);
2054 }
2055 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
2056 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
2057 return (1. - 0.765572);
2058 }
2059 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2060 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2061 return (1. - 0.749438);
2062 }
2063 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2064 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2065 return (1. - 0.750941);
2066 }
2067 if (((fabs(eta1) >= 1.3 && fabs(eta1) < 1.5) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2068 ((fabs(eta2) >= 1.3 && fabs(eta2) < 1.5) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2069 return (1. - 0.722832);
2070 }
2071 if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.7)) ||
2072 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.7))) {
2073 return (1. - 0.699723);
2074 }
2075 if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
2076 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
2077 return (1. - 0.734044);
2078 }
2079 if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2080 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2081 return (1. - 0.719434);
2082 }
2083 if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2084 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2085 return (1. - 0.718889);
2086 }
2087 if (((fabs(eta1) >= 1.5 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2088 ((fabs(eta2) >= 1.5 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2089 return (1. - 0.689382);
2090 }
2091 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.7 && fabs(eta2) < 1.8)) ||
2092 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.7 && fabs(eta1) < 1.8))) {
2093 return (1. - 0.681106);
2094 }
2095 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2096 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2097 return (1. - 0.685783);
2098 }
2099 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2100 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2101 return (1. - 0.695924);
2102 }
2103 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.7) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2104 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.7) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2105 return (1. - 0.670977);
2106 }
2107 if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.8 && fabs(eta2) < 1.9)) ||
2108 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.8 && fabs(eta1) < 1.9))) {
2109 return (1. - 0.654816);
2110 }
2111 if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2112 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2113 return (1. - 0.670969);
2114 }
2115 if (((fabs(eta1) >= 1.7 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2116 ((fabs(eta2) >= 1.7 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2117 return (1. - 0.659082);
2118 }
2119 if (((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 1.9 && fabs(eta2) < 2.0)) ||
2120 ((fabs(eta2) >= 1.8 && fabs(eta2) < 1.9) && (fabs(eta1) >= 1.9 && fabs(eta1) < 2.0))) {
2121 return (1. - 0.648371);
2122 }
2123 if (((fabs(eta1) >= 1.8 && fabs(eta1) < 1.9) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2124 ((fabs(eta2) >= 1.8 && fabs(eta2) < 1.9) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2125 return (1. - 0.659114);
2126 }
2127 if (((fabs(eta1) >= 1.9 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.0 && fabs(eta2) < 1000.)) ||
2128 ((fabs(eta2) >= 1.9 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.0 && fabs(eta1) < 1000.))) {
2129 return (1. - 0.660482);
2130 } else {
2131 std::cout << "WARNING: this should not happen for eta1 = " << eta1 << " and eta2 = " << eta2 << std::endl;
2132 return (1. - 0.687878);
2133 }
2134 }
2135 };
2136
2137 class backgroundFunctionType8 : public backgroundFunctionBase {
2138 public:
2139 backgroundFunctionType8(const double& lowerLimit, const double& upperLimit)
2140 : backgroundFunctionBase(lowerLimit, upperLimit) {
2141 this->parNum_ = 2;
2142 }
2143 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
2144 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
2145 double Bgrp2 = 0.;
2146 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2147 Bgrp2 = (-2.17047);
2148 } else if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2149 Bgrp2 = (-2.12913);
2150 } else if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2151 Bgrp2 = (-2.19963);
2152 } else if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1000) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) {
2153 Bgrp2 = (-0.386394);
2154 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2155 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2156 Bgrp2 = (-1.71339);
2157 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2158 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2159 Bgrp2 = (-0.206566);
2160 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2161 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2162 Bgrp2 = (4.4815);
2163 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2164 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2165 Bgrp2 = (-1.87985);
2166 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2167 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2168 Bgrp2 = (-0.163569);
2169 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2170 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2171 Bgrp2 = (-1.67935);
2172 }
2173 Bgrp2 *= -1.;
2174 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
2175 if (norm != 0)
2176 return exp(-Bgrp2 * mass) / norm;
2177 else
2178 return 0.;
2179 }
2180 void setParameters(double* Start,
2181 double* Step,
2182 double* Mini,
2183 double* Maxi,
2184 int* ind,
2185 TString* parname,
2186 const std::vector<double>::const_iterator& parBgrIt,
2187 const std::vector<int>::const_iterator& parBgrOrderIt,
2188 const int muonType) override {
2189 double thisStep[] = {0.01, 0.01};
2190 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
2191 if (muonType == 1) {
2192 double thisMini[] = {0.0, 0.};
2193 double thisMaxi[] = {1.0, 10.};
2194 this->setPar(
2195 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2196 } else {
2197 double thisMini[] = {0.0, 0.};
2198 double thisMaxi[] = {1.0, 10.};
2199 this->setPar(
2200 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2201 }
2202 }
2203
2204 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override {
2205 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2206 return (1. - 0.907727);
2207 }
2208 if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2209 return (1. - 0.907715);
2210 }
2211 if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2212 return (1. - 0.912233);
2213 }
2214 if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1000) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) {
2215 return (1. - 0.876776);
2216 }
2217 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2218 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2219 return (1. - 0.913046);
2220 }
2221 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2222 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2223 return (1. - 0.916765);
2224 }
2225 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2226 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2227 return (1. - 0.6);
2228 }
2229 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2230 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2231 return (1. - 0.907471);
2232 }
2233 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2234 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2235 return (1. - 0.899253);
2236 }
2237 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2238 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2239 return (1. - 0.879108);
2240 }
2241 return 0;
2242 }
2243 };
2244
2245
2246 backgroundFunctionBase* backgroundFunctionService(const int identifier,
2247 const double& lowerLimit,
2248 const double& upperLimit);
2249
2250
2251
2252 class backgroundFunctionType9 : public backgroundFunctionBase {
2253 public:
2254 backgroundFunctionType9(const double& lowerLimit, const double& upperLimit)
2255 : backgroundFunctionBase(lowerLimit, upperLimit) {
2256 this->parNum_ = 2;
2257 }
2258 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
2259 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
2260 double Bgrp2 = 0.;
2261
2262 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2263 Bgrp2 = (-1.80833);
2264 } else if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2265 Bgrp2 = (-1.98281);
2266 } else if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2267 Bgrp2 = (-1.79632);
2268 } else if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1000) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) {
2269 Bgrp2 = (-1.14645);
2270 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2271 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2272 Bgrp2 = (-1.55747);
2273 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2274 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2275 Bgrp2 = (-0.337598);
2276 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2277 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2278 Bgrp2 = (5.36513);
2279 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2280 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2281 Bgrp2 = (-1.44363);
2282 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2283 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2284 Bgrp2 = (-0.54614);
2285 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2286 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2287 Bgrp2 = (-1.41059);
2288 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2289 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2290 Bgrp2 = (-1.41059);
2291 }
2292 Bgrp2 *= -1.;
2293 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
2294 if (norm != 0)
2295 return exp(-Bgrp2 * mass) / norm;
2296 else
2297 return 0.;
2298 }
2299 void setParameters(double* Start,
2300 double* Step,
2301 double* Mini,
2302 double* Maxi,
2303 int* ind,
2304 TString* parname,
2305 const std::vector<double>::const_iterator& parBgrIt,
2306 const std::vector<int>::const_iterator& parBgrOrderIt,
2307 const int muonType) override {
2308 double thisStep[] = {0.01, 0.01};
2309 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
2310 if (muonType == 1) {
2311 double thisMini[] = {0.0, 0.};
2312 double thisMaxi[] = {1.0, 10.};
2313 this->setPar(
2314 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2315 } else {
2316 double thisMini[] = {0.0, 0.};
2317 double thisMaxi[] = {1.0, 10.};
2318 this->setPar(
2319 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2320 }
2321 }
2322
2323 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override
2324
2325 {
2326
2327 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2328 return (1. - 0.893683);
2329 }
2330 if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2331 return (1. - 0.888968);
2332 }
2333 if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2334 return (1. - 0.885926);
2335 }
2336 if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1000) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) {
2337 return (1. - 0.866615);
2338 }
2339 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2340 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2341 return (1. - 0.892856);
2342 }
2343 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2344 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2345 return (1. - 0.884864);
2346 }
2347 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2348 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2349 return (1. - 0.6);
2350 }
2351 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2352 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2353 return (1. - 0.894739);
2354 }
2355 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2356 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2357 return (1. - 0.880597);
2358 }
2359 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2360 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2361 return (1. - 0.869165);
2362 }
2363 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2364 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2365 return (1. - 0.869165);
2366 }
2367 return 0;
2368 }
2369 };
2370
2371 class backgroundFunctionType10 : public backgroundFunctionBase {
2372 public:
2373 backgroundFunctionType10(const double& lowerLimit, const double& upperLimit)
2374 : backgroundFunctionBase(lowerLimit, upperLimit) {
2375 this->parNum_ = 2;
2376 }
2377 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
2378 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
2379 double Bgrp2 = 0.;
2380 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2381 Bgrp2 = (-1.80833);
2382 } else if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2383 Bgrp2 = (-1.98281);
2384 } else if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2385 Bgrp2 = (-1.79632);
2386 } else if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.8)) {
2387 Bgrp2 = (-1.50855);
2388 } else if ((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) {
2389 Bgrp2 = (-0.498511);
2390 } else if ((fabs(eta1) >= 2.0 && fabs(eta1) < 2.2) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) {
2391 Bgrp2 = (-0.897031);
2392 } else if ((fabs(eta1) >= 2.2 && fabs(eta1) < 1000) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) {
2393 Bgrp2 = (-0.75954);
2394 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2395 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2396 Bgrp2 = (-1.55747);
2397 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2398 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2399 Bgrp2 = (-0.337598);
2400 } else if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2401 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2402 Bgrp2 = (3.5163);
2403 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2404 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2405 Bgrp2 = (-1.44363);
2406 } else if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2407 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2408 Bgrp2 = (-0.54614);
2409 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.8)) ||
2410 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.8))) {
2411 Bgrp2 = (-1.36442);
2412 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) ||
2413 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.8 && fabs(eta1) < 2.0))) {
2414 Bgrp2 = (-1.66202);
2415 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2416 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2417 Bgrp2 = (-0.62038);
2418 } else if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2419 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2420 Bgrp2 = (0.662449);
2421 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) ||
2422 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.8 && fabs(eta1) < 2.0))) {
2423 Bgrp2 = (-0.723325);
2424 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2425 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2426 Bgrp2 = (-1.54405);
2427 } else if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2428 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2429 Bgrp2 = (-1.1104);
2430 } else if (((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2431 ((fabs(eta2) >= 1.8 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2432 Bgrp2 = (-1.56277);
2433 } else if (((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2434 ((fabs(eta2) >= 1.8 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2435 Bgrp2 = (-1.0827);
2436 } else if (((fabs(eta1) >= 2.0 && fabs(eta1) < 2.2) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2437 ((fabs(eta2) >= 2.0 && fabs(eta2) < 2.2) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2438 Bgrp2 = (-1.05662);
2439 }
2440 Bgrp2 *= -1.;
2441 double norm = -(exp(-Bgrp2 * upperLimit_) - exp(-Bgrp2 * lowerLimit_)) / Bgrp2;
2442 if (norm != 0)
2443 return exp(-Bgrp2 * mass) / norm;
2444 else
2445 return 0.;
2446 }
2447 void setParameters(double* Start,
2448 double* Step,
2449 double* Mini,
2450 double* Maxi,
2451 int* ind,
2452 TString* parname,
2453 const std::vector<double>::const_iterator& parBgrIt,
2454 const std::vector<int>::const_iterator& parBgrOrderIt,
2455 const int muonType) override {
2456 double thisStep[] = {0.01, 0.01};
2457 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
2458 if (muonType == 1) {
2459 double thisMini[] = {0.0, 0.};
2460 double thisMaxi[] = {1.0, 10.};
2461 this->setPar(
2462 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2463 } else {
2464 double thisMini[] = {0.0, 0.};
2465 double thisMaxi[] = {1.0, 10.};
2466 this->setPar(
2467 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2468 }
2469 }
2470
2471 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override {
2472 if ((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0. && fabs(eta2) < 0.85)) {
2473 return (1. - 0.893683);
2474 }
2475 if ((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) {
2476 return (1. - 0.888968);
2477 }
2478 if ((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) {
2479 return (1. - 0.885926);
2480 }
2481 if ((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.8)) {
2482 return (1. - 0.892823);
2483 }
2484 if ((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) {
2485 return (1. - 0.888735);
2486 }
2487 if ((fabs(eta1) >= 2.0 && fabs(eta1) < 2.2) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) {
2488 return (1. - 0.87497);
2489 }
2490 if ((fabs(eta1) >= 2.2 && fabs(eta1) < 1000) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) {
2491 return (1. - 0.895275);
2492 }
2493 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 0.85 && fabs(eta2) < 1.25)) ||
2494 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 0.85 && fabs(eta1) < 1.25))) {
2495 return (1. - 0.892856);
2496 }
2497 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2498 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2499 return (1. - 0.884864);
2500 }
2501 if (((fabs(eta1) >= 0. && fabs(eta1) < 0.85) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2502 ((fabs(eta2) >= 0. && fabs(eta2) < 0.85) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2503 return (1. - 0.834572);
2504 }
2505 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.25 && fabs(eta2) < 1.6)) ||
2506 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.25 && fabs(eta1) < 1.6))) {
2507 return (1. - 0.894739);
2508 }
2509 if (((fabs(eta1) >= 0.85 && fabs(eta1) < 1.25) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1000)) ||
2510 ((fabs(eta2) >= 0.85 && fabs(eta2) < 1.25) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1000))) {
2511 return (1. - 0.880597);
2512 }
2513 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.6 && fabs(eta2) < 1.8)) ||
2514 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.6 && fabs(eta1) < 1.8))) {
2515 return (1. - 0.892911);
2516 }
2517 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) ||
2518 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 1.8 && fabs(eta1) < 2.0))) {
2519 return (1. - 0.880506);
2520 }
2521 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2522 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2523 return (1. - 0.885718);
2524 }
2525 if (((fabs(eta1) >= 1.25 && fabs(eta1) < 1.6) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2526 ((fabs(eta2) >= 1.25 && fabs(eta2) < 1.6) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2527 return (1. - 0.853141);
2528 }
2529 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 1.8 && fabs(eta2) < 2.0)) ||
2530 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 1.8 && fabs(eta1) < 2.0))) {
2531 return (1. - 0.88822);
2532 }
2533 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2534 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2535 return (1. - 0.87028);
2536 }
2537 if (((fabs(eta1) >= 1.6 && fabs(eta1) < 1.8) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2538 ((fabs(eta2) >= 1.6 && fabs(eta2) < 1.8) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2539 return (1. - 0.869603);
2540 }
2541 if (((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.0 && fabs(eta2) < 2.2)) ||
2542 ((fabs(eta2) >= 1.8 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.0 && fabs(eta1) < 2.2))) {
2543 return (1. - 0.877922);
2544 }
2545 if (((fabs(eta1) >= 1.8 && fabs(eta1) < 2.0) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2546 ((fabs(eta2) >= 1.8 && fabs(eta2) < 2.0) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2547 return (1. - 0.865997);
2548 }
2549 if (((fabs(eta1) >= 2.0 && fabs(eta1) < 2.2) && (fabs(eta2) >= 2.2 && fabs(eta2) < 1000)) ||
2550 ((fabs(eta2) >= 2.0 && fabs(eta2) < 2.2) && (fabs(eta1) >= 2.2 && fabs(eta1) < 1000))) {
2551 return (1. - 0.886109);
2552 }
2553 return 0;
2554 }
2555 };
2556
2557
2558
2559 class backgroundFunctionType11 : public backgroundFunctionBase {
2560 public:
2561 backgroundFunctionType11(const double& lowerLimit, const double& upperLimit)
2562 : backgroundFunctionBase(lowerLimit, upperLimit) {
2563 this->parNum_ = 2;
2564 }
2565 double operator()(const double* parval, const double& mass, const double& eta) const override { return 0.; }
2566 double operator()(const double* parval, const double& mass, const double& eta1, const double& eta2) const override {
2567 double Bgrp2 = 0.;
2568 if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= -100. && eta2 < -0.8)) {
2569 Bgrp2 = (-0.0512353);
2570 } else if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= -0.8 && eta2 < 0.)) {
2571 Bgrp2 = (-0.0448482);
2572 } else if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= 0. && eta2 < 0.8)) {
2573 Bgrp2 = (-0.0193726);
2574 } else if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= 0.8 && eta2 < 100.)) {
2575 Bgrp2 = (0.0225765);
2576 } else if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= -100. && eta2 < -0.8)) {
2577 Bgrp2 = (-0.0822936);
2578 } else if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= -0.8 && eta2 < 0.)) {
2579 Bgrp2 = (-0.0676357);
2580 } else if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= 0. && eta2 < 0.8)) {
2581 Bgrp2 = (-0.0591544);
2582 } else if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= 0.8 && eta2 < 100.)) {
2583 Bgrp2 = (-0.0235858);
2584 } else if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= -100. && eta2 < -0.8)) {
2585 Bgrp2 = (-0.0317051);
2586 } else if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= -0.8 && eta2 < 0.)) {
2587 Bgrp2 = (-0.06139);
2588 } else if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= 0. && eta2 < 0.8)) {
2589 Bgrp2 = (-0.0747737);
2590 } else if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= 0.8 && eta2 < 100.)) {
2591 Bgrp2 = (-0.0810139);
2592 } else if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= -100. && eta2 < -0.8)) {
2593 Bgrp2 = (0.0229602);
2594 } else if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= -0.8 && eta2 < 0.)) {
2595 Bgrp2 = (-0.0224212);
2596 } else if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= 0. && eta2 < 0.8)) {
2597 Bgrp2 = (-0.0446273);
2598 } else if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= 0.8 && eta2 < 100.)) {
2599 Bgrp2 = (-0.0554561);
2600 } else {
2601 std::cout << "WARNING, backgroundFunctionType11: this should not happen for eta1 = " << eta1
2602 << " and eta2 = " << eta2 << std::endl;
2603 return (-0.05);
2604 }
2605 double norm = (exp(Bgrp2 * upperLimit_) - exp(Bgrp2 * lowerLimit_)) / Bgrp2;
2606 if (norm != 0)
2607 return exp(Bgrp2 * mass) / norm;
2608 else
2609 return 0.;
2610 }
2611 void setParameters(double* Start,
2612 double* Step,
2613 double* Mini,
2614 double* Maxi,
2615 int* ind,
2616 TString* parname,
2617 const std::vector<double>::const_iterator& parBgrIt,
2618 const std::vector<int>::const_iterator& parBgrOrderIt,
2619 const int muonType) override {
2620 double thisStep[] = {0.01, 0.01};
2621 TString thisParName[] = {"Bgr fraction", "Bgr slope"};
2622 if (muonType == 1) {
2623 double thisMini[] = {-1.0, 10.};
2624 double thisMaxi[] = {1.0, 10.};
2625 this->setPar(
2626 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2627 } else {
2628 double thisMini[] = {-1.0, 10.};
2629 double thisMaxi[] = {1.0, 10.};
2630 this->setPar(
2631 Start, Step, Mini, Maxi, ind, parname, parBgrIt, parBgrOrderIt, thisStep, thisMini, thisMaxi, thisParName);
2632 }
2633 }
2634
2635 double fracVsEta(const double* parval, const double& eta1, const double& eta2) const override {
2636 if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= -100. && eta2 < -0.8)) {
2637 return (1. - 0.966316);
2638 }
2639 if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= -0.8 && eta2 < 0.)) {
2640 return (1. - 0.966875);
2641 }
2642 if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= 0. && eta2 < 0.8)) {
2643 return (1. - 0.955311);
2644 }
2645 if ((eta1 >= -100. && eta1 < -0.8) && (eta2 >= 0.8 && eta2 < 100.)) {
2646 return (1. - 0.928771);
2647 }
2648 if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= -100. && eta2 < -0.8)) {
2649 return (1. - 0.983255);
2650 }
2651 if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= -0.8 && eta2 < 0.)) {
2652 return (1. - 0.982203);
2653 }
2654 if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= 0. && eta2 < 0.8)) {
2655 return (1. - 0.972127);
2656 }
2657 if ((eta1 >= -0.8 && eta1 < 0.) && (eta2 >= 0.8 && eta2 < 100.)) {
2658 return (1. - 0.962929);
2659 }
2660 if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= -100. && eta2 < -0.8)) {
2661 return (1. - 0.965597);
2662 }
2663 if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= -0.8 && eta2 < 0.)) {
2664 return (1. - 0.969461);
2665 }
2666 if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= 0. && eta2 < 0.8)) {
2667 return (1. - 0.979922);
2668 }
2669 if ((eta1 >= 0. && eta1 < 0.8) && (eta2 >= 0.8 && eta2 < 100.)) {
2670 return (1. - 0.984247);
2671 }
2672 if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= -100. && eta2 < -0.8)) {
2673 return (1. - 0.934252);
2674 }
2675 if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= -0.8 && eta2 < 0.)) {
2676 return (1. - 0.952914);
2677 }
2678 if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= 0. && eta2 < 0.8)) {
2679 return (1. - 0.960191);
2680 }
2681 if ((eta1 >= 0.8 && eta1 < 100.) && (eta2 >= 0.8 && eta2 < 100.)) {
2682 return (1. - 0.966175);
2683 } else {
2684 std::cout << "WARNING, backgroundFunctionType11: this should not happen for eta1 = " << eta1
2685 << " and eta2 = " << eta2 << std::endl;
2686 return (1. - 0.97);
2687 }
2688 }
2689 };
2690
2691 #endif