CMS 3D CMS Logo

ParametrizedSubtractor.cc
Go to the documentation of this file.
8 
10 
11 #include "TFile.h"
12 
13 #include <string>
14 #include <iostream>
15 using namespace std;
16 
18  for (std::map<int, double>::iterator iter = esigma_.begin(); iter != esigma_.end(); ++iter) {
19  iter->second = s * (iter->second);
20  }
21 }
22 
24  : PileUpSubtractor(iConfig, std::move(iC)),
25  dropZeroTowers_(iConfig.getUntrackedParameter<bool>("dropZeroTowers", true)),
26  cbins_(nullptr) {
27  centTag_ = iC.consumes<reco::Centrality>(
28  iConfig.getUntrackedParameter<edm::InputTag>("centTag", edm::InputTag("hiCentrality", "", "RECO")));
29 
30  interpolate_ = iConfig.getParameter<bool>("interpolate");
31  sumRecHits_ = iConfig.getParameter<bool>("sumRecHits");
32 
33  std::string ifname = "RecoHI/HiJetAlgos/data/PU_DATA.root";
34  TFile* inf = new TFile(edm::FileInPath(ifname).fullPath().data());
35  fPU = (TF1*)inf->Get("fPU");
36  fMean = (TF1*)inf->Get("fMean");
37  fRMS = (TF1*)inf->Get("fRMS");
38  hC = (TH1D*)inf->Get("hC");
39 
40  for (int i = 0; i < 40; ++i) {
41  hEta.push_back((TH1D*)inf->Get(Form("hEta_%d", i)));
42  hEtaMean.push_back((TH1D*)inf->Get(Form("hEtaMean_%d", i)));
43  hEtaRMS.push_back((TH1D*)inf->Get(Form("hEtaRMS_%d", i)));
44  }
45 }
46 
48  LogDebug("PileUpSubtractor") << "The subtractor setting up geometry...\n";
49 
50  // The function below that is commented out was deleted from
51  // DataFormats/HeavyIonEvent/src/Centrality.cc
52  // in June 2015. See comments associated with that commit.
53  // if(!cbins_) getCentralityBinsFromDB(iSetup);
54 
56  iEvent.getByToken(centTag_, cent);
57 
58  centrality_ = cent->EtHFhitSum();
59  bin_ = 40 - hC->FindBin(centrality_);
60  if (bin_ > 39)
61  bin_ = 39;
62  if (bin_ < 0)
63  bin_ = 0;
64 
65  if (!geo_) {
67  iSetup.get<CaloGeometryRecord>().get(pG);
68  geo_ = pG.product();
69  std::vector<DetId> alldid = geo_->getValidDetIds();
70 
71  int ietaold = -10000;
72  ietamax_ = -10000;
73  ietamin_ = 10000;
74  for (std::vector<DetId>::const_iterator did = alldid.begin(); did != alldid.end(); did++) {
75  if ((*did).det() == DetId::Hcal) {
76  HcalDetId hid = HcalDetId(*did);
77  if ((hid).depth() == 1) {
78  allgeomid_.push_back(*did);
79 
80  if ((hid).ieta() != ietaold) {
81  ietaold = (hid).ieta();
82  geomtowers_[(hid).ieta()] = 1;
83  if ((hid).ieta() > ietamax_)
84  ietamax_ = (hid).ieta();
85  if ((hid).ieta() < ietamin_)
86  ietamin_ = (hid).ieta();
87  } else {
88  geomtowers_[(hid).ieta()]++;
89  }
90  }
91  }
92  }
93  }
94 
95  for (int i = ietamin_; i < ietamax_ + 1; i++) {
96  emean_[i] = 0.;
97  esigma_[i] = 0.;
98  ntowersWithJets_[i] = 0;
99  }
100 }
101 
102 void ParametrizedSubtractor::calculatePedestal(vector<fastjet::PseudoJet> const& coll) { return; }
103 
104 void ParametrizedSubtractor::subtractPedestal(vector<fastjet::PseudoJet>& coll) {
105  if (false) {
106  return;
107  } else {
108  LogDebug("PileUpSubtractor") << "The subtractor subtracting pedestals...\n";
109 
110  int it = -100;
111  vector<fastjet::PseudoJet> newcoll;
112 
113  for (vector<fastjet::PseudoJet>::iterator input_object = coll.begin(), fjInputsEnd = coll.end();
114  input_object != fjInputsEnd;
115  ++input_object) {
116  reco::CandidatePtr const& itow = (*inputs_)[input_object->user_index()];
117 
118  it = ieta(itow);
119  iphi(itow);
120 
121  double Original_Et = itow->et();
122  if (sumRecHits_) {
123  Original_Et = getEt(itow);
124  }
125 
126  double etnew = Original_Et - getPU(it, true, true);
127  float mScale = etnew / input_object->Et();
128  if (etnew < 0.)
129  mScale = 0.;
130 
131  math::XYZTLorentzVectorD towP4(input_object->px() * mScale,
132  input_object->py() * mScale,
133  input_object->pz() * mScale,
134  input_object->e() * mScale);
135 
136  int index = input_object->user_index();
137  input_object->reset(towP4.px(), towP4.py(), towP4.pz(), towP4.energy());
138  input_object->set_user_index(index);
139  if (etnew > 0. && dropZeroTowers_)
140  newcoll.push_back(*input_object);
141  }
142  if (dropZeroTowers_)
143  coll = newcoll;
144  }
145 }
146 
147 void ParametrizedSubtractor::calculateOrphanInput(vector<fastjet::PseudoJet>& orphanInput) { orphanInput = *fjInputs_; }
148 
150  LogDebug("PileUpSubtractor") << "The subtractor correcting jets...\n";
151  jetOffset_.clear();
152 
153  using namespace reco;
154 
155  (*fjInputs_) = fjOriginalInputs_;
158 
159  if (false) {
160  const fastjet::JetDefinition& def = fjClusterSeq_->jet_def();
161  if (!doAreaFastjet_ && !doRhoFastjet_) {
162  fastjet::ClusterSequence newseq(*fjInputs_, def);
163  (*fjClusterSeq_) = newseq;
164  } else {
165  fastjet::ClusterSequenceArea newseq(*fjInputs_, def, *fjActiveArea_);
166  (*fjClusterSeq_) = newseq;
167  }
168 
169  (*fjJets_) = fastjet::sorted_by_pt(fjClusterSeq_->inclusive_jets(jetPtMin_));
170  }
171 
172  jetOffset_.reserve(fjJets_->size());
173 
174  vector<fastjet::PseudoJet>::iterator pseudojetTMP = fjJets_->begin(), jetsEnd = fjJets_->end();
175  for (; pseudojetTMP != jetsEnd; ++pseudojetTMP) {
176  int ijet = pseudojetTMP - fjJets_->begin();
177  jetOffset_[ijet] = 0;
178 
179  std::vector<fastjet::PseudoJet> towers = sorted_by_pt(fjClusterSeq_->constituents(*pseudojetTMP));
180 
181  double newjetet = 0.;
182  for (vector<fastjet::PseudoJet>::const_iterator ito = towers.begin(), towEnd = towers.end(); ito != towEnd; ++ito) {
183  const reco::CandidatePtr& originalTower = (*inputs_)[ito->user_index()];
184  int it = ieta(originalTower);
185  double Original_Et = originalTower->et();
186 
187  if (sumRecHits_) {
188  Original_Et = getEt(originalTower);
189  }
190 
191  double etnew = Original_Et - getPU(it, true, true);
192  if (etnew < 0.)
193  etnew = 0;
194  newjetet = newjetet + etnew;
195  jetOffset_[ijet] += Original_Et - etnew;
196  }
197 
198  if (sumRecHits_) {
199  double mScale = newjetet / pseudojetTMP->Et();
200  int cshist = pseudojetTMP->cluster_hist_index();
201  pseudojetTMP->reset(pseudojetTMP->px() * mScale,
202  pseudojetTMP->py() * mScale,
203  pseudojetTMP->pz() * mScale,
204  pseudojetTMP->e() * mScale);
205  pseudojetTMP->set_cluster_hist_index(cshist);
206  }
207  }
208 }
209 
211  const CaloTower* ctc = dynamic_cast<const CaloTower*>(in.get());
212  const GlobalPoint& pos = geo_->getPosition(ctc->id());
213  double energy = ctc->emEnergy() + ctc->hadEnergy();
214 
215  if (false) {
216  energy = 0;
217  const std::vector<DetId>& hitids = ctc->constituents();
218  for (unsigned int i = 0; i < hitids.size(); ++i) {
219  }
220  }
221 
222  double et = energy * sin(pos.theta());
223  return et;
224 }
225 
227  const CaloTower* ctc = dynamic_cast<const CaloTower*>(in.get());
228  const GlobalPoint& pos = geo_->getPosition(ctc->id());
229  double eta = pos.eta();
230  return eta;
231 }
232 
234  int it = ieta(in);
235  return getPU(it, true, false);
236 }
237 
239  int it = ieta(in);
240  return getPU(it, false, true);
241 }
242 
244  int it = ieta(in);
245  return getPU(it, true, true);
246 }
247 
248 double ParametrizedSubtractor::getPU(int ieta, bool addMean, bool addSigma) const {
249  //double e = hEta[bin_]->GetBinContent(hEta[bin_]->FindBin(ieta));
250  //double c = fPU->Eval(centrality_);
251 
252  double em = hEtaMean[bin_]->GetBinContent(hEtaMean[bin_]->FindBin(ieta));
253  double cm = fMean->Eval(centrality_);
254 
255  double er = hEtaRMS[bin_]->GetBinContent(hEtaRMS[bin_]->FindBin(ieta));
256  double cr = fRMS->Eval(centrality_);
257 
258  if (interpolate_) {
259  double n = 0;
260  int hbin = 40 - bin_;
261  double centerweight = (centrality_ - hC->GetBinCenter(hbin));
262  double lowerweight = (centrality_ - hC->GetBinLowEdge(hbin));
263  double upperweight = (centrality_ - hC->GetBinLowEdge(hbin + 1));
264 
265  em *= lowerweight * upperweight;
266  er *= lowerweight * upperweight;
267  n += lowerweight * upperweight;
268 
269  if (bin_ > 0) {
270  em += upperweight * centerweight * hEtaMean[bin_]->GetBinContent(hEtaMean[bin_ - 1]->FindBin(ieta));
271  er += upperweight * centerweight * hEtaRMS[bin_]->GetBinContent(hEtaRMS[bin_ - 1]->FindBin(ieta));
272  n += upperweight * centerweight;
273  }
274 
275  if (bin_ < 39) {
276  em += lowerweight * centerweight * hEtaMean[bin_]->GetBinContent(hEtaMean[bin_ + 1]->FindBin(ieta));
277  er += lowerweight * centerweight * hEtaRMS[bin_]->GetBinContent(hEtaRMS[bin_ + 1]->FindBin(ieta));
278  n += lowerweight * centerweight;
279  }
280  em /= n;
281  er /= n;
282  }
283 
284  // return e*c;
285  return addMean * em * cm + addSigma * nSigmaPU_ * er * cr;
286 }
#define LogDebug(id)
double getEt(const reco::CandidatePtr &in) const
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< double > jetOffset_
double getEta(const reco::CandidatePtr &in) const
std::map< int, double > esigma_
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
std::vector< fastjet::PseudoJet > * fjJets_
std::vector< TH1D * > hEtaRMS
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:139
std::vector< fastjet::PseudoJet > fjOriginalInputs_
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define nullptr
void calculateOrphanInput(std::vector< fastjet::PseudoJet > &orphanInput) override
std::vector< TH1D * > hEtaMean
int ieta(const reco::CandidatePtr &in) const
std::map< int, int > geomtowers_
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
std::vector< fastjet::PseudoJet > * fjInputs_
std::map< int, double > emean_
double getPileUpAtTower(const reco::CandidatePtr &in) const override
int iEvent
Definition: GenABIO.cc:224
double emEnergy() const
Definition: CaloTower.h:134
double getSigmaAtTower(const reco::CandidatePtr &in) const override
std::vector< TH1D * > hEta
std::map< int, int > ntowersWithJets_
edm::EDGetTokenT< reco::Centrality > centTag_
GlobalPoint getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:50
const std::vector< DetId > & constituents() const
Definition: CaloTower.h:128
double getPU(int ieta, bool addMean, bool addSigma) const
double hadEnergy() const
Definition: CaloTower.h:135
int iphi(const reco::CandidatePtr &in) const
CaloTowerDetId id() const
Definition: CaloTower.h:127
JetCorrectorParametersCollection coll
Definition: classes.h:10
ActiveAreaSpecPtr fjActiveArea_
ClusterSequencePtr fjClusterSeq_
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
Definition: CaloGeometry.cc:75
T eta() const
Definition: PV3DBase.h:73
double EtHFhitSum() const
Definition: Centrality.h:21
void subtractPedestal(std::vector< fastjet::PseudoJet > &coll) override
void calculatePedestal(std::vector< fastjet::PseudoJet > const &coll) override
fixed size matrix
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
T get() const
Definition: EventSetup.h:73
double getMeanAtTower(const reco::CandidatePtr &in) const override
CaloGeometry const * geo_
JetCorrectorParameters::Definitions def
Definition: classes.h:6
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511
std::vector< HcalDetId > allgeomid_
void setupGeometryMap(edm::Event &iEvent, const edm::EventSetup &iSetup) override
ParametrizedSubtractor(const edm::ParameterSet &iConfig, edm::ConsumesCollector &&iC)