CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTHcalTowerNoiseCleaner.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Class: HLTHcalTowerNoiseCleaner
4 //
12 //
13 // Original Author: Alexander Mott
14 // Created: Mon Nov 21 11:32:00 CEST 2011
15 //
16 //
17 //
18 
19 
25 
27 
34 
38 
39 #include <iostream>
40 #include <string>
41 #include <fstream>
42 #include <TVector3.h>
43 #include <TLorentzVector.h>
44 #include <set>
45 
47 
48 //#include <Point.h>
49 
51  : HcalNoiseRBXCollectionTag_(iConfig.getParameter<edm::InputTag>("HcalNoiseRBXCollection")),
52  TowerCollectionTag_(iConfig.getParameter<edm::InputTag>("CaloTowerCollection")),
53  severity_(iConfig.getParameter<int> ("severity")),
54  maxNumRBXs_(iConfig.getParameter<int>("maxNumRBXs")),
55  numRBXsToConsider_(iConfig.getParameter<int>("numRBXsToConsider")),
56  needEMFCoincidence_(iConfig.getParameter<bool>("needEMFCoincidence")),
57  minRBXEnergy_(iConfig.getParameter<double>("minRBXEnergy")),
58  minRatio_(iConfig.getParameter<double>("minRatio")),
59  maxRatio_(iConfig.getParameter<double>("maxRatio")),
60  minHPDHits_(iConfig.getParameter<int>("minHPDHits")),
61  minRBXHits_(iConfig.getParameter<int>("minRBXHits")),
62  minHPDNoOtherHits_(iConfig.getParameter<int>("minHPDNoOtherHits")),
63  minZeros_(iConfig.getParameter<int>("minZeros")),
64  minHighEHitTime_(iConfig.getParameter<double>("minHighEHitTime")),
65  maxHighEHitTime_(iConfig.getParameter<double>("maxHighEHitTime")),
66  maxRBXEMF_(iConfig.getParameter<double>("maxRBXEMF")),
67  minRecHitE_(iConfig.getParameter<double>("minRecHitE")),
68  minLowHitE_(iConfig.getParameter<double>("minLowHitE")),
69  minHighHitE_(iConfig.getParameter<double>("minHighHitE")),
70  TS4TS5EnergyThreshold_(iConfig.getParameter<double>("TS4TS5EnergyThreshold"))
71 {
72 
73  std::vector<double> TS4TS5UpperThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperThreshold");
74  std::vector<double> TS4TS5UpperCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperCut");
75  std::vector<double> TS4TS5LowerThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerThreshold");
76  std::vector<double> TS4TS5LowerCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerCut");
77 
78  for(int i = 0; i < (int)TS4TS5UpperThresholdTemp.size() && i < (int)TS4TS5UpperCutTemp.size(); i++)
79  TS4TS5UpperCut_.push_back(std::pair<double, double>(TS4TS5UpperThresholdTemp[i], TS4TS5UpperCutTemp[i]));
80  sort(TS4TS5UpperCut_.begin(), TS4TS5UpperCut_.end());
81 
82  for(int i = 0; i < (int)TS4TS5LowerThresholdTemp.size() && i < (int)TS4TS5LowerCutTemp.size(); i++)
83  TS4TS5LowerCut_.push_back(std::pair<double, double>(TS4TS5LowerThresholdTemp[i], TS4TS5LowerCutTemp[i]));
84  sort(TS4TS5LowerCut_.begin(), TS4TS5LowerCut_.end());
85 
86  m_theHcalNoiseToken = consumes<reco::HcalNoiseRBXCollection>(HcalNoiseRBXCollectionTag_);
87  m_theCaloTowerCollectionToken = consumes<CaloTowerCollection>(TowerCollectionTag_);
88 
89  produces<CaloTowerCollection>();
90 }
91 
92 
94 
95 void
98  desc.add<edm::InputTag>("HcalNoiseRBXCollection",edm::InputTag("hltHcalNoiseInfoProducer"));
99  desc.add<edm::InputTag>("CaloTowerCollection",edm::InputTag("hltTowerMakerForAll"));
100  desc.add<double>("maxTowerNoiseEnergyFraction",0.5);
101  desc.add<int>("severity",1);
102  desc.add<int>("maxNumRBXs",2);
103  desc.add<int>("numRBXsToConsider",2);
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);
119 
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);
128 
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("hltHcalTowerNoiseCleaner",desc);
134 }
135 
136 //
137 // member functions
138 //
139 
141 {
142  using namespace reco;
143 
144  //get the calo MET / MHT
147 
148  std::set<unsigned int> noisyTowers;
149 
150  if(not tower_h.isValid()){ //No towers MET, don't do anything and accept the event
151  edm::LogError("HLTHcalTowerNoiseCleaner") << "Input Tower Collection is not Valid";
152  return;
153  }
154 
155 
156  // get the RBXs produced by RecoMET/METProducers/HcalNoiseInfoProducer
158  iEvent.getByToken(m_theHcalNoiseToken,rbxs_h);
159  if(!rbxs_h.isValid()) {
160  edm::LogWarning("HLTHcalTowerNoiseCleaner") << "Could not find HcalNoiseRBXCollection product named "
161  << HcalNoiseRBXCollectionTag_ << "." << std::endl;
162  severity_=0;
163  }
164 
165  // create a sorted set of the RBXs, ordered by energy
167  for(HcalNoiseRBXCollection::const_iterator it=rbxs_h->begin(); it!=rbxs_h->end(); ++it) {
168  const HcalNoiseRBX &rbx=(*it);
171  data.insert(d);
172  }
173 
174  // data is now sorted by RBX energy
175  // only consider top N=numRBXsToConsider_ energy RBXs
176  if(severity_>0){
177  for(noisedataset_t::const_iterator it=data.begin();
178  it!=data.end();
179  it++) {
180 
181 
182  bool passFilter=true;
183  bool passEMF=true;
184  if(it->energy()>minRBXEnergy_) {
185  if(it->validRatio() && it->ratio()<minRatio_) passFilter=false;
186  else if(it->validRatio() && it->ratio()>maxRatio_) passFilter=false;
187  else if(it->numHPDHits()>=minHPDHits_) passFilter=false;
188  else if(it->numRBXHits()>=minRBXHits_) passFilter=false;
189  else if(it->numHPDNoOtherHits()>=minHPDNoOtherHits_) passFilter=false;
190  else if(it->numZeros()>=minZeros_) passFilter=false;
191  else if(it->minHighEHitTime()<minHighEHitTime_) passFilter=false;
192  else if(it->maxHighEHitTime()>maxHighEHitTime_) passFilter=false;
193  else if(!it->PassTS4TS5()) passFilter=false;
194 
195  if(it->RBXEMF()<maxRBXEMF_){
196  passEMF=false;
197  }
198  }
199 
200  if((needEMFCoincidence_ && !passEMF && !passFilter) ||
201  (!needEMFCoincidence_ && !passFilter)) { // check for noise
202  LogDebug("") << "HLTHcalTowerNoiseCleaner debug: Found a noisy RBX: "
203  << "energy=" << it->energy() << "; "
204  << "ratio=" << it->ratio() << "; "
205  << "# RBX hits=" << it->numRBXHits() << "; "
206  << "# HPD hits=" << it->numHPDHits() << "; "
207  << "# Zeros=" << it->numZeros() << "; "
208  << "min time=" << it->minHighEHitTime() << "; "
209  << "max time=" << it->maxHighEHitTime() << "; "
210  << "passTS4TS5=" << it->PassTS4TS5() << "; "
211  << "RBX EMF=" << it->RBXEMF()
212  << std::endl;
213  // add calotowers associated with this RBX to the noise list
214  edm::RefVector<CaloTowerCollection> noiseTowers = it->rbxTowers();
216  //add these calotowers to the noisy list
217  for( noiseTowersIt = noiseTowers.begin(); noiseTowersIt != noiseTowers.end(); noiseTowersIt++){
218  edm::Ref<edm::SortedCollection<CaloTower> > tower_ref = *noiseTowersIt;
219  CaloTowerDetId id = tower_ref->id();
220  noisyTowers.insert( id.denseIndex() );
221  }}
222  } // done with noise loop
223  }//if(severity_>0)
224 
225  //output collection
226  std::auto_ptr<CaloTowerCollection> OutputTowers(new CaloTowerCollection() );
227 
229 
230  for(inTowersIt = tower_h->begin(); inTowersIt != tower_h->end(); inTowersIt++){
231  const CaloTower & tower = (*inTowersIt);
232  CaloTowerDetId id = tower.id();
233  if(noisyTowers.find( id.denseIndex() ) == noisyTowers.end()){ // the tower is not noisy
234  OutputTowers->push_back(*inTowersIt);
235  }
236  }
237  iEvent.put(OutputTowers);
238 
239 }
240 
241 
#define LogDebug(id)
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
HLTHcalTowerNoiseCleaner(const edm::ParameterSet &)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::set< CommonHcalNoiseRBXData, noisedatacomp > noisedataset_t
std::vector< CaloTower >::const_iterator const_iterator
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:249
ProductID id() const
Accessor for product ID.
Definition: Ref.h:256
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:244
std::vector< std::pair< double, double > > TS4TS5UpperCut_
int iEvent
Definition: GenABIO.cc:230
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
edm::EDGetTokenT< CaloTowerCollection > m_theCaloTowerCollectionToken
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
virtual void produce(edm::Event &, const edm::EventSetup &)
CaloTowerDetId id() const
Definition: CaloTower.h:87
edm::EDGetTokenT< reco::HcalNoiseRBXCollection > m_theHcalNoiseToken
void add(std::string const &label, ParameterSetDescription const &psetDescription)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
edm::SortedCollection< CaloTower > CaloTowerCollection
Definition: CaloTowerFwd.h:15
std::vector< std::pair< double, double > > TS4TS5LowerCut_