21 #include "G4LogicalVolumeStore.hh" 22 #include "G4LogicalVolume.hh" 25 #include "G4VProcess.hh" 27 #include "G4SystemOfUnits.hh" 34 bool any(
const std::vector<T> &
v,
const T &what) {
35 return std::find(v.begin(), v.end(), what) != v.end();
41 CaloSD(name, cpv, clg, p, manager,
43 p.getParameter<
edm::
ParameterSet>(
"ECalSD").getParameter<bool>(
"IgnoreTrackID")),
85 std::vector<double> tempD =
getDDDArray(
"EnergyWeight",sv);
86 if (tempD.size() > 0) {
if (tempD[0] < 0.1) useWeight =
false; }
95 if (nullNS) scheme = 0;
96 else if (name ==
"EcalHitsEB")
101 else if (name ==
"EcalHitsEE")
106 else if (name ==
"EcalHitsES")
112 else {
edm::LogWarning(
"EcalSim") <<
"ECalSD: ReadoutName not supported\n";}
117 LogDebug(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
120 edm::LogInfo(
"EcalSim") <<
"ECalSD:: Use of Birks law is set to " 121 << useBirk <<
" with three constants kB = " 122 << birk1 <<
", C1 = " << birk2 <<
", C2 = " 123 << birk3 <<
"\n Use of L3 parametrization " 124 << useBirkL3 <<
" with slope " << birkSlope
125 <<
" and cut off " << birkCut <<
"\n" 126 <<
" Slope for Light yield is set to " 129 edm::LogInfo(
"EcalSim") <<
"ECalSD:: energy deposit is not corrected " 130 <<
" by Birk or light yield curve";
134 <<
"\tprotons below " <<
kmaxProton <<
" MeV," 136 <<
"\tions below " <<
kmaxIon <<
" MeV" 139 <<
"\n\tstoreRL" << storeRL
140 <<
"\tstoreLayerTimeSim " << storeLayerTimeSim
142 if (useWeight)
initMap(name,cpv);
155 G4Track*
theTrack = aStep->GetTrack();
156 double wt2 = theTrack->GetWeight();
157 G4String nameVolume =
preStepPoint->GetPhysicalVolume()->GetName();
164 int pdg = theTrack->GetDefinition()->GetPDGEncoding();
166 double ke = theTrack->GetKineticEnergy()/
MeV;
167 if (((pdg/1000000000 == 1 && ((pdg/10000)%100) > 0 &&
168 ((pdg/10)%100) > 0)) && (ke<
kmaxIon)) weight = 0;
169 if ((pdg == 2212) && (ke <
kmaxProton)) weight = 0;
170 if ((pdg == 2112) && (ke <
kmaxNeutron)) weight = 0;
173 LogDebug(
"EcalSim") <<
"Ignore Track " << theTrack->GetTrackID()
174 <<
" Type " << theTrack->GetDefinition()->GetParticleName()
175 <<
" Kinetic Energy " << ke <<
" MeV";
180 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
189 double edep = aStep->GetTotalEnergyDeposit()*weight*wt1;
206 if(wt2 > 0.0) { edep *= wt2; }
208 LogDebug(
"EcalSim") <<
"ECalSD:: " << nameVolume
209 <<
" Light Collection Efficiency " <<weight <<
":" <<wt1
210 <<
" Weighted Energy Deposit " << edep/
MeV <<
" MeV";
221 G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
230 primaryID = aTrack->GetTrackID();
238 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
250 G4StepPoint* hitPoint = aStep->GetPreStepPoint();
251 G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
254 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
255 hitPoint->GetTouchable());
257 double radl = hitPoint->GetMaterial()->GetRadlen();
258 double detz = (
float)(0.5*crlength + localPoint.z());
259 thisX0 = (uint16_t)floor(detz/radl);
268 float layerSize = 1*cm;
272 if (aStep !=
NULL ) {
273 G4StepPoint* hitPoint = aStep->GetPreStepPoint();
274 G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
275 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
276 hitPoint->GetTouchable());
280 const auto&
name = lv->GetName();
285 detz = (
float)(0.5*crlength + localPoint.z());
287 detz = (
float)(0.5*crlength - localPoint.z());
292 detz = (
float)(0.5*crlength - localPoint.z());
294 detz = (
float)(0.5*crlength + localPoint.z());
298 return 100+(
int)detz/layerSize;
314 edm::LogInfo(
"EcalSim") <<
"EcalSD: updates numbering scheme for " 315 << GetName() <<
"\n";
324 G4String attribute =
"ReadOutName";
329 std::vector<G4LogicalVolume*> lvused;
330 const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
331 std::vector<G4LogicalVolume *>::const_iterator lvcite;
332 std::map<std::string, G4LogicalVolume *> nameMap;
333 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
334 nameMap.insert(std::make_pair((*lvi)->GetName(), *lvi));
340 G4LogicalVolume* lv = nameMap[lvname];
342 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
346 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
347 <<
" in Depth 1 volume list";
350 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
354 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 355 <<
" in Depth 1 volume list";
361 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
365 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
366 <<
" in Depth 2 volume list";
369 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
373 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 374 <<
" in Depth 2 volume list";
381 if (!
any(lvused,lv)) {
382 lvused.push_back(lv);
384 const std::vector<double> & paras = sol.
parameters();
386 LogDebug(
"EcalSim") <<
"ECalSD::initMap (for " << sd <<
"): Solid " 387 << lvname <<
" Shape " << sol.
shape()
388 <<
" Parameter 0 = "<< paras[0]
389 <<
" Logical Volume " << lv;
392 double dz = 2*paras[0];
393 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
394 lv = nameMap[lvname +
"_refl"];
396 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
403 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
404 <<
" Material " << matname <<
" in noWeight list";
407 lv = nameMap[lvname];
411 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
412 <<
" Material " << matname <<
" in noWeight list";
420 LogDebug(
"EcalSim") <<
"ECalSD: Length Table for " << attribute <<
" = " 422 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.begin();
424 for (; ite !=
xtalLMap.end(); ite++, i++) {
425 G4String
name =
"Unknown";
426 if (ite->first != 0) name = (ite->first)->GetName();
427 LogDebug(
"EcalSim") <<
" " << i <<
" " << ite->first <<
" " << name
428 <<
" L = " << ite->second;
435 G4StepPoint* stepPoint = aStep->GetPreStepPoint();
436 G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
439 G4ThreeVector localPoint =
setToLocal(stepPoint->GetPosition(),
440 stepPoint->GetTouchable());
446 double depth = 0.5 * crlength + localPoint.z();
448 if (depth >= -0.1 || depth <= crlength+0.1)
452 double dapd = 0.5 * crlength - localPoint.z();
453 if (dapd >= -0.1 || dapd <= crlength+0.1) {
457 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance " 458 <<
"to APD " << dapd <<
" crlength = " 459 << crlength <<
" crystal name = " <<lv->GetName()
460 <<
" z of localPoint = " << localPoint.z()
461 <<
" take weight = " <<
weight;
470 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.find(lv);
471 if (ite !=
xtalLMap.end()) length = ite->second;
478 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
479 int theSize = touch->GetHistoryDepth()+1;
483 for (
int ii = 0;
ii < theSize ;
ii++) {
486 LogDebug(
"EcalSim") <<
"ECalSD::getBaseNumber(): Adding level " <<
ii 487 <<
": " << touch->GetVolume(
ii)->GetName() <<
"[" 488 << touch->GetReplicaNumber(
ii) <<
"]";
498 double charge = aStep->GetPreStepPoint()->GetCharge();
500 if (charge != 0. && aStep->GetStepLength() > 0) {
501 G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
502 double density = mat->GetDensity();
503 double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
504 double rkb =
birk1/density;
508 else if (weight > 1.) weight = 1.;
511 LogDebug(
"EcalSim") <<
"ECalSD::getBirkL3 in " << mat->GetName()
512 <<
" Charge " << charge <<
" dE/dx " << dedx
513 <<
" Birk Const " << rkb <<
" Weight = " << weight
514 <<
" dE " << aStep->GetTotalEnergyDeposit();
525 LogDebug(
"EcalSim") <<
"ECalSD:getDDDArray called for " <<
str;
532 const std::vector<double> & fvec = value.
doubles();
535 std::vector<double> fvec;
544 LogDebug(
"EcalSim") <<
"ECalSD:getStringArray called for " <<
str;
551 const std::vector<std::string> & fvec = value.
strings();
554 std::vector<std::string> fvec;
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the filtered-view.
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
std::vector< std::string > getStringArray(const std::string &, const DDsvalues_type &)
std::vector< G4LogicalVolume * > useDepth1
void setLumies(double x, double y)
void getBaseNumber(const G4Step *)
virtual double getEnergyDeposit(G4Step *)
bool any(const std::vector< T > &v, const T &what)
virtual int getTrackID(G4Track *)
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
type of data representation of DDCompactView
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
std::vector< G4LogicalVolume * > noWeight
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
std::vector< G4LogicalVolume * > useDepth2
A DDSolid represents the shape of a part.
static TrackerG4SimHitNumberingScheme & numberingScheme(const DDCompactView &cpv, const GeometricDet &det)
virtual uint16_t getDepth(G4Step *)
void addLevel(const std::string &name, const int ©Number)
EcalBaseNumber theBaseNumber
bool next()
set current node to the next node in the filtered tree
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::...
double crystalLength(G4LogicalVolume *)
virtual uint16_t getLayerIDForTimeSim(G4Step *)
DDSolidShape shape(void) const
The type of the solid.
virtual int getTrackID(G4Track *)
double getAttenuation(G4Step *aStep, double birk1, double birk2, double birk3)
void initMap(G4String, const DDCompactView &)
const std::vector< std::string > & strings() const
a reference to the std::string-valued values stored in the given instance of DDValue ...
double curve_LY(G4Step *)
G4StepPoint * preStepPoint
virtual uint32_t getUnitID(const EcalBaseNumber &baseNumber) const =0
std::vector< double > getDDDArray(const std::string &, const DDsvalues_type &)
virtual uint16_t getRadiationLength(G4Step *)
double getBirkL3(G4Step *)
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
DDsvalues_type mergedSpecifics() const
ECalSD(G4String, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
double getResponseWt(G4Track *)
bool firstChild()
set the current node to the first child ...
virtual uint32_t setDetUnitId(G4Step *)
EcalNumberingScheme * numberingScheme
EnergyResolutionVsLumi ageing
std::map< G4LogicalVolume *, double > xtalLMap
void setNumberingScheme(EcalNumberingScheme *)
void setSize(const int &size)
const std::string & name() const
Returns the name.
const DDMaterial & material(void) const
Returns a reference object of the material this LogicalPart is made of.
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *)