CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HcalTB06Analysis.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HcalTestBeam
4 // Class : HcalTB06Analysis
5 //
6 // Implementation:
7 // Main analysis class for Hcal Test Beam 2006 Analysis
8 //
9 // Original Author:
10 // Created: 19 November 2015
11 //
12 
13 // user include files
16 
17 // to retreive hits
22 
25 
36 
38 
41 
42 #include "Randomize.hh"
43 #include "globals.hh"
44 
45 #include <CLHEP/Units/GlobalSystemOfUnits.h>
46 #include <CLHEP/Units/GlobalPhysicalConstants.h>
47 
48 // system include files
49 #include <string>
50 #include <vector>
51 
52 //#define EDM_ML_DEBUG
53 
54 class HcalTB06Analysis : public edm::one::EDAnalyzer<edm::one::SharedResources> {
55 public:
56  explicit HcalTB06Analysis(const edm::ParameterSet& p);
57  ~HcalTB06Analysis() override;
58 
59  void beginJob() override;
60  void endJob() override;
61  void analyze(const edm::Event& e, const edm::EventSetup& c) override;
62 
63  HcalTB06Analysis(const HcalTB06Analysis&) = delete;
64  const HcalTB06Analysis& operator=(const HcalTB06Analysis&) = delete;
65 
66 private:
70  bool m_ECAL;
71 
72  int count;
77 
78  double m_eta;
79  double m_phi;
80  double m_ener;
81  double m_timeLimit;
82  double m_widthEcal;
83  double m_widthHcal;
84  double m_factEcal;
85  double m_factHcal;
86  std::vector<int> m_PDG;
87 
89 };
90 
92  usesResource("TFileService");
93 
94  m_ECAL = p.getParameter<bool>("ECAL");
95  if (m_ECAL) {
96  m_EcalToken = consumes<edm::PCaloHitContainer>(edm::InputTag("g4SimHits", "EcalHitsEB"));
97  }
98  m_HcalToken = consumes<edm::PCaloHitContainer>(edm::InputTag("g4SimHits", "HcalHits"));
99  m_BeamToken = consumes<edm::PCaloHitContainer>(edm::InputTag("g4SimHits", "HcalTB06BeamHits"));
100  m_eta = p.getParameter<double>("MinEta");
101  m_phi = p.getParameter<double>("MinPhi");
102  m_ener = p.getParameter<double>("MinE");
103  m_PDG = p.getParameter<std::vector<int> >("PartID");
104 
105  double minEta = p.getParameter<double>("MinEta");
106  double maxEta = p.getParameter<double>("MaxEta");
107  double minPhi = p.getParameter<double>("MinPhi");
108  double maxPhi = p.getParameter<double>("MaxPhi");
109  double beamEta = (maxEta + minEta) * 0.5;
110  double beamPhi = (maxPhi + minPhi) * 0.5;
111  if (beamPhi < 0) {
112  beamPhi += twopi;
113  }
114 
115  m_idxetaEcal = 13;
116  m_idxphiEcal = 13;
117 
118  m_idxetaHcal = (int)(beamEta / 0.087) + 1;
119  m_idxphiHcal = (int)(beamPhi / 0.087) + 6;
120  if (m_idxphiHcal > 72) {
121  m_idxphiHcal -= 73;
122  }
123 
124  edm::ParameterSet ptb = p.getParameter<edm::ParameterSet>("TestBeamAnalysis");
125  m_timeLimit = ptb.getParameter<double>("TimeLimit");
126  m_widthEcal = ptb.getParameter<double>("EcalWidth");
127  m_widthHcal = ptb.getParameter<double>("HcalWidth");
128  m_factEcal = ptb.getParameter<double>("EcalFactor");
129  m_factHcal = ptb.getParameter<double>("HcalFactor");
130  double eMIP = ptb.getParameter<double>("MIP");
131 
132  edm::LogInfo("HcalTB06Analysis") << "Beam parameters: E(GeV)= " << m_ener << " pdgID= " << m_PDG[0]
133  << "\n eta= " << m_eta << " idx_etaEcal= " << m_idxetaEcal
134  << " idx_etaHcal= " << m_idxetaHcal << " phi= " << m_phi
135  << " idx_phiEcal= " << m_idxphiEcal << " idx_phiHcal= " << m_idxphiHcal
136  << "\n EcalFactor= " << m_factEcal << " EcalWidth= " << m_widthEcal << " GeV"
137  << "\n HcalFactor= " << m_factHcal << " HcalWidth= " << m_widthHcal << " GeV"
138  << " MIP= " << eMIP << " GeV"
139  << "\n TimeLimit= " << m_timeLimit << " ns"
140  << "\n";
141  m_histo = new HcalTB06Histo(ptb);
142 }
143 
145 
146 void HcalTB06Analysis::beginJob() { edm::LogInfo("HcalTB06Analysis") << " =====> Begin of Run"; }
147 
149  edm::LogInfo("HcalTB06Analysis") << " =====> End of Run; Total number of events: " << count;
150 }
151 
153  ++count;
154 
155  //Beam Information
157 
161  std::vector<double> eCalo(6, 0), eTrig(7, 0);
162 
163  const std::vector<PCaloHit>* EcalHits = nullptr;
164  if (m_ECAL) {
165  evt.getByToken(m_EcalToken, Ecal);
166  EcalHits = Ecal.product();
167  }
168  evt.getByToken(m_HcalToken, Hcal);
169  const std::vector<PCaloHit>* HcalHits = Hcal.product();
170  evt.getByToken(m_BeamToken, Beam);
171  const std::vector<PCaloHit>* BeamHits = Beam.product();
172 
173  // Total Energy
174  double eecals = 0.;
175  double ehcals = 0.;
176 
177  unsigned int ne = 0;
178  unsigned int nh = 0;
179  if (m_ECAL) {
180  ne = EcalHits->size();
181  for (unsigned int i = 0; i < ne; ++i) {
182  EBDetId ecalid((*EcalHits)[i].id());
183 #ifdef EDM_ML_DEBUG
184  edm::LogVerbatim("HcalTBSim") << "EB " << i << " " << ecalid.ieta() << ":" << m_idxetaEcal << " "
185  << ecalid.iphi() << ":" << m_idxphiEcal << " " << (*EcalHits)[i].time() << ":"
186  << m_timeLimit << " " << (*EcalHits)[i].energy();
187 #endif
188  // 7x7 crystal selection
189  if (std::abs(m_idxetaEcal - ecalid.ieta()) <= 3 && std::abs(m_idxphiEcal - ecalid.iphi()) <= 3 &&
190  (*EcalHits)[i].time() < m_timeLimit) {
191  eCalo[0] += (*EcalHits)[i].energy();
192  }
193  }
194  if (m_widthEcal > 0.0) {
195  eCalo[1] = G4RandGauss::shoot(0.0, m_widthEcal);
196  }
197  eecals = m_factEcal * (eCalo[0] + eCalo[1]);
198  }
199  if (HcalHits) {
200  nh = HcalHits->size();
201  for (unsigned int i = 0; i < nh; ++i) {
202  HcalDetId hcalid((*HcalHits)[i].id());
203 #ifdef EDM_ML_DEBUG
204  edm::LogVerbatim("HcalTBSim") << "HC " << i << " " << hcalid.subdet() << " " << hcalid.ieta() << ":"
205  << m_idxetaHcal << " " << hcalid.iphi() << ":" << m_idxphiHcal << " "
206  << (*HcalHits)[i].time() << ":" << m_timeLimit << " " << (*HcalHits)[i].energy();
207 #endif
208  // 3x3 towers selection
209  if (std::abs(m_idxetaHcal - hcalid.ieta()) <= 1 && std::abs(m_idxphiHcal - hcalid.iphi()) <= 1 &&
210  (*HcalHits)[i].time() < m_timeLimit) {
211  if (hcalid.subdet() != HcalOuter) {
212  eCalo[2] += (*HcalHits)[i].energy();
213  } else {
214  eCalo[4] += (*HcalHits)[i].energy();
215  }
216  }
217  }
218  if (m_widthHcal > 0.0) {
219  eCalo[3] = G4RandGauss::shoot(0.0, m_widthHcal);
220  eCalo[5] = G4RandGauss::shoot(0.0, m_widthHcal);
221  }
222  ehcals = m_factHcal * eCalo[2] + eCalo[3];
223  }
224  double etots = eecals + ehcals;
225 
226  edm::LogInfo("HcalTBSim") << "HcalTB06Analysis:: Etot(MeV)= " << etots << " E(Ecal)= " << eecals
227  << " E(Hcal)= " << ehcals << " Nhits(ECAL)= " << ne << " Nhits(HCAL)= " << nh;
228  m_histo->fillEdep(etots, eecals, ehcals);
229 
230  if (BeamHits) {
231  for (unsigned int i = 0; i < BeamHits->size(); ++i) {
232  unsigned int id = ((*BeamHits)[i].id());
233  int det, lay, ix, iy;
234  HcalTestBeamNumbering::unpackIndex(id, det, lay, ix, iy);
235  if ((det == 1) && ((*BeamHits)[i].time() < m_timeLimit)) {
236  if (lay > 0 && lay <= 4) {
237  eTrig[lay - 1] += (*BeamHits)[i].energy();
238  } else if (lay == 7 || lay == 8) {
239  eTrig[lay - 2] += (*BeamHits)[i].energy();
240  } else if (lay >= 11 && lay <= 14) {
241  eTrig[4] += (*BeamHits)[i].energy();
242  }
243  }
244  }
245  }
246 
247  edm::LogInfo("HcalTBSim") << "HcalTB06Analysis:: Trigger Info: " << eTrig[0] << ":" << eTrig[1] << ":" << eTrig[2]
248  << ":" << eTrig[3] << ":" << eTrig[4] << ":" << eTrig[5] << ":" << eTrig[6];
249 
250  m_histo->fillTree(eCalo, eTrig);
251 }
252 
254 
const HcalTB06Analysis & operator=(const HcalTB06Analysis &)=delete
Log< level::Info, true > LogVerbatim
const edm::EventSetup & c
void beginJob() override
edm::EDGetTokenT< edm::PCaloHitContainer > m_BeamToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void analyze(const edm::Event &e, const edm::EventSetup &c) override
void fillEdep(double etots, double eecals, double ehcals)
double maxEta
int iphi() const
get the crystal iphi
Definition: EBDetId.h:51
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
void fillTree(std::vector< double > &ecalo, std::vector< double > &etrig)
HcalTB06Histo * m_histo
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
edm::EDGetTokenT< edm::PCaloHitContainer > m_HcalToken
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
int ieta() const
get the crystal ieta
Definition: EBDetId.h:49
uint32_t nh
Log< level::Info, false > LogInfo
T const * product() const
Definition: Handle.h:70
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
~HcalTB06Analysis() override
HcalTB06Analysis(const edm::ParameterSet &p)
std::vector< int > m_PDG
static void unpackIndex(const uint32_t &idx, int &det, int &lay, int &x, int &y)
void fillPrimary(double energy, double eta, double phi)
edm::EDGetTokenT< edm::PCaloHitContainer > m_EcalToken
void endJob() override