44 #include <TLorentzVector.h>
48 : HcalNoiseRBXCollectionTag_(iConfig.getParameter<
edm::
InputTag>(
"HcalNoiseRBXCollection")),
49 CaloMetCollectionTag_(iConfig.getParameter<
edm::
InputTag>(
"CaloMetCollection")),
50 CaloMetCut_(iConfig.getParameter<double>(
"CaloMetCut")),
51 severity_(iConfig.getParameter<
int>(
"severity")),
52 maxNumRBXs_(iConfig.getParameter<
int>(
"maxNumRBXs")),
53 numRBXsToConsider_(iConfig.getParameter<
int>(
"numRBXsToConsider")),
54 accept2NoiseRBXEvents_(iConfig.getParameter<
bool>(
"accept2NoiseRBXEvents")),
55 needEMFCoincidence_(iConfig.getParameter<
bool>(
"needEMFCoincidence")),
56 minRBXEnergy_(iConfig.getParameter<double>(
"minRBXEnergy")),
57 minRatio_(iConfig.getParameter<double>(
"minRatio")),
58 maxRatio_(iConfig.getParameter<double>(
"maxRatio")),
59 minHPDHits_(iConfig.getParameter<
int>(
"minHPDHits")),
60 minRBXHits_(iConfig.getParameter<
int>(
"minRBXHits")),
61 minHPDNoOtherHits_(iConfig.getParameter<
int>(
"minHPDNoOtherHits")),
62 minZeros_(iConfig.getParameter<
int>(
"minZeros")),
63 minHighEHitTime_(iConfig.getParameter<double>(
"minHighEHitTime")),
64 maxHighEHitTime_(iConfig.getParameter<double>(
"maxHighEHitTime")),
65 maxRBXEMF_(iConfig.getParameter<double>(
"maxRBXEMF")),
66 minRecHitE_(iConfig.getParameter<double>(
"minRecHitE")),
67 minLowHitE_(iConfig.getParameter<double>(
"minLowHitE")),
68 minHighHitE_(iConfig.getParameter<double>(
"minHighHitE")),
70 TS4TS5EnergyThreshold_(iConfig.getParameter<double>(
"TS4TS5EnergyThreshold")) {
71 std::vector<double> TS4TS5UpperThresholdTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5UpperThreshold");
72 std::vector<double> TS4TS5UpperCutTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5UpperCut");
73 std::vector<double> TS4TS5LowerThresholdTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5LowerThreshold");
74 std::vector<double> TS4TS5LowerCutTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5LowerCut");
76 for (
int i = 0;
i < (
int)TS4TS5UpperThresholdTemp.size() &&
i < (
int)TS4TS5UpperCutTemp.size();
i++)
77 TS4TS5UpperCut_.push_back(std::pair<double, double>(TS4TS5UpperThresholdTemp[
i], TS4TS5UpperCutTemp[
i]));
80 for (
int i = 0;
i < (
int)TS4TS5LowerThresholdTemp.size() &&
i < (
int)TS4TS5LowerCutTemp.size();
i++)
81 TS4TS5LowerCut_.push_back(std::pair<double, double>(TS4TS5LowerThresholdTemp[
i], TS4TS5LowerCutTemp[
i]));
87 if (iConfig.
existsAs<
double>(
"minR45HitE"))
90 produces<reco::CaloMETCollection>();
99 desc.
add<
double>(
"CaloMetCut", 0.0);
100 desc.
add<
int>(
"severity", 1);
101 desc.
add<
int>(
"maxNumRBXs", 2);
102 desc.
add<
int>(
"numRBXsToConsider", 2);
103 desc.
add<
bool>(
"accept2NoiseRBXEvents",
true);
104 desc.
add<
bool>(
"needEMFCoincidence",
true);
105 desc.
add<
double>(
"minRBXEnergy", 50.0);
106 desc.
add<
double>(
"minRatio", -999.);
107 desc.
add<
double>(
"maxRatio", 999.);
108 desc.
add<
int>(
"minHPDHits", 17);
109 desc.
add<
int>(
"minRBXHits", 999);
110 desc.
add<
int>(
"minHPDNoOtherHits", 10);
111 desc.
add<
int>(
"minZeros", 10);
112 desc.
add<
double>(
"minHighEHitTime", -9999.0);
113 desc.
add<
double>(
"maxHighEHitTime", 9999.0);
114 desc.
add<
double>(
"maxRBXEMF", 0.02);
115 desc.
add<
double>(
"minRecHitE", 1.5);
116 desc.
add<
double>(
"minLowHitE", 10.0);
117 desc.
add<
double>(
"minHighHitE", 25.0);
118 desc.
add<
double>(
"minR45HitE", 5.0);
119 desc.
add<
double>(
"TS4TS5EnergyThreshold", 50.0);
121 double TS4TS5UpperThresholdArray[5] = {70, 90, 100, 400, 4000};
122 double TS4TS5UpperCutArray[5] = {1, 0.8, 0.75, 0.72, 0.72};
123 double TS4TS5LowerThresholdArray[7] = {100, 120, 150, 200, 300, 400, 500};
124 double TS4TS5LowerCutArray[7] = {-1, -0.7, -0.4, -0.2, -0.08, 0, 0.1};
125 std::vector<double>
TS4TS5UpperThreshold(TS4TS5UpperThresholdArray, TS4TS5UpperThresholdArray + 5);
126 std::vector<double>
TS4TS5UpperCut(TS4TS5UpperCutArray, TS4TS5UpperCutArray + 5);
127 std::vector<double>
TS4TS5LowerThreshold(TS4TS5LowerThresholdArray, TS4TS5LowerThresholdArray + 7);
128 std::vector<double>
TS4TS5LowerCut(TS4TS5LowerCutArray, TS4TS5LowerCutArray + 7);
134 descriptions.
add(
"hltHcalMETNoiseCleaner", desc);
142 using namespace reco;
152 met_h->front().pt() < 0) {
160 CleanedMET->push_back(inCaloMet);
169 edm::LogError(
"DataNotFound") <<
"HLTHcalMETNoiseCleaner: Could not find HcalNoiseRBXCollection product named "
171 CleanedMET->push_back(inCaloMet);
178 for (
auto const& rbx : *rbxs_h) {
191 CleanedMET->push_back(inCaloMet);
201 metVec.SetPtEtaPhi(met_h->front().pt(), 0, met_h->front().phi());
203 TVector3 noiseHPDVector(0, 0, 0);
204 TVector3 secondHPDVector(0, 0, 0);
206 bool isNoise =
false;
207 bool passFilter =
true;
210 if (it->validRatio() && it->ratio() <
minRatio_)
212 else if (it->validRatio() && it->ratio() >
maxRatio_)
226 else if (!it->PassTS4TS5())
235 LogDebug(
"") <<
"HLTHcalMETNoiseCleaner debug: Found a noisy RBX: "
236 <<
"energy=" << it->energy() <<
"; "
237 <<
"ratio=" << it->ratio() <<
"; "
238 <<
"# RBX hits=" << it->numRBXHits() <<
"; "
239 <<
"# HPD hits=" << it->numHPDHits() <<
"; "
240 <<
"# Zeros=" << it->numZeros() <<
"; "
241 <<
"min time=" << it->minHighEHitTime() <<
"; "
242 <<
"max time=" << it->maxHighEHitTime() <<
"; "
243 <<
"passTS4TS5=" << it->PassTS4TS5() <<
"; "
244 <<
"RBX EMF=" << it->RBXEMF() << std::endl;
250 if (isNoise && nNoise == 1) {
254 for (noiseTowersIt = noiseTowers.
begin(); noiseTowersIt != noiseTowers.
end(); noiseTowersIt++) {
256 towerVec.SetPtEtaPhi((*noiseTowersIt)->pt(), (*noiseTowersIt)->eta(), (*noiseTowersIt)->phi());
257 noiseHPDVector += towerVec;
259 if (noiseHPDVector.Mag() > 0)
260 noiseHPDVector.SetPtEtaPhi(noiseHPDVector.Pt(), 0, noiseHPDVector.Phi());
262 noiseHPDVector.SetPtEtaPhi(0, 0, 0);
265 if (isNoise && cntr > 0) {
266 CleanedMET->push_back(inCaloMet);
271 if (!isNoise && cntr == 0) {
272 CleanedMET->push_back(inCaloMet);
277 if (!isNoise && nNoise > 0) {
280 for (noiseTowersIt = noiseTowers.
begin(); noiseTowersIt != noiseTowers.
end(); noiseTowersIt++) {
282 towerVec.SetPtEtaPhi((*noiseTowersIt)->pt(), (*noiseTowersIt)->eta(), (*noiseTowersIt)->phi());
283 secondHPDVector += towerVec;
285 if (secondHPDVector.Mag() > 0)
286 secondHPDVector.SetPtEtaPhi(secondHPDVector.Pt(), 0, secondHPDVector.Phi());
288 secondHPDVector.SetPtEtaPhi(0, 0, 0);
293 if (noiseHPDVector.Mag() == 0) {
294 CleanedMET->push_back(inCaloMet);
303 float METsumet = met_h->front().energy();
305 metVec += noiseHPDVector;
307 float ZMETsumet = METsumet - noiseHPDVector.Mag();
308 float ZMETpt = metVec.Pt();
309 float ZMETphi = metVec.Phi();
316 if (secondHPDVector.Mag() > 0.) {
317 secondHPDVector.SetPtEtaPhi(secondHPDVector.Pt(), noiseHPDVector.Eta(), noiseHPDVector.Phi());
318 metVec -= secondHPDVector;
319 SMETsumet = METsumet - noiseHPDVector.Mag();
320 SMETpt = metVec.Pt();
321 SMETphi = metVec.Phi();
324 float CorMetSumEt, CorMetPt, CorMetPhi;
325 if (ZMETpt > SMETpt) {
326 CorMetSumEt = ZMETsumet;
330 CorMetSumEt = SMETsumet;
336 CleanedMET->push_back(corMet);
370 p4TL.SetPtEtaPhiM(
pt, 0.,
phi, 0.);