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);
130 desc.
add<std::vector<double> >(
"TS4TS5UpperThreshold", TS4TS5UpperThreshold);
131 desc.
add<std::vector<double> >(
"TS4TS5UpperCut", TS4TS5UpperCut);
132 desc.
add<std::vector<double> >(
"TS4TS5LowerThreshold", TS4TS5LowerThreshold);
133 desc.
add<std::vector<double> >(
"TS4TS5LowerCut", TS4TS5LowerCut);
134 descriptions.
add(
"hltHcalMETNoiseCleaner", desc);
142 using namespace reco;
151 if (not met_h.isValid()
or met_h->empty()
or
152 met_h->front().pt() < 0) {
160 CleanedMET->push_back(inCaloMet);
168 if (!rbxs_h.isValid()) {
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.);
371 const LorentzVector p4(p4TL.X(), p4TL.Y(), 0, p4TL.T());
372 const Point vtx(0.0, 0.0, 0.0);
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
bool getByToken(EDGetToken token, Handle< PROD > &result) const
~HLTHcalMETNoiseCleaner() override
std::vector< std::pair< double, double > > TS4TS5UpperCut_
edm::EDGetTokenT< reco::CaloMETCollection > m_theCaloMetToken
std::set< CommonHcalNoiseRBXData, noisedatacomp > noisedataset_t
Log< level::Error, false > LogError
const_iterator end() const
Termination of iteration.
edm::InputTag CaloMetCollectionTag_
reco::CaloMET BuildCaloMet(float sumet, float pt, float phi)
const_iterator begin() const
Initialize an iterator over the RefVector.
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
HLTHcalMETNoiseCleaner(const edm::ParameterSet &)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::InputTag HcalNoiseRBXCollectionTag_
XYZPointD XYZPoint
point in space with cartesian internal representation
bool filter(edm::Event &, const edm::EventSetup &) override
edm::EDGetTokenT< reco::HcalNoiseRBXCollection > m_theHcalNoiseToken
T getParameter(std::string const &) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool accept2NoiseRBXEvents_
char data[epos_bytes_allocation]
double TS4TS5EnergyThreshold_
math::PtEtaPhiELorentzVectorF LorentzVector
std::vector< std::pair< double, double > > TS4TS5LowerCut_