CMS 3D CMS Logo

MCPizeroAnalyzer.cc
Go to the documentation of this file.
1 #include <iostream>
2 //
7 //
13 //
18 //
20 //
27 //
30 
31 //
32 #include "TFile.h"
33 #include "TH1.h"
34 #include "TH2.h"
35 #include "TTree.h"
36 #include "TVector3.h"
37 #include "TProfile.h"
38 //
39 
40 using namespace std;
41 
43  : fOutputFileName_(pset.getUntrackedParameter<string>("HistOutFile", std::string("TestConversions.root"))),
44  fOutputFile_(nullptr) {}
45 
47 
49  nEvt_ = 0;
50 
52 
53  fOutputFile_ = new TFile(fOutputFileName_.c_str(), "RECREATE");
54 
56  h_MCPizE_ = new TH1F("MCPizE", "MC piz energy", 100, 0., 200.);
57  h_MCPizPhi_ = new TH1F("MCPizPhi", "MC piz phi", 40, -3.14, 3.14);
58  h_MCPizEta_ = new TH1F("MCPizEta", "MC piz eta", 40, -3., 3.);
59  h_MCPizUnEta_ = new TH1F("MCPizUnEta", "MC un piz eta", 40, -3., 3.);
60  h_MCPiz1ConEta_ = new TH1F("MCPiz1ConEta", "MC con piz eta: at least one converted photon", 40, -3., 3.);
61  h_MCPiz2ConEta_ = new TH1F("MCPiz2ConEta", "MC con piz eta: two converted photons", 40, -3., 3.);
62  h_MCPizMass1_ = new TH1F("MCPizMass1", "Piz mass unconverted ", 100, 0., 200);
63  h_MCPizMass2_ = new TH1F("MCPizMass2", "Piz mass converted ", 100, 0., 200);
64 
65  // All Photons from Pizeros
66  h_MCPhoE_ = new TH1F("MCPhoE", "MC photon energy", 100, 0., 200.);
67  h_MCPhoPhi_ = new TH1F("MCPhoPhi", "MC photon phi", 40, -3.14, 3.14);
68  h_MCPhoEta_ = new TH1F("MCPhoEta", "MC photon eta", 40, -3., 3.);
69 
70  // Converted photons
71  h_MCConvPhoE_ = new TH1F("MCConvPhoE", "MC converted photon energy", 100, 0., 200.);
72  h_MCConvPhoPhi_ = new TH1F("MCConvPhoPhi", "MC converted photon phi", 40, -3.14, 3.14);
73  h_MCConvPhoEta_ = new TH1F("MCConvPhoEta", "MC converted photon eta", 40, -3., 3.);
74  h_MCConvPhoR_ = new TH1F("MCConvPhoR", "MC converted photon R", 120, 0., 120.);
75  // Electrons from converted photons
76  h_MCEleE_ = new TH1F("MCEleE", "MC ele energy", 100, 0., 200.);
77  h_MCElePhi_ = new TH1F("MCElePhi", "MC ele phi", 40, -3.14, 3.14);
78  h_MCEleEta_ = new TH1F("MCEleEta", "MC ele eta", 40, -3., 3.);
79  h_BremFrac_ = new TH1F("bremFrac", "brem frac ", 50, 0., 1.);
80  h_BremEnergy_ = new TH1F("bremE", "Brem energy", 100, 0., 200.);
81 
82  h_EleEvsPhoE_ = new TH2F("eleEvsPhoE", "eleEvsPhoE", 100, 0., 200., 100, 0., 200.);
83 
84  return;
85 }
86 
87 float MCPizeroAnalyzer::etaTransformation(float EtaParticle, float Zvertex) {
88  //---Definitions
89  const float PI = 3.1415927;
90  //UNUSED const float TWOPI = 2.0*PI;
91 
92  //---Definitions for ECAL
93  const float R_ECAL = 136.5;
94  const float Z_Endcap = 328.0;
95  const float etaBarrelEndcap = 1.479;
96 
97  //---ETA correction
98 
99  float Theta = 0.0;
100  float ZEcal = R_ECAL * sinh(EtaParticle) + Zvertex;
101 
102  if (ZEcal != 0.0)
103  Theta = atan(R_ECAL / ZEcal);
104  if (Theta < 0.0)
105  Theta = Theta + PI;
106  float ETA = -log(tan(0.5 * Theta));
107 
108  if (fabs(ETA) > etaBarrelEndcap) {
109  float Zend = Z_Endcap;
110  if (EtaParticle < 0.0)
111  Zend = -Zend;
112  float Zlen = Zend - Zvertex;
113  float RR = Zlen / sinh(EtaParticle);
114  Theta = atan(RR / Zend);
115  if (Theta < 0.0)
116  Theta = Theta + PI;
117  ETA = -log(tan(0.5 * Theta));
118  }
119  //---Return the result
120  return ETA;
121  //---end
122 }
123 
125  //---Definitions
126  const float PI = 3.1415927;
127  const float TWOPI = 2.0 * PI;
128 
129  if (phi > PI) {
130  phi = phi - TWOPI;
131  }
132  if (phi < -PI) {
133  phi = phi + TWOPI;
134  }
135 
136  // cout << " Float_t PHInormalization out " << PHI << endl;
137  return phi;
138 }
139 
141  using namespace edm;
142  //UNUSED const float etaPhiDistance=0.01;
143  // Fiducial region
144  //UNUSED const float TRK_BARL =0.9;
145  //UNUSED const float BARL = 1.4442; // DAQ TDR p.290
146  //UNUSED const float END_LO = 1.566;
147  //UNUSED const float END_HI = 2.5;
148  // Electron mass
149  //UNUSED const Float_t mElec= 0.000511;
150 
151  nEvt_++;
152  LogInfo("MCPizeroAnalyzer") << "MCPizeroAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_
153  << "\n";
154  // LogDebug("MCPizeroAnalyzer") << "MCPizeroAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_ <<"\n";
155  std::cout << "MCPizeroAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_ << "\n";
156 
158  std::cout << " MCPizeroAnalyzer Looking for MC truth "
159  << "\n";
160 
161  //get simtrack info
162  std::vector<SimTrack> theSimTracks;
163  std::vector<SimVertex> theSimVertices;
164 
167  e.getByLabel("g4SimHits", SimTk);
168  e.getByLabel("g4SimHits", SimVtx);
169 
170  theSimTracks.insert(theSimTracks.end(), SimTk->begin(), SimTk->end());
171  theSimVertices.insert(theSimVertices.end(), SimVtx->begin(), SimVtx->end());
172  std::cout << " MCPizeroAnalyzer This Event has " << theSimTracks.size() << " sim tracks " << std::endl;
173  std::cout << " MCPizeroAnalyzer This Event has " << theSimVertices.size() << " sim vertices " << std::endl;
174  if (theSimTracks.empty())
175  std::cout << " Event number " << e.id() << " has NO sim tracks " << std::endl;
176 
177  std::vector<PizeroMCTruth> MCPizeroeros = thePizeroMCTruthFinder_->find(theSimTracks, theSimVertices);
178  std::cout << " MCPizeroAnalyzer MCPizeroeros size " << MCPizeroeros.size() << std::endl;
179 
180  for (std::vector<PizeroMCTruth>::const_iterator iPiz = MCPizeroeros.begin(); iPiz != MCPizeroeros.end(); ++iPiz) {
181  h_MCPizE_->Fill((*iPiz).fourMomentum().e());
182  h_MCPizEta_->Fill((*iPiz).fourMomentum().pseudoRapidity());
183  h_MCPizPhi_->Fill((*iPiz).fourMomentum().phi());
184 
185  std::vector<PhotonMCTruth> mcPhotons = (*iPiz).photons();
186  std::cout << " MCPizeroAnalyzer mcPhotons size " << mcPhotons.size() << std::endl;
187 
188  float px = mcPhotons[0].fourMomentum().x() + mcPhotons[1].fourMomentum().x();
189  float py = mcPhotons[0].fourMomentum().y() + mcPhotons[1].fourMomentum().y();
190  float pz = mcPhotons[0].fourMomentum().z() + mcPhotons[1].fourMomentum().z();
191  float e = mcPhotons[0].fourMomentum().e() + mcPhotons[1].fourMomentum().e();
192  float invM = sqrt(e * e - px * px - py * py - pz * pz) * 1000;
193  h_MCPizMass1_->Fill(invM);
194 
195  int converted = 0;
196  for (std::vector<PhotonMCTruth>::const_iterator iPho = mcPhotons.begin(); iPho != mcPhotons.end(); ++iPho) {
197  h_MCPhoE_->Fill((*iPho).fourMomentum().e());
198  h_MCPhoEta_->Fill((*iPho).fourMomentum().pseudoRapidity());
199  h_MCPhoPhi_->Fill((*iPho).fourMomentum().phi());
200  if ((*iPho).isAConversion()) {
201  converted++;
202 
203  h_MCConvPhoE_->Fill((*iPho).fourMomentum().e());
204  h_MCConvPhoEta_->Fill((*iPho).fourMomentum().pseudoRapidity());
205  h_MCConvPhoPhi_->Fill((*iPho).fourMomentum().phi());
206  h_MCConvPhoR_->Fill((*iPho).vertex().perp());
207 
208  std::vector<ElectronMCTruth> mcElectrons = (*iPho).electrons();
209  std::cout << " MCPizeroAnalyzer mcElectrons size " << mcElectrons.size() << std::endl;
210 
211  for (std::vector<ElectronMCTruth>::const_iterator iEl = mcElectrons.begin(); iEl != mcElectrons.end(); ++iEl) {
212  if ((*iEl).fourMomentum().e() < 30)
213  continue;
214  h_MCEleE_->Fill((*iEl).fourMomentum().e());
215  h_MCEleEta_->Fill((*iEl).fourMomentum().pseudoRapidity());
216  h_MCElePhi_->Fill((*iEl).fourMomentum().phi());
217 
218  h_EleEvsPhoE_->Fill((*iPho).fourMomentum().e(), (*iEl).fourMomentum().e());
219 
220  float totBrem = 0;
221  for (unsigned int iBrem = 0; iBrem < (*iEl).bremVertices().size(); ++iBrem)
222  totBrem += (*iEl).bremMomentum()[iBrem].e();
223 
224  h_BremFrac_->Fill(totBrem / (*iEl).fourMomentum().e());
225  h_BremEnergy_->Fill(totBrem);
226  }
227  }
228  }
229 
230  if (converted > 0) {
231  h_MCPiz1ConEta_->Fill((*iPiz).fourMomentum().pseudoRapidity());
232  if (converted == 2)
233  h_MCPiz2ConEta_->Fill((*iPiz).fourMomentum().pseudoRapidity());
234  } else {
235  h_MCPizUnEta_->Fill((*iPiz).fourMomentum().pseudoRapidity());
236  }
237  }
238 }
239 
241  fOutputFile_->Write();
242  fOutputFile_->Close();
243 
244  edm::LogInfo("MCPizeroAnalyzer") << "Analyzed " << nEvt_ << "\n";
245  std::cout << "MCPizeroAnalyzer::endJob Analyzed " << nEvt_ << " events "
246  << "\n";
247 
248  return;
249 }
float phiNormalization(float &a)
~MCPizeroAnalyzer() override
void analyze(const edm::Event &, const edm::EventSetup &) override
MCPizeroAnalyzer(const edm::ParameterSet &)
#define nullptr
float etaTransformation(float a, float b)
#define ETA
T sqrt(T t)
Definition: SSEVec.h:19
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
static float etaBarrelEndcap
#define TWOPI
Definition: DQMSourcePi0.cc:36
#define PI
Definition: QcdUeDQM.h:37
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:488
std::string fOutputFileName_
std::vector< PizeroMCTruth > find(const std::vector< SimTrack > &simTracks, const std::vector< SimVertex > &simVertices)
void endJob() override
PizeroMCTruthFinder * thePizeroMCTruthFinder_
void beginJob() override
edm::EventID id() const
Definition: EventBase.h:59
HLT enums.
static float Z_Endcap
static float R_ECAL