14 #include "G4VPhysicalVolume.hh" 15 #include "G4NavigationHistory.hh" 18 #include "Randomize.hh" 19 #include "CLHEP/Units/GlobalSystemOfUnits.h" 20 #include "CLHEP/Units/GlobalPhysicalConstants.h" 37 backProb = m_HS.getParameter<
double>(
"BackProbability");
40 std::string branchEvInfo = m_HS.getUntrackedParameter<
std::string>(
"BranchEvt",
"HFShowerLibraryEventInfos_hfshowerlib_HFShowerLibraryEventInfo");
41 std::string branchPre = m_HS.getUntrackedParameter<
std::string>(
"BranchPre",
"HFShowerPhotons_hfshowerlib_");
43 verbose = m_HS.getUntrackedParameter<
bool>(
"Verbosity",
false);
44 applyFidCut = m_HS.getParameter<
bool>(
"ApplyFiducialCut");
46 if (pTreeName.find(
".") == 0) pTreeName.erase(0,2);
47 const char* nTree = pTreeName.c_str();
48 hf = TFile::Open(nTree);
51 edm::LogError(
"HFShower") <<
"HFShowerLibrary: opening " << nTree
54 <<
"Opening of " << pTreeName <<
" fails\n";
56 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: opening " << nTree
61 TTree*
event(
nullptr);
62 if (
newForm)
event = (TTree *)
hf ->Get(
"HFSimHits");
63 else event = (TTree *)
hf ->Get(
"Events");
65 TBranch *evtInfo(
nullptr);
68 evtInfo =
event->GetBranch(info.c_str());
73 edm::LogError(
"HFShower") <<
"HFShowerLibrary: HFShowerLibrayEventInfo" 74 <<
" Branch does not exist in Event";
76 <<
"Event information absent\n";
79 edm::LogError(
"HFShower") <<
"HFShowerLibrary: Events Tree does not " 82 <<
"Events tree absent\n";
87 <<
" Events Total " <<
totEvents <<
" and " 89 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Energies (GeV) with " 92 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: pmom[" <<
i <<
"] = " 95 std::string nameBr = branchPre + emName + branchPost;
96 emBranch =
event->GetBranch(nameBr.c_str());
98 nameBr = branchPre + hadName + branchPost;
99 hadBranch =
event->GetBranch(nameBr.c_str());
108 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary:Branch " << emName
109 <<
" has " <<
emBranch->GetEntries()
110 <<
" entries and Branch " << hadName
113 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::No packing information -" 114 <<
" Assume x, y, z are not in packed form";
116 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Maximum probability cut off " 117 << probMax <<
" Back propagation of light prob. " 140 emPDG = theParticleTable->FindParticle(parName=
"e-")->GetPDGEncoding();
141 epPDG = theParticleTable->FindParticle(parName=
"e+")->GetPDGEncoding();
142 gammaPDG = theParticleTable->FindParticle(parName=
"gamma")->GetPDGEncoding();
143 pi0PDG = theParticleTable->FindParticle(parName=
"pi0")->GetPDGEncoding();
144 etaPDG = theParticleTable->FindParticle(parName=
"eta")->GetPDGEncoding();
145 nuePDG = theParticleTable->FindParticle(parName=
"nu_e")->GetPDGEncoding();
146 numuPDG = theParticleTable->FindParticle(parName=
"nu_mu")->GetPDGEncoding();
147 nutauPDG= theParticleTable->FindParticle(parName=
"nu_tau")->GetPDGEncoding();
148 anuePDG = theParticleTable->FindParticle(parName=
"anti_nu_e")->GetPDGEncoding();
149 anumuPDG= theParticleTable->FindParticle(parName=
"anti_nu_mu")->GetPDGEncoding();
150 anutauPDG= theParticleTable->FindParticle(parName=
"anti_nu_tau")->GetPDGEncoding();
151 geantinoPDG= theParticleTable->FindParticle(parName=
"geantino")->GetPDGEncoding();
153 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Particle codes for e- = " 154 <<
emPDG <<
", e+ = " <<
epPDG <<
", gamma = " 157 <<
"\n nu_e = " <<
nuePDG <<
", nu_mu = " 159 <<
", anti_nu_e = " <<
anuePDG <<
", anti_nu_mu = " 166 rMax = rTable[rTable.size()-1];
168 <<
" cm and rMax " <<
rMax/cm;
173 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: (Half) Phi Width of wedge " 178 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: " <<
gpar.size() <<
" gpar (cm)";
179 for (
unsigned int ig=0; ig<
gpar.size(); ig++)
180 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: gpar[" << ig <<
"] = " 181 <<
gpar[ig]/cm <<
" cm";
190 G4StepPoint * preStepPoint = aStep->GetPreStepPoint();
191 G4StepPoint * postStepPoint = aStep->GetPostStepPoint();
192 G4Track *
track = aStep->GetTrack();
194 const G4DynamicParticle *aParticle = track->GetDynamicParticle();
195 G4ThreeVector momDir = aParticle->GetMomentumDirection();
198 G4ThreeVector hitPoint = preStepPoint->GetPosition();
199 G4String partType = track->GetDefinition()->GetParticleName();
200 int parCode = track->GetDefinition()->GetPDGEncoding();
203 G4ThreeVector localPos = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(hitPoint);
204 double zoff = localPos.z() + 0.5*
gpar[1];
206 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: getHits " << partType
207 <<
" of energy " << pin/
GeV <<
" GeV" 208 <<
" dir.orts " << momDir.x() <<
", " <<momDir.y()
209 <<
", " << momDir.z() <<
" Pos x,y,z = " 210 << hitPoint.x() <<
"," << hitPoint.y() <<
"," 211 << hitPoint.z() <<
" (" << zoff
212 <<
") sphi,cphi,stheta,ctheta = " <<
sin(momDir.phi())
213 <<
"," <<
cos(momDir.phi()) <<
", " <<
sin(momDir.theta())
214 <<
"," <<
cos(momDir.theta());
217 double tSlice = (postStepPoint->GetGlobalTime())/nanosecond;
218 double pin = preStepPoint->GetTotalEnergy();
220 return fillHits(hitPoint,momDir,parCode,pin,ok,weight,tSlice,onlyLong);
224 G4ThreeVector & momDir,
225 int parCode,
double pin,
bool &
ok,
226 double weight,
double tSlice,
bool onlyLong) {
228 std::vector<HFShowerLibrary::Hit>
hit;
236 double pz = momDir.
z();
237 double zint = hitPoint.z();
241 if (pz * zint < 0.) backward = 1;
243 double sphi =
sin(momDir.phi());
244 double cphi =
cos(momDir.phi());
245 double ctheta =
cos(momDir.theta());
246 double stheta =
sin(momDir.theta());
264 for (
int i = 0;
i <
npe;
i++) {
267 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Hit " <<
i <<
" " <<
pe[
i] <<
" zv " << zv;
269 if (zv <=
gpar[1] &&
pe[
i].lambda() > 0 &&
270 (
pe[
i].
z() >= 0 || (zv >
gpar[0] && (!onlyLong)))) {
273 }
else if (backward == 0) {
274 if (
pe[
i].
z() < 0) depth = 2;
276 double r = G4UniformRand();
277 if (r > 0.5) depth = 2;
283 double pex =
pe[
i].x();
284 double pey =
pe[
i].y();
286 double xx = pex*ctheta*cphi - pey*sphi + zv*stheta*cphi;
287 double yy = pex*ctheta*sphi + pey*cphi + zv*stheta*sphi;
288 double zz = -pex*stheta + zv*ctheta;
290 G4ThreeVector
pos = hitPoint + G4ThreeVector(xx,yy,zz);
292 G4ThreeVector lpos = G4ThreeVector(pos.x(),pos.y(),zv);
296 double r = pos.perp();
298 double fi = pos.phi();
299 if (fi < 0) fi += twopi;
301 isect = (isect + 1) / 2;
302 double dfi = ((isect*2-1)*
dphi - fi);
303 if (dfi < 0) dfi = -dfi;
304 double dfir = r *
sin(dfi);
306 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Position shift " << xx
307 <<
", " << yy <<
", " << zz <<
": " << pos
308 <<
" R " << r <<
" Phi " << fi <<
" Section " 309 << isect <<
" R*Dfi " << dfir <<
" Dist " << zv;
312 double r1 = G4UniformRand();
313 double r2 = G4UniformRand();
315 if (backward) r3 = G4UniformRand();
320 <<
" attenuation " << r1 <<
":" <<
exp(-p*zv)
321 <<
" r2 " << r2 <<
" r3 " << r3 <<
" rDfi " 323 << zz <<
" zLim " <<
gpar[4] <<
":" 325 <<
" rInside(r) :" <<
rInside(r)
326 <<
" r1 <= exp(-p*zv) :" << (r1 <=
exp(-p*zv))
327 <<
" r2 <= probMax :" << (r2 <=
probMax*weight)
328 <<
" r3 <= backProb :" << (r3 <=
backProb)
329 <<
" dfir > gpar[5] :" << (dfir >
gpar[5])
330 <<
" zz >= gpar[4] :" << (zz >=
gpar[4])
331 <<
" zz <= gpar[4]+gpar[1] :" 336 r3 <= backProb && (depth != 2 || zz >=
gpar[4]+
gpar[0])) {
340 hit.push_back(oneHit);
342 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Final Hit " << nHit
343 <<
" position " << (hit[nHit].position)
344 <<
" Depth " << (hit[nHit].depth) <<
" Time " 345 << tSlice <<
":" <<
pe[
i].t() <<
":" 352 else LogDebug(
"HFShower") <<
"HFShowerLibrary: REJECTED !!!";
355 r1 = G4UniformRand();
356 r2 = G4UniformRand();
357 if (
rInside(r) && r1 <=
exp(-p*zv) && r2 <= probMax && dfir >
gpar[5]){
361 hit.push_back(oneHit);
363 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Final Hit " << nHit
364 <<
" position " << (hit[nHit].position)
365 <<
" Depth " << (hit[nHit].depth) <<
" Time " 366 << tSlice <<
":" <<
pe[
i].t() <<
":" 377 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Total Hits " << nHit
378 <<
" out of " << npe <<
" PE";
380 if (nHit > npe && !onlyLong)
382 <<
" smaller than " << nHit <<
" Hits";
389 if (r >=
rMin && r <=
rMax)
return true;
405 std::vector<float>
t;
406 std::vector<float> *tp=&
t;
409 unsigned int tSize=t.size()/5;
410 photo->reserve(tSize);
411 for (
unsigned int i=0;
i<tSize;
i++ ) {
412 photo->push_back(
HFShowerPhoton( t[
i], t[1*tSize+i], t[2*tSize+i], t[3*tSize+i], t[4*tSize+i] ) );
426 std::vector<float>
t;
427 std::vector<float> *tp=&
t;
430 unsigned int tSize=t.size()/5;
431 photo->reserve(tSize);
432 for (
unsigned int i=0;
i<tSize;
i++ ) {
433 photo->push_back(
HFShowerPhoton( t[
i], t[1*tSize+i], t[2*tSize+i], t[3*tSize+i], t[4*tSize+i] ) );
443 LogDebug(
"HFShower") <<
"HFShowerLibrary::getRecord: Record " << record
444 <<
" of type " << type <<
" with " << nPhoton
446 for (
int j = 0; j < nPhoton; j++)
455 std::vector<HFShowerLibraryEventInfo> eventInfoCollection;
456 branch->SetAddress(&eventInfoCollection);
458 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::loadEventInfo loads " 459 <<
" EventInfo Collection of size " 460 << eventInfoCollection.size() <<
" records";
461 totEvents = eventInfoCollection[0].totalEvents();
462 nMomBin = eventInfoCollection[0].numberOfBins();
463 evtPerBin = eventInfoCollection[0].eventsPerBin();
464 libVers = eventInfoCollection[0].showerLibraryVersion();
465 listVersion = eventInfoCollection[0].physListVersion();
466 pmom = eventInfoCollection[0].energyBins();
468 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::loadEventInfo loads " 469 <<
" EventInfo from hardwired numbers";
475 pmom = {2,3,5,7,10,15,20,30,50,75,100,150,250,350,500,1000};
484 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Interpolate for Energy " <<pin/
GeV 485 <<
" GeV with " <<
nMomBin <<
" momentum bins and " 490 double r = G4UniformRand();
497 for (
int j=0; j<
nMomBin-1; j++) {
498 if (pin >=
pmom[j] && pin <
pmom[j+1]) {
500 if (j == nMomBin-2) {
510 << irc[0] <<
" now set to 0";
512 }
else if (irc[0] > totEvents) {
522 << irc[1] <<
" now set to 1";
524 }
else if (irc[1] > totEvents) {
531 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Select records " << irc[0]
532 <<
" and " << irc[1] <<
" with weights " << 1-w
538 for (
int ir=0; ir < 2; ir++) {
543 for (
int j=0; j<nPhoton; j++) {
545 if ((ir==0 && r > w) || (ir > 0 && r < w)) {
552 if ((
npe > npold || (npold == 0 && irc[0] > 0)) && !(
npe == 0 && npold == 0))
553 edm::LogWarning(
"HFShower") <<
"HFShowerLibrary: Interpolation Warning ==" 554 <<
" records " << irc[0] <<
" and " << irc[1]
555 <<
" gives a buffer of " << npold
556 <<
" photons and fills " <<
npe <<
" *****";
559 LogDebug(
"HFShower") <<
"HFShowerLibrary: Interpolation == records " 560 << irc[0] <<
" and " << irc[1] <<
" gives a " 561 <<
"buffer of " << npold <<
" photons and fills " 563 for (
int j=0; j<
npe; j++)
564 LogDebug(
"HFShower") <<
"Photon " << j <<
" " <<
pe[j];
574 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Extrapolate for Energy " << pin
575 <<
" GeV with " <<
nMomBin <<
" momentum bins and " 577 <<
" using " << nrec <<
" records";
579 std::vector<int> irc(nrec);
581 for (
int ir=0; ir<nrec; ir++) {
582 double r = G4UniformRand();
586 <<
"] = " << irc[ir] <<
" now set to 1";
590 <<
"] = " << irc[ir] <<
" now set to " 595 LogDebug(
"HFShower") <<
"HFShowerLibrary::Extrapolation use irc[" 596 << ir <<
"] = " << irc[ir];
604 for (
int ir=0; ir<nrec; ir++) {
609 for (
int j=0; j<nPhoton; j++) {
610 double r = G4UniformRand();
611 if (ir != nrec-1 || r < w) {
616 LogDebug(
"HFShower") <<
"HFShowerLibrary: Record [" << ir <<
"] = " 617 << irc[ir] <<
" npold = " << npold;
622 LogDebug(
"HFShower") <<
"HFShowerLibrary:: uses " << npold <<
" photons";
625 if (
npe > npold || npold == 0)
626 edm::LogWarning(
"HFShower") <<
"HFShowerLibrary: Extrapolation Warning == " 627 << nrec <<
" records " << irc[0] <<
", " 628 << irc[1] <<
", ... gives a buffer of " <<npold
629 <<
" photons and fills " <<
npe 633 LogDebug(
"HFShower") <<
"HFShowerLibrary: Extrapolation == " << nrec
634 <<
" records " << irc[0] <<
", " << irc[1]
635 <<
", ... gives a buffer of " << npold
636 <<
" photons and fills " << npe <<
" PE";
637 for (
int j=0; j<
npe; j++)
638 LogDebug(
"HFShower") <<
"Photon " << j <<
" " <<
pe[j];
647 LogDebug(
"HFShower") <<
"HFShowerLibrary: storePhoton " << j <<
" npe " 658 LogDebug(
"HFShower") <<
"HFShowerLibrary:getDDDArray called for " << str
659 <<
" with nMin " << nmin;
666 const std::vector<double> & fvec = value.
doubles();
667 int nval = fvec.size();
670 edm::LogError(
"HFShower") <<
"HFShowerLibrary : # of " << str
671 <<
" bins " << nval <<
" < " << nmin
674 <<
"nval < nmin for array " << str <<
"\n";
678 edm::LogError(
"HFShower") <<
"HFShowerLibrary : # of " << str
679 <<
" bins " << nval <<
" < 2 ==> illegal" 680 <<
" (nmin=" << nmin <<
")";
682 <<
"nval < 2 for array " << str <<
"\n";
691 <<
"cannot get array " << str <<
"\n";
double tShift(const G4ThreeVector &point, int depth, int fromEndAbs=0)
std::vector< Hit > fillHits(G4ThreeVector &p, G4ThreeVector &v, int parCode, double parEnergy, bool &ok, double weight, double time, bool onlyLong=false)
T getParameter(std::string const &) const
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
void initRun(HcalDDDSimConstants *)
std::vector< Hit > getHits(G4Step *aStep, bool &ok, double weight, bool onlyLong=false)
Sin< T >::type sin(const T &t)
double attLength(double lambda)
HFShowerPhotonCollection pe
double zShift(const G4ThreeVector &point, int depth, int fromEndAbs=0)
type of data representation of DDCompactView
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
HFShowerLibrary(std::string &name, const DDCompactView &cpv, edm::ParameterSet const &p)
std::vector< HFShowerPhoton > HFShowerPhotonCollection
const std::vector< double > & getRTableHF() const
Cos< T >::type cos(const T &t)
std::vector< std::pair< unsigned int, DDValue > > DDsvalues_type
std::maps an index to a DDValue. The index corresponds to the index assigned to the name of the std::...
void loadEventInfo(TBranch *)
const std::vector< double > & getPhiTableHF() const
Abs< T >::type abs(const T &t)
std::vector< double > gpar
std::vector< double > getDDDArray(const std::string &, const DDsvalues_type &, int &)
HFShowerPhotonCollection * photo
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
const std::vector< double > & getGparHF() const
std::vector< double > pmom
void extrapolate(int, double)
HFShowerPhotonCollection photon
void initRun(G4ParticleTable *, HcalDDDSimConstants *)
void interpolate(int, double)