24 #include "G4LogicalVolumeStore.hh" 25 #include "G4LogicalVolume.hh" 28 #include "G4VProcess.hh" 30 #include "G4SystemOfUnits.hh" 37 bool any(
const std::vector<T>&
v,
const T& what) {
38 return std::find(v.begin(), v.end(), what) != v.end();
83 if (ageingWithSlopeLY)
101 edm::LogVerbatim(
"EcalSim") <<
"ECalSD:: useWeight " << tempD.size() <<
":" << useWeight << std::endl;
119 }
else if (name ==
"EcalHitsEB") {
122 }
else if (name ==
"EcalHitsEE") {
125 }
else if (name ==
"EcalHitsES") {
138 edm::LogVerbatim(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
141 edm::LogVerbatim(
"EcalSim") <<
"ECalSD:: Use of Birks law is set to " << useBirk
142 <<
" with three constants kB = " << birk1 <<
", C1 = " << birk2
143 <<
", C2 = " << birk3 <<
"\n Use of L3 parametrization " << useBirkL3
144 <<
" with slope " << birkSlope <<
" and cut off " << birkCut <<
"\n" 145 <<
" Slope for Light yield is set to " <<
slopeLY;
148 <<
" by Birk or light yield curve";
154 <<
"\tions below " <<
kmaxIon <<
" MeV" 157 <<
"\n\ttime Granularity " 166 static const std::string ctype[4] = {
"EB",
"EBref",
"EE",
"EERef"};
167 for (
int k = 0;
k < 4; ++
k) {
170 double xmin = (
k > 1) ? 3000.0 : 1000.0;
171 g2L_[
k] = ecDir.
make<TH2F>(name.c_str(), title.c_str(), 100,
xmin, xmin + 1000., 100, 0.0, 3000.);
174 for (
int k = 0;
k < 4; ++
k)
183 const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
184 const G4Track* theTrack = aStep->GetTrack();
185 double edep = aStep->GetTotalEnergyDeposit();
192 int pdg = theTrack->GetDefinition()->GetPDGEncoding();
194 double ke = theTrack->GetKineticEnergy();
195 if (((pdg / 1000000000 == 1 && ((pdg / 10000) % 100) > 0 && ((pdg / 10) % 100) > 0)) && (ke <
kmaxIon))
204 const G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
216 edep *= weight * wt1;
218 double wt2 = theTrack->GetWeight();
223 edm::LogVerbatim(
"EcalSim") << lv->GetName() <<
" Light Collection Efficiency " << weight <<
":" << wt1
224 <<
" wt2= " << wt2 <<
" Weighted Energy Deposit " << edep /
MeV <<
" MeV";
233 primaryID = aTrack->GetTrackID();
242 const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
244 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
261 <<
" L " << (ite ==
xtalLMap.end()) <<
":" << ite->second;
269 double radl = hitPoint->GetMaterial()->GetRadlen();
273 int k1 = (lvname.find(
"EFRY") != std::string::npos) ? 2 : 0;
274 int k2 = (lvname.find(
"refl") != std::string::npos) ? 1 : 0;
276 double rz = (k1 == 0) ? (hitPoint->GetPosition()).
rho() :
std::abs((hitPoint->GetPosition()).
z());
277 edm::LogVerbatim(
"EcalSim") << lvname <<
" # " << k1 <<
":" << k2 <<
":" << kk <<
" rz " << rz <<
" D " << thisX0;
278 g2L_[
kk]->Fill(rz, thisX0);
281 edm::LogVerbatim(
"EcalSim") << lv->GetName() <<
" Global " << hitPoint->GetPosition() <<
":" 282 << (hitPoint->GetPosition()).
rho() <<
" Local " << localPoint <<
" Crystal Length " 283 << crlength <<
" Radl " << radl <<
" DetZ " << detz <<
" Index " << thisX0 <<
" : " 291 const double invLayerSize = 0.1;
305 if (scheme !=
nullptr) {
306 edm::LogVerbatim(
"EcalSim") <<
"EcalSD: updates numbering scheme for " << GetName();
314 G4String attribute =
"ReadOutName";
319 std::vector<const G4LogicalVolume*> lvused;
320 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
321 std::map<const std::string, const G4LogicalVolume*> nameMap;
322 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
323 nameMap.emplace((*lvi)->GetName(), *lvi);
329 const G4LogicalVolume* lv = nameMap[lvname];
330 int ibec = (lvname.find(
"EFRY") == std::string::npos) ? 0 : 1;
331 int iref = (lvname.find(
"refl") == std::string::npos) ? 0 : 1;
332 int type = (ibec + iref == 1) ? 1 : -1;
334 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
338 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" in Depth 1 volume list";
341 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
345 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 346 <<
" in Depth 1 volume list";
352 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
356 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" in Depth 2 volume list";
359 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
363 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 364 <<
" in Depth 2 volume list";
371 if (!
any(lvused, lv)) {
372 lvused.push_back(lv);
374 const std::vector<double>& paras = sol.
parameters();
376 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap (for " << sd <<
"): Solid " << lvname <<
" Shape " 377 << sol.
shape() <<
" Parameter 0 = " << paras[0] <<
" Logical Volume " << lv;
380 double dz = 2 * paras[0];
381 xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, dz * type));
382 lv = nameMap[lvname +
"_refl"];
384 xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, -dz * type));
392 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" Material " << matname
393 <<
" in noWeight list";
396 lv = nameMap[lvname];
400 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" Material " << matname
401 <<
" in noWeight list";
409 edm::LogVerbatim(
"EcalSim") <<
"ECalSD: Length Table for " << attribute <<
" = " << sd <<
":";
412 G4String
name(
"Unknown");
414 name = (ite.first)->GetName();
415 edm::LogVerbatim(
"EcalSim") <<
" " << i <<
" " << ite.first <<
" " << name <<
" L = " << ite.second;
433 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance " 435 <<
" crystal name = " << lv->GetName()
444 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
445 int theSize = touch->GetHistoryDepth() + 1;
450 for (
int ii = 0;
ii < theSize;
ii++) {
454 << touch->GetVolume(
ii)->GetName() <<
"[" << touch->GetReplicaNumber(
ii) <<
"]";
462 const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
463 double charge = preStepPoint->GetCharge();
465 if (charge != 0. && aStep->GetStepLength() > 0.) {
466 const G4Material* mat = preStepPoint->GetMaterial();
467 double density = mat->GetDensity();
468 double dedx = aStep->GetTotalEnergyDeposit() / aStep->GetStepLength();
469 double rkb =
birk1 / density;
474 else if (weight > 1.)
478 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::getBirkL3 in " << mat->GetName() <<
" Charge " << charge <<
" dE/dx " 479 << dedx <<
" Birk Const " << rkb <<
" Weight = " << weight <<
" dE " 480 << aStep->GetTotalEnergyDeposit();
495 const std::vector<double>& fvec = value.
doubles();
498 std::vector<double> fvec;
512 const std::vector<std::string>& fvec = value.
strings();
515 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 &)
void setLumies(double x, double y)
std::vector< const G4LogicalVolume * > useDepth2
void getBaseNumber(const G4Step *)
static const int kEcalDepthRefz
std::vector< const G4LogicalVolume * > noWeight
bool any(const std::vector< T > &v, const T &what)
double getEnergyDeposit(const G4Step *) override
virtual int getTrackID(const 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)
Compact representation of the geometrical detector hierarchy.
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
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
A DDSolid represents the shape of a part.
static TrackerG4SimHitNumberingScheme & numberingScheme(const DDCompactView &cpv, const GeometricDet &det)
double getBirkL3(const G4Step *)
int getTrackID(const G4Track *) override
void addLevel(const std::string &name, const int ©Number)
std::map< const G4LogicalVolume *, double > xtalLMap
EcalBaseNumber theBaseNumber
bool next()
set current node to the next node in the filtered tree
static const int kEcalDepthMask
Abs< T >::type abs(const T &t)
uint16_t getLayerIDForTimeSim()
DDSolidShape shape(void) const
The type of the solid.
static const int kEcalDepthOffset
T * make(const Args &...args) const
make new ROOT object
const std::vector< std::string > & strings() const
a reference to the std::string-valued values stored in the given instance of DDValue ...
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
G4ThreeVector currentLocalPoint
uint16_t getRadiationLength(const G4StepPoint *hitPoint, const G4LogicalVolume *lv)
void initMap(const G4String &, const DDCompactView &)
std::vector< const G4LogicalVolume * > useDepth1
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
virtual uint32_t getUnitID(const EcalBaseNumber &baseNumber) const =0
std::vector< double > getDDDArray(const std::string &, const DDsvalues_type &)
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
DDsvalues_type mergedSpecifics() const
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
std::vector< std::pair< unsigned int, DDValue > > DDsvalues_type
ECalSD(const std::string &, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
bool firstChild()
set the current node to the first child ...
double curve_LY(const G4LogicalVolume *)
EcalNumberingScheme * numberingScheme
EnergyResolutionVsLumi ageing
void setNumberingScheme(EcalNumberingScheme *)
uint32_t setDetUnitId(const G4Step *) override
double getResponseWt(const G4Track *)
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.
uint16_t getDepth(const G4Step *) override