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
62 if (
newForm)
event = (TTree *)
hf ->Get(
"HFSimHits");
63 else event = (TTree *)
hf ->Get(
"Events");
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());
101 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary:Branch " << emName
102 <<
" has " <<
emBranch->GetEntries()
103 <<
" entries and Branch " << hadName
106 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::No packing information -"
107 <<
" Assume x, y, z are not in packed form";
109 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Maximum probability cut off "
110 << probMax <<
" Back propagation of light prob. "
113 G4String attribute =
"ReadOutName";
116 DDValue ddv(attribute,value,0);
126 std::vector<double> rTable =
getDDDArray(
"rTable",sv,nR);
130 <<
" cm and rMax " <<
rMax/cm;
134 std::vector<double> etaTable =
getDDDArray(
"etaTable",sv,nEta);
135 int nPhi = nEta + nR - 2;
136 std::vector<double> phibin =
getDDDArray(
"phibin",sv,nPhi);
137 dphi = phibin[nEta-1];
138 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: (Half) Phi Width of wedge "
144 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: " << ngpar <<
" gpar (cm)";
145 for (
int ig=0; ig<ngpar; ig++)
146 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: gpar[" << ig <<
"] = "
147 <<
gpar[ig]/cm <<
" cm";
149 edm::LogError(
"HFShower") <<
"HFShowerLibrary: cannot get filtered "
150 <<
" view for " << attribute <<
" matching "
153 <<
"cannot match " << attribute <<
" to " << name <<
"\n";
172 emPDG = theParticleTable->FindParticle(parName=
"e-")->GetPDGEncoding();
173 epPDG = theParticleTable->FindParticle(parName=
"e+")->GetPDGEncoding();
174 gammaPDG = theParticleTable->FindParticle(parName=
"gamma")->GetPDGEncoding();
175 pi0PDG = theParticleTable->FindParticle(parName=
"pi0")->GetPDGEncoding();
176 etaPDG = theParticleTable->FindParticle(parName=
"eta")->GetPDGEncoding();
177 nuePDG = theParticleTable->FindParticle(parName=
"nu_e")->GetPDGEncoding();
178 numuPDG = theParticleTable->FindParticle(parName=
"nu_mu")->GetPDGEncoding();
179 nutauPDG= theParticleTable->FindParticle(parName=
"nu_tau")->GetPDGEncoding();
180 anuePDG = theParticleTable->FindParticle(parName=
"anti_nu_e")->GetPDGEncoding();
181 anumuPDG= theParticleTable->FindParticle(parName=
"anti_nu_mu")->GetPDGEncoding();
182 anutauPDG= theParticleTable->FindParticle(parName=
"anti_nu_tau")->GetPDGEncoding();
183 geantinoPDG= theParticleTable->FindParticle(parName=
"geantino")->GetPDGEncoding();
185 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Particle codes for e- = "
186 <<
emPDG <<
", e+ = " <<
epPDG <<
", gamma = "
189 <<
"\n nu_e = " <<
nuePDG <<
", nu_mu = "
191 <<
", anti_nu_e = " <<
anuePDG <<
", anti_nu_mu = "
202 G4StepPoint * preStepPoint = aStep->GetPreStepPoint();
203 G4StepPoint * postStepPoint = aStep->GetPostStepPoint();
204 G4Track * track = aStep->GetTrack();
206 const G4DynamicParticle *aParticle = track->GetDynamicParticle();
207 G4ThreeVector momDir = aParticle->GetMomentumDirection();
210 G4ThreeVector hitPoint = preStepPoint->GetPosition();
211 G4String partType = track->GetDefinition()->GetParticleName();
212 int parCode = track->GetDefinition()->GetPDGEncoding();
215 G4ThreeVector localPos = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(hitPoint);
216 double zoff = localPos.z() + 0.5*
gpar[1];
218 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: getHits " << partType
219 <<
" of energy " << pin/
GeV <<
" GeV"
220 <<
" dir.orts " << momDir.x() <<
", " <<momDir.y()
221 <<
", " << momDir.z() <<
" Pos x,y,z = "
222 << hitPoint.x() <<
"," << hitPoint.y() <<
","
223 << hitPoint.z() <<
" (" << zoff
224 <<
") sphi,cphi,stheta,ctheta = " <<
sin(momDir.phi())
225 <<
"," <<
cos(momDir.phi()) <<
", " <<
sin(momDir.theta())
226 <<
"," <<
cos(momDir.theta());
229 double tSlice = (postStepPoint->GetGlobalTime())/nanosecond;
230 double pin = preStepPoint->GetTotalEnergy();
232 return fillHits(hitPoint,momDir,parCode,pin,ok,weight,tSlice,onlyLong);
236 G4ThreeVector & momDir,
237 int parCode,
double pin,
bool &
ok,
238 double weight,
double tSlice,
bool onlyLong) {
240 std::vector<HFShowerLibrary::Hit>
hit;
248 double pz = momDir.
z();
249 double zint = hitPoint.z();
253 if (pz * zint < 0.) backward = 1;
255 double sphi =
sin(momDir.phi());
256 double cphi =
cos(momDir.phi());
257 double ctheta =
cos(momDir.theta());
258 double stheta =
sin(momDir.theta());
276 for (
int i = 0;
i <
npe;
i++) {
279 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Hit " <<
i <<
" " <<
pe[
i] <<
" zv " << zv;
281 if (zv <=
gpar[1] &&
pe[
i].lambda() > 0 &&
282 (
pe[
i].
z() >= 0 || (zv >
gpar[0] && (!onlyLong)))) {
285 }
else if (backward == 0) {
286 if (
pe[
i].
z() < 0) depth = 2;
288 double r = G4UniformRand();
289 if (r > 0.5) depth = 2;
295 double pex =
pe[
i].x();
296 double pey =
pe[
i].y();
298 double xx = pex*ctheta*cphi - pey*sphi + zv*stheta*cphi;
299 double yy = pex*ctheta*sphi + pey*cphi + zv*stheta*sphi;
300 double zz = -pex*stheta + zv*ctheta;
302 G4ThreeVector pos = hitPoint + G4ThreeVector(xx,yy,zz);
304 G4ThreeVector lpos = G4ThreeVector(pos.x(),pos.y(),zv);
308 double r = pos.perp();
310 double fi = pos.phi();
311 if (fi < 0) fi += twopi;
312 int isect = int(fi/
dphi) + 1;
313 isect = (isect + 1) / 2;
314 double dfi = ((isect*2-1)*
dphi - fi);
315 if (dfi < 0) dfi = -dfi;
316 double dfir = r *
sin(dfi);
318 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Position shift " << xx
319 <<
", " << yy <<
", " << zz <<
": " << pos
320 <<
" R " << r <<
" Phi " << fi <<
" Section "
321 << isect <<
" R*Dfi " << dfir <<
" Dist " << zv;
324 double r1 = G4UniformRand();
325 double r2 = G4UniformRand();
327 if (backward) r3 = G4UniformRand();
332 <<
" attenuation " << r1 <<
":" <<
exp(-p*zv)
333 <<
" r2 " << r2 <<
" r3 " << r3 <<
" rDfi "
335 << zz <<
" zLim " <<
gpar[4] <<
":"
337 <<
" rInside(r) :" <<
rInside(r)
338 <<
" r1 <= exp(-p*zv) :" << (r1 <=
exp(-p*zv))
339 <<
" r2 <= probMax :" << (r2 <=
probMax*weight)
340 <<
" r3 <= backProb :" << (r3 <=
backProb)
341 <<
" dfir > gpar[5] :" << (dfir >
gpar[5])
342 <<
" zz >= gpar[4] :" << (zz >=
gpar[4])
343 <<
" zz <= gpar[4]+gpar[1] :"
348 r3 <= backProb && (depth != 2 || zz >=
gpar[4]+
gpar[0])) {
352 hit.push_back(oneHit);
354 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Final Hit " << nHit
355 <<
" position " << (hit[nHit].position)
356 <<
" Depth " << (hit[nHit].depth) <<
" Time "
357 << tSlice <<
":" <<
pe[
i].t() <<
":"
364 else LogDebug(
"HFShower") <<
"HFShowerLibrary: REJECTED !!!";
367 r1 = G4UniformRand();
368 r2 = G4UniformRand();
369 if (
rInside(r) && r1 <=
exp(-p*zv) && r2 <= probMax && dfir >
gpar[5]){
373 hit.push_back(oneHit);
375 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Final Hit " << nHit
376 <<
" position " << (hit[nHit].position)
377 <<
" Depth " << (hit[nHit].depth) <<
" Time "
378 << tSlice <<
":" <<
pe[
i].t() <<
":"
389 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary: Total Hits " << nHit
390 <<
" out of " << npe <<
" PE";
392 if (nHit > npe && !onlyLong)
394 <<
" smaller than " << nHit <<
" Hits";
401 if (r >=
rMin && r <=
rMax)
return true;
428 LogDebug(
"HFShower") <<
"HFShowerLibrary::getRecord: Record " << record
429 <<
" of type " << type <<
" with " << nPhoton
431 for (
int j = 0;
j < nPhoton;
j++)
440 std::vector<HFShowerLibraryEventInfo> eventInfoCollection;
441 branch->SetAddress(&eventInfoCollection);
443 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::loadEventInfo loads "
444 <<
" EventInfo Collection of size "
445 << eventInfoCollection.size() <<
" records";
446 totEvents = eventInfoCollection[0].totalEvents();
447 nMomBin = eventInfoCollection[0].numberOfBins();
448 evtPerBin = eventInfoCollection[0].eventsPerBin();
449 libVers = eventInfoCollection[0].showerLibraryVersion();
450 listVersion = eventInfoCollection[0].physListVersion();
451 pmom = eventInfoCollection[0].energyBins();
453 edm::LogInfo(
"HFShower") <<
"HFShowerLibrary::loadEventInfo loads "
454 <<
" EventInfo from hardwired numbers";
460 pmom = {2,3,5,7,10,15,20,30,50,75,100,150,250,350,500,1000};
469 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Interpolate for Energy " <<pin/
GeV
470 <<
" GeV with " <<
nMomBin <<
" momentum bins and "
475 double r = G4UniformRand();
485 if (j == nMomBin-2) {
495 << irc[0] <<
" now set to 0";
497 }
else if (irc[0] > totEvents) {
507 << irc[1] <<
" now set to 1";
509 }
else if (irc[1] > totEvents) {
516 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Select records " << irc[0]
517 <<
" and " << irc[1] <<
" with weights " << 1-w
523 for (
int ir=0; ir < 2; ir++) {
528 for (
int j=0;
j<nPhoton;
j++) {
530 if ((ir==0 && r > w) || (ir > 0 && r < w)) {
537 if ((
npe > npold || (npold == 0 && irc[0] > 0)) && !(
npe == 0 && npold == 0))
538 edm::LogWarning(
"HFShower") <<
"HFShowerLibrary: Interpolation Warning =="
539 <<
" records " << irc[0] <<
" and " << irc[1]
540 <<
" gives a buffer of " << npold
541 <<
" photons and fills " <<
npe <<
" *****";
544 LogDebug(
"HFShower") <<
"HFShowerLibrary: Interpolation == records "
545 << irc[0] <<
" and " << irc[1] <<
" gives a "
546 <<
"buffer of " << npold <<
" photons and fills "
559 LogDebug(
"HFShower") <<
"HFShowerLibrary:: Extrapolate for Energy " << pin
560 <<
" GeV with " <<
nMomBin <<
" momentum bins and "
562 <<
" using " << nrec <<
" records";
564 std::vector<int> irc(nrec);
566 for (
int ir=0; ir<nrec; ir++) {
567 double r = G4UniformRand();
571 <<
"] = " << irc[ir] <<
" now set to 1";
575 <<
"] = " << irc[ir] <<
" now set to "
580 LogDebug(
"HFShower") <<
"HFShowerLibrary::Extrapolation use irc["
581 << ir <<
"] = " << irc[ir];
589 for (
int ir=0; ir<nrec; ir++) {
594 for (
int j=0;
j<nPhoton;
j++) {
595 double r = G4UniformRand();
596 if (ir != nrec-1 || r < w) {
601 LogDebug(
"HFShower") <<
"HFShowerLibrary: Record [" << ir <<
"] = "
602 << irc[ir] <<
" npold = " << npold;
607 LogDebug(
"HFShower") <<
"HFShowerLibrary:: uses " << npold <<
" photons";
610 if (
npe > npold || npold == 0)
611 edm::LogWarning(
"HFShower") <<
"HFShowerLibrary: Extrapolation Warning == "
612 << nrec <<
" records " << irc[0] <<
", "
613 << irc[1] <<
", ... gives a buffer of " <<npold
614 <<
" photons and fills " <<
npe
618 LogDebug(
"HFShower") <<
"HFShowerLibrary: Extrapolation == " << nrec
619 <<
" records " << irc[0] <<
", " << irc[1]
620 <<
", ... gives a buffer of " << npold
621 <<
" photons and fills " << npe <<
" PE";
632 LogDebug(
"HFShower") <<
"HFShowerLibrary: storePhoton " << j <<
" npe "
643 LogDebug(
"HFShower") <<
"HFShowerLibrary:getDDDArray called for " << str
644 <<
" with nMin " << nmin;
651 const std::vector<double> & fvec = value.
doubles();
652 int nval = fvec.size();
655 edm::LogError(
"HFShower") <<
"HFShowerLibrary : # of " << str
656 <<
" bins " << nval <<
" < " << nmin
659 <<
"nval < nmin for array " << str <<
"\n";
663 edm::LogError(
"HFShower") <<
"HFShowerLibrary : # of " << str
664 <<
" bins " << nval <<
" < 2 ==> illegal"
665 <<
" (nmin=" << nmin <<
")";
667 <<
"nval < 2 for array " << str <<
"\n";
674 edm::LogError(
"HFShower") <<
"HFShowerLibrary : cannot get array " << str;
676 <<
"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 addFilter(const DDFilter &, DDLogOp op=DDLogOp::AND)
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
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 *)
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
std::vector< double > pmom
DDsvalues_type mergedSpecifics() const
void initRun(G4ParticleTable *theParticleTable)
void extrapolate(int, double)
bool firstChild()
set the current node to the first child ...
HFShowerPhotonCollection photon
void interpolate(int, double)
void setCriteria(const DDValue &nameVal, DDCompOp, DDLogOp l=DDLogOp::AND, bool asString=true, bool merged=true)
The DDGenericFilter is a runtime-parametrized Filter looking on DDSpecifcs.