16 const int SummaryTypeNotSet = -1;
20 asg::AsgMessaging(std::string(
name)),
22 m_useTRTOutliers(true),
23 m_useTRTXenonHits(false),
25 m_cutPositionClusterEtaRange_Electron(0),
27 m_cutPositionConversionMatch_Electron(0),
29 m_cutPositionClusterHadronicLeakage_Electron(0),
31 m_cutPositionClusterMiddleEnergy_Electron(0),
33 m_cutPositionClusterMiddleEratio37_Electron(0),
35 m_cutPositionClusterMiddleEratio33_Electron(0),
37 m_cutPositionClusterMiddleWidth_Electron(0),
39 m_cutPositionClusterBackEnergyFraction_Electron(0),
41 m_cutPositionClusterStripsEratio_Electron(0),
43 m_cutPositionClusterStripsDeltaEmax2_Electron(0),
45 m_cutPositionClusterStripsDeltaE_Electron(0),
47 m_cutPositionClusterStripsWtot_Electron(0),
49 m_cutPositionClusterStripsFracm_Electron(0),
51 m_cutPositionClusterStripsWeta1c_Electron(0),
53 m_cutPositionClusterStripsDEmaxs1_Electron(0),
55 m_cutPositionTrackBlayer_Electron(0),
57 m_cutPositionTrackPixel_Electron(0),
59 m_cutPositionTrackSi_Electron(0),
61 m_cutPositionTrackA0_Electron(0),
63 m_cutPositionTrackMatchEta_Electron(0),
65 m_cutPositionTrackMatchPhi_Electron(0),
67 m_cutPositionTrackMatchEoverP_Electron(0),
69 m_cutPositionTrackTRTeProbabilityHT_Electron(0),
71 m_cutPositionTrackTRThits_Electron(0),
73 m_cutPositionTrackTRTratio_Electron(0),
75 m_cutPositionTrackTRTratio90_Electron(0),
77 m_cutPositionTrackA0Tight_Electron(0),
80 m_cutPositionTrackMatchEtaTight_Electron(0),
82 m_cutPositionIsolation_Electron(0),
84 m_cutPositionClusterIsolation_Electron(0),
86 m_cutPositionTrackIsolation_Electron(0),
88 m_cutNameClusterEtaRange_Electron(
"ClusterEtaRange_Electron"),
90 m_cutNameConversionMatch_Electron(
"ConversionMatch_Electron"),
92 m_cutNameClusterHadronicLeakage_Electron(
"ClusterHadronicLeakage_Electron"),
94 m_cutNameClusterMiddleEnergy_Electron(
"ClusterMiddleEnergy_Electron"),
96 m_cutNameClusterMiddleEratio37_Electron(
"ClusterMiddleEratio37_Electron"),
98 m_cutNameClusterMiddleEratio33_Electron(
"ClusterMiddleEratio33_Electron"),
100 m_cutNameClusterMiddleWidth_Electron(
"ClusterMiddleWidth_Electron"),
102 m_cutNameClusterBackEnergyFraction_Electron(
"ClusterBackEnergyFraction_Electron"),
104 m_cutNameClusterStripsEratio_Electron(
"ClusterStripsEratio_Electron"),
106 m_cutNameClusterStripsDeltaEmax2_Electron(
"ClusterStripsDeltaEmax2_Electron"),
108 m_cutNameClusterStripsDeltaE_Electron(
"ClusterStripsDeltaE_Electron"),
110 m_cutNameClusterStripsWtot_Electron(
"ClusterStripsWtot_Electron"),
112 m_cutNameClusterStripsFracm_Electron(
"ClusterStripsFracm_Electron"),
114 m_cutNameClusterStripsWeta1c_Electron(
"ClusterStripsWeta1c_Electron"),
116 m_cutNameClusterStripsDEmaxs1_Electron(
"ClusterStripsDEmaxs1_Electron"),
118 m_cutNameTrackBlayer_Electron(
"TrackBlayer_Electron"),
120 m_cutNameTrackPixel_Electron(
"TrackPixel_Electron"),
122 m_cutNameTrackSi_Electron(
"TrackSi_Electron"),
124 m_cutNameTrackA0_Electron(
"TrackA0_Electron"),
126 m_cutNameTrackMatchEta_Electron(
"TrackMatchEta_Electron"),
128 m_cutNameTrackMatchPhi_Electron(
"TrackMatchPhi_Electron"),
130 m_cutNameTrackMatchEoverP_Electron(
"TrackMatchEoverP_Electron"),
132 m_cutNameTrackTRTeProbabilityHT_Electron(
"TrackTRTeProbabilityHT_Electron"),
134 m_cutNameTrackTRThits_Electron(
"TrackTRThits_Electron"),
136 m_cutNameTrackTRTratio_Electron(
"TrackTRTratio_Electron"),
138 m_cutNameTrackTRTratio90_Electron(
"TrackTRTratio90_Electron"),
140 m_cutNameTrackA0Tight_Electron(
"TrackA0Tight_Electron"),
143 m_cutNameTrackMatchEtaTight_Electron(
"TrackMatchEtaTight_Electron"),
145 m_cutNameIsolation_Electron(
"Isolation_Electron"),
147 m_cutNameClusterIsolation_Electron(
"ClusterIsolation_Electron"),
149 m_cutNameTrackIsolation_Electron(
"TrackIsolation_Electron")
192 m_cutPositionClusterEtaRange_Electron =
193 m_acceptInfo.addCut(m_cutNameClusterEtaRange_Electron,
"Electron within eta range");
194 if (m_cutPositionClusterEtaRange_Electron < 0)
sc = StatusCode::FAILURE;
197 m_cutPositionConversionMatch_Electron =
198 m_acceptInfo.addCut(m_cutNameConversionMatch_Electron,
"Electron matches a photon with AR > LOOSE");
199 if (m_cutPositionConversionMatch_Electron < 0)
sc = StatusCode::FAILURE;
202 m_cutPositionClusterHadronicLeakage_Electron =
203 m_acceptInfo.addCut(m_cutNameClusterHadronicLeakage_Electron,
"Had leakage < Cut");
204 if (m_cutPositionClusterHadronicLeakage_Electron < 0)
sc = StatusCode::FAILURE;
207 m_cutPositionClusterMiddleEnergy_Electron =
208 m_acceptInfo.addCut(m_cutNameClusterMiddleEnergy_Electron,
"Et <0 Cut");
209 if (m_cutPositionClusterMiddleEnergy_Electron < 0)
sc = StatusCode::FAILURE;
212 m_cutPositionClusterMiddleEratio37_Electron =
213 m_acceptInfo.addCut(m_cutNameClusterMiddleEratio37_Electron,
"E237/377 > Cut");
214 if (m_cutPositionClusterMiddleEratio37_Electron < 0)
sc = StatusCode::FAILURE;
217 m_cutPositionClusterMiddleEratio33_Electron =
218 m_acceptInfo.addCut(m_cutNameClusterMiddleEratio33_Electron,
"E233/E237 > Cut");
219 if (m_cutPositionClusterMiddleEratio33_Electron < 0)
sc = StatusCode::FAILURE;
222 m_cutPositionClusterMiddleWidth_Electron =
223 m_acceptInfo.addCut(m_cutNameClusterMiddleWidth_Electron,
"Weta2 < Cut");
224 if (m_cutPositionClusterMiddleWidth_Electron < 0)
sc = StatusCode::FAILURE;
227 m_cutPositionClusterBackEnergyFraction_Electron =
228 m_acceptInfo.addCut(m_cutNameClusterBackEnergyFraction_Electron,
"f3 < Cut");
229 if (m_cutPositionClusterBackEnergyFraction_Electron < 0)
sc = StatusCode::FAILURE;
232 m_cutPositionClusterStripsEratio_Electron =
233 m_acceptInfo.addCut(m_cutNameClusterStripsEratio_Electron,
"No Cut");
234 if (m_cutPositionClusterStripsEratio_Electron < 0)
sc = StatusCode::FAILURE;
237 m_cutPositionClusterStripsDeltaEmax2_Electron =
238 m_acceptInfo.addCut(m_cutNameClusterStripsDeltaEmax2_Electron,
"emax2/(1000.+0.009*et) < Cut, where emax2 is the energy of the second max");
239 if (m_cutPositionClusterStripsDeltaEmax2_Electron < 0)
sc = StatusCode::FAILURE;
242 m_cutPositionClusterStripsDeltaE_Electron =
243 m_acceptInfo.addCut(m_cutNameClusterStripsDeltaE_Electron,
"difference between 2nd maximium and first minimum < Cut");
244 if (m_cutPositionClusterStripsDeltaE_Electron < 0)
sc = StatusCode::FAILURE;
247 m_cutPositionClusterStripsWtot_Electron =
248 m_acceptInfo.addCut(m_cutNameClusterStripsWtot_Electron,
"Total shower width in first sampling < Cut");
249 if (m_cutPositionClusterStripsWtot_Electron < 0)
sc = StatusCode::FAILURE;
252 m_cutPositionClusterStripsFracm_Electron =
253 m_acceptInfo.addCut(m_cutNameClusterStripsFracm_Electron,
"Fracm (aka Fside) < Cut");
254 if (m_cutPositionClusterStripsFracm_Electron < 0)
sc = StatusCode::FAILURE;
257 m_cutPositionClusterStripsWeta1c_Electron =
258 m_acceptInfo.addCut(m_cutNameClusterStripsWeta1c_Electron,
"Shower width in 3 strips in first sampling < Cut");
259 if (m_cutPositionClusterStripsWeta1c_Electron < 0)
sc = StatusCode::FAILURE;
261 int voidcutpos = m_acceptInfo.addCut(
"VOID1",
"No Cut");
262 if (voidcutpos < 0)
sc = StatusCode::FAILURE;
265 m_cutPositionClusterStripsDEmaxs1_Electron =
266 m_acceptInfo.addCut(m_cutNameClusterStripsDEmaxs1_Electron,
"Difference between first and second max > Cut");
267 if (m_cutPositionClusterStripsDEmaxs1_Electron < 0)
sc = StatusCode::FAILURE;
270 m_cutPositionTrackBlayer_Electron =
271 m_acceptInfo.addCut(m_cutNameTrackBlayer_Electron,
"nBL > 0, maybe including outliers and using expectHitInBLayer");
272 if (m_cutPositionTrackBlayer_Electron < 0)
sc = StatusCode::FAILURE;
275 m_cutPositionTrackPixel_Electron =
276 m_acceptInfo.addCut(m_cutNameTrackPixel_Electron,
"nPi > Cut, maybe including outliers");
277 if (m_cutPositionTrackPixel_Electron < 0)
sc = StatusCode::FAILURE;
280 m_cutPositionTrackSi_Electron =
281 m_acceptInfo.addCut(m_cutNameTrackSi_Electron,
"nSi > Cut, maybe including outliers");
282 if (m_cutPositionTrackSi_Electron < 0)
sc = StatusCode::FAILURE;
285 m_cutPositionTrackA0_Electron =
286 m_acceptInfo.addCut(m_cutNameTrackA0_Electron,
"A0 (aka d0) wrt beam spot < Cut");
287 if (m_cutPositionTrackA0_Electron < 0)
sc = StatusCode::FAILURE;
290 m_cutPositionTrackMatchEta_Electron =
291 m_acceptInfo.addCut(m_cutNameTrackMatchEta_Electron,
"Track match deta in 1st sampling < Cut");
292 if (m_cutPositionTrackMatchEta_Electron < 0)
sc = StatusCode::FAILURE;
295 m_cutPositionTrackMatchPhi_Electron =
296 m_acceptInfo.addCut(m_cutNameTrackMatchPhi_Electron,
"Track match dphi in 2nd sampling < Cut");
297 if (m_cutPositionTrackMatchPhi_Electron < 0)
sc = StatusCode::FAILURE;
300 m_cutPositionTrackMatchEoverP_Electron =
301 m_acceptInfo.addCut(m_cutNameTrackMatchEoverP_Electron,
"E/p < Cut");
302 if (m_cutPositionTrackMatchEoverP_Electron < 0)
sc = StatusCode::FAILURE;
308 m_cutPositionTrackTRTeProbabilityHT_Electron =
309 m_acceptInfo.addCut(m_cutNameTrackTRTeProbabilityHT_Electron,
"eProbabilityHT TRT hits > Cut");
310 if (m_cutPositionTrackTRTeProbabilityHT_Electron < 0)
sc = StatusCode::FAILURE;
313 m_cutPositionTrackTRThits_Electron =
314 m_acceptInfo.addCut(m_cutNameTrackTRThits_Electron,
"number of TRT hits > Cut");
315 if (m_cutPositionTrackTRThits_Electron < 0)
sc = StatusCode::FAILURE;
318 m_cutPositionTrackTRTratio_Electron =
319 m_acceptInfo.addCut(m_cutNameTrackTRTratio_Electron,
"ration of high to all TRT hits > Cut");
320 if (m_cutPositionTrackTRTratio_Electron < 0)
sc = StatusCode::FAILURE;
323 m_cutPositionTrackTRTratio90_Electron =
324 m_acceptInfo.addCut(m_cutNameTrackTRTratio90_Electron,
"ration of high to all TRT hits > Cut, 90% cut, (only for old tight menu)");
325 if (m_cutPositionTrackTRTratio90_Electron < 0)
sc = StatusCode::FAILURE;
328 m_cutPositionTrackA0Tight_Electron =
329 m_acceptInfo.addCut(m_cutNameTrackA0Tight_Electron,
"tight cut on d0 for old tight menu (not used otherwis)");
330 if (m_cutPositionTrackA0Tight_Electron < 0)
sc = StatusCode::FAILURE;
334 m_cutPositionTrackMatchEtaTight_Electron =
335 m_acceptInfo.addCut(m_cutNameTrackMatchEtaTight_Electron,
"tight cut on deta only for old tight menu");
336 if (m_cutPositionTrackMatchEtaTight_Electron < 0)
sc = StatusCode::FAILURE;
339 m_cutPositionIsolation_Electron =
340 m_acceptInfo.addCut(m_cutNameIsolation_Electron,
"Track and calorimetric isolation");
341 if (m_cutPositionIsolation_Electron < 0)
sc = StatusCode::FAILURE;
344 m_cutPositionClusterIsolation_Electron =
345 m_acceptInfo.addCut(m_cutNameClusterIsolation_Electron,
"calorimetric isolation only");
346 if (m_cutPositionClusterIsolation_Electron < 0)
sc = StatusCode::FAILURE;
349 m_cutPositionTrackIsolation_Electron =
350 m_acceptInfo.addCut(m_cutNameTrackIsolation_Electron,
"track isolation only");
351 if (m_cutPositionTrackIsolation_Electron < 0)
sc = StatusCode::FAILURE;
353 if (
sc == StatusCode::FAILURE) {
354 ATH_MSG_ERROR(
"Exceeded the number of allowed cuts in TElectronIsEMSelector");
363 for (
int i = 0;
i < 32;
i++) {
364 const unsigned int mask = (0x1
u <<
i) & m_isEMMask;
413 int nSiHitsPlusDeadSensors,
416 int nTRThighOutliers,
433 unsigned int isEM = calcIsEm(
eta2,
451 nSiHitsPlusDeadSensors,
463 return fillAccept(isEM);
509 int nSiHitsPlusDeadSensors,
512 int nTRThighOutliers,
525 unsigned int iflag = calocuts_electrons(
eta2,
543 iflag = TrackCut(
eta2,
547 nSiHitsPlusDeadSensors,
600 double trigEtTh)
const
604 if(trigEtTh > 0)
et = trigEtTh*1.01;
606 int ibin_et=
bins.at(0);
607 int ibin_eta=
bins.at(1);
608 int ibin_combined=
bins.at(2);
621 if (ibin_eta>=0 && ibin_et>=0 && ibin_combined>=0) {
624 if (CheckVar(m_cutHadLeakage, 4)) {
626 if (
Rhad1 > m_cutHadLeakage[ibin_combined])
628 }
else if (
eta2 >= 0.8 &&
eta2 < 1.37) {
629 if (
Rhad > m_cutHadLeakage[ibin_combined])
632 if (
Rhad1 > m_cutHadLeakage[ibin_combined])
638 if (CheckVar(m_cutF3, 4)) {
639 if (
f3 > m_cutF3[ibin_combined]) {
645 if (CheckVar(m_cutReta37, 4)) {
646 if (
Reta <= m_cutReta37[ibin_combined])
650 if (CheckVar(m_cutRphi33, 4)) {
651 if (
Rphi <= m_cutRphi33[ibin_combined])
656 if (CheckVar(m_cutWeta2c, 4)) {
657 if (weta2c > m_cutWeta2c[ibin_combined])
662 if (
f1 > m_cutF1[0] &&
eta2 < 2.37 && (eta2 < 1.37 || eta2 > 1.52)) {
665 if (CheckVar(m_cutDeltaEmax2, 4)) {
667 double deltaemax2 = emax2 / (1000. + 0.009 *
et);
668 if (emax2 > 0. && deltaemax2 >= m_cutDeltaEmax2[ibin_combined])
673 if (CheckVar(m_cutDeltaE, 4)) {
674 if (emax2 > 0. &&
DeltaE >= m_cutDeltaE[ibin_combined])
679 if (CheckVar(m_cutDEmaxs1, 4)) {
680 if (
Eratio <= m_cutDEmaxs1[ibin_combined])
685 if (CheckVar(m_cutWtot, 4)) {
686 if (wtot >= m_cutWtot[ibin_combined])
691 if (CheckVar(m_cutFracm, 4)) {
692 if (fracm >= m_cutFracm[ibin_combined])
697 if (CheckVar(m_cutWeta1c, 4)) {
698 if (weta1c >= m_cutWeta1c[ibin_combined])
718 int nSiHitsPlusDeadSensors,
722 int nTRThighOutliers,
734 unsigned int iflag)
const
738 int ibin_eta=
bins.at(1);
739 int ibin_combined=
bins.at(2);
741 if (ibin_eta >= 0 && ibin_combined >= 0) {
744 if (CheckVar(m_cutBL, 1) && m_cutBL[ibin_eta] == 1 &&
749 if (CheckVar(m_cutPi, 1)) {
754 if (CheckVar(m_cutSi, 1)) {
755 if (nSiHitsPlusDeadSensors < m_cutSi[ibin_eta])
759 if (CheckVar(m_cutA0, 1)) {
760 if (trackd0 > m_cutA0[ibin_eta])
764 if (CheckVar(m_cutA0Tight, 1)) {
765 if (trackd0 > m_cutA0Tight[ibin_eta])
771 deltaeta = std::abs(deltaeta);
773 if (CheckVar(m_cutDeltaEta, 4)) {
774 if (deltaeta > m_cutDeltaEta[ibin_combined])
777 if (CheckVar(m_cutminDeltaPhi, 4)) {
778 if (deltaphi < m_cutminDeltaPhi[ibin_combined])
781 if (CheckVar(m_cutmaxDeltaPhi, 4)) {
782 if (deltaphi > m_cutmaxDeltaPhi[ibin_combined])
786 if (CheckVar(m_cutDeltaEtaTight, 4)) {
787 if (deltaeta > m_cutDeltaEtaTight[ibin_combined])
792 if (CheckVar(m_cutminEp, 4) && CheckVar(m_cutmaxEp, 4)) {
793 if (ep < m_cutminEp[ibin_combined] || ep > m_cutmaxEp[ibin_combined])
801 if (m_useTRTOutliers) {
804 if (m_useTRTXenonHits && (nTRTXenonHits != SummaryTypeNotSet))
805 nTRTTotal = nTRTXenonHits;
807 nTRTTotal = nTRT + nTRTOutliers;
809 rTRT = (nTRTTotal) > 0
810 ? ((
double)(nTRThigh + nTRThighOutliers) / (nTRTTotal))
814 rTRT = (nTRT) > 0 ? ((
double)(nTRThigh) / (nTRT)) : 0.;
818 double DeltaNum = -100;
821 const double a0 = 33.14 ;
const double b0 = -129.1 ;
const double c0 = 1455.;
823 const double a1 = 29.42 ;
const double b1 = 27.93 ;
const double c1 = -89.96;
const double d1 = 91.51;
825 const double a2 = 196.3;
const double b2 = -403.;
const double c2 = 230.2;
827 const double a3 = -10.59;
const double b3 = 37.29;
829 const double a4 = -640.9;
const double b4 = 1323.;
const double c4 = -851.8;
const double d4 = 180.8;
831 const double a5 = 159.8;
const double b5 = -70.9;
833 int ibin_eta_TRT = -1;
838 if (!m_cutBinEta_TRT.empty()&&
eta2<m_cutBinEta_TRT.back()) {
839 const int numBins = (m_cutBinEta_TRT.size()-1);
841 while (ibinEta < numBins && eta2 > m_cutBinEta_TRT[ibinEta]) {
844 ibin_eta_TRT = ibinEta;
847 if (ibin_eta_TRT >= 0) {
848 switch (ibin_eta_TRT) {
860 DeltaNum = nTRTTotal - (a3 + b3 *
eta2);
863 DeltaNum = nTRTTotal - (a4 + b4 *
eta2 + c4 *
eta2 *
eta2 +
867 DeltaNum = nTRTTotal - (a5 + b5 *
eta2);
871 if (CheckVar(m_cutNumTRT, 2)) {
872 if (DeltaNum < m_cutNumTRT[ibin_eta_TRT]) {
877 int ibin_et_TRT = -1;
879 if (!m_cutBinET_TRT.empty()) {
880 const int numBins = m_cutBinET_TRT.size();
882 while (ibinET < numBins && et > m_cutBinET_TRT[ibinET]) {
885 ibin_et_TRT = ibinET;
888 int ibin_combined_TRT =ibin_eta_TRT;
890 ibin_combined_TRT =ibin_et_TRT*m_cutBinEta_TRT.size()+ibin_eta_TRT;
893 if (CheckVar(m_cutTRTRatio, 5) && CheckVar(m_cutEProbabilityHT, 5)) {
894 ATH_MSG_WARNING(
"We apply both: TRT ratio and eProbabilityHT cuts, are "
895 "you sure you want that, if yes good luck");
898 if (CheckVar(m_cutEProbabilityHT, 5)) {
900 if (TRT_PID < m_cutEProbabilityHT[ibin_combined_TRT] && nTRTTotal > 0) {
905 if (CheckVar(m_cutTRTRatio,5)) {
907 if (rTRT < m_cutTRTRatio[ibin_combined_TRT] && nTRTTotal > 0) {
912 if (CheckVar(m_cutTRTRatio90, 5)) {
913 if (rTRT < m_cutTRTRatio90[ibin_combined_TRT]) {
934 if (!m_cutBinET.empty()) {
935 const int numBins = m_cutBinET.size();
937 while (ibinET < numBins && et > m_cutBinET[ibinET]) {
950 if (!m_cutBinEta.empty() &&
eta2<m_cutBinEta.back()) {
951 const int numBins = (m_cutBinEta.size()-1);
953 while (ibinEta < numBins && eta2 > m_cutBinEta[ibinEta]) {
959 const int ibin_combined = ibin_et * m_cutBinEta.size() + ibin_eta;
961 std::vector<int>
bins{ ibin_et, ibin_eta, ibin_combined };
983 const unsigned int etaNB = m_cutBinEta.size();
984 const unsigned int etaTRTNB = m_cutBinEta_TRT.size();
985 const unsigned int etNB = m_cutBinET.size();
986 const unsigned int etTRTNB = m_cutBinET_TRT.size();
987 unsigned int combinedNB = 0;
988 unsigned int combinedTRTNB = 0;
991 combinedNB = etaNB * (etNB+1);
998 combinedTRTNB = etaTRTNB * (etTRTNB+1);
1001 combinedTRTNB = etaTRTNB;
1006 if (
vec.size() != 1) {
1008 <<
vec.size() <<
" but needs 1");
1015 if (
vec.size() != etaNB ) {
1017 <<
vec.size() <<
" but needs "
1024 if (
vec.size() != etaTRTNB ) {
1026 <<
vec.size() <<
" but needs "
1034 if (
vec.size() != etNB ) {
1036 <<
vec.size() <<
" but needs "
1044 if (
vec.size() != combinedNB ) {
1046 <<
vec.size() <<
" but needs "
1054 if (
vec.size() != combinedTRTNB ) {
1056 <<
vec.size() <<
" but needs "
1064 template bool Root::TElectronIsEMSelector::CheckVar<float> (
const std::vector<float>&
vec,
int choice)
const;
1065 template bool Root::TElectronIsEMSelector::CheckVar<int> (
const std::vector<int>&
vec,
int choice)
const;