File indexing completed on 2024-09-07 04:35:04
0001
0002
0003
0004 #include "Calibration/Tools/interface/InvMatrixUtils.h"
0005 #include "Calibration/Tools/interface/InvMatrixCommonDefs.h"
0006 #include "TStyle.h"
0007 #include "TROOT.h"
0008 #include "CLHEP/Geometry/Point3D.h"
0009
0010 #include "Calibration/Tools/interface/matrixSaver.h"
0011
0012 #include <iostream>
0013 #include <string>
0014 #include <fstream>
0015 #include <sstream>
0016 #include <vector>
0017 #include <cassert>
0018
0019
0020 void setStyle() {
0021 gROOT->SetStyle("Plain");
0022 gStyle->SetTextSize(0.5);
0023
0024 gStyle->SetOptStat(0);
0025
0026 gStyle->SetOptFit(0);
0027 gStyle->SetTitleBorderSize(0);
0028 gStyle->SetTitleX(0.08);
0029 gStyle->SetTitleY(0.97);
0030 gStyle->SetPalette(1, nullptr);
0031 gStyle->SetStatColor(0);
0032 gStyle->SetFrameFillStyle(0);
0033 gStyle->SetFrameFillColor(0);
0034 return;
0035 }
0036
0037
0038
0039 TCanvas *getGlobalCanvas(std::string name) {
0040 setStyle();
0041 TCanvas *globalCanvas = static_cast<TCanvas *>(gROOT->FindObject(name.c_str()));
0042 if (globalCanvas) {
0043 globalCanvas->Clear();
0044 globalCanvas->UseCurrentStyle();
0045 globalCanvas->SetWindowSize(700, 600);
0046
0047 } else {
0048 globalCanvas = new TCanvas(name.c_str(), name.c_str(), 700, 600);
0049 }
0050 return globalCanvas;
0051 }
0052
0053
0054
0055 TFile *getGlobalTFile(std::string name) {
0056
0057
0058 TFile *globalTFile = (TFile *)gROOT->FindObject(name.c_str());
0059 if (!globalTFile) {
0060
0061 globalTFile = new TFile(name.c_str(), "RECREATE");
0062 }
0063
0064 return globalTFile;
0065 }
0066
0067
0068
0069 int saveGlobalTFile(std::string name) {
0070 TFile *globalTFile = static_cast<TFile *>(gROOT->FindObject(name.c_str()));
0071 if (!globalTFile)
0072 return 1;
0073 globalTFile->Write();
0074 globalTFile->Close();
0075 delete globalTFile;
0076 return 0;
0077 }
0078
0079
0080
0081 CLHEP::HepMatrix *getSavedMatrix(const std::string &name) {
0082 matrixSaver reader;
0083 CLHEP::HepMatrix *savedMatrix;
0084 if (reader.touch(name)) {
0085 savedMatrix = static_cast<CLHEP::HepMatrix *>(reader.getMatrix(name));
0086 } else {
0087 savedMatrix = new CLHEP::HepMatrix(SCMaxEta, SCMaxPhi, 0);
0088 }
0089
0090 return savedMatrix;
0091 }
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 HepGeom::Point3D<Float_t> TBposition(const Float_t amplit[7][7],
0107 const Float_t beamEne,
0108 const Float_t w0,
0109 const Float_t x0,
0110 const Float_t a0,
0111 const Float_t sideX,
0112 const Float_t sideY) {
0113
0114 Float_t caloX = 0.;
0115 Float_t caloY = 0.;
0116 Float_t sumWeight = 0.;
0117 Float_t depth = x0 * (log(beamEne) + a0);
0118 Float_t sin3 = 0.052335956;
0119
0120 Float_t invE3x3 = 1. / get3x3(amplit);
0121
0122
0123 for (int eta = 2; eta <= 4; eta++) {
0124 for (int phi = 2; phi <= 4; phi++) {
0125 Float_t weight = log(amplit[eta][phi] * invE3x3) + w0;
0126 if (weight > 0) {
0127 caloX += (eta - 3) * sideX * weight;
0128 caloY -= (phi - 3) * sideY * weight;
0129 sumWeight += weight;
0130 }
0131 }
0132 }
0133
0134 caloX /= sumWeight;
0135 caloY /= sumWeight;
0136
0137
0138 caloX -= depth * sin3;
0139 caloY -= depth * sin3;
0140
0141
0142 HepGeom::Point3D<Float_t> TBposition(caloX, caloY, 0);
0143
0144 return TBposition;
0145 }
0146
0147
0148
0149
0150
0151 double get5x5(const Float_t energy[7][7]) {
0152 double total = 0.;
0153
0154 for (int eta = 1; eta < 6; ++eta)
0155 for (int phi = 1; phi < 6; ++phi)
0156 total += energy[eta][phi];
0157
0158 return total;
0159 }
0160
0161
0162
0163
0164
0165 double get3x3(const Float_t energy[7][7]) {
0166 double total = 0.;
0167
0168 for (int eta = 2; eta < 5; ++eta)
0169 for (int phi = 2; phi < 5; ++phi)
0170 total += energy[eta][phi];
0171
0172 return total;
0173 }
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 int xtalFromEtaPhi(const int &myEta, const int &myPhi) {
0205 int xMin = 20 * myEta + 1;
0206 int xMax = 20 * (myEta + 1) + 1;
0207
0208 int myCryst = 999999;
0209
0210 for (int x = xMin; x < xMax; x++) {
0211 if (phiFromXtal(x) == myPhi)
0212 myCryst = x;
0213 }
0214 return myCryst;
0215 }
0216
0217
0218
0219 int xtalFromiEtaiPhi(const int &iEta, const int &iPhi) {
0220 assert(iEta >= 1);
0221 assert(iEta <= 85);
0222 assert(iPhi >= 1);
0223 assert(iPhi <= 20);
0224 return 20 * (iEta - 1) + 21 - iPhi;
0225 }
0226
0227
0228
0229 int etaFromXtal(const int &xtal) {
0230
0231 return int(floor((xtal - 1) / 20));
0232 }
0233
0234
0235
0236 int phiFromXtal(const int &xtal) {
0237 int phi = (xtal - 1) - 20 * etaFromXtal(xtal);
0238 return (20 - phi - 1);
0239 }
0240
0241
0242
0243 int ietaFromXtal(const int &xtal) { return etaFromXtal(xtal) + 1; }
0244
0245
0246
0247 int iphiFromXtal(const int &xtal) { return phiFromXtal(xtal) + 1; }
0248
0249
0250
0251 int extract(std::vector<int> *output, const std::string &dati) {
0252 std::ifstream _dati(dati.c_str());
0253
0254 while (!_dati.eof()) {
0255
0256 std::string dataline;
0257 do {
0258 getline(_dati, dataline, '\n');
0259 } while (*dataline.begin() == '#');
0260 std::stringstream linea(dataline);
0261
0262 while (!linea.eof()) {
0263 int buffer = -1;
0264 linea >> buffer;
0265 if (buffer != -1)
0266 output->push_back(buffer);
0267 }
0268 }
0269 return output->size();
0270 }
0271
0272
0273
0274
0275
0276 int writeCalibTxt(const CLHEP::HepMatrix &AmplitudeMatrix,
0277 const CLHEP::HepMatrix &SigmaMatrix,
0278 const CLHEP::HepMatrix &StatisticMatrix,
0279 std::string fileName) {
0280
0281 double reference = 0.;
0282 for (int eta = 0; eta < SCMaxEta; ++eta)
0283 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0284 if (AmplitudeMatrix[eta][phi] && SigmaMatrix[eta][phi] < 100 ) {
0285 reference = AmplitudeMatrix[eta][phi];
0286 std::cout << "[InvMatrixUtils][writeCalibTxt] reference crystal: "
0287 << "(" << eta << "," << phi << ") -> " << reference << "\n";
0288 break;
0289 }
0290 }
0291 if (!reference) {
0292 std::cerr << "ERROR: no calibration coefficients found" << std::endl;
0293 return 1;
0294 }
0295
0296
0297 std::ofstream txt_outfile;
0298 txt_outfile.open(fileName.c_str());
0299 txt_outfile << "# xtal\tcoeff\tsigma\tevt\tisGood\n";
0300
0301
0302 for (int eta = 0; eta < SCMaxEta; ++eta)
0303 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0304 int isGood = 1;
0305 if (AmplitudeMatrix[eta][phi] == 0)
0306 isGood = 0;
0307 if (SigmaMatrix[eta][phi] > 100 )
0308 isGood = 0;
0309 txt_outfile << xtalFromEtaPhi(eta, phi) << "\t" << AmplitudeMatrix[eta][phi] / reference << "\t"
0310 << SigmaMatrix[eta][phi] << "\t" << StatisticMatrix[eta][phi] << "\t" << isGood << "\n";
0311 }
0312
0313
0314 txt_outfile.close();
0315 return 0;
0316 }
0317
0318
0319
0320 int writeCMSSWCoeff(const CLHEP::HepMatrix &lMatrix,
0321 double calibThres,
0322 float ERef,
0323 const CLHEP::HepMatrix &sigmaMatrix,
0324 const CLHEP::HepMatrix &statisticMatrix,
0325 std::string fileName,
0326 std::string genTag,
0327 std::string method,
0328 std::string version,
0329 std::string type) {
0330
0331 std::ofstream txt_outfile;
0332 txt_outfile.open(fileName.c_str());
0333 txt_outfile << "1\n";
0334 txt_outfile << "-1\n";
0335 txt_outfile << genTag << "\n";
0336 txt_outfile << method << "\n";
0337 txt_outfile << version << "\n";
0338 txt_outfile << type << "\n";
0339
0340 double reference = ERef;
0341
0342
0343 for (int eta = 0; eta < SCMaxEta; ++eta)
0344 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0345 if (amplMatrix[eta][phi] <= calibThres)
0346 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << 1 << "\t" << -1 << "\t" << -1 << "\t" << 0 << "\n";
0347 else
0348 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << reference / amplMatrix[eta][phi] << "\t"
0349 << sigmaMatrix[eta][phi] << "\t" << statisticMatrix[eta][phi] << "\t" << 1 << "\n";
0350 }
0351
0352
0353 txt_outfile.close();
0354 return 0;
0355 }
0356
0357
0358
0359 int writeCMSSWCoeff(const CLHEP::HepMatrix &lMatrix,
0360 double calibThres,
0361 int etaRef,
0362 int phiRef,
0363 const CLHEP::HepMatrix &sigmaMatrix,
0364 const CLHEP::HepMatrix &statisticMatrix,
0365 std::string fileName,
0366 std::string genTag,
0367 std::string method,
0368 std::string version,
0369 std::string type) {
0370
0371 std::ofstream txt_outfile;
0372 txt_outfile.open(fileName.c_str());
0373 txt_outfile << "1\n";
0374 txt_outfile << "-1\n";
0375 txt_outfile << genTag << "\n";
0376 txt_outfile << method << "\n";
0377 txt_outfile << version << "\n";
0378 txt_outfile << type << "\n";
0379
0380 if (amplMatrix[etaRef - 1][phiRef - 1] == 0) {
0381 std::cerr << "The reference crystal: (" << etaRef << "," << phiRef << ") is out of range\n";
0382 return 1;
0383 }
0384 double reference = amplMatrix[etaRef - 1][phiRef - 1];
0385
0386
0387 for (int eta = 0; eta < SCMaxEta; ++eta)
0388 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0389 if (amplMatrix[eta][phi] <= calibThres)
0390 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << 1 << "\t" << -1 << "\t" << -1 << "\t" << 0 << "\n";
0391 else
0392 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << reference / amplMatrix[eta][phi] << "\t"
0393 << sigmaMatrix[eta][phi] << "\t" << statisticMatrix[eta][phi] << "\t" << 1 << "\n";
0394 }
0395
0396
0397 txt_outfile.close();
0398 return 0;
0399 }
0400
0401
0402
0403 int translateCoeff(const CLHEP::HepMatrix &calibcoeff,
0404 const CLHEP::HepMatrix &sigmaMatrix,
0405 const CLHEP::HepMatrix &statisticMatrix,
0406 std::string SMnumber,
0407 double calibThres,
0408 std::string fileName,
0409 std::string genTag,
0410 std::string method,
0411 std::string version,
0412 std::string type) {
0413
0414 std::ofstream txt_outfile;
0415 txt_outfile.open(fileName.c_str());
0416 txt_outfile << SMnumber << "\n";
0417 txt_outfile << "-1\n";
0418 txt_outfile << genTag << "\n";
0419 txt_outfile << method << "\n";
0420 txt_outfile << version << "\n";
0421 txt_outfile << type << "\n";
0422
0423
0424 for (int eta = 0; eta < SCMaxEta; ++eta)
0425 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0426 if (calibcoeff[eta][phi] < calibThres) {
0427 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << 1 << "\t" << -1 << "\t" << -1 << "\t" << 0 << "\n";
0428 std::cout << "[translateCoefff][" << SMnumber << "]\t WARNING crystal " << xtalFromiEtaiPhi(eta + 1, phi + 1)
0429 << " calib coeff below threshold: "
0430 << "\t" << 1 << "\t" << -1 << "\t" << -1 << "\t" << 0 << "\n";
0431 } else
0432 txt_outfile << xtalFromiEtaiPhi(eta + 1, phi + 1) << "\t" << calibcoeff[eta][phi] << "\t"
0433 << sigmaMatrix[eta][phi] << "\t" << statisticMatrix[eta][phi] << "\t" << 1 << "\n";
0434 }
0435
0436
0437 txt_outfile.close();
0438 return 0;
0439 }
0440
0441
0442
0443 int readCMSSWcoeff(CLHEP::HepMatrix &calibcoeff, const std::string &inputFileName, double defaultVal) {
0444 std::ifstream CMSSWfile;
0445 CMSSWfile.open(inputFileName.c_str());
0446 std::string buffer;
0447 CMSSWfile >> buffer;
0448 CMSSWfile >> buffer;
0449 CMSSWfile >> buffer;
0450 CMSSWfile >> buffer;
0451 CMSSWfile >> buffer;
0452 CMSSWfile >> buffer;
0453 while (!CMSSWfile.eof()) {
0454 int xtalnum;
0455 CMSSWfile >> xtalnum;
0456 double coeff;
0457 CMSSWfile >> coeff;
0458 double buffer;
0459 CMSSWfile >> buffer;
0460 int good;
0461 CMSSWfile >> good;
0462 CMSSWfile >> good;
0463 if (!good)
0464 coeff = defaultVal;
0465 calibcoeff[etaFromXtal(xtalnum)][phiFromXtal(xtalnum)] = coeff;
0466 }
0467 return 0;
0468 }
0469
0470
0471
0472 int readCMSSWcoeffForComparison(CLHEP::HepMatrix &calibcoeff, const std::string &inputFileName) {
0473 std::ifstream CMSSWfile;
0474 CMSSWfile.open(inputFileName.c_str());
0475 std::string buffer;
0476 CMSSWfile >> buffer;
0477 CMSSWfile >> buffer;
0478 CMSSWfile >> buffer;
0479 CMSSWfile >> buffer;
0480 CMSSWfile >> buffer;
0481 CMSSWfile >> buffer;
0482 while (!CMSSWfile.eof()) {
0483 int xtalnum;
0484 CMSSWfile >> xtalnum;
0485 double coeff;
0486 CMSSWfile >> coeff;
0487 double buffer;
0488 CMSSWfile >> buffer;
0489 int good;
0490 CMSSWfile >> good;
0491 CMSSWfile >> good;
0492 if (!good)
0493 coeff = 0.;
0494 calibcoeff[etaFromXtal(xtalnum)][phiFromXtal(xtalnum)] = coeff;
0495 }
0496 return 0;
0497 }
0498
0499
0500
0501 TH1D *smartProfile(TH2F *strip, double width) {
0502 TProfile *stripProfile = strip->ProfileX();
0503
0504
0505
0506 double xmin = stripProfile->GetXaxis()->GetXmin();
0507 double xmax = stripProfile->GetXaxis()->GetXmax();
0508 int profileBins = stripProfile->GetNbinsX();
0509
0510 std::string name = strip->GetName();
0511 name += "_smart";
0512 TH1D *prof = new TH1D(name.c_str(), strip->GetTitle(), profileBins, xmin, xmax);
0513
0514 int cut = 0;
0515 int nbins = strip->GetXaxis()->GetNbins();
0516 int binmin = 1;
0517 int ngroup = 1;
0518 int binmax = nbins;
0519
0520
0521 for (int bin = binmin; bin <= binmax; bin += ngroup) {
0522 TH1D *hpy = strip->ProjectionY("_temp", bin, bin + ngroup - 1, "e");
0523 if (hpy == nullptr)
0524 continue;
0525 int nentries = Int_t(hpy->GetEntries());
0526 if (nentries == 0 || nentries < cut) {
0527 delete hpy;
0528 continue;
0529 }
0530
0531 Int_t biny = bin + ngroup / 2;
0532
0533 hpy->GetXaxis()->SetRangeUser(hpy->GetMean() - width * hpy->GetRMS(), hpy->GetMean() + width * hpy->GetRMS());
0534 prof->Fill(strip->GetXaxis()->GetBinCenter(biny), hpy->GetMean());
0535 prof->SetBinError(biny, hpy->GetRMS());
0536
0537 delete hpy;
0538 }
0539
0540 delete stripProfile;
0541 return prof;
0542 }
0543
0544
0545
0546 TH1D *smartGausProfile(TH2F *strip, double width) {
0547 TProfile *stripProfile = strip->ProfileX();
0548
0549
0550
0551 double xmin = stripProfile->GetXaxis()->GetXmin();
0552 double xmax = stripProfile->GetXaxis()->GetXmax();
0553 int profileBins = stripProfile->GetNbinsX();
0554
0555 std::string name = strip->GetName();
0556 name += "_smartGaus";
0557 TH1D *prof = new TH1D(name.c_str(), strip->GetTitle(), profileBins, xmin, xmax);
0558
0559 int cut = 0;
0560 int nbins = strip->GetXaxis()->GetNbins();
0561 int binmin = 1;
0562 int ngroup = 1;
0563 int binmax = nbins;
0564
0565
0566 for (int bin = binmin; bin <= binmax; bin += ngroup) {
0567 TH1D *hpy = strip->ProjectionY("_temp", bin, bin + ngroup - 1, "e");
0568 if (hpy == nullptr)
0569 continue;
0570 int nentries = Int_t(hpy->GetEntries());
0571 if (nentries == 0 || nentries < cut) {
0572 delete hpy;
0573 continue;
0574 }
0575
0576 Int_t biny = bin + ngroup / 2;
0577
0578 TF1 *gaussian =
0579 new TF1("gaussian", "gaus", hpy->GetMean() - width * hpy->GetRMS(), hpy->GetMean() + width * hpy->GetRMS());
0580 gaussian->SetParameter(1, hpy->GetMean());
0581 gaussian->SetParameter(2, hpy->GetRMS());
0582 hpy->Fit("gaussian", "RQL");
0583
0584 hpy->GetXaxis()->SetRangeUser(hpy->GetMean() - width * hpy->GetRMS(), hpy->GetMean() + width * hpy->GetRMS());
0585 prof->Fill(strip->GetXaxis()->GetBinCenter(biny), gaussian->GetParameter(1));
0586 prof->SetBinError(biny, gaussian->GetParameter(2));
0587
0588 delete gaussian;
0589 delete hpy;
0590 }
0591
0592 delete stripProfile;
0593 return prof;
0594 }
0595
0596
0597
0598 TH1D *smartError(TH1D *strip) {
0599 double xmin = strip->GetXaxis()->GetXmin();
0600 double xmax = strip->GetXaxis()->GetXmax();
0601 int stripsBins = strip->GetNbinsX();
0602
0603 std::string name = strip->GetName();
0604 name += "_error";
0605 TH1D *error = new TH1D(name.c_str(), strip->GetTitle(), stripsBins, xmin, xmax);
0606
0607 int binmin = 1;
0608 int ngroup = 1;
0609 int binmax = stripsBins;
0610 for (int bin = binmin; bin <= binmax; bin += ngroup) {
0611 double dummyError = strip->GetBinError(bin);
0612 error->SetBinContent(bin, dummyError);
0613 }
0614 return error;
0615 }
0616
0617
0618
0619 double effectiveSigma(TH1F &histogram, int vSteps) {
0620 double totInt = histogram.Integral();
0621 int maxBin = histogram.GetMaximumBin();
0622 int maxBinVal = int(histogram.GetBinContent(maxBin));
0623 int totBins = histogram.GetNbinsX();
0624 double area = totInt;
0625 double threshold = 0;
0626 double vStep = maxBinVal / vSteps;
0627 int leftBin = 1;
0628 int rightBin = totBins - 1;
0629
0630 while (area / totInt > 0.683) {
0631 threshold += vStep;
0632
0633 for (int back = maxBin; back > 0; --back) {
0634 if (histogram.GetBinContent(back) < threshold) {
0635 leftBin = back;
0636 break;
0637 }
0638 }
0639
0640
0641 for (int fwd = maxBin; fwd < totBins; ++fwd) {
0642 if (histogram.GetBinContent(fwd) < threshold) {
0643 rightBin = fwd;
0644 break;
0645 }
0646 }
0647 area = histogram.Integral(leftBin, rightBin);
0648 }
0649
0650 histogram.GetXaxis()->SetRange(leftBin, rightBin);
0651
0652 double halfWidthRange = 0.5 * (histogram.GetBinCenter(rightBin) - histogram.GetBinCenter(leftBin));
0653 return halfWidthRange;
0654 }
0655
0656
0657
0658 std::pair<int, int> findSupport(TH1F &histogram, double thres) {
0659 int totBins = histogram.GetNbinsX();
0660 if (thres >= histogram.GetMaximum())
0661 return std::pair<int, int>(0, totBins);
0662
0663 int leftBin = totBins - 1;
0664
0665 for (int bin = 1; bin < totBins; ++bin) {
0666 if (histogram.GetBinContent(bin) > thres) {
0667 leftBin = bin;
0668 break;
0669 }
0670 }
0671 int rightBin = 1;
0672
0673 for (int bin = totBins - 1; bin > 0; --bin) {
0674 if (histogram.GetBinContent(bin) > thres) {
0675 rightBin = bin;
0676 break;
0677 }
0678 }
0679 return std::pair<int, int>(leftBin, rightBin);
0680 }
0681
0682
0683
0684 void mtrTransfer(double output[SCMaxEta][SCMaxPhi], CLHEP::HepMatrix *input, double Default) {
0685 for (int eta = 0; eta < SCMaxEta; ++eta)
0686 for (int phi = 0; phi < SCMaxPhi; ++phi) {
0687 if ((*input)[eta][phi])
0688 output[eta][phi] = (*input)[eta][phi];
0689 else
0690 output[eta][phi] = Default;
0691 }
0692 return;
0693 }
0694
0695
0696
0697 double etaCorrE1E25(int eta) {
0698 double p0 = 0.807883;
0699 double p1 = 0.000182551;
0700 double p2 = -5.76961e-06;
0701 double p3 = 7.41903e-08;
0702 double p4 = -2.25384e-10;
0703
0704 double corr;
0705 if (eta < 6)
0706 corr = p0;
0707 else
0708 corr = p0 + p1 * eta + p2 * eta * eta + p3 * eta * eta * eta + p4 * eta * eta * eta * eta;
0709 return corr / p0;
0710 }
0711
0712
0713 double etaCorrE1E49(int eta) {
0714 double p0 = 0.799895;
0715 double p1 = 0.000235487;
0716 double p2 = -8.26496e-06;
0717 double p3 = 1.21564e-07;
0718 double p4 = -4.83286e-10;
0719
0720 double corr;
0721 if (eta < 8)
0722 corr = p0;
0723 else
0724 corr = p0 + p1 * eta + p2 * eta * eta + p3 * eta * eta * eta + p4 * eta * eta * eta * eta;
0725 return corr / p0;
0726 }
0727
0728
0729 double etaCorrE1E9(int eta) {
0730 if (eta < 4)
0731 return 1.0;
0732
0733 double p0 = 0.834629;
0734 double p1 = 0.00015254;
0735 double p2 = -4.91784e-06;
0736 double p3 = 6.54652e-08;
0737 double p4 = -2.4894e-10;
0738
0739 double corr;
0740 if (eta < 6)
0741 corr = p0;
0742 else
0743 corr = p0 + p1 * eta + p2 * eta * eta + p3 * eta * eta * eta + p4 * eta * eta * eta * eta;
0744 return corr / p0;
0745 }