CMS 3D CMS Logo

CaloRecoTauDiscriminationAgainstElectron.cc
Go to the documentation of this file.
2 
6 
9 
10 /* class CaloRecoTauDiscriminationAgainstElectron
11  * created : Feb 17 2008,
12  * revised : ,
13  * contributors : Konstantinos Petridis, Sebastien Greder,
14  * Maiko Takahashi, Alexandre Nikitenko (Imperial College, London),
15  * Evan Friis (UC Davis)
16  */
17 
18 
19 namespace {
20 using namespace reco;
21 class CaloRecoTauDiscriminationAgainstElectron final : public CaloTauDiscriminationProducerBase {
22  public:
23  explicit CaloRecoTauDiscriminationAgainstElectron(const edm::ParameterSet& iConfig):CaloTauDiscriminationProducerBase(iConfig){
24  CaloTauProducer_ = iConfig.getParameter<edm::InputTag>("CaloTauProducer");
25  leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_ = iConfig.getParameter<double>("leadTrack_HCAL3x3hitsEtSumOverPt_minvalue");
26  ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_ = iConfig.getParameter<bool>("ApplyCut_maxleadTrackHCAL3x3hottesthitDEta");
27  maxleadTrackHCAL3x3hottesthitDEta_ = iConfig.getParameter<double>("maxleadTrackHCAL3x3hottesthitDEta");
28  ApplyCut_leadTrackavoidsECALcrack_ = iConfig.getParameter<bool>("ApplyCut_leadTrackavoidsECALcrack");
29  }
30  ~CaloRecoTauDiscriminationAgainstElectron() override{}
31  double discriminate(const CaloTauRef& theCaloTauRef) const override;
32  void beginEvent(const edm::Event& event, const edm::EventSetup& eventSetup) override;
33  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
34  private:
35  edm::ESHandle<MagneticField> theMagneticField;
36  edm::InputTag CaloTauProducer_;
37  double leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_;
38  bool ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_;
39  double maxleadTrackHCAL3x3hottesthitDEta_;
40  bool ApplyCut_leadTrackavoidsECALcrack_;
41 };
42 
43 void CaloRecoTauDiscriminationAgainstElectron::beginEvent(const edm::Event& event, const edm::EventSetup& eventSetup)
44 {
45  if (ApplyCut_leadTrackavoidsECALcrack_)
46  {
47  // get the magnetic field, if we need it
48  eventSetup.get<IdealMagneticFieldRecord>().get(theMagneticField);
49  }
50 }
51 
52 
53 double CaloRecoTauDiscriminationAgainstElectron::discriminate(const CaloTauRef& theCaloTauRef) const
54 {
55  if (ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_){
56  // optional selection : ask for small |deta| between direction of propag. leading Track - ECAL inner surf. contact point and direction of highest Et hit among HCAL hits inside a 3x3 calo. tower matrix centered on direction of propag. leading Track - ECAL inner surf. contact point
57  if (edm::isNotFinite((*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()) || (*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()>maxleadTrackHCAL3x3hottesthitDEta_) return 0.;
58  }
59  if (ApplyCut_leadTrackavoidsECALcrack_){
60  // optional selection : ask that leading track - ECAL inner surface contact point does not fall inside any ECAL eta crack
61  math::XYZPoint thepropagleadTrackECALSurfContactPoint = TauTagTools::propagTrackECALSurfContactPoint(theMagneticField.product(),(*theCaloTauRef).leadTrack());
62  if(thepropagleadTrackECALSurfContactPoint.R()==0. ||
63  fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalA().second ||
64  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalB().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalB().second) ||
65  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalC().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalC().second) ||
66  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalD().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalD().second) ||
67  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalE().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalE().second))
68  {
69  return 0.;
70  }
71  }
72  if (edm::isNotFinite((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()))
73  {
74  return 0.;
75  } else
76  {
77  if ((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()/(*theCaloTauRef).leadTrack()->pt()<=leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_) return 0.;
78  else return 1.;
79  }
80 }
81 
82  /*
83 void CaloRecoTauDiscriminationAgainstElectron::produce(edm::Event& iEvent,const edm::EventSetup& iEventSetup){
84  edm::Handle<CaloTauCollection> theCaloTauCollection;
85  iEvent.getByLabel(CaloTauProducer_,theCaloTauCollection);
86 
87  // fill the AssociationVector object
88  auto theCaloTauDiscriminatorAgainstElectron = std::make_unique<CaloTauDiscriminator>(CaloTauRefProd(theCaloTauCollection));
89 
90  for(size_t iCaloTau=0;iCaloTau<theCaloTauCollection->size();++iCaloTau) {
91  CaloTauRef theCaloTauRef(theCaloTauCollection,iCaloTau);
92  if (!(*theCaloTauRef).leadTrack()){
93  theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
94  continue;
95  }
96  if (ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_){
97  // optional selection : ask for small |deta| between direction of propag. leading Track - ECAL inner surf. contact point and direction of highest Et hit among HCAL hits inside a 3x3 calo. tower matrix centered on direction of propag. leading Track - ECAL inner surf. contact point
98  if (edm::isNotFinite((*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()) || (*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()>maxleadTrackHCAL3x3hottesthitDEta_){
99  theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
100  continue;
101  }
102  }
103  if (ApplyCut_leadTrackavoidsECALcrack_){
104  // optional selection : ask that leading track - ECAL inner surface contact point does not fall inside any ECAL eta crack
105  edm::ESHandle<MagneticField> theMagneticField;
106  iEventSetup.get<IdealMagneticFieldRecord>().get(theMagneticField);
107  math::XYZPoint thepropagleadTrackECALSurfContactPoint=TauTagTools::propagTrackECALSurfContactPoint(theMagneticField.product(),(*theCaloTauRef).leadTrack());
108  if(thepropagleadTrackECALSurfContactPoint.R()==0. ||
109  fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalA().second ||
110  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalB().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalB().second) ||
111  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalC().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalC().second) ||
112  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalD().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalD().second) ||
113  (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalE().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalE().second)
114  ){
115  theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
116  continue;
117  }
118  }
119  if (edm::isNotFinite((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum())){
120  theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
121  }else{
122  if ((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()/(*theCaloTauRef).leadTrack()->pt()<=leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_) theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
123  else theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,1);
124  }
125  }
126 
127  iEvent.put(std::move(theCaloTauDiscriminatorAgainstElectron));
128 }
129 */
130 
131 }
132 
133 void
135  // caloRecoTauDiscriminationAgainstElectron
137  desc.add<edm::InputTag>("CaloTauProducer", edm::InputTag("caloRecoTauProducer"));
138  desc.add<double>("leadTrack_HCAL3x3hitsEtSumOverPt_minvalue", 0.1);
139  desc.add<double>("maxleadTrackHCAL3x3hottesthitDEta", 0.1);
140  desc.add<bool>("ApplyCut_maxleadTrackHCAL3x3hottesthitDEta", false);
141  {
143  psd0.add<std::string>("BooleanOperator", "and");
144  {
146  psd1.add<double>("cut");
147  psd1.add<edm::InputTag>("Producer");
148  psd0.addOptional<edm::ParameterSetDescription>("leadTrack", psd1);
149  }
150  desc.add<edm::ParameterSetDescription>("Prediscriminants", psd0);
151  }
152  desc.add<bool>("ApplyCut_leadTrackavoidsECALcrack", true);
153  descriptions.add("caloRecoTauDiscriminationAgainstElectron", desc);
154 }
155 
156 DEFINE_FWK_MODULE(CaloRecoTauDiscriminationAgainstElectron);
T getParameter(std::string const &) const
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
math::XYZPoint propagTrackECALSurfContactPoint(const MagneticField *, reco::TrackRef)
Definition: TauTagTools.cc:184
static std::pair< float, float > crack_absEtaIntervalA()
Definition: ECALBounds.h:35
static std::pair< float, float > crack_absEtaIntervalB()
Definition: ECALBounds.h:36
static std::pair< float, float > crack_absEtaIntervalE()
Definition: ECALBounds.h:39
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static std::pair< float, float > crack_absEtaIntervalC()
Definition: ECALBounds.h:37
static std::pair< float, float > crack_absEtaIntervalD()
Definition: ECALBounds.h:38
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
fixed size matrix
T get() const
Definition: EventSetup.h:71
Definition: event.py:1