11 #include <CLHEP/Vector/LorentzVector.h>
41 : hlTriggerResults_(iConfig.getParameter<edm::
InputTag>(
"HLTriggerResults")),
42 mcProducer_(iConfig.getUntrackedParameter<std::
string>(
"mcProducer",
"")),
43 rechitProducer_(iConfig.getParameter<std::
string>(
"rechitProducer")),
44 rechitCollection_(iConfig.getParameter<std::
string>(
"rechitCollection")),
45 erechitProducer_(iConfig.getParameter<std::
string>(
"erechitProducer")),
46 erechitCollection_(iConfig.getParameter<std::
string>(
"erechitCollection")),
47 scProducer_(iConfig.getParameter<std::
string>(
"scProducer")),
48 scCollection_(iConfig.getParameter<std::
string>(
"scCollection")),
49 scIslandProducer_(iConfig.getParameter<std::
string>(
"scIslandProducer")),
50 scIslandCollection_(iConfig.getParameter<std::
string>(
"scIslandCollection")),
51 electronProducer_(iConfig.getParameter<std::
string>(
"electronProducer")),
52 electronCollection_(iConfig.getParameter<std::
string>(
"electronCollection")),
53 trigResultsToken_(consumes<edm::TriggerResults>(hlTriggerResults_)),
62 std::cout <<
"[ZeeCalibration] Starting the ctor" << std::endl;
76 outputFile_ = TFile::Open(outputFileName_.c_str(),
"RECREATE");
78 myTree =
new TTree(
"myTree",
"myTree");
80 myTree->Branch(
"zMass", &
mass4tree,
"mass/F");
116 findingRecord<EcalIntercalibConstantsRcd>();
118 for (
int i = 0;
i < 50;
i++) {
126 std::cout <<
"[ZeeCalibration] Done with the ctor" << std::endl;
139 std::cout <<
"@SUB=ZeeCalibration::produceEcalIntercalibConstants" << std::endl;
183 std::cout <<
"Writing histos..." << std::endl;
212 for (
unsigned int i = 0;
i < 25;
i++) {
247 Double_t
mean[25] = {0.};
248 Double_t
num[25] = {0.};
249 Double_t meanErr[25] = {0.};
250 Float_t
rms[25] = {0.};
251 Float_t tempRms[10][25];
253 for (
int ia = 0; ia < 10; ia++) {
254 for (
int ib = 0;
ib < 25;
ib++) {
255 tempRms[ia][
ib] = 0.;
263 bool isNearCrack =
false;
274 if ((
k + 1) % 5 != 0) {
318 if (
k >= 170 &&
k <= 204) {
335 else if (flag == 4) {
354 if (
k >= 205 &&
k <= 208) {
396 for (
int ic = 0; ic < 17; ic++) {
397 mean[ic] = mean[ic] / num[ic];
399 meanErr[ic] = 1. /
sqrt(meanErr[ic]);
403 for (
int ic = 0; ic < 25; ic++) {
404 for (
int id = 0;
id < 10;
id++) {
405 if (tempRms[
id][ic] > 0.) {
406 rms[ic] += (tempRms[
id][ic] - mean[
j]) * (tempRms[
id][ic] - mean[j]);
410 rms[ic] =
sqrt(rms[ic]);
415 Double_t xtalEta[25] = {1.4425, 1.3567, 1.2711, 1.1855, 1.10, 1.01, 0.92, 0.83, 0.7468,
416 0.6612, 0.5756, 0.4897, 0.3985, 0.3117, 0.2250, 0.1384, 0.0487, 1.546,
417 1.651, 1.771, 1.908, 2.071, 2.267, 2.516, 2.8};
419 Double_t
zero[25] = {0.026};
421 for (
int j = 0; j < 25; j++)
428 px->SetXTitle(
"Eta channel");
429 px->SetYTitle(
"recalibCoeff");
449 double weightSumMeanBarrel = 0.;
450 double weightSumMeanEndcap = 0.;
484 std::cout <<
"Weight sum mean on channels in Barrel is :" << weightSumMeanBarrel << std::endl;
485 std::cout <<
"Weight sum mean on channels in Endcap is :" << weightSumMeanEndcap << std::endl;
497 TGraphErrors* graph =
new TGraphErrors(25, xtalEta, mean, zero, meanErr);
501 double zero50[50] = {0.};
504 residualSigmaGraph->SetName(
"residualSigmaGraph");
505 residualSigmaGraph->Draw(
"APL");
506 residualSigmaGraph->Write();
508 TGraphErrors* coefficientDistanceAtIterationGraph =
510 coefficientDistanceAtIterationGraph->SetName(
"coefficientDistanceAtIterationGraph");
511 coefficientDistanceAtIterationGraph->Draw(
"APL");
512 coefficientDistanceAtIterationGraph->Write();
514 Float_t noError[250] = {0.};
516 Float_t ringInd[250];
517 for (
int i = 0;
i < 250;
i++)
520 TGraphErrors* graphCoeff =
522 graphCoeff->SetName(
"graphCoeff");
523 graphCoeff->Draw(
"APL");
556 std::cout <<
"[ZeeCalibration] Entering duringLoop" << std::endl;
572 std::cout <<
"[ZeeCalibration::beginOfJob] Histograms booked " << std::endl;
587 std::cout <<
"[ZeeCalibration::beginOfJob] Parsed EB miscal file" << std::endl;
595 std::cout <<
"[ZeeCalibration::beginOfJob] Parsed EE miscal file" << std::endl;
606 std::vector<DetId> ringIds;
619 for (
unsigned int iid = 0; iid < ringIds.size(); ++iid) {
620 float miscalib = *(miscalibMap->
get().
getMap().
find(ringIds[iid]));
631 ical = std::make_shared<EcalIntercalibConstants>();
636 std::vector<DetId> ringIds;
647 for (
unsigned int iid = 0; iid < ringIds.size(); ++iid) {
651 EBDetId myEBDetId(ringIds[iid]);
653 myEBDetId.
ieta() + 86,
659 EEDetId myEEDetId(ringIds[iid]);
660 if (myEEDetId.
zside() < 0)
666 if (myEEDetId.
zside() > 0)
684 for (
unsigned int iHLT = 0; iHLT < 200; ++iHLT) {
689 std::cout <<
"[ZeeCalibration::duringLoop] Done with initializing aHLTresults[] " << std::endl;
695 if (!hltTriggerResultHandle.isValid()) {
698 hltCount = hltTriggerResultHandle->size();
704 std::cout <<
"[ZeeCalibration::duringLoop] Done with myZeePlots_->fillHLTInfo(hltTriggerResultHandle); "
721 std::cout <<
"[ZeeCalibration::duringLoop] End HLT section" << std::endl;
726 std::vector<HepMC::GenParticle*> mcEle;
728 float myGenZMass(-1);
741 std::cout <<
"[ZeeCalibration::duringLoop] Done with myZeePlots_->fillZMCInfo( & (*myGenEvent) ); " << std::endl;
744 for (HepMC::GenEvent::particle_const_iterator
p = myGenEvent->particles_begin();
p != myGenEvent->particles_end();
747 if ((*p)->pdg_id() == 23 && (*p)->status() == 2) {
748 myGenZMass = (*p)->momentum().m();
759 for (HepMC::GenEvent::particle_const_iterator
p = myGenEvent->particles_begin();
p != myGenEvent->particles_end();
761 if (
abs((*p)->pdg_id()) == 11) {
762 mcEle.push_back((*
p));
767 if (mcEle.size() == 2 && fabs(mcEle[0]->momentum().
eta()) < 2.4 && fabs(mcEle[1]->momentum().
eta()) < 2.4) {
770 if (fabs(mcEle[0]->momentum().
eta()) < 1.479 && fabs(mcEle[1]->momentum().
eta()) < 1.479)
773 if ((fabs(mcEle[0]->momentum().
eta()) > 1.479 && fabs(mcEle[1]->momentum().
eta()) < 1.479) ||
774 (fabs(mcEle[0]->momentum().
eta()) < 1.479 && fabs(mcEle[1]->momentum().
eta()) > 1.479))
777 if (fabs(mcEle[0]->momentum().eta()) > 1.479 && fabs(mcEle[1]->momentum().eta()) > 1.479)
785 if (!
phits.isValid()) {
786 std::cerr <<
"Error! can't get the product EBRecHitCollection " << std::endl;
793 if (!ephits.isValid()) {
794 std::cerr <<
"Error! can't get the product EERecHitCollection " << std::endl;
801 if (!pSuperClusters.isValid()) {
802 std::cerr <<
"Error! can't get the product SuperClusterCollection " << std::endl;
807 std::cout <<
"scCollection->size()" << scCollection->size() << std::endl;
808 for (reco::SuperClusterCollection::const_iterator scIt = scCollection->begin(); scIt != scCollection->end(); scIt++) {
809 std::cout << scIt->energy() << std::endl;
816 if (!pIslandSuperClusters.isValid()) {
817 std::cerr <<
"Error! can't get the product IslandSuperClusterCollection " << std::endl;
822 std::cout <<
"scCollection->size()" << scIslandCollection->size() << std::endl;
825 if ((scCollection->size() + scIslandCollection->size()) < 2)
831 if (!pElectrons.isValid()) {
832 std::cerr <<
"Error! can't get the product ElectronCollection " << std::endl;
845 if (electronCollection->size() < 2)
848 if (!hits && !ehits) {
853 if (hits->empty() && ehits->empty()) {
854 std::cout <<
"hits->size() == 0" << std::endl;
858 if (!electronCollection) {
859 std::cout <<
"!electronCollection" << std::endl;
863 if (electronCollection->empty()) {
864 std::cout <<
"electronCollection->size() == 0" << std::endl;
879 std::cout <<
" Starting with myZeePlots_->fillEleInfo(electronCollection); " << std::endl;
886 std::cout <<
" Done with myZeePlots_->fillEleInfo(electronCollection); " << std::endl;
892 std::vector<calib::CalibElectron> calibElectrons;
896 for (
unsigned int e_it = 0; e_it != electronCollection->size(); e_it++) {
899 std::cout << calibElectrons.back().getRecoElectron()->superCluster()->energy() <<
" "
900 << calibElectrons.back().getRecoElectron()->energy() << std::endl;
908 std::cout <<
"Filled histos" << std::endl;
912 std::vector<std::pair<calib::CalibElectron*, calib::CalibElectron*> > zeeCandidates;
916 double DeltaMinvMin(5000.);
918 if (calibElectrons.size() < 2)
921 for (
unsigned int e_it = 0; e_it != calibElectrons.size() - 1; e_it++) {
922 for (
unsigned int p_it = e_it + 1; p_it != calibElectrons.size(); p_it++) {
924 std::cout << e_it <<
" " << calibElectrons[e_it].getRecoElectron()->charge() <<
" " << p_it <<
" "
925 << calibElectrons[p_it].getRecoElectron()->charge() << std::endl;
927 if (calibElectrons[e_it].getRecoElectron()->
charge() * calibElectrons[p_it].getRecoElectron()->
charge() != -1)
931 std::pair<calib::CalibElectron*, calib::CalibElectron*>(&(calibElectrons[e_it]), &(calibElectrons[p_it])));
937 std::cout <<
"#######################mass " <<
mass << std::endl;
940 zeeCandidates.push_back(
941 std::pair<calib::CalibElectron*, calib::CalibElectron*>(&(calibElectrons[e_it]), &(calibElectrons[p_it])));
942 double DeltaMinv = fabs(
mass -
MZ);
944 if (DeltaMinv < DeltaMinvMin) {
945 DeltaMinvMin = DeltaMinv;
946 myBestZ = zeeCandidates.size() - 1;
957 if (zeeCandidates.empty() || myBestZ == -1)
964 std::cout <<
"Found ZCandidates " << myBestZ << std::endl;
971 int class1 = zeeCandidates[myBestZ].first->getRecoElectron()->classification();
972 int class2 = zeeCandidates[myBestZ].second->getRecoElectron()->classification();
1001 if (class1 == 10 || class1 == 20)
1003 if (class1 == 110 || class1 == 120)
1005 if (class1 >= 30 && class1 <= 34)
1007 if (class1 >= 130 && class1 <= 134)
1018 if (class2 == 10 || class2 == 20)
1020 if (class2 == 110 || class2 == 120)
1022 if (class2 >= 30 && class2 <= 34)
1024 if (class2 >= 130 && class2 <= 134)
1035 DetId firstElehottestDetId =
1037 zeeCandidates[myBestZ].
first->getRecoElectron()->superCluster()->seed()->hitsAndFractions(), hits, ehits)
1039 DetId secondElehottestDetId =
1041 zeeCandidates[myBestZ].
second->getRecoElectron()->superCluster()->seed()->hitsAndFractions(), hits, ehits)
1044 bool firstElectronIsOnModuleBorder(
false);
1045 bool secondElectronIsOnModuleBorder(
false);
1050 if (firstElehottestDetId.subdetId() ==
EcalBarrel)
1055 if (firstElehottestDetId.subdetId() ==
EcalBarrel && !firstElectronIsOnModuleBorder)
1060 if (secondElehottestDetId.subdetId() ==
EcalBarrel)
1065 if (secondElehottestDetId.subdetId() ==
EcalBarrel && !secondElectronIsOnModuleBorder)
1070 if (firstElehottestDetId.subdetId() ==
EcalBarrel && firstElectronIsOnModuleBorder) {
1077 if (secondElehottestDetId.subdetId() ==
EcalBarrel && secondElectronIsOnModuleBorder) {
1086 if (class1 < 100 && class2 < 100) {
1088 if (class1 == 0 && class2 == 0)
1090 if (class1 < 21 && class2 < 21)
1092 if (class1 < 21 || class2 < 21)
1096 if (class1 >= 100 && class2 >= 100) {
1098 if (class1 == 100 && class2 == 100)
1100 if (class1 < 121 && class2 < 121)
1102 if (class1 < 121 || class2 < 121)
1106 if ((class1 < 100 && class2 >= 100) || (class2 < 100 && class1 >= 100)) {
1108 if ((class1 == 0 && class2 == 100) || (class2 == 0 && class1 == 100))
1110 if ((class1 < 21 && class2 < 121) || (class2 < 21 && class1 < 121))
1112 if (class2 < 21 || class1 < 21 || class2 < 121 || class1 < 121)
1123 bool selectionBool =
false;
1128 float theta1 = 2. * atan(
exp(-zeeCandidates[myBestZ].
first->getRecoElectron()->superCluster()->eta()));
1129 bool ET_1 = ((zeeCandidates[myBestZ].first->getRecoElectron()->superCluster()->energy() *
sin(theta1)) > 20.);
1131 float theta2 = 2. * atan(
exp(-zeeCandidates[myBestZ].
second->getRecoElectron()->superCluster()->eta()));
1132 bool ET_2 = ((zeeCandidates[myBestZ].second->getRecoElectron()->superCluster()->energy() *
sin(theta2)) > 20.);
1134 bool HoE_1 = (zeeCandidates[myBestZ].first->getRecoElectron()->hadronicOverEm() < 0.115);
1135 bool HoE_2 = (zeeCandidates[myBestZ].second->getRecoElectron()->hadronicOverEm() < 0.115);
1137 bool DeltaPhiIn_1 = (zeeCandidates[myBestZ].first->getRecoElectron()->deltaPhiSuperClusterTrackAtVtx() < 0.090);
1138 bool DeltaPhiIn_2 = (zeeCandidates[myBestZ].second->getRecoElectron()->deltaPhiSuperClusterTrackAtVtx() < 0.090);
1140 bool DeltaEtaIn_1 = (zeeCandidates[myBestZ].first->getRecoElectron()->deltaEtaSuperClusterTrackAtVtx() < 0.0090);
1141 bool DeltaEtaIn_2 = (zeeCandidates[myBestZ].second->getRecoElectron()->deltaEtaSuperClusterTrackAtVtx() < 0.0090);
1145 if (!(invMassBool && ET_1 && ET_2 && HoE_1 && HoE_2 && DeltaPhiIn_1 && DeltaPhiIn_2 && DeltaEtaIn_1 && DeltaEtaIn_2))
1153 int c1st = zeeCandidates[myBestZ].first->getRecoElectron()->classification();
1154 int c2nd = zeeCandidates[myBestZ].second->getRecoElectron()->classification();
1156 selectionBool = (myBestZ != -1 && c1st != 40 && c1st != 40 && c2nd != 40 && c2nd != 140);
1162 (myBestZ != -1 && (c1st == 0 || c1st == 10 || c1st == 20 || c1st == 100 || c1st == 110 || c1st == 120) &&
1163 (c2nd == 0 || c2nd == 10 || c2nd == 20 || c2nd == 100 || c2nd == 110 || c2nd == 120));
1167 selectionBool = (myBestZ != -1 && (c1st == 0 || c1st == 100) && (c2nd == 0 || c2nd == 100));
1170 selectionBool = (myBestZ != -1 && ((c1st >= 30 && c1st <= 34) || ((c1st >= 130 && c1st <= 134))) &&
1171 ((c2nd >= 30 && c2nd <= 34) || ((c2nd >= 130 && c2nd <= 134)))
1178 selectionBool = (myBestZ != -1 && (
1180 ((c1st == 0 || c1st == 10 || c1st == 20) && c2nd >= 100 && c2nd != 140)
1184 ((c2nd == 0 || c2nd == 10 || c2nd == 20) && c1st >= 100 && c1st != 140)
1191 selectionBool = (myBestZ != -1 && c1st >= 100 && c2nd >= 100 && c1st != 140 && c2nd != 140);
1196 selectionBool = (myBestZ != -1 && c1st < 100 && c2nd < 100 && c1st != 40 && c2nd != 40);
1201 selectionBool = (myBestZ != -1 && !(c1st < 100 && c2nd >= 100) && !(c1st >= 100 && c2nd < 100));
1203 float ele1EnergyCorrection(1.);
1204 float ele2EnergyCorrection(1.);
1211 if (invMassBool && selectionBool) {
1219 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection) -
1227 std::map<HepMC::GenParticle*, const reco::GsfElectron*> myMCmap;
1229 std::vector<const reco::GsfElectron*> dauElectronCollection;
1231 dauElectronCollection.push_back(zeeCandidates[myBestZ].
first->getRecoElectron());
1232 dauElectronCollection.push_back(zeeCandidates[myBestZ].
second->getRecoElectron());
1234 fillMCmap(&dauElectronCollection, mcEle, myMCmap);
1241 zeeCandidates[myBestZ].
second,
1242 MZ *
sqrt(ele1EnergyCorrection * ele2EnergyCorrection));
1247 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection));
1249 int c1st = zeeCandidates[myBestZ].first->getRecoElectron()->classification();
1250 int c2nd = zeeCandidates[myBestZ].second->getRecoElectron()->classification();
1251 if (c1st < 100 && c2nd < 100)
1253 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection));
1255 if (c1st >= 100 && c2nd >= 100)
1257 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection));
1260 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection);
1263 zeeCandidates[myBestZ], ele1EnergyCorrection, ele2EnergyCorrection) -
1272 std::cout <<
"Added event to algorithm" << std::endl;
1281 std::cout <<
"[ZeeCalibration] Starting loop number " << iLoop << std::endl;
1290 std::cout <<
"[ZeeCalibration] exiting from startingNewLoop" << std::endl;
1311 std::cout <<
"[ZeeCalibration] Ending loop " << iLoop << std::endl;
1322 std::cout <<
"Optimized coefficients " << optimizedCoefficients.size() << std::endl;
1328 for (
unsigned int ieta = 0; ieta < optimizedCoefficients.size(); ieta++) {
1341 std::cout <<
"size " << optimizedCoefficients.size() << std::endl;
1343 for (
unsigned int ieta = 0; ieta < optimizedCoefficients.size(); ieta++) {
1344 calibCoeff[ieta] *= optimizedCoefficients[ieta];
1346 calibCoeff[ieta] *
sqrt(
pow(optimizedCoefficientsError[ieta] / optimizedCoefficients[ieta], 2) +
1351 std::cout << ieta <<
" " << optimizedCoefficients[ieta] << std::endl;
1354 std::vector<DetId> ringIds;
1365 for (
unsigned int iid = 0; iid < ringIds.size(); ++iid) {
1367 EBDetId myEBDetId(ringIds[iid]);
1369 myEBDetId.
ieta() + 86,
1375 EEDetId myEEDetId(ringIds[iid]);
1376 if (myEEDetId.
zside() < 0)
1382 if (myEEDetId.
zside() > 0)
1389 ical->setValue(ringIds[iid], *(
ical->getMap().find(ringIds[iid])) * optimizedCoefficients[ieta]);
1419 double parResidual[3];
1420 double errparResidual[3];
1432 std::cout <<
"Fit on residuals, sigma is " << parResidual[2] <<
" +/- " << errparResidual[2] << std::endl;
1468 new TH1F(
"h1_eventsBeforeBorderSelection",
"h1_eventsBeforeBorderSelection", 5, 0, 5);
1471 h1_seedOverSC_ =
new TH1F(
"h1_seedOverSC",
"h1_seedOverSC", 400, 0., 2.);
1476 new TH1F(
"h1_borderElectronClassification",
"h1_borderElectronClassification", 55, -5, 50);
1479 h2_fEtaBarrelGood_ =
new TH2F(
"fEtaBarrelGood",
"fEtaBarrelGood", 800, -4., 4., 800, 0.8, 1.2);
1483 h2_fEtaBarrelBad_ =
new TH2F(
"fEtaBarrelBad",
"fEtaBarrelBad", 800, -4., 4., 800, 0.8, 1.2);
1487 h2_fEtaEndcapGood_ =
new TH2F(
"fEtaEndcapGood",
"fEtaEndcapGood", 800, -4., 4., 800, 0.8, 1.2);
1491 h2_fEtaEndcapBad_ =
new TH2F(
"fEtaEndcapBad",
"fEtaEndcapBad", 800, -4., 4., 800, 0.8, 1.2);
1495 for (
int i = 0;
i < 2;
i++) {
1498 sprintf(histoName,
"h_eleEffEta_%d",
i);
1499 h_eleEffEta_[
i] =
new TH1F(histoName, histoName, 150, 0., 2.7);
1502 sprintf(histoName,
"h_eleEffPhi_%d",
i);
1503 h_eleEffPhi_[
i] =
new TH1F(histoName, histoName, 400, -4., 4.);
1506 sprintf(histoName,
"h_eleEffPt_%d",
i);
1507 h_eleEffPt_[
i] =
new TH1F(histoName, histoName, 200, 0., 200.);
1512 new TH2F(
"h2_xtalMiscalibCoeffBarrel",
"h2_xtalMiscalibCoeffBarrel", 171, -85, 85, 360, 0, 360);
1514 new TH2F(
"h2_xtalMiscalibCoeffEndcapMinus",
"h2_xtalMiscalibCoeffEndcapMinus", 100, 0, 100, 100, 0, 100);
1516 new TH2F(
"h2_xtalMiscalibCoeffEndcapPlus",
"h2_xtalMiscalibCoeffEndcapPlus", 100, 0, 100, 100, 0, 100);
1524 for (
int i = 0;
i < 25;
i++) {
1526 sprintf(histoName,
"h_ESCEtrueVsEta_%d",
i);
1528 h_ESCEtrueVsEta_[
i] =
new TH2F(histoName, histoName, 150, 0., 2.7, 300, 0., 1.5);
1532 sprintf(histoName,
"h_ESCEtrue_%d",
i);
1534 h_ESCEtrue_[
i] =
new TH1F(histoName, histoName, 300, 0., 1.5);
1536 sprintf(histoName,
"h2_chi2_%d",
i);
1537 h2_chi2_[
i] =
new TH2F(histoName, histoName, 1000, -150, 150, 1000, -1, 5);
1539 sprintf(histoName,
"h2_iterations_%d",
i);
1540 h2_iterations_[
i] =
new TH2F(histoName, histoName, 1000, -150, 150, 1000, -1, 15);
1542 sprintf(histoName,
"h_ESCcorrEtrueVsEta_%d",
i);
1548 sprintf(histoName,
"h_ESCcorrEtrue_%d",
i);
1552 sprintf(histoName,
"h2_xtalRecalibCoeffBarrel_%d",
i);
1558 sprintf(histoName,
"h2_xtalRecalibCoeffEndcapMinus_%d",
i);
1563 sprintf(histoName,
"h2_xtalRecalibCoeffEndcapPlus_%d",
i);
1588 h1_zMassResol_ =
new TH1F(
"zMassResol",
"zMassResol", 200, -50., 50.);
1592 h1_eleEtaResol_ =
new TH1F(
"eleEtaResol",
"eleEtaResol", 100, -0.01, 0.01);
1608 h1_elePhiResol_ =
new TH1F(
"elePhiResol",
"elePhiResol", 100, -0.01, 0.01);
1612 h1_zEtaResol_ =
new TH1F(
"zEtaResol",
"zEtaResol", 200, -1., 1.);
1616 h1_zPhiResol_ =
new TH1F(
"zPhiResol",
"zPhiResol", 200, -1., 1.);
1620 h1_nEleReco_ =
new TH1F(
"nEleReco",
"Number of reco electrons", 10, -0.5, 10.5);
1633 h1_occupancy_ =
new TH1F(
"occupancy",
"occupancy", 1000, 0, 10000);
1642 h1_eleClasses_ =
new TH1F(
"eleClasses",
"eleClasses", 301, -1, 300);
1654 h1_ZCandMult_ =
new TH1F(
"ZCandMult",
"Multiplicity of Z candidates in one event", 10, -0.5, 10.5);
1657 h1_reco_ZMass_ =
new TH1F(
"reco_ZMass",
"Inv. mass of 2 reco Electrons", 200, 0., 150.);
1661 h1_reco_ZMassCorr_ =
new TH1F(
"reco_ZMassCorr",
"Inv. mass of 2 corrected reco Electrons", 200, 0., 150.);
1665 h1_reco_ZMassCorrBB_ =
new TH1F(
"reco_ZMassCorrBB",
"Inv. mass of 2 corrected reco Electrons", 200, 0., 150.);
1669 h1_reco_ZMassCorrEE_ =
new TH1F(
"reco_ZMassCorrEE",
"Inv. mass of 2 corrected reco Electrons", 200, 0., 150.);
1675 h2_coeffVsEta_ =
new TH2F(
"h2_calibCoeffVsEta",
"h2_calibCoeffVsEta", 249, -124, 125, 200, 0., 2.);
1680 new TH2F(
"h2_calibCoeffVsEtaGrouped",
"h2_calibCoeffVsEtaGrouped", 200, 0., 3., 200, 0.6, 1.4);
1684 h2_zMassVsLoop_ =
new TH2F(
"h2_zMassVsLoop",
"h2_zMassVsLoop", 1000, 0, 40, 90, 80., 95.);
1686 h2_zMassDiffVsLoop_ =
new TH2F(
"h2_zMassDiffVsLoop",
"h2_zMassDiffVsLoop", 1000, 0, 40, 100, -1., 1.);
1690 h2_zWidthVsLoop_ =
new TH2F(
"h2_zWidthVsLoop",
"h2_zWidthVsLoop", 1000, 0, 40, 100, 0., 10.);
1692 h2_coeffVsLoop_ =
new TH2F(
"h2_coeffVsLoop",
"h2_coeffVsLoop", 1000, 0, 40, 100, 0., 2.);
1694 h2_residualSigma_ =
new TH2F(
"h2_residualSigma",
"h2_residualSigma", 1000, 0, 40, 100, 0., .5);
1696 h2_miscalRecal_ =
new TH2F(
"h2_miscalRecal",
"h2_miscalRecal", 500, 0., 2., 500, 0., 2.);
1700 h2_miscalRecalEB_ =
new TH2F(
"h2_miscalRecalEB",
"h2_miscalRecalEB", 500, 0., 2., 500, 0., 2.);
1704 h2_miscalRecalEE_ =
new TH2F(
"h2_miscalRecalEE",
"h2_miscalRecalEE", 500, 0., 2., 500, 0., 2.);
1708 h1_mc_ =
new TH1F(
"h1_residualMiscalib",
"h1_residualMiscalib", 200, -0.2, 0.2);
1709 h1_mcEB_ =
new TH1F(
"h1_residualMiscalibEB",
"h1_residualMiscalibEB", 200, -0.2, 0.2);
1710 h1_mcEE_ =
new TH1F(
"h1_residualMiscalibEE",
"h1_residualMiscalibEE", 200, -0.2, 0.2);
1712 for (
int i = 0;
i < 25;
i++) {
1731 sprintf(histoName,
"h1_residualMiscalibParz_%d",
i);
1732 h1_mcParz_[
i] =
new TH1F(histoName, histoName, 200, -0.2, 0.2);
1733 sprintf(histoName,
"h1_residualMiscalibEBParz_%d",
i);
1734 h1_mcEBParz_[
i] =
new TH1F(histoName, histoName, 200, -0.2, 0.2);
1735 sprintf(histoName,
"h1_residualMiscalibEEParz_%d",
i);
1736 h1_mcEEParz_[
i] =
new TH1F(histoName, histoName, 200, -0.2, 0.2);
1741 float p0 = 1.00153e+00;
1742 float p1 = 3.29331e-02;
1743 float p2 = 1.21187e-03;
1745 double x = (double)fabs(scEta);
1747 return 1. / (p0 + p1 * x * x + p2 * x * x * x *
x);
1753 float p0 = 1.06819e+00;
1754 float p1 = -1.53189e-02;
1755 float p2 = 4.01707e-04;
1757 double x = (double)fabs(scEta);
1759 return 1. / (p0 + p1 * x * x + p2 * x * x * x *
x);
1763 float p0 = 1.17382e+00;
1764 float p1 = -6.52319e-02;
1765 float p2 = 6.26108e-03;
1767 double x = (double)fabs(scEta);
1769 return 1. / (p0 + p1 * x * x + p2 * x * x * x *
x);
1773 float p0 = 9.99782e-01;
1774 float p1 = 1.26983e-02;
1775 float p2 = 2.16344e-03;
1777 double x = (double)fabs(scEta);
1779 return 1. / (p0 + p1 * x * x + p2 * x * x * x *
x);
1785 const std::vector<HepMC::GenParticle*>& mcEle,
1786 std::map<HepMC::GenParticle*, const reco::GsfElectron*>& myMCmap) {
1787 for (
unsigned int i = 0;
i < mcEle.size();
i++) {
1790 for (
unsigned int j = 0;
j < electronCollection->size();
j++) {
1791 float dr =
EvalDR(mcEle[
i]->momentum().pseudoRapidity(),
1792 (*(*electronCollection)[
j]).
eta(),
1793 mcEle[
i]->momentum().
phi(),
1794 (*(*electronCollection)[j]).
phi());
1796 myMatchEle = (*electronCollection)[
j];
1800 myMCmap.insert(std::pair<HepMC::GenParticle*, const reco::GsfElectron*>(mcEle[
i], myMatchEle));
1809 float DPhi = Phi - Phi_ref;
1813 float DEta = Eta - Eta_ref;
1815 float DR =
sqrt(DEta * DEta + DPhi * DPhi);
1824 return (Phi - Phi_ref);
1828 std::map<HepMC::GenParticle*, const reco::GsfElectron*>& associationMap) {
1829 for (
unsigned int i = 0;
i < mcEle.size();
i++) {
1830 h_eleEffEta_[0]->Fill(fabs(mcEle[
i]->momentum().pseudoRapidity()));
1834 std::map<HepMC::GenParticle*, const reco::GsfElectron*>::const_iterator mIter = associationMap.find(mcEle[
i]);
1835 if (mIter == associationMap.end())
1838 if ((*mIter).second) {
1841 h_eleEffEta_[1]->Fill(fabs(mcEle[i]->momentum().pseudoRapidity()));
1871 if (k >= 0 && k <= 84)
1874 if (k >= 85 && k <= 169)
1877 if (k >= 170 && k <= 208)
1880 if (k >= 209 && k <= 247)
1886 if (k >= 0 && k <= 71)
1889 if (k >= 72 && k <= 143)
1899 if (c == 0 || c == 10 || c == 20)
1902 if (c == 100 || c == 110 || c == 120)
1905 if (c == 30 || c == 31 || c == 32 || c == 33 || c == 34)
1908 if (c == 130 || c == 131 || c == 132 || c == 133 || c == 134)
1917 double maxEnergy = -9999.;
1920 std::pair<DetId, double> myPair(
DetId(0), -9999.);
1922 for (
std::vector<std::pair<DetId, float> >::const_iterator idIt = mySCRecHits.begin(); idIt != mySCRecHits.end();
1925 hottestRecHit = &(*(ebhits->
find((*idIt).first)));
1927 if (hottestRecHit == &(*(ebhits->
end()))) {
1928 std::cout <<
"@@@@@@@@@@@@@@@@@@@@@@@@@@@ NO RECHIT FOUND SHOULD NEVER HAPPEN" << std::endl;
1931 }
else if (idIt->first.subdetId() ==
EcalEndcap) {
1932 hottestRecHit = &(*(eehits->
find((*idIt).first)));
1933 if (hottestRecHit == &(*(eehits->
end()))) {
1934 std::cout <<
"@@@@@@@@@@@@@@@@@@@@@@@@@@@ NO RECHIT FOUND SHOULD NEVER HAPPEN" << std::endl;
1941 if (hottestRecHit && hottestRecHit->
energy() > maxEnergy) {
1942 maxEnergy = hottestRecHit->
energy();
1944 myPair.first = hottestRecHit->
id();
1945 myPair.second = maxEnergy;
1958 short ieta = myEBDetId.
ieta();
1959 short iphi = myEBDetId.
iphi();
1963 myBool = (
abs(ieta) == 1 ||
abs(ieta) == 25 ||
abs(ieta) == 26 ||
abs(ieta) == 45 ||
abs(ieta) == 46 ||
1964 abs(ieta) == 65 ||
abs(ieta) == 66 ||
abs(ieta) == 85);
1966 for (
int i = 0;
i < 19;
i++) {
1967 if (iphi == (20 *
i + 1) || iphi == 20 *
i)
1977 for (
int i = 0;
i <
size;
i++) {
1980 bool isNearCrack =
false;
1992 dist +=
pow(v1[
i] - v2[
i], 2);
2041 for (
int i = 0;
i < 2;
i++) {
2079 std::cout <<
"[ CHECK ON BARREL ELECTRON NUMBER ]"
2082 std::cout <<
"[ EFFICIENCY OF THE BORDER SELECTION ]"
2085 std::cout <<
"[ EFFICIENCY OF THE GOLDEN SELECTION ] BARREL: "
2089 std::cout <<
"[ EFFICIENCY OF THE SILVER SELECTION ] BARREL: "
2093 std::cout <<
"[ EFFICIENCY OF THE SHOWER SELECTION ] BARREL: "
2097 std::cout <<
"[ EFFICIENCY OF THE CRACK SELECTION ] BARREL: "
2101 std::ofstream
fout(
"ZeeStatistics.txt");
2104 std::cout <<
"Cannot open output file.\n";
2107 fout <<
"ZeeStatistics" << std::endl;
2109 fout <<
"##########################RECO#########################" << std::endl;
2110 fout <<
"##################Zee with Barrel-Barrel electrons: " <<
BBZN << std::endl;
2112 fout <<
"Golden-Golden fraction: " << (float)
BBZN_gg /
BBZN <<
" 3-3 fraction is " << (
float)
BBZN_tt /
BBZN
2113 <<
" 3-whatever fraction is " << (float)
BBZN_t0 /
BBZN << std::endl;
2114 fout <<
"##################Zee with Barrel-Endcap electrons: " <<
EBZN << std::endl;
2115 fout <<
"Golden-Golden fraction: " << (float)
EBZN_gg /
EBZN <<
" 3-3 fraction is " << (
float)
EBZN_tt /
EBZN
2116 <<
" 3-whatever fraction is " << (float)
EBZN_t0 /
EBZN << std::endl;
2117 fout <<
"##################Zee with Endcap-Endcap electrons: " <<
EEZN << std::endl;
2118 fout <<
"Golden-Golden fraction: " << (float)
EEZN_gg /
EEZN <<
" 3-3 fraction is " << (
float)
EEZN_tt /
EEZN
2119 <<
" 3-whatever fraction is " << (float)
EEZN_t0 /
EEZN << std::endl;
2121 fout <<
"\n" << std::endl;
2123 fout <<
"##########################GEN#########################" << std::endl;
2124 fout <<
"##################Zee with Barrel-Barrel electrons: " << (float)
MCZBB /
NEVT << std::endl;
2125 fout <<
"##################Zee with Barrel-Endcap electrons: " << (float)
MCZEB /
NEVT << std::endl;
2126 fout <<
"##################Zee with Endcap-Endcap electrons: " << (float)
MCZEE /
NEVT << std::endl;
TH1 * weightedRescaleFactor[50][250]
auto setWhatProduced(T *iThis, const es::Label &iLabel={})
T getUntrackedParameter(std::string const &, T const &) const
const math::XYZPoint & position() const
cluster centroid position
const edm::EDGetTokenT< edm::HepMCProduct > hepMCToken_
const ZIterativeAlgorithmWithFitPlots * getHistos() const
std::string outputFileName_
static const int MIN_IPHI
double fEtaEndcapGood(double scEta) const
const edm::EventSetup & c
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometryToken_
int BARREL_ELECTRONS_AFTER_BORDER_CUT
uint16_t *__restrict__ id
TH1F * h1_eventsBeforeEWKSelection_
double fEtaBarrelBad(double scEta) const
float computeCoefficientDistanceAtIteration(float v1[250], float v2[250], int size)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const self & getMap() const
void fillEleInfo(const reco::GsfElectronCollection *)
void fillEleMCInfo(const HepMC::GenEvent *)
const edm::EDGetTokenT< EERecHitCollection > eeRecHitToken_
const std::vector< float > & getOptimizedChiSquare() const
int GOLDEN_ELECTRONS_IN_ENDCAP
void fillZMCInfo(const HepMC::GenEvent *)
TH1F * h1_eventsAfterBorderSelection_
int getNumberOfChannels() const
Sin< T >::type sin(const T &t)
constexpr uint32_t rawId() const
get the raw id
bool parseXMLMiscalibFile(std::string configFile)
void fillMCmap(const std::vector< const reco::GsfElectron * > *electronCollection, const std::vector< HepMC::GenParticle * > &mcEle, std::map< HepMC::GenParticle *, const reco::GsfElectron * > &myMCmap)
const std::vector< float > & getOptimizedCoefficients() const
TH1F * h1_occupancyEndcap_
bool addEvent(calib::CalibElectron *, calib::CalibElectron *, float)
void writeMCEleHistograms()
Exp< T >::type exp(const T &t)
Status duringLoop(const edm::Event &, const edm::EventSetup &) override
Called at each event.
TH1F * h1_eventsBeforeBorderSelection_
TH1F * h1_electronCosTheta_SC_
void writeMCZHistograms()
double fEtaEndcapBad(double scEta) const
TH1F * h1_reco_ZMassCorr_
static void gausfit(TH1F *histoou, double *par, double *errpar, float nsigmalow, float nsigmaup, double *mychi2, int *iterations)
int GOLDEN_ELECTRONS_IN_BARREL
TH2F * h2_coeffVsEtaGrouped_
TH1F * h1_occupancyVsEta_
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
TH1F * h1_occupancyBarrel_
~ZeeCalibration() override
Destructor.
const edm::EDGetTokenT< edm::TriggerResults > trigResultsToken_
static bool validDetId(int i, int j)
check if a valid index combination
float EvalDR(float Eta, float Eta_ref, float Phi, float Phi_ref)
int iphi() const
get the crystal iphi
bool getData(T &iHolder) const
U second(std::pair< T, U > const &p)
TH1F * h1_electronCosTheta_TK_
TH2F * h_ESCcorrEtrueVsEta_[25]
const EcalIntercalibConstants & get()
int ringNumberCorrector(int k)
int SILVER_ELECTRONS_IN_BARREL
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
void beginOfJob() override
Called at beginning of job.
int TOTAL_ELECTRONS_IN_ENDCAP
int BARREL_ELECTRONS_BEFORE_BORDER_CUT
void fillHLTInfo(edm::Handle< edm::TriggerResults >)
int SHOWER_ELECTRONS_IN_ENDCAP
int getNumberOfIterations() const
Abs< T >::type abs(const T &t)
double energy() const
cluster energy
ZIterativeAlgorithmWithFit * theAlgorithm_
const edm::EDGetTokenT< reco::SuperClusterCollection > islandSCToken_
int ieta() const
get the crystal ieta
unsigned int electronSelection_
bool xtalIsOnModuleBorder(EBDetId myEBDetId)
TH2F * h2_xtalRecalibCoeffBarrel_[25]
float EvalDPhi(float Phi, float Phi_ref)
TH1F * h1_eventsAfterEWKSelection_
TH1F * h1_preshowerOverSC_
TH1F * h1_electronCosTheta_SC_TK_
double coefficientDistanceAtIteration[50]
const_iterator end() const
TH2F * h2_zMassDiffVsLoop_
void startingNewLoop(unsigned int iLoop) override
Called at beginning of loop.
const edm::EDGetTokenT< reco::SuperClusterCollection > scToken_
const std::vector< float > & getOptimizedCoefficientsError() const
static const int MAX_IPHI
DetId id() const
get the id
void writeEleHistograms()
edm::ParameterSet theParameterSet
static bool validDetId(int crystal_ix, int crystal_iy, int iz)
Classification classification() const
TH1F * h_ESCcorrEtrue_[25]
std::pair< DetId, double > getHottestDetId(const std::vector< std::pair< DetId, float > > &mySCRecHits, const EBRecHitCollection *ebhits, const EERecHitCollection *eehits)
T getParameter(std::string const &) const
TH2F * h2_xtalMiscalibCoeffEndcapPlus_
static const int MAX_IETA
constexpr float correction(int sizeM1, int q_f, int q_l, uint16_t upper_edge_first_pix, uint16_t lower_edge_last_pix, float lorentz_shift, float theThickness, float cot_angle, float pitch, bool first_is_big, bool last_is_big)
const edm::EDGetTokenT< EBRecHitCollection > ebRecHitToken_
Status endOfLoop(const edm::EventSetup &, unsigned int iLoop) override
Called at end of loop.
const std::string mcProducer_
float initCalibCoeff[250]
int SILVER_ELECTRONS_IN_ENDCAP
TH1F * h1_reco_ZMassCorrBB_
const edm::EDGetTokenT< reco::GsfElectronCollection > gsfElectronToken_
void writeLine(EBDetId const &, float)
iterator find(key_type k)
T perp() const
Magnitude of transverse component.
virtual std::shared_ptr< EcalIntercalibConstants > produceEcalIntercalibConstants(const EcalIntercalibConstantsRcd &iRecord)
Produce Ecal interCalibrations.
TH1F * h1_reco_ZMassCorrEE_
TH2F * h2_xtalMiscalibCoeffBarrel_
void fillZInfo(std::pair< calib::CalibElectron *, calib::CalibElectron * > myZeeCandidate)
void fillEleInfo(std::vector< HepMC::GenParticle * > &a, std::map< HepMC::GenParticle *, const reco::GsfElectron * > &b)
const_iterator find(uint32_t rawId) const
TH1F * h1_weightSumMeanBarrel_
double fEtaBarrelGood(double scEta) const
TH2F * h_ESCEtrueVsEta_[25]
TH2F * h2_iterations_[25]
const CaloClusterPtr & seed() const
seed BasicCluster
ZeeCalibration(const edm::ParameterSet &iConfig)
Constructor.
double preshowerEnergy() const
energy deposited in preshower
float calibCoeffError[250]
TH2F * h2_xtalRecalibCoeffEndcapPlus_[25]
int CRACK_ELECTRONS_IN_ENDCAP
int CRACK_ELECTRONS_IN_BARREL
TH2F * h2_fEtaEndcapGood_
TH2F * h2_xtalRecalibCoeffEndcapMinus_[25]
void bookEleMCHistograms()
double phi() const final
momentum azimuthal angle
double getEtaCorrection(const reco::GsfElectron *)
TH2F * h2_fEtaBarrelGood_
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
TH1F * h1_borderElectronClassification_
SuperClusterRef superCluster() const override
reference to a SuperCluster
TH2F * h2_xtalMiscalibCoeffEndcapMinus_
void endOfJob() override
Called at end of job.
double sigmaErrorArray[50]
caConstants::TupleMultiplicity const *__restrict__ HitsOnGPU const *__restrict__ tindex_type *__restrict__ double *__restrict__ phits
int SHOWER_ELECTRONS_IN_BARREL
const std::vector< int > & getOptimizedIterations() const
int TOTAL_ELECTRONS_IN_BARREL
TH1F * h1_weightSumMeanEndcap_
double eta() const final
momentum pseudorapidity
std::shared_ptr< EcalIntercalibConstants > ical