CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
CalibratedPatElectronProducer Class Reference

#include <CalibratedPatElectronProducer.h>

Inheritance diagram for CalibratedPatElectronProducer:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 CalibratedPatElectronProducer (const edm::ParameterSet &)
 
virtual void produce (edm::Event &, const edm::EventSetup &)
 
virtual ~CalibratedPatElectronProducer ()
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducer ()
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Attributes

bool applyExtraHighEnergyProtection
 
bool applyLinearityCorrection
 
std::string combinationRegressionInputPath
 
int combinationType
 
int correctionsType
 
std::string dataset
 
edm::EDGetTokenT< edm::View
< reco::Candidate > > 
inputPatElectronsToken
 
bool isAOD
 
bool isMC
 
std::string linCorrectionsInputPath
 
double lumiRatio
 
ElectronEPcombinatormyCombinator
 
EpCombinationToolmyEpCombinationTool
 
std::string scaleCorrectionsInputPath
 
bool synchronization
 
ElectronEnergyCalibratortheEnCorrector
 
bool updateEnergyError
 
bool verbose
 

Additional Inherited Members

- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Description: EDProducer of PatElectron objects

Implementation: <Notes on="" implementation>="">

Definition at line 20 of file CalibratedPatElectronProducer.h.

Constructor & Destructor Documentation

CalibratedPatElectronProducer::CalibratedPatElectronProducer ( const edm::ParameterSet cfg)
explicit

Definition at line 47 of file CalibratedPatElectronProducer.cc.

References regressionModifier_cfi::applyExtraHighEnergyProtection, gather_cfg::cout, dataset::dataset, Exception, contentValuesFiles::fullPath, edm::ParameterSet::getParameter(), AlCaHLTBitMon_QueryRunRegistry::string, and verbose.

49 {
50  produces<ElectronCollection>();
51 
52  inputPatElectronsToken = consumes<edm::View<reco::Candidate> >(cfg.getParameter<edm::InputTag>("inputPatElectronsTag"));
53  dataset = cfg.getParameter<std::string>("inputDataset");
54  isMC = cfg.getParameter<bool>("isMC");
55  updateEnergyError = cfg.getParameter<bool>("updateEnergyError");
56  lumiRatio = cfg.getParameter<double>("lumiRatio");
57  correctionsType = cfg.getParameter<int>("correctionsType");
58  applyLinearityCorrection = cfg.getParameter<bool>("applyLinearityCorrection");
59  combinationType = cfg.getParameter<int>("combinationType");
60  verbose = cfg.getParameter<bool>("verbose");
61  synchronization = cfg.getParameter<bool>("synchronization");
62  combinationRegressionInputPath = cfg.getParameter<std::string>("combinationRegressionInputPath");
63  scaleCorrectionsInputPath = cfg.getParameter<std::string>("scaleCorrectionsInputPath");
64  linCorrectionsInputPath = cfg.getParameter<std::string>("linearityCorrectionsInputPath");
65  applyExtraHighEnergyProtection = cfg.getParameter<bool>("applyExtraHighEnergyProtection");
66 
67  //basic checks
68  if ( isMC && ( dataset != "Summer11" && dataset != "Fall11"
69  && dataset != "Summer12" && dataset != "Summer12_DR53X_HCP2012"
70  && dataset != "Summer12_LegacyPaper" ) )
71  {
72  throw cms::Exception("CalibratedPATElectronProducer|ConfigError") << "Unknown MC dataset";
73  }
74  if ( !isMC && ( dataset != "Prompt" && dataset != "ReReco"
75  && dataset != "Jan16ReReco" && dataset != "ICHEP2012"
76  && dataset != "Moriond2013" && dataset != "22Jan2013ReReco" ) )
77  {
78  throw cms::Exception("CalibratedPATElectronProducer|ConfigError") << "Unknown Data dataset";
79  }
80 
81  // Linearity correction only applied on combined momentum obtain with regression combination
83  {
84  std::cout << "[CalibratedElectronProducer] "
85  << "Warning: you chose combinationType!=3 and applyLinearityCorrection=True. Linearity corrections are only applied on top of combination 3." << std::endl;
86  }
87 
88 
89  std::cout << "[CalibratedPATElectronProducer] Correcting scale for dataset " << dataset << std::endl;
90 
91  //initializations
92  std::string pathToDataCorr;
93  switch ( correctionsType )
94  {
95  case 0:
96  break;
97  case 1:
98  if ( verbose )
99  {
100  std::cout << "You choose regression 1 scale corrections" << std::endl;
101  }
102  break;
103  case 2:
104  if ( verbose )
105  {
106  std::cout << "You choose regression 2 scale corrections." << std::endl;
107  }
108  break;
109  case 3:
110  throw cms::Exception("CalibratedPATElectronProducer|ConfigError")
111  << "You choose standard non-regression ecal energy scale corrections. They are not implemented yet.";
112  break;
113  default:
114  throw cms::Exception("CalibratedPATElectronProducer|ConfigError")
115  << "Unknown correctionsType !!!";
116  }
117 
119  (
122  dataset,
125  lumiRatio,
126  isMC,
128  verbose,
130  );
131 
132  if ( verbose )
133  {
134  std::cout << "[CalibratedPATElectronProducer] "
135  << "ElectronEnergyCalibrator object is created " << std::endl;
136  }
137 
140  (
142  "CombinationWeight"
143  );
144 
146 
147  if ( verbose )
148  {
149  std::cout << "[CalibratedPATElectronProducer] "
150  << "Combination tools are created and initialized " << std::endl;
151  }
152 }
edm::EDGetTokenT< edm::View< reco::Candidate > > inputPatElectronsToken
T getParameter(std::string const &) const
bool init(const std::string &regressionFile, const std::string &bdtName="")
ElectronEnergyCalibrator * theEnCorrector
tuple cout
Definition: gather_cfg.py:121
CalibratedPatElectronProducer::~CalibratedPatElectronProducer ( )
virtual

Definition at line 156 of file CalibratedPatElectronProducer.cc.

157 {}

Member Function Documentation

void CalibratedPatElectronProducer::produce ( edm::Event event,
const edm::EventSetup setup 
)
virtual

Implements edm::EDProducer.

Definition at line 159 of file CalibratedPatElectronProducer.cc.

References regressionModifier_cfi::applyExtraHighEnergyProtection, reco::GsfElectron::BADTRACK, reco::Candidate::begin(), reco::GsfElectron::BIGBREM, clone(), gather_cfg::cout, metsig::electron, HI_PhotonSkim_cff::electrons, relativeConstraints::error, Exception, reco::GsfElectron::GAP, reco::GsfElectron::GOLDEN, funct::pow(), DTTTrigCorrFirst::run, reco::GsfElectron::SHOWERING, mathSSE::sqrt(), edm::Event::streamID(), and reco::btau::trackMomentum.

Referenced by JSONExport.JsonExport::export(), HTMLExport.HTMLExport::export(), and HTMLExport.HTMLExportStatic::export().

160 {
161 
163  event.getByToken(inputPatElectronsToken,oldElectrons) ;
164  std::auto_ptr<ElectronCollection> electrons( new ElectronCollection ) ;
165  ElectronCollection::const_iterator electron ;
166  ElectronCollection::iterator ele ;
167  // first clone the initial collection
168  for
169  (
170  edm::View<reco::Candidate>::const_iterator ele=oldElectrons->begin();
171  ele!=oldElectrons->end();
172  ++ele
173  )
174  {
175  const pat::ElectronRef elecsRef = edm::RefToBase<reco::Candidate>(oldElectrons,ele-oldElectrons->begin()).castTo<pat::ElectronRef>();
176  pat::Electron clone = *edm::RefToBase<reco::Candidate>(oldElectrons,ele-oldElectrons->begin()).castTo<pat::ElectronRef>();
177  electrons->push_back(clone);
178  }
179 
180  if (correctionsType != 0 )
181  {
182  for
183  (
184  ele = electrons->begin();
185  ele != electrons->end() ;
186  ++ele
187  )
188  {
189  int elClass = -1;
190  int run = event.run();
191 
192  float r9 = ele->r9();
193  double correctedEcalEnergy = ele->correctedEcalEnergy();
194  double correctedEcalEnergyError = ele->correctedEcalEnergyError();
195  double trackMomentum = ele->trackMomentumAtVtx().R();
196  double trackMomentumError = ele->trackMomentumError();
197  double combinedMomentum = ele->p();
198  double combinedMomentumError = 0;
199  if ( ele->candidateP4Kind() != GsfElectron::P4_UNKNOWN )
200  {
201  combinedMomentumError = ele->p4Error(ele->candidateP4Kind());
202  }
203  // FIXME : p4Error not filled for pure tracker electrons
204  // Recompute it using the parametrization implemented in
205  // RecoEgamma/EgammaElectronAlgos/src/ElectronEnergyCorrector.cc::simpleParameterizationUncertainty()
206  if( !ele->ecalDrivenSeed() )
207  {
208  double error = 999. ;
209  double momentum = (combinedMomentum<15. ? 15. : combinedMomentum);
210  if ( ele->isEB() )
211  {
212  float parEB[3] = { 5.24e-02, 2.01e-01, 1.00e-02} ;
213  error = momentum * sqrt( pow(parEB[0]/sqrt(momentum),2) + pow(parEB[1]/momentum,2) + pow(parEB[2],2) );
214  }
215  else if ( ele->isEE() )
216  {
217  float parEE[3] = { 1.46e-01, 9.21e-01, 1.94e-03} ;
218  error = momentum * sqrt( pow(parEE[0]/sqrt(momentum),2) + pow(parEE[1]/momentum,2) + pow(parEE[2],2) );
219  }
220  combinedMomentumError = error;
221  }
222 
223  if (ele->classification() == reco::GsfElectron::GOLDEN) {elClass = 0;}
224  if (ele->classification() == reco::GsfElectron::BIGBREM) {elClass = 1;}
225  if (ele->classification() == reco::GsfElectron::BADTRACK) {elClass = 2;}
226  if (ele->classification() == reco::GsfElectron::SHOWERING) {elClass = 3;}
227  if (ele->classification() == reco::GsfElectron::GAP) {elClass = 4;}
228 
229  SimpleElectron mySimpleElectron
230  (
231  run,
232  elClass,
233  r9,
234  correctedEcalEnergy,
235  correctedEcalEnergyError,
236  trackMomentum,
237  trackMomentumError,
238  ele->ecalRegressionEnergy(),
239  ele->ecalRegressionError(),
240  combinedMomentum,
241  combinedMomentumError,
242  ele->superCluster()->eta(),
243  ele->isEB(),
244  isMC,
245  ele->ecalDriven(),
246  ele->trackerDrivenSeed()
247  );
248 
249  // energy calibration for ecalDriven electrons
250  if ( ele->core()->ecalDrivenSeed() || correctionsType==2 || combinationType==3 )
251  {
252  theEnCorrector->calibrate(mySimpleElectron, event.streamID());
253 
254  // E-p combination
255 
256  switch ( combinationType )
257  {
258  case 0:
259  if ( verbose )
260  {
261  std::cout << "[CalibratedPATElectronProducer] "
262  << "You choose not to combine." << std::endl;
263  }
264  break;
265  case 1:
266  if ( verbose )
267  {
268  std::cout << "[CalibratedPATElectronProducer] "
269  << "You choose corrected regression energy for standard combination" << std::endl;
270  }
272  myCombinator->combine(mySimpleElectron);
273  break;
274  case 2:
275  if ( verbose )
276  {
277  std::cout << "[CalibratedPATElectronProducer] "
278  << "You choose uncorrected regression energy for standard combination" << std::endl;
279  }
281  myCombinator->combine(mySimpleElectron);
282  break;
283  case 3:
284  if ( verbose )
285  {
286  std::cout << "[CalibratedPATElectronProducer] "
287  << "You choose regression combination." << std::endl;
288  }
290  theEnCorrector->correctLinearity(mySimpleElectron);
291  break;
292  default:
293  throw cms::Exception("CalibratedPATElectronProducer|ConfigError")
294  << "Unknown combination Type !!!" ;
295  }
296 
297  math::XYZTLorentzVector oldMomentum = ele->p4() ;
298  math::XYZTLorentzVector newMomentum_ ;
299  newMomentum_ = math::XYZTLorentzVector
300  ( oldMomentum.x()*mySimpleElectron.getCombinedMomentum()/oldMomentum.t(),
301  oldMomentum.y()*mySimpleElectron.getCombinedMomentum()/oldMomentum.t(),
302  oldMomentum.z()*mySimpleElectron.getCombinedMomentum()/oldMomentum.t(),
303  mySimpleElectron.getCombinedMomentum() ) ;
304 
305  ele->correctMomentum
306  (
307  newMomentum_,
308  mySimpleElectron.getTrackerMomentumError(),
309  mySimpleElectron.getCombinedMomentumError()
310  );
311 
312  if ( verbose )
313  {
314  std::cout << "[CalibratedPATElectronProducer] Combined momentum after saving "
315  << ele->p4().t() << std::endl;
316  }
317  }// end of if (ele.core()->ecalDrivenSeed())
318  }// end of loop on electrons
319  } else
320  {
321  if ( verbose )
322  {
323  std::cout << "[CalibratedPATElectronProducer] "
324  << "You choose not to correct. Uncorrected Regression Energy is taken." << std::endl;
325  }
326  }
327  // Save the electrons
328  event.put(electrons) ;
329 }
edm::EDGetTokenT< edm::View< reco::Candidate > > inputPatElectronsToken
void calibrate(SimpleElectron &electron, edm::StreamID const &)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
T sqrt(T t)
Definition: SSEVec.h:48
std::vector< Electron > ElectronCollection
collectin of Electron objects
Definition: ElectronFwd.h:9
void correctLinearity(SimpleElectron &electron)
void setCombinationMode(int mode)
Analysis-level electron class.
Definition: Electron.h:52
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:85
void combine(SimpleElectron &mySimpleElectron, bool applyExtraHighEnergyProtection=false)
StreamID streamID() const
Definition: Event.h:79
void combine(SimpleElectron &electron)
const_iterator begin() const
first daughter const_iterator
Definition: Candidate.h:144
ElectronEnergyCalibrator * theEnCorrector
tuple cout
Definition: gather_cfg.py:121
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40

Member Data Documentation

bool CalibratedPatElectronProducer::applyExtraHighEnergyProtection
private

Definition at line 42 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::applyLinearityCorrection
private

Definition at line 34 of file CalibratedPatElectronProducer.h.

std::string CalibratedPatElectronProducer::combinationRegressionInputPath
private

Definition at line 39 of file CalibratedPatElectronProducer.h.

int CalibratedPatElectronProducer::combinationType
private

Definition at line 35 of file CalibratedPatElectronProducer.h.

int CalibratedPatElectronProducer::correctionsType
private

Definition at line 33 of file CalibratedPatElectronProducer.h.

std::string CalibratedPatElectronProducer::dataset
private
edm::EDGetTokenT<edm::View<reco::Candidate> > CalibratedPatElectronProducer::inputPatElectronsToken
private

Definition at line 28 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::isAOD
private

Definition at line 30 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::isMC
private
std::string CalibratedPatElectronProducer::linCorrectionsInputPath
private

Definition at line 41 of file CalibratedPatElectronProducer.h.

double CalibratedPatElectronProducer::lumiRatio
private

Definition at line 38 of file CalibratedPatElectronProducer.h.

ElectronEPcombinator* CalibratedPatElectronProducer::myCombinator
private

Definition at line 46 of file CalibratedPatElectronProducer.h.

EpCombinationTool* CalibratedPatElectronProducer::myEpCombinationTool
private

Definition at line 45 of file CalibratedPatElectronProducer.h.

std::string CalibratedPatElectronProducer::scaleCorrectionsInputPath
private

Definition at line 40 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::synchronization
private

Definition at line 37 of file CalibratedPatElectronProducer.h.

ElectronEnergyCalibrator* CalibratedPatElectronProducer::theEnCorrector
private

Definition at line 44 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::updateEnergyError
private

Definition at line 32 of file CalibratedPatElectronProducer.h.

bool CalibratedPatElectronProducer::verbose
private