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")),
86 std::vector<double> tempD =
getDDDArray(
"EnergyWeight",sv);
87 if (tempD.size() > 0) {
if (tempD[0] < 0.1) useWeight =
false; }
89 edm::LogInfo(
"EcalSim") <<
"ECalSD:: useWeight " << tempD.size() <<
":" 90 << useWeight << std::endl;
103 if (nullNS) scheme = 0;
104 else if (name ==
"EcalHitsEB")
109 else if (name ==
"EcalHitsEE")
114 else if (name ==
"EcalHitsES")
120 else {
edm::LogWarning(
"EcalSim") <<
"ECalSD: ReadoutName not supported\n";}
125 LogDebug(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
128 edm::LogInfo(
"EcalSim") <<
"ECalSD:: Use of Birks law is set to " 129 << useBirk <<
" with three constants kB = " 130 << birk1 <<
", C1 = " << birk2 <<
", C2 = " 131 << birk3 <<
"\n Use of L3 parametrization " 132 << useBirkL3 <<
" with slope " << birkSlope
133 <<
" and cut off " << birkCut <<
"\n" 134 <<
" Slope for Light yield is set to " 137 edm::LogInfo(
"EcalSim") <<
"ECalSD:: energy deposit is not corrected " 138 <<
" by Birk or light yield curve";
142 <<
"\tprotons below " <<
kmaxProton <<
" MeV," 144 <<
"\tions below " <<
kmaxIon <<
" MeV" 147 <<
"\n\tstoreRL" << storeRL <<
":" << scaleRL
150 if (useWeight)
initMap(name,cpv);
163 G4Track*
theTrack = aStep->GetTrack();
164 double wt2 = theTrack->GetWeight();
165 G4String nameVolume =
preStepPoint->GetPhysicalVolume()->GetName();
172 int pdg = theTrack->GetDefinition()->GetPDGEncoding();
174 double ke = theTrack->GetKineticEnergy()/
MeV;
175 if (((pdg/1000000000 == 1 && ((pdg/10000)%100) > 0 &&
176 ((pdg/10)%100) > 0)) && (ke<
kmaxIon)) weight = 0;
177 if ((pdg == 2212) && (ke <
kmaxProton)) weight = 0;
178 if ((pdg == 2112) && (ke <
kmaxNeutron)) weight = 0;
181 LogDebug(
"EcalSim") <<
"Ignore Track " << theTrack->GetTrackID()
182 <<
" Type " << theTrack->GetDefinition()->GetParticleName()
183 <<
" Kinetic Energy " << ke <<
" MeV";
188 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
197 double edep = aStep->GetTotalEnergyDeposit()*weight*wt1;
214 if(wt2 > 0.0) { edep *= wt2; }
216 LogDebug(
"EcalSim") <<
"ECalSD:: " << nameVolume
217 <<
" Light Collection Efficiency " <<weight <<
":" <<wt1
218 <<
" Weighted Energy Deposit " << edep/
MeV <<
" MeV";
229 G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
238 primaryID = aTrack->GetTrackID();
246 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
262 G4StepPoint* hitPoint = aStep->GetPreStepPoint();
263 G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
268 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
269 hitPoint->GetTouchable());
271 double radl = hitPoint->GetMaterial()->GetRadlen();
272 double detz = (
float)(0.5*crlength + localPoint.z());
273 thisX0 = (uint16_t)floor(
scaleRL*detz/radl);
275 edm::LogInfo(
"EcalSim") <<
"Crystal Length " << crlength <<
" Radl " 276 << radl <<
" DetZ " << detz <<
" " << thisX0;
286 float layerSize = 1*cm;
290 if (aStep !=
NULL ) {
291 G4StepPoint* hitPoint = aStep->GetPreStepPoint();
292 G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
293 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
294 hitPoint->GetTouchable());
298 const auto&
name = lv->GetName();
303 detz = (
float)(0.5*crlength + localPoint.z());
305 detz = (
float)(0.5*crlength - localPoint.z());
310 detz = (
float)(0.5*crlength - localPoint.z());
312 detz = (
float)(0.5*crlength + localPoint.z());
316 return 100+(
int)detz/layerSize;
332 edm::LogInfo(
"EcalSim") <<
"EcalSD: updates numbering scheme for " 333 << GetName() <<
"\n";
342 G4String attribute =
"ReadOutName";
347 std::vector<G4LogicalVolume*> lvused;
348 const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
349 std::vector<G4LogicalVolume *>::const_iterator lvcite;
350 std::map<std::string, G4LogicalVolume *> nameMap;
351 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
352 nameMap.insert(std::make_pair((*lvi)->GetName(), *lvi));
358 G4LogicalVolume* lv = nameMap[lvname];
360 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
364 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 365 << lvname <<
" in Depth 1 volume list\n";
368 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
372 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 374 <<
" in Depth 1 volume list\n";
380 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
384 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 385 << lvname <<
" in Depth 2 volume list\n";
388 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
392 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 394 <<
" in Depth 2 volume list\n";
401 if (!
any(lvused,lv)) {
402 lvused.push_back(lv);
404 const std::vector<double> & paras = sol.
parameters();
406 LogDebug(
"EcalSim") <<
"ECalSD::initMap (for " << sd <<
"): Solid " 407 << lvname <<
" Shape " << sol.
shape()
408 <<
" Parameter 0 = "<< paras[0]
409 <<
" Logical Volume " << lv;
412 double dz = 2*paras[0];
413 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
414 lv = nameMap[lvname +
"_refl"];
416 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
423 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
424 <<
" Material " << matname <<
" in noWeight list";
427 lv = nameMap[lvname];
431 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
432 <<
" Material " << matname <<
" in noWeight list";
440 LogDebug(
"EcalSim") <<
"ECalSD: Length Table for " << attribute <<
" = " 442 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.begin();
444 for (; ite !=
xtalLMap.end(); ite++, i++) {
445 G4String
name =
"Unknown";
446 if (ite->first != 0) name = (ite->first)->GetName();
447 LogDebug(
"EcalSim") <<
" " << i <<
" " << ite->first <<
" " << name
448 <<
" L = " << ite->second;
455 G4StepPoint* stepPoint = aStep->GetPreStepPoint();
456 G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
459 G4ThreeVector localPoint =
setToLocal(stepPoint->GetPosition(),
460 stepPoint->GetTouchable());
466 double depth = 0.5 * crlength + localPoint.z();
468 if (depth >= -0.1 || depth <= crlength+0.1)
472 double dapd = 0.5 * crlength - localPoint.z();
473 if (dapd >= -0.1 || dapd <= crlength+0.1) {
477 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance " 478 <<
"to APD " << dapd <<
" crlength = " 479 << crlength <<
" crystal name = " <<lv->GetName()
480 <<
" z of localPoint = " << localPoint.z()
481 <<
" take weight = " <<
weight;
490 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.find(lv);
491 if (ite !=
xtalLMap.end()) length = ite->second;
498 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
499 int theSize = touch->GetHistoryDepth()+1;
503 for (
int ii = 0;
ii < theSize ;
ii++) {
506 LogDebug(
"EcalSim") <<
"ECalSD::getBaseNumber(): Adding level " <<
ii 507 <<
": " << touch->GetVolume(
ii)->GetName() <<
"[" 508 << touch->GetReplicaNumber(
ii) <<
"]";
518 double charge = aStep->GetPreStepPoint()->GetCharge();
520 if (charge != 0. && aStep->GetStepLength() > 0) {
521 G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
522 double density = mat->GetDensity();
523 double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
524 double rkb =
birk1/density;
528 else if (weight > 1.) weight = 1.;
531 LogDebug(
"EcalSim") <<
"ECalSD::getBirkL3 in " << mat->GetName()
532 <<
" Charge " << charge <<
" dE/dx " << dedx
533 <<
" Birk Const " << rkb <<
" Weight = " << weight
534 <<
" dE " << aStep->GetTotalEnergyDeposit();
545 LogDebug(
"EcalSim") <<
"ECalSD:getDDDArray called for " <<
str;
552 const std::vector<double> & fvec = value.
doubles();
555 std::vector<double> fvec;
564 LogDebug(
"EcalSim") <<
"ECalSD:getStringArray called for " <<
str;
571 const std::vector<std::string> & fvec = value.
strings();
574 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 *)