CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTTauMCProducer.cc
Go to the documentation of this file.
2 
3 using namespace edm;
4 using namespace std;
5 using namespace reco;
6 
8 {
9 
10  //One Parameter Set per Collection
11 
12  MC_ = mc.getUntrackedParameter<edm::InputTag>("GenParticles");
13  ptMinMCTau_ = mc.getUntrackedParameter<double>("ptMinTau",5.);
14  ptMinMCMuon_ = mc.getUntrackedParameter<double>("ptMinMuon",2.);
15  ptMinMCElectron_ = mc.getUntrackedParameter<double>("ptMinElectron",5.);
16  m_PDG_ = mc.getUntrackedParameter<std::vector<int> >("BosonID");
17  etaMax = mc.getUntrackedParameter<double>("EtaMax",2.5);
18 
19  produces<LorentzVectorCollection>("LeptonicTauLeptons");
20  produces<LorentzVectorCollection>("LeptonicTauElectrons");
21  produces<LorentzVectorCollection>("LeptonicTauMuons");
22  produces<LorentzVectorCollection>("HadronicTauOneProng");
23  produces<LorentzVectorCollection>("HadronicTauThreeProng");
24  produces<LorentzVectorCollection>("HadronicTauOneAndThreeProng");
25  produces<LorentzVectorCollection>("TauOther");
26  produces<LorentzVectorCollection>("Neutrina");
27  produces<std::vector<int> >("Mothers");
28 
29 }
30 
32 
34 {
35  //All the code from HLTTauMCInfo is here :-)
36 
37  auto_ptr<LorentzVectorCollection> product_Electrons(new LorentzVectorCollection);
38  auto_ptr<LorentzVectorCollection> product_Muons(new LorentzVectorCollection);
39  auto_ptr<LorentzVectorCollection> product_Leptons(new LorentzVectorCollection);
40  auto_ptr<LorentzVectorCollection> product_OneProng(new LorentzVectorCollection);
41  auto_ptr<LorentzVectorCollection> product_ThreeProng(new LorentzVectorCollection);
42  auto_ptr<LorentzVectorCollection> product_OneAndThreeProng(new LorentzVectorCollection);
43  auto_ptr<LorentzVectorCollection> product_Other(new LorentzVectorCollection);
44  auto_ptr<LorentzVectorCollection> product_Neutrina(new LorentzVectorCollection);
45  auto_ptr<std::vector<int> > product_Mothers(new std::vector<int>);
46 
48  iEvent.getByLabel(MC_, genParticles);
49 
50  GenParticleCollection::const_iterator p = genParticles->begin();
51 
52  for (;p != genParticles->end(); ++p ) {
53  //Check the PDG ID
54  bool pdg_ok = true;
55  for(size_t pi =0;pi<m_PDG_.size();++pi)
56  {
57  if(abs((*p).pdgId())== m_PDG_[pi] && abs((*p).status()) == 3 ){
58  pdg_ok = true;
59  // cout<<" Bsoson particles: "<< (*p).pdgId()<< " " <<(*p).status() << " "<< pdg_ok<<endl;
60  }
61  }
62 
63  // Check if the boson is one of interest and if there is a valid vertex
64  if( pdg_ok )
65  {
66  product_Mothers->push_back((*p).pdgId());
67 
68  std::vector<GenParticle*> decayProducts;
69 
70  TLorentzVector Boson((*p).px(),(*p).py(),(*p).pz(),(*p).energy());
71 
72  for (GenParticle::const_iterator BosonIt=(*p).begin(); BosonIt != (*p).end(); BosonIt++){
73  // cout<<" Dparticles: "<< (*BosonIt).pdgId() << " "<< (*BosonIt).status()<<endl;
74 
75  if (abs((*BosonIt).pdgId()) == 15 && ((*BosonIt).status()==3)) //if it is a Tau and decayed
76  {
77  decayProducts.clear();
78  // cout<<" Boson daugther particles: "<< (*BosonIt).pdgId() << " "<< (*BosonIt).status()<< endl;
79  for (GenParticle::const_iterator TauIt = (*BosonIt).begin(); TauIt != (*BosonIt).end(); TauIt++) {
80  // cout<<" Tau daughter particles: "<< (*TauIt).pdgId() << " "<< (*TauIt).status()<<endl;
81 
82  if (abs((*TauIt).pdgId()) == 15 && ((*TauIt).status()==2)) //if it is a Tau and decayed
83  {
84  decayProducts = getGenStableDecayProducts((reco::GenParticle*) & (*TauIt));
85  // for (GenParticle::const_iterator TauIt2 = (*TauIt).begin(); TauIt2 != (*TauIt).end(); TauIt2++) {
86  // cout<<" Real Tau particles: "<< (*TauIt2).pdgId() << " "<< (*TauIt2).status()<< " mother: "<< (*TauIt2).mother()->pdgId() << endl;
87  // }
88  }
89  }
90 
91 
92  if ( !decayProducts.empty() )
93  {
94 
95  LorentzVector Visible_Taus(0.,0.,0.,0.);
96  LorentzVector TauDecayProduct(0.,0.,0.,0.);
97  LorentzVector Neutrino(0.,0.,0.,0.);
98 
99  int numElectrons = 0;
100  int numMuons = 0;
101  int numChargedPions = 0;
102  int numNeutralPions = 0;
103  int numNeutrinos = 0;
104  int numOtherParticles = 0;
105 
106 
107  for (std::vector<GenParticle*>::iterator pit = decayProducts.begin(); pit != decayProducts.end(); pit++)
108  {
109  int pdg_id = abs((*pit)->pdgId());
110  if (pdg_id == 11) numElectrons++;
111  else if (pdg_id == 13) numMuons++;
112  else if (pdg_id == 211) numChargedPions++;
113  else if (pdg_id == 111) numNeutralPions++;
114  else if (pdg_id == 12 ||
115  pdg_id == 14 ||
116  pdg_id == 16) {
117  numNeutrinos++;
118  if (pdg_id == 16) {
119  Neutrino.SetPxPyPzE((*pit)->px(),(*pit)->py(),(*pit)->pz(),(*pit)->energy());
120  }
121  }
122  else if (pdg_id != 22) {
123  numOtherParticles++;
124  }
125 
126  if (pdg_id != 12 &&
127  pdg_id != 14 &&
128  pdg_id != 16){
129  TauDecayProduct.SetPxPyPzE((*pit)->px(),(*pit)->py(),(*pit)->pz(),(*pit)->energy());
130  Visible_Taus+=TauDecayProduct;
131  }
132  // cout<< "This has to be the same: " << (*pit)->pdgId() << " "<< (*pit)->status()<< " mother: "<< (*pit)->mother()->pdgId() << endl;
133  }
134 
135  int tauDecayMode = kOther;
136 
137  if ( numOtherParticles == 0 ){
138  if ( numElectrons == 1 ){
139  //--- tau decays into electrons
140  tauDecayMode = kElectron;
141  } else if ( numMuons == 1 ){
142  //--- tau decays into muons
143  tauDecayMode = kMuon;
144  } else {
145  //--- hadronic tau decays
146  switch ( numChargedPions ){
147  case 1 :
148  switch ( numNeutralPions ){
149  case 0 :
150  tauDecayMode = kOneProng0pi0;
151  break;
152  case 1 :
153  tauDecayMode = kOneProng1pi0;
154  break;
155  case 2 :
156  tauDecayMode = kOneProng2pi0;
157  break;
158  }
159  break;
160  case 3 :
161  switch ( numNeutralPions ){
162  case 0 :
163  tauDecayMode = kThreeProng0pi0;
164  break;
165  case 1 :
166  tauDecayMode = kThreeProng1pi0;
167  break;
168  }
169  break;
170  }
171  }
172  }
173 
174 
175  // cout<< "So we have a: " << tauDecayMode <<endl;
176 
177  if(tauDecayMode == kElectron)
178  {
179  if((abs(Visible_Taus.eta())<etaMax)&&(Visible_Taus.pt()>ptMinMCElectron_)){
180  product_Electrons->push_back(Visible_Taus);
181  product_Leptons->push_back(Visible_Taus);
182  }
183  }
184  else if (tauDecayMode == kMuon)
185  {
186 
187  if((abs(Visible_Taus.eta())<etaMax)&&(Visible_Taus.pt()>ptMinMCMuon_)){
188  product_Muons->push_back(Visible_Taus);
189  product_Leptons->push_back(Visible_Taus);
190  }
191  }
192  else if(tauDecayMode == kOneProng0pi0 ||
193  tauDecayMode == kOneProng1pi0 ||
194  tauDecayMode == kOneProng2pi0 )
195  {
196  if ((abs(Visible_Taus.eta()) < etaMax) && (Visible_Taus.pt() > ptMinMCTau_)){
197  product_OneProng->push_back(Visible_Taus);
198  product_OneAndThreeProng->push_back(Visible_Taus);
199  product_Neutrina->push_back(Neutrino);
200  }
201  }
202  else if (tauDecayMode == kThreeProng0pi0 ||
203  tauDecayMode == kThreeProng1pi0 )
204  {
205  if((abs(Visible_Taus.eta())<etaMax)&&(Visible_Taus.pt()>ptMinMCTau_)) {
206  product_ThreeProng->push_back(Visible_Taus);
207  product_OneAndThreeProng->push_back(Visible_Taus);
208  product_Neutrina->push_back(Neutrino);
209  }
210  }
211  else if (tauDecayMode == kOther)
212  {
213  if((abs(Visible_Taus.eta())<etaMax)&&(Visible_Taus.pt()>ptMinMCTau_)) {
214  product_Other->push_back(Visible_Taus);
215  }
216  }
217  }
218  }
219  }
220  //
221  }
222  }
223  iEvent.put(product_Leptons,"LeptonicTauLeptons");
224  iEvent.put(product_Electrons,"LeptonicTauElectrons");
225  iEvent.put(product_Muons,"LeptonicTauMuons");
226  iEvent.put(product_OneProng,"HadronicTauOneProng");
227  iEvent.put(product_ThreeProng,"HadronicTauThreeProng");
228  iEvent.put(product_OneAndThreeProng,"HadronicTauOneAndThreeProng");
229  iEvent.put(product_Other, "TauOther");
230  iEvent.put(product_Neutrina,"Neutrina");
231  iEvent.put(product_Mothers,"Mothers");
232 
233 
234 }
235 // Helper Function
236 
237 std::vector<reco::GenParticle*> HLTTauMCProducer::getGenStableDecayProducts(const reco::GenParticle* particle)
238 {
239  std::vector<GenParticle*> decayProducts;
240  decayProducts.clear();
241 
242  // std::cout << " Are we ever here?: "<< (*particle).numberOfDaughters() << std::endl;
243  for ( GenParticle::const_iterator daughter_particle = (*particle).begin();daughter_particle != (*particle).end(); ++daughter_particle ){
244 
245  int pdg_id = abs((*daughter_particle).pdgId());
246 
247 // // check if particle is stable
248  if ( pdg_id == 11 || pdg_id == 12 || pdg_id == 13 || pdg_id == 14 || pdg_id == 16 || pdg_id == 111 || pdg_id == 211 ){
249  // stable particle, identified by pdg code
250  decayProducts.push_back((reco::GenParticle*) &(* daughter_particle));
251  }
252  else {
253 // // unstable particle, identified by non-zero decay vertex
254  std::vector<GenParticle*> addDecayProducts = getGenStableDecayProducts((reco::GenParticle*) &(*daughter_particle));
255  for ( std::vector<GenParticle*>::const_iterator adddaughter_particle = addDecayProducts.begin(); adddaughter_particle != addDecayProducts.end(); ++adddaughter_particle ){
256  decayProducts.push_back((*adddaughter_particle));
257  }
258  }
259  }
260  return decayProducts;
261 }
T getUntrackedParameter(std::string const &, T const &) const
std::vector< reco::GenParticle * > getGenStableDecayProducts(const reco::GenParticle *particle)
math::XYZTLorentzVector LorentzVector
#define abs(x)
Definition: mlp_lapack.h:159
const Double_t pi
tuple numMuons
Definition: patZpeak.py:40
HLTTauMCProducer(const edm::ParameterSet &)
int iEvent
Definition: GenABIO.cc:243
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
std::vector< LorentzVector > LorentzVectorCollection
virtual void produce(edm::Event &, const edm::EventSetup &)