CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CastorShowerLibrary.cc
Go to the documentation of this file.
1 // File: CastorShowerLibrary.cc
3 // Description: Shower library for CASTOR calorimeter
4 // Adapted from HFShowerLibrary
5 //
6 // Wagner Carvalho
7 //
9 
12 
13 #include "G4VPhysicalVolume.hh"
14 #include "G4Step.hh"
15 #include "G4Track.hh"
16 #include "G4ParticleTable.hh"
17 #include "Randomize.hh"
18 #include "CLHEP/Units/GlobalSystemOfUnits.h"
19 
20 //#define DebugLog
21 
23  : hf(0), evtInfo(0), emBranch(0), hadBranch(0),
24  nMomBin(0), totEvents(0), evtPerBin(0),
25  nBinsE(0),nBinsEta(0),nBinsPhi(0),
26  nEvtPerBinE(0),nEvtPerBinEta(0),nEvtPerBinPhi(0),
27  SLenergies(),SLetas(),SLphis() {
28 
29  initFile(p);
30 
31 }
32 
33 //=============================================================================================
34 
35 
37  if (hf) hf->Close();
38 }
39 
40 
41 //=============================================================================================
42 
45 //
46 // Init TFile and associated TBranch's of CASTOR Root file
47 // holding library events
48 //
50 
51  //
52  // Read PSet for Castor shower library
53  //
54 
55  edm::ParameterSet m_CS = p.getParameter<edm::ParameterSet>("CastorShowerLibrary");
56  edm::FileInPath fp = m_CS.getParameter<edm::FileInPath>("FileName");
57  std::string pTreeName = fp.fullPath();
58  std::string branchEvInfo = m_CS.getUntrackedParameter<std::string>("BranchEvt");
59  std::string branchEM = m_CS.getUntrackedParameter<std::string>("BranchEM");
60  std::string branchHAD = m_CS.getUntrackedParameter<std::string>("BranchHAD");
61  verbose = m_CS.getUntrackedParameter<bool>("Verbosity",false);
62 
63  // Open TFile
64  if (pTreeName.find(".") == 0) pTreeName.erase(0,2);
65  const char* nTree = pTreeName.c_str();
66  hf = TFile::Open(nTree);
67 
68  // Check that TFile has been successfully opened
69  if (!hf->IsOpen()) {
70  edm::LogError("CastorShower") << "CastorShowerLibrary: opening " << nTree << " failed";
71  throw cms::Exception("Unknown", "CastorShowerLibrary")
72  << "Opening of " << pTreeName << " fails\n";
73  } else {
74  edm::LogInfo("CastorShower") << "CastorShowerLibrary: opening " << nTree << " successfully";
75  }
76 
77  // Check for the TBranch holding EventInfo in "Events" TTree
78  TTree* event = (TTree *) hf ->Get("CastorCherenkovPhotons");
79  if (event) {
80  evtInfo = (TBranchObject *) event->GetBranch(branchEvInfo.c_str());
81  if (evtInfo) {
83  } else {
84  edm::LogError("CastorShower") << "CastorShowerLibrary: " << branchEvInfo.c_str()
85  << " Branch does not exit in Event";
86  throw cms::Exception("Unknown", "CastorShowerLibrary") << "Event information absent\n";
87  }
88  } else {
89  edm::LogError("CastorShower") << "CastorShowerLibrary: Events Tree does not exist";
90  throw cms::Exception("Unknown", "CastorShowerLibrary") << "Events tree absent\n";
91  }
92 
93  // Get EM and HAD Branchs
94  emBranch = (TBranchObject *) event->GetBranch(branchEM.c_str());
95  if (verbose) emBranch->Print();
96  hadBranch = (TBranchObject *) event->GetBranch(branchHAD.c_str());
97  if (verbose) hadBranch->Print();
98  edm::LogInfo("CastorShower") << "CastorShowerLibrary: Branch " << branchEM
99  << " has " << emBranch->GetEntries()
100  << " entries and Branch " << branchHAD
101  << " has " << hadBranch->GetEntries()
102  << " entries";
103 
104 }
105 
106 //=============================================================================================
107 
108 void CastorShowerLibrary::loadEventInfo(TBranchObject* branch) {
110 //
111 // Get EventInfo from the "TBranch* branch" of Root file
112 // holding library events
113 //
114 // Based on HFShowerLibrary::loadEventInfo
115 //
117 
119  branch->SetAddress(&eventInfo);
120  branch->GetEntry(0);
121  // Initialize shower library general parameters
122 
124 // nMomBin = eventInfo->Energy.getNBins();
125 // evtPerBin = eventInfo->Energy.getNEvtPerBin();
126 // pmom = eventInfo->Energy.getBin();
132  SLetas = eventInfo->Eta.getBin();
135  SLphis = eventInfo->Phi.getBin();
136 
137  // Convert from GeV to MeV
138  for (unsigned int i=0; i<SLenergies.size(); i++) SLenergies[i] *= GeV;
139 
140  edm::LogInfo("CastorShower") << " CastorShowerLibrary::loadEventInfo : "
141  << "\n \n Total number of events : " << totEvents
142  << "\n Number of bins (E) : " << nBinsE
143  << "\n Number of events/bin (E) : " << nEvtPerBinE
144  << "\n Number of bins (Eta) : " << nBinsEta
145  << "\n Number of events/bin (Eta) : " << nEvtPerBinEta
146  << "\n Number of bins (Phi) : " << nBinsPhi
147  << "\n Number of events/bin (Phi) : " << nEvtPerBinPhi << "\n";
148 
149  for (unsigned int i=0; i<nBinsE; i++)
150  edm::LogInfo("CastorShower") << "CastorShowerLibrary: SLenergies[" << i << "] = "
151  << SLenergies[i]/GeV << " GeV";
152  for (unsigned int i=0; i<nBinsEta; i++)
153  edm::LogInfo("CastorShower") << "CastorShowerLibrary: SLetas[" << i << "] = "
154  << SLetas[i];
155  for (unsigned int i=0; i<nBinsPhi; i++)
156  edm::LogInfo("CastorShower") << "CastorShowerLibrary: SLphis[" << i << "] = "
157  << SLphis[i] << " rad";
158 }
159 
160 //=============================================================================================
161 
162 void CastorShowerLibrary::initParticleTable(G4ParticleTable * theParticleTable) {
164 //
165 // Set particle codes according to PDG encoding
166 //
167 // Based on HFShowerLibrary::initRun
168 //
170 
171  G4String particleName;
172 
173  edm::LogInfo("CastorShower") << "CastorShowerLibrary::initParticleTable"
174  << " *** Accessing PDGEncoding ***" ;
175 
176  emPDG = theParticleTable->FindParticle(particleName="e-")->GetPDGEncoding();
177  epPDG = theParticleTable->FindParticle(particleName="e+")->GetPDGEncoding();
178  gammaPDG = theParticleTable->FindParticle(particleName="gamma")->GetPDGEncoding();
179  pi0PDG = theParticleTable->FindParticle(particleName="pi0")->GetPDGEncoding();
180  etaPDG = theParticleTable->FindParticle(particleName="eta")->GetPDGEncoding();
181  nuePDG = theParticleTable->FindParticle(particleName="nu_e")->GetPDGEncoding();
182  numuPDG = theParticleTable->FindParticle(particleName="nu_mu")->GetPDGEncoding();
183  nutauPDG = theParticleTable->FindParticle(particleName="nu_tau")->GetPDGEncoding();
184  anuePDG = theParticleTable->FindParticle(particleName="anti_nu_e")->GetPDGEncoding();
185  anumuPDG = theParticleTable->FindParticle(particleName="anti_nu_mu")->GetPDGEncoding();
186  anutauPDG = theParticleTable->FindParticle(particleName="anti_nu_tau")->GetPDGEncoding();
187  geantinoPDG = theParticleTable->FindParticle(particleName="geantino")->GetPDGEncoding();
188  mumPDG = theParticleTable->FindParticle(particleName="mu-")->GetPDGEncoding();
189  mupPDG = theParticleTable->FindParticle(particleName="mu+")->GetPDGEncoding();
190 
191 //#ifdef DebugLog
192  LogDebug("CastorShower") << "CastorShowerLibrary: Particle codes for e- = " << emPDG
193  << ", e+ = " << epPDG << ", gamma = " << gammaPDG
194  << ", pi0 = " << pi0PDG << ", eta = " << etaPDG
195  << ", geantino = " << geantinoPDG << "\n nu_e = "
196  << nuePDG << ", nu_mu = " << numuPDG << ", nu_tau = "
197  << nutauPDG << ", anti_nu_e = " << anuePDG
198  << ", anti_nu_mu = " << anumuPDG << ", anti_nu_tau = "
199  << anutauPDG << ", mu- = " << mumPDG << ", mu+ = "
200  << mupPDG;
201 //#endif
202 
203  edm::LogInfo("CastorShower") << " ***** Successfully called: "
204  << "CastorShowerLibrary::initParticleTable() ***** " ;
205 
206 }
207 
208 
209 //=============================================================================================
210 
212 
213  G4StepPoint * preStepPoint = aStep->GetPreStepPoint();
214  // G4StepPoint * postStepPoint = aStep->GetPostStepPoint();
215  G4Track * track = aStep->GetTrack();
216  // Get Z-direction
217  const G4DynamicParticle *aParticle = track->GetDynamicParticle();
218  G4ThreeVector momDir = aParticle->GetMomentumDirection();
219  // double mom = aParticle->GetTotalMomentum();
220 
221  G4ThreeVector hitPoint = preStepPoint->GetPosition();
222  G4String partType = track->GetDefinition()->GetParticleName();
223  int parCode = track->GetDefinition()->GetPDGEncoding();
224 
226  hit.Clear();
227 
228  ok = false;
229  if (parCode == pi0PDG || parCode == etaPDG || parCode == nuePDG ||
230  parCode == numuPDG || parCode == nutauPDG || parCode == anuePDG ||
231  parCode == anumuPDG || parCode == anutauPDG || parCode == geantinoPDG)
232  return hit;
233  ok = true;
234 
235  double pin = preStepPoint->GetTotalEnergy();
236  double etain = momDir.getEta();
237  double phiin = momDir.getPhi();
238 
239  double zint = hitPoint.z();
240  double R=sqrt(hitPoint.x()*hitPoint.x() + hitPoint.y()*hitPoint.y());
241  double theta = atan2(R,std::abs(zint));
242  phiin = atan2(hitPoint.y(),hitPoint.x());
243  etain = -1*(std::log(std::tan((M_PI-theta)/2)));
244 
245  // Replace "interpolation/extrapolation" by new method "select" that just randomly
246  // selects a record from the appropriate energy bin and fills its content to
247  // "showerEvent" instance of class CastorShowerEvent
248 
249  if (parCode == emPDG || parCode == epPDG || parCode == gammaPDG ) {
250  select(0, pin, etain, phiin);
251  // if (pin<SLenergies[nBinsE-1]) {
252  // interpolate(0, pin);
253  // } else {
254  // extrapolate(0, pin);
255  // }
256  } else {
257  select(1, pin, etain, phiin);
258  // if (pin<SLenergies[nBinsE-1]) {
259  // interpolate(1, pin);
260  // } else {
261  // extrapolate(1, pin);
262  // }
263  }
264 
265  hit = (*showerEvent);
266  return hit;
267 
268 }
269 
270 //=============================================================================================
271 
274 //
275 // Retrieve event # "record" from the library and stores it
276 // into vector<CastorShowerHit> showerHit;
277 //
278 // Based on HFShowerLibrary::getRecord
279 //
280 // Modified 02/02/09 by W. Carvalho
281 //
283 
284 #ifdef DebugLog
285  LogDebug("CastorShower") << "CastorShowerLibrary::getRecord: ";
286 #endif
287  int nrc = record;
288  int nHit = 0;
290  if (type > 0) {
291  hadBranch->SetAddress(&showerEvent);
292  hadBranch->GetEntry(nrc);
293  } else {
294  emBranch->SetAddress(&showerEvent);
295  emBranch->GetEntry(nrc);
296  }
297  nHit = showerEvent->getNhit();
298 
299 #ifdef DebugLog
300  LogDebug("CastorShower") << "CastorShowerLibrary::getRecord: Record " << record
301  << " of type " << type << " with " << nHit
302  << " CastorShowerHits";
303 
304 #endif
305 
306 }
307 
308 //=======================================================================================
309 
310 void CastorShowerLibrary::select(int type, double pin, double etain, double phiin) {
312 //
313 // Selects an event from the library based on
314 //
315 // type: 0 --> em
316 // >0 --> had
317 // pin : momentum
318 // etain: eta (if not given, disregard the eta binning
319 // phiin: phi (if not given, disregard the phi binning
320 //
321 // Created 30/01/09 by W. Carvalho
322 //
324 
325  int irec; // to hold record number
326  double r = G4UniformRand(); // to randomly select within an energy bin (r=[0,1])
327 
328  // Randomly select a record from the right energy bin in the library,
329  // based on track momentum (pin)
330 
331  // pin < SLenergies[MIN]
332 /*
333  if (pin<SLenergies[0]) {
334  edm::LogWarning("CastorShower") << "CastorShowerLibrary: Warning, pin = " << pin
335  << " less than minimum SLenergies " << SLenergies[0] << " in library."
336  << " For the moment, selecting hit from the first bin" ;
337  irec = int(nEvtPerBinE*r) + 1;
338  // pin > SLenergies[MAX]
339  } else if (pin>SLenergies[nBinsE]) {
340 
341 // This part needs rethinking because the last element of SLenergies is no longer the upper limit of the bins
342  edm::LogWarning("CastorShower") << "CastorShowerLibrary: Warning, pin = " << pin
343  << " greater than maximum SLenergies " << SLenergies[nBinsE] << " in library."
344  << " For the moment, selecting hit from the last bin";
345  irec = (nBinsE-1)*nEvtPerBinE + int(evtPerBin*r) + 1;
346  // SLenergies[MIN] < pin < SLenergies[MAX]
347  } else {
348  for (unsigned int j=0; j<nBinsE; j++) {
349  if (pin >= SLenergies[j] && pin < SLenergies[j+1]) {
350  irec = j*evtPerBin + int(evtPerBin*r) + 1 ;
351  if (irec<0) {
352  edm::LogWarning("CastorShower") << "CastorShowerLibrary:: Illegal irec = "
353  << irec << " now set to 0";
354  irec = 0;
355  } else if (irec > totEvents) {
356  edm::LogWarning("CastorShower") << "CastorShowerLibrary:: Illegal irec = "
357  << irec << " now set to "<< totEvents;
358  irec = totEvents;
359  }
360  }
361  }
362  }
363 */
364  int ienergy = FindEnergyBin(pin);
365  int ieta = FindEtaBin(etain);
366 #ifdef DebugLog
367  if (verbose) edm::LogInfo("CastorShower") << " ienergy = " << ienergy ;
368  if (verbose) edm::LogInfo("CastorShower") << " ieta = " << ieta;
369 #endif
370 
371  int iphi;
372  double phiMin = 0. ;
373  double phiMax = M_PI/4 ; // 45 * (pi/180) rad
374  if(phiin < phiMin) phiin = phiin + M_PI ;
375  if(phiin >= phiMin && phiin < phiMax) {
376  iphi = FindPhiBin(phiin) ;
377  } else {
378  double remainder = fmod(phiin , M_PI/4) ;
379  phiin = phiMin + remainder ;
380  iphi = FindPhiBin(phiin) ;
381  }
382 #ifdef DebugLog
383  if (verbose) edm::LogInfo("CastorShower") << " iphi = " << iphi;
384 #endif
385  if (ienergy==-1) ienergy=0; // if pin < first bin, choose an event in the first one
386  if (ieta==-1) ieta=0; // idem for eta
387  if (iphi!=-1) irec = int(nEvtPerBinE*ienergy+nEvtPerBinEta*ieta+nEvtPerBinPhi*(iphi+r));
388  else irec = int(nEvtPerBinE*(ienergy+r));
389 
390 #ifdef DebugLog
391  edm::LogInfo("CastorShower") << "CastorShowerLibrary:: Select record " << irec
392  << " of type " << type ;
393 #endif
394 
395  // Retrieve record number "irec" from the library
396  getRecord (type, irec);
397 
398 }
400  //
401  // returns the integer index of the energy bin, taken from SLenergies vector
402  // returns -1 if ouside valid range
403  //
404  if (energy >= SLenergies.back()) return SLenergies.size()-1;
405 
406  unsigned int i = 0;
407  for(;i<SLenergies.size()-1;i++)
408  if (energy >= SLenergies.at(i) && energy < SLenergies.at(i+1)) return (int)i;
409 
410  // now i points to the last but 1 bin
411  if (energy>=SLenergies.at(i)) return (int)i;
412  // energy outside bin range
413  return -1;
414 }
416  //
417  // returns the integer index of the eta bin, taken from SLetas vector
418  // returns -1 if ouside valid range
419  //
420  if (eta>=SLetas.back()) return SLetas.size()-1;
421  unsigned int i = 0;
422  for(;i<SLetas.size()-1;i++)
423  if (eta >= SLetas.at(i) && eta < SLetas.at(i+1)) return (int)i;
424  // now i points to the last but 1 bin
425  if (eta>=SLetas.at(i)) return (int)i;
426  // eta outside bin range
427  return -1;
428 }
430  //
431  // returns the integer index of the phi bin, taken from SLphis vector
432  // returns -1 if ouside valid range
433  //
434  // needs protection in case phi is outside range -pi,pi
435  //
436  if (phi>=SLphis.back()) return SLphis.size()-1;
437  unsigned int i = 0;
438  for(;i<SLphis.size()-1;i++)
439  if (phi >= SLphis.at(i) && phi < SLphis.at(i+1)) return (int)i;
440  // now i points to the last but 1 bin
441  if (phi>=SLphis.at(i)) return (int)i;
442  // phi outside bin range
443  return -1;
444 }
#define LogDebug(id)
type
Definition: HCALResponse.h:22
T getParameter(std::string const &) const
void initParticleTable(G4ParticleTable *)
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
void select(int, double, double=0, double=9)
JetCorrectorParameters::Record record
Definition: classes.h:11
#define abs(x)
Definition: mlp_lapack.h:159
Geom::Theta< T > theta() const
T eta() const
std::vector< double > SLetas
unsigned int getNBins()
TBranchObject * emBranch
std::vector< double > SLphis
TBranchObject * hadBranch
T sqrt(T t)
Definition: SSEVec.h:28
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
CastorShowerLibrary(std::string &name, edm::ParameterSet const &p)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
unsigned int getNEvts()
unsigned int getNEvtPerBin()
void initFile(edm::ParameterSet const &)
std::vector< double > SLenergies
CastorShowerLibraryInfo * eventInfo
#define M_PI
Definition: BFit3D.cc:3
Log< T >::type log(const T &t)
Definition: Log.h:22
void loadEventInfo(TBranchObject *)
CastorShowerEvent getShowerHits(G4Step *, bool &)
CastorShowerEvent * showerEvent
TBranchObject * evtInfo
double getBin(int i)
std::string fullPath() const
Definition: FileInPath.cc:170
unsigned int getNhit()
Definition: DDAxes.h:10