CMS 3D CMS Logo

ColinsSoperVariablesComputer.cc
Go to the documentation of this file.
1 //
2 
16 
19 
23 #include "TLorentzVector.h"
24 
26 public:
27  explicit ColinsSoperVariablesComputer(const edm::ParameterSet& iConfig);
29 
30  void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
31 
32 private:
34 };
35 
37  : parentBosonToken_(consumes<edm::View<reco::Candidate>>(iConfig.getParameter<edm::InputTag>("parentBoson"))) {
38  produces<edm::ValueMap<float>>("costheta");
39  produces<edm::ValueMap<float>>("sin2theta");
40  produces<edm::ValueMap<float>>("tanphi");
41 }
42 
44 
46  using namespace edm;
47 
48  // read input
50  iEvent.getByToken(parentBosonToken_, bosons);
51 
52  // prepare vector for output
53  std::vector<float> values;
54  std::vector<float> values2;
55  std::vector<float> values3;
56 
57  // fill: use brute force
58  double costheta = -10.0;
59  double sin2theta = -10.0;
60  double tanphi = -10.0;
61 
62  const reco::Candidate* daughter1 = nullptr;
63  const reco::Candidate* daughter2 = nullptr;
64  TLorentzVector mu(0., 0., 0., 0.);
65  TLorentzVector mubar(0., 0., 0., 0.);
66  bool isOS = false;
67  int charge1 = 0, charge2 = 0;
68  double res[3] = {-10., -10., -10.};
69 
70  View<reco::Candidate>::const_iterator boson, endbosons = bosons->end();
71 
72  for (boson = bosons->begin(); boson != endbosons; ++boson) {
73  daughter1 = boson->daughter(0);
74  daughter2 = boson->daughter(1);
75 
76  if (!(nullptr == daughter1 || nullptr == daughter2)) {
77  charge1 = daughter1->charge();
78  charge2 = daughter2->charge();
79  isOS = charge1 * charge2 < 0;
80  if (isOS && charge1 < 0) {
81  mu.SetPxPyPzE(daughter1->px(), daughter1->py(), daughter1->pz(), daughter1->energy());
82  mubar.SetPxPyPzE(daughter2->px(), daughter2->py(), daughter2->pz(), daughter2->energy());
83  }
84  if (isOS && charge1 > 0) {
85  mu.SetPxPyPzE(daughter2->px(), daughter2->py(), daughter2->pz(), daughter2->energy());
86  mubar.SetPxPyPzE(daughter1->px(), daughter1->py(), daughter1->pz(), daughter1->energy());
87  }
88  }
89 
90  calCSVariables(mu, mubar, res, boson->pz() < 0.0);
91 
92  costheta = res[0];
93  sin2theta = res[1];
94  tanphi = res[2];
95 
96  values.push_back(costheta);
97  values2.push_back(sin2theta);
98  values3.push_back(tanphi);
99  }
100 
101  // convert into ValueMap and store
102  auto valMap = std::make_unique<ValueMap<float>>();
104  filler.insert(bosons, values.begin(), values.end());
105  filler.fill();
106  iEvent.put(std::move(valMap), "costheta");
107 
108  // ---> same for sin2theta
109  auto valMap2 = std::make_unique<ValueMap<float>>();
110  ValueMap<float>::Filler filler2(*valMap2);
111  filler2.insert(bosons, values2.begin(), values2.end());
112  filler2.fill();
113  iEvent.put(std::move(valMap2), "sin2theta");
114 
115  // ---> same for tanphi
116  auto valMap3 = std::make_unique<ValueMap<float>>();
117  ValueMap<float>::Filler filler3(*valMap3);
118  filler3.insert(bosons, values3.begin(), values3.end());
119  filler3.fill();
120  iEvent.put(std::move(valMap3), "tanphi");
121 }
122 
virtual double energy() const =0
energy
virtual const Candidate * daughter(size_type i) const =0
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
virtual double pz() const =0
z coordinate of momentum vector
ColinsSoperVariablesComputer(const edm::ParameterSet &iConfig)
const edm::EDGetTokenT< edm::View< reco::Candidate > > parentBosonToken_
Definition: Electron.h:6
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
virtual int charge() const =0
electric charge
virtual double py() const =0
y coordinate of momentum vector
const int mubar
Definition: Constants.h:23
virtual double px() const =0
x coordinate of momentum vector
void calCSVariables(TLorentzVector mu, TLorentzVector mubar, double *res, bool swap)
fixed size matrix
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:88
void produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
def move(src, dest)
Definition: eostools.py:511