CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Type2CorrectionProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 
3 //____________________________________________________________________________||
9 
11 
13 
14 #include <TFormula.h>
15 
16 #include <iostream>
17 #include <vector>
18 
19 //____________________________________________________________________________||
21 {
22 public:
25 
26 private:
27 
28  typedef std::vector<edm::InputTag> vInputTag;
29 
30  typedef std::vector<std::string> vstring;
32  {
33  type2BinningEntryType(const std::string& binCorrformula, const edm::ParameterSet& binCorrParameter, const vInputTag& srcUnclEnergySums)
34  : binLabel_(""),
35  srcUnclEnergySums_(srcUnclEnergySums),
37  {
38  initialize(binCorrformula, binCorrParameter);
39  }
40  type2BinningEntryType(const edm::ParameterSet& cfg, const vInputTag& srcUnclEnergySums)
41  : binLabel_(cfg.getParameter<std::string>("binLabel")),
43  {
44  for ( vInputTag::const_iterator srcUnclEnergySum = srcUnclEnergySums.begin();
45  srcUnclEnergySum != srcUnclEnergySums.end(); ++srcUnclEnergySum ) {
46  std::string instanceLabel = srcUnclEnergySum->instance();
47  if ( instanceLabel != "" && binLabel_ != "" ) instanceLabel.append("#");
48  instanceLabel.append(binLabel_);
49  srcUnclEnergySums_.push_back(edm::InputTag(srcUnclEnergySum->label(), instanceLabel));
50  }
51 
52  std::string binCorrFormula = cfg.getParameter<std::string>("binCorrFormula").data();
53 
54  edm::ParameterSet binCorrParameter = cfg.getParameter<edm::ParameterSet>("binCorrParameter");
55 
56  initialize(binCorrFormula, binCorrParameter);
57  }
58  void initialize(const std::string& binCorrFormula, const edm::ParameterSet& binCorrParameter)
59  {
60  TString formula = binCorrFormula;
61 
62  vstring parNames = binCorrParameter.getParameterNamesForType<double>();
63  int numParameter = parNames.size();
64  binCorrParameter_.resize(numParameter);
65  for ( int parIndex = 0; parIndex < numParameter; ++parIndex ) {
66  const std::string& parName = parNames[parIndex].data();
67 
68  double parValue = binCorrParameter.getParameter<double>(parName);
69  binCorrParameter_[parIndex] = parValue;
70 
71  TString parName_internal = Form("[%i]", parIndex);
72  formula = formula.ReplaceAll(parName.data(), parName_internal);
73  }
74 
75  std::string binCorrFormulaName = std::string("binCorrFormula").append("_").append(binLabel_);
76  binCorrFormula_ = new TFormula(binCorrFormulaName.data(), formula);
77 
78 //--- check that syntax of formula string is valid
79 // (i.e. that TFormula "compiled" without errors)
80  if ( !(binCorrFormula_->GetNdim() <= 1 && binCorrFormula_->GetNpar() == numParameter) )
81  throw cms::Exception("METCorrectionAlgorithm2")
82  << "Formula for Type 2 correction has invalid syntax = " << formula << " !!\n";
83 
84  for ( int parIndex = 0; parIndex < numParameter; ++parIndex ) {
85  binCorrFormula_->SetParameter(parIndex, binCorrParameter_[parIndex]);
86  binCorrFormula_->SetParName(parIndex, parNames[parIndex].data());
87  }
88  }
90  {
91  delete binCorrFormula_;
92  }
93  std::string binLabel_;
95  TFormula* binCorrFormula_;
96  std::vector<double> binCorrParameter_;
97  };
98 
99  std::vector<type2BinningEntryType*> type2Binning_;
100 
101  void produce(edm::Event&, const edm::EventSetup&);
102 
103 };
104 
105 //____________________________________________________________________________||
107 {
108  vInputTag srcUnclEnergySums = cfg.getParameter<vInputTag>("srcUnclEnergySums");
109  if ( cfg.exists("type2Binning") ) {
110  typedef std::vector<edm::ParameterSet> vParameterSet;
111  vParameterSet cfgType2Binning = cfg.getParameter<vParameterSet>("type2Binning");
112  for ( vParameterSet::const_iterator cfgType2BinningEntry = cfgType2Binning.begin();
113  cfgType2BinningEntry != cfgType2Binning.end(); ++cfgType2BinningEntry ) {
114  type2Binning_.push_back(new type2BinningEntryType(*cfgType2BinningEntry, srcUnclEnergySums));
115  }
116  } else {
117  std::string type2CorrFormula = cfg.getParameter<std::string>("type2CorrFormula").data();
118  edm::ParameterSet type2CorrParameter = cfg.getParameter<edm::ParameterSet>("type2CorrParameter");
119  type2Binning_.push_back(new type2BinningEntryType(type2CorrFormula, type2CorrParameter, srcUnclEnergySums));
120  }
121  produces<CorrMETData>("");
122 }
123 
124 //____________________________________________________________________________||
126 {
127  CorrMETData product;
128 
129  for ( std::vector<type2BinningEntryType*>::const_iterator type2BinningEntry = type2Binning_.begin();
130  type2BinningEntry != type2Binning_.end(); ++type2BinningEntry ) {
131  CorrMETData unclEnergySum;
132  for (vInputTag::const_iterator inputTag = (*type2BinningEntry)->srcUnclEnergySums_.begin();
133  inputTag != (*type2BinningEntry)->srcUnclEnergySums_.end(); ++inputTag) {
134  edm::Handle<CorrMETData> unclEnergySummand;
135  evt.getByLabel(*inputTag, unclEnergySummand);
136 
137  unclEnergySum += (*unclEnergySummand);
138  }
139 
140  double unclEnergySumPt = sqrt(unclEnergySum.mex*unclEnergySum.mex + unclEnergySum.mey*unclEnergySum.mey);
141  double unclEnergyScaleFactor = (*type2BinningEntry)->binCorrFormula_->Eval(unclEnergySumPt);
142 
143  unclEnergySum.mex = -unclEnergySum.mex;
144  unclEnergySum.mey = -unclEnergySum.mey;
145 
146  product += (unclEnergyScaleFactor - 1.)*unclEnergySum;
147  }
148 
149  std::auto_ptr<CorrMETData> pprod(new CorrMETData(product));
150  evt.put(pprod, "");
151 }
152 
153 //____________________________________________________________________________||
154 
156 
T getParameter(std::string const &) const
std::vector< edm::InputTag > vInputTag
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::vector< type2BinningEntryType * > type2Binning_
Type2CorrectionProducer(const edm::ParameterSet &)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:195
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
T sqrt(T t)
Definition: SSEVec.h:46
std::vector< std::string > vstring
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
void initialize(const std::string &binCorrFormula, const edm::ParameterSet &binCorrParameter)
a MET correction term
Definition: CorrMETData.h:14
type2BinningEntryType(const edm::ParameterSet &cfg, const vInputTag &srcUnclEnergySums)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
void produce(edm::Event &, const edm::EventSetup &)
type2BinningEntryType(const std::string &binCorrformula, const edm::ParameterSet &binCorrParameter, const vInputTag &srcUnclEnergySums)
double mey
Definition: CorrMETData.h:18
double mex
Definition: CorrMETData.h:17