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,
42 (float)(p.getParameter<edm::
ParameterSet>(
"ECalSD").getParameter<double>(
"TimeSliceUnit")),
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;
98 else if (name ==
"EcalHitsES") {
102 }
else {
edm::LogWarning(
"EcalSim") <<
"ECalSD: ReadoutName not supported\n";}
106 LogDebug(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
109 edm::LogInfo(
"EcalSim") <<
"ECalSD:: Use of Birks law is set to "
110 << useBirk <<
" with three constants kB = "
111 << birk1 <<
", C1 = " << birk2 <<
", C2 = "
112 << birk3 <<
"\n Use of L3 parametrization "
113 << useBirkL3 <<
" with slope " << birkSlope
114 <<
" and cut off " << birkCut <<
"\n"
115 <<
" Slope for Light yield is set to "
118 edm::LogInfo(
"EcalSim") <<
"ECalSD:: energy deposit is not corrected "
119 <<
" by Birk or light yield curve";
125 <<
" ions below " <<
kmaxIon <<
" MeV\n"
129 if (useWeight)
initMap(name,cpv);
143 G4Track*
theTrack = aStep->GetTrack();
144 double wt2 = theTrack->GetWeight();
145 G4String nameVolume =
preStepPoint->GetPhysicalVolume()->GetName();
152 int pdg = theTrack->GetDefinition()->GetPDGEncoding();
154 double ke = theTrack->GetKineticEnergy()/
MeV;
155 if (((pdg/1000000000 == 1 && ((pdg/10000)%100) > 0 &&
156 ((pdg/10)%100) > 0)) && (ke<
kmaxIon)) weight = 0;
157 if ((pdg == 2212) && (ke <
kmaxProton)) weight = 0;
158 if ((pdg == 2112) && (ke <
kmaxNeutron)) weight = 0;
161 LogDebug(
"EcalSim") <<
"Ignore Track " << theTrack->GetTrackID()
162 <<
" Type " << theTrack->GetDefinition()->GetParticleName()
163 <<
" Kinetic Energy " << ke <<
" MeV";
168 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
177 double edep = aStep->GetTotalEnergyDeposit()*weight*wt1;
194 if(wt2 > 0.0) { edep *= wt2; }
196 LogDebug(
"EcalSim") <<
"ECalSD:: " << nameVolume
197 <<
" Light Collection Efficiency " <<weight <<
":" <<wt1
198 <<
" Weighted Energy Deposit " << edep/
MeV <<
" MeV";
209 G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
218 primaryID = aTrack->GetTrackID();
226 G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
232 LogDebug(
"EcalSim") <<
"Volume " << lv->GetName() <<
" Depth " <<
ret;
241 G4StepPoint* hitPoint = aStep->GetPreStepPoint();
242 G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
245 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
246 hitPoint->GetTouchable());
248 double radl = hitPoint->GetMaterial()->GetRadlen();
249 double detz = (float)(0.5*crlength + localPoint.z());
250 thisX0 = (uint16_t)floor(detz/radl);
267 edm::LogInfo(
"EcalSim") <<
"EcalSD: updates numbering scheme for "
268 << GetName() <<
"\n";
277 G4String attribute =
"ReadOutName";
285 std::vector<G4LogicalVolume*> lvused;
286 const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
287 std::vector<G4LogicalVolume *>::const_iterator lvcite;
288 std::map<std::string, G4LogicalVolume *> nameMap;
289 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
290 nameMap.insert(std::make_pair((*lvi)->GetName(), *lvi));
296 G4LogicalVolume* lv = nameMap[lvname];
298 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
302 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
303 <<
" in Depth 1 volume list";
306 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
310 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl"
311 <<
" in Depth 1 volume list";
317 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
321 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
322 <<
" in Depth 2 volume list";
325 G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
329 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl"
330 <<
" in Depth 2 volume list";
337 if (!
any(lvused,lv)) {
338 lvused.push_back(lv);
340 const std::vector<double> & paras = sol.
parameters();
342 LogDebug(
"EcalSim") <<
"ECalSD::initMap (for " << sd <<
"): Solid "
343 << lvname <<
" Shape " << sol.
shape()
344 <<
" Parameter 0 = "<< paras[0]
345 <<
" Logical Volume " << lv;
348 double dz = 2*paras[0];
349 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
350 lv = nameMap[lvname +
"_refl"];
352 xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
359 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
360 <<
" Material " << matname <<
" in noWeight list";
363 lv = nameMap[lvname];
367 LogDebug(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname
368 <<
" Material " << matname <<
" in noWeight list";
376 LogDebug(
"EcalSim") <<
"ECalSD: Length Table for " << attribute <<
" = "
378 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.begin();
380 for (; ite !=
xtalLMap.end(); ite++, i++) {
381 G4String
name =
"Unknown";
382 if (ite->first != 0) name = (ite->first)->GetName();
383 LogDebug(
"EcalSim") <<
" " << i <<
" " << ite->first <<
" " << name
384 <<
" L = " << ite->second;
391 G4StepPoint* stepPoint = aStep->GetPreStepPoint();
392 G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
395 G4ThreeVector localPoint =
setToLocal(stepPoint->GetPosition(),
396 stepPoint->GetTouchable());
402 double depth = 0.5 * crlength + localPoint.z();
404 if (depth >= -0.1 || depth <= crlength+0.1)
408 double dapd = 0.5 * crlength - localPoint.z();
409 if (dapd >= -0.1 || dapd <= crlength+0.1) {
413 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance "
414 <<
"to APD " << dapd <<
" crlength = "
415 << crlength <<
" crystal name = " <<lv->GetName()
416 <<
" z of localPoint = " << localPoint.z()
417 <<
" take weight = " <<
weight;
421 LogDebug(
"EcalSim") <<
"ECalSD, light coll curve : " << dapd
422 <<
" crlength = " << crlength
423 <<
" crystal name = " << lv->GetName()
424 <<
" z of localPoint = " << localPoint.z()
425 <<
" take weight = " <<
weight;
433 std::map<G4LogicalVolume*,double>::const_iterator ite =
xtalLMap.find(lv);
434 if (ite !=
xtalLMap.end()) length = ite->second;
441 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
442 int theSize = touch->GetHistoryDepth()+1;
446 for (
int ii = 0;
ii < theSize ;
ii++) {
449 LogDebug(
"EcalSim") <<
"ECalSD::getBaseNumber(): Adding level " <<
ii
450 <<
": " << touch->GetVolume(
ii)->GetName() <<
"["
451 << touch->GetReplicaNumber(
ii) <<
"]";
461 double charge = aStep->GetPreStepPoint()->GetCharge();
463 if (charge != 0. && aStep->GetStepLength() > 0) {
464 G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
465 double density = mat->GetDensity();
466 double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
467 double rkb =
birk1/density;
471 else if (weight > 1.) weight = 1.;
474 LogDebug(
"EcalSim") <<
"ECalSD::getBirkL3 in " << mat->GetName()
475 <<
" Charge " << charge <<
" dE/dx " << dedx
476 <<
" Birk Const " << rkb <<
" Weight = " << weight
477 <<
" dE " << aStep->GetTotalEnergyDeposit();
488 LogDebug(
"EcalSim") <<
"ECalSD:getDDDArray called for " << str;
495 const std::vector<double> & fvec = value.
doubles();
498 std::vector<double> fvec;
507 LogDebug(
"EcalSim") <<
"ECalSD:getStringArray called for " << str;
514 const std::vector<std::string> & fvec = value.
strings();
517 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 *)
void addFilter(const DDFilter &, DDLogOp op=DDLogOp::AND)
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 *)
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
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.
void setCriteria(const DDValue &nameVal, DDCompOp, DDLogOp l=DDLogOp::AND, bool asString=true, bool merged=true)
virtual uint32_t getUnitID(const EcalBaseNumber &baseNumber) const =0
The DDGenericFilter is a runtime-parametrized Filter looking on DDSpecifcs.
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *)