47 #include <TLorentzVector.h>
51 : HcalNoiseRBXCollectionTag_(iConfig.getParameter<edm::InputTag>(
"HcalNoiseRBXCollection")),
52 CaloMetCollectionTag_(iConfig.getParameter<edm::InputTag>(
"CaloMetCollection")),
53 CaloMetCut_(iConfig.getParameter<double>(
"CaloMetCut")),
54 severity_(iConfig.getParameter<int> (
"severity")),
55 maxNumRBXs_(iConfig.getParameter<int>(
"maxNumRBXs")),
56 numRBXsToConsider_(iConfig.getParameter<int>(
"numRBXsToConsider")),
57 accept2NoiseRBXEvents_(iConfig.getParameter<bool>(
"accept2NoiseRBXEvents")),
58 needEMFCoincidence_(iConfig.getParameter<bool>(
"needEMFCoincidence")),
59 minRBXEnergy_(iConfig.getParameter<double>(
"minRBXEnergy")),
60 minRatio_(iConfig.getParameter<double>(
"minRatio")),
61 maxRatio_(iConfig.getParameter<double>(
"maxRatio")),
62 minHPDHits_(iConfig.getParameter<int>(
"minHPDHits")),
63 minRBXHits_(iConfig.getParameter<int>(
"minRBXHits")),
64 minHPDNoOtherHits_(iConfig.getParameter<int>(
"minHPDNoOtherHits")),
65 minZeros_(iConfig.getParameter<int>(
"minZeros")),
66 minHighEHitTime_(iConfig.getParameter<double>(
"minHighEHitTime")),
67 maxHighEHitTime_(iConfig.getParameter<double>(
"maxHighEHitTime")),
68 maxRBXEMF_(iConfig.getParameter<double>(
"maxRBXEMF")),
69 minRecHitE_(iConfig.getParameter<double>(
"minRecHitE")),
70 minLowHitE_(iConfig.getParameter<double>(
"minLowHitE")),
71 minHighHitE_(iConfig.getParameter<double>(
"minHighHitE")),
72 TS4TS5EnergyThreshold_(iConfig.getParameter<double>(
"TS4TS5EnergyThreshold"))
75 std::vector<double> TS4TS5UpperThresholdTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5UpperThreshold");
76 std::vector<double> TS4TS5UpperCutTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5UpperCut");
77 std::vector<double> TS4TS5LowerThresholdTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5LowerThreshold");
78 std::vector<double> TS4TS5LowerCutTemp = iConfig.
getParameter<std::vector<double> >(
"TS4TS5LowerCut");
80 for(
int i = 0;
i < (int)TS4TS5UpperThresholdTemp.size() &&
i < (int)TS4TS5UpperCutTemp.size();
i++)
81 TS4TS5UpperCut_.push_back(std::pair<double, double>(TS4TS5UpperThresholdTemp[
i], TS4TS5UpperCutTemp[i]));
84 for(
int i = 0; i < (int)TS4TS5LowerThresholdTemp.size() && i < (int)TS4TS5LowerCutTemp.size(); i++)
85 TS4TS5LowerCut_.push_back(std::pair<double, double>(TS4TS5LowerThresholdTemp[i], TS4TS5LowerCutTemp[i]));
88 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>(
"TS4TS5EnergyThreshold",50.0);
120 double TS4TS5UpperThresholdArray[5] = {70, 90, 100, 400, 4000 };
121 double TS4TS5UpperCutArray[5] = {1, 0.8, 0.75, 0.72, 0.72};
122 double TS4TS5LowerThresholdArray[7] = {100, 120, 150, 200, 300, 400, 500};
123 double TS4TS5LowerCutArray[7] = {-1, -0.7, -0.4, -0.2, -0.08, 0, 0.1};
124 std::vector<double> TS4TS5UpperThreshold(TS4TS5UpperThresholdArray, TS4TS5UpperThresholdArray+5);
125 std::vector<double> TS4TS5UpperCut(TS4TS5UpperCutArray, TS4TS5UpperCutArray+5);
126 std::vector<double> TS4TS5LowerThreshold(TS4TS5LowerThresholdArray, TS4TS5LowerThresholdArray+7);
127 std::vector<double> TS4TS5LowerCut(TS4TS5LowerCutArray, TS4TS5LowerCutArray+7);
129 desc.
add<std::vector<double> >(
"TS4TS5UpperThreshold", TS4TS5UpperThreshold);
130 desc.
add<std::vector<double> >(
"TS4TS5UpperCut", TS4TS5UpperCut);
131 desc.
add<std::vector<double> >(
"TS4TS5LowerThreshold", TS4TS5LowerThreshold);
132 desc.
add<std::vector<double> >(
"TS4TS5LowerCut", TS4TS5LowerCut);
133 descriptions.
add(
"hltHcalMETNoiseCleaner",desc);
142 using namespace reco;
151 if(not met_h.isValid()
or met_h->size()==0
or met_h->front().pt()<0){
160 CleanedMET->push_back(inCaloMet);
161 iEvent.
put(CleanedMET);
168 if(!rbxs_h.isValid()) {
169 edm::LogError(
"DataNotFound") <<
"HLTHcalMETNoiseCleaner: Could not find HcalNoiseRBXCollection product named "
171 CleanedMET->push_back(inCaloMet);
172 iEvent.
put(CleanedMET);
178 for(HcalNoiseRBXCollection::const_iterator it=rbxs_h->begin(); it!=rbxs_h->end(); ++it) {
186 CleanedMET->push_back(inCaloMet);
187 iEvent.
put(CleanedMET);
196 metVec.SetPtEtaPhi(met_h->front().pt(), 0, met_h->front().phi() );
198 TVector3 noiseHPDVector(0,0,0);
199 TVector3 secondHPDVector(0,0,0);
200 for(noisedataset_t::const_iterator it=
data.begin();
204 bool passFilter=
true;
207 if(it->validRatio() && it->ratio()<
minRatio_) passFilter=
false;
208 else if(it->validRatio() && it->ratio()>
maxRatio_) passFilter=
false;
209 else if(it->numHPDHits()>=
minHPDHits_) passFilter=
false;
210 else if(it->numRBXHits()>=
minRBXHits_) passFilter=
false;
212 else if(it->numZeros()>=
minZeros_) passFilter=
false;
215 else if(!it->PassTS4TS5()) passFilter=
false;
224 LogDebug(
"") <<
"HLTHcalMETNoiseCleaner debug: Found a noisy RBX: "
225 <<
"energy=" << it->energy() <<
"; "
226 <<
"ratio=" << it->ratio() <<
"; "
227 <<
"# RBX hits=" << it->numRBXHits() <<
"; "
228 <<
"# HPD hits=" << it->numHPDHits() <<
"; "
229 <<
"# Zeros=" << it->numZeros() <<
"; "
230 <<
"min time=" << it->minHighEHitTime() <<
"; "
231 <<
"max time=" << it->maxHighEHitTime() <<
"; "
232 <<
"passTS4TS5=" << it->PassTS4TS5() <<
"; "
233 <<
"RBX EMF=" << it->RBXEMF()
240 if(isNoise && nNoise==1){
244 for( noiseTowersIt = noiseTowers.
begin(); noiseTowersIt != noiseTowers.
end(); noiseTowersIt++){
246 towerVec.SetPtEtaPhi((*noiseTowersIt)->pt(),(*noiseTowersIt)->eta(),(*noiseTowersIt)->phi());
247 noiseHPDVector+=towerVec;
249 if(noiseHPDVector.Mag()>0) noiseHPDVector.SetPtEtaPhi(noiseHPDVector.Pt(),0,noiseHPDVector.Phi());
250 else noiseHPDVector.SetPtEtaPhi(0,0,0);
253 if(isNoise && cntr > 0){
254 CleanedMET->push_back(inCaloMet);
255 iEvent.
put(CleanedMET);
259 if(!isNoise && cntr == 0){
260 CleanedMET->push_back(inCaloMet);
261 iEvent.
put(CleanedMET);
265 if(!isNoise && nNoise>0){
268 for( noiseTowersIt = noiseTowers.
begin(); noiseTowersIt != noiseTowers.
end(); noiseTowersIt++){
270 towerVec.SetPtEtaPhi((*noiseTowersIt)->pt(),(*noiseTowersIt)->eta(),(*noiseTowersIt)->phi());
271 secondHPDVector+=towerVec;
273 if(secondHPDVector.Mag()>0) secondHPDVector.SetPtEtaPhi(secondHPDVector.Pt(),0,secondHPDVector.Phi());
274 else secondHPDVector.SetPtEtaPhi(0,0,0);
279 if(noiseHPDVector.Mag()==0){
280 CleanedMET->push_back(inCaloMet);
281 iEvent.
put(CleanedMET);
289 float METsumet = met_h->front().energy();
291 metVec+=noiseHPDVector;
293 float ZMETsumet = METsumet-noiseHPDVector.Mag();
294 float ZMETpt = metVec.Pt();
295 float ZMETphi = metVec.Phi();
302 if(secondHPDVector.Mag()>0.){
303 secondHPDVector.SetPtEtaPhi(secondHPDVector.Pt(),noiseHPDVector.Eta(),noiseHPDVector.Phi());
304 metVec-= secondHPDVector;
305 SMETsumet = METsumet-noiseHPDVector.Mag();
306 SMETpt = metVec.Pt();
307 SMETphi = metVec.Phi();
310 float CorMetSumEt,CorMetPt,CorMetPhi;
312 CorMetSumEt = ZMETsumet;
316 CorMetSumEt = SMETsumet;
322 CleanedMET->push_back(corMet);
323 iEvent.
put(CleanedMET);
356 p4TL.SetPtEtaPhiM(pt,0.,phi,0.);
357 const LorentzVector
p4(p4TL.X(),p4TL.Y(),0,p4TL.T());
358 const Point vtx( 0.0, 0.0, 0.0 );
T getParameter(std::string const &) const
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
~HLTHcalMETNoiseCleaner()
std::vector< std::pair< double, double > > TS4TS5UpperCut_
std::set< CommonHcalNoiseRBXData, noisedatacomp > noisedataset_t
MET made from CaloTowers.
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.
virtual bool filter(edm::Event &, const edm::EventSetup &)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
HLTHcalMETNoiseCleaner(const edm::ParameterSet &)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
edm::InputTag HcalNoiseRBXCollectionTag_
XYZPointD XYZPoint
point in space with cartesian internal representation
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_
double EtFractionHadronic