22 #include "G4LogicalVolumeStore.hh" 23 #include "G4LogicalVolume.hh" 26 #include "G4VProcess.hh" 27 #include "G4SystemOfUnits.hh" 36 bool any(
const std::vector<T>&
v,
const T& what) {
51 ecalSimParameters_(ecpar) {
64 double bunit = (
CLHEP::g / (CLHEP::MeV * CLHEP::cm2));
88 edm::LogError(
"EcalSim") <<
"ECalSD : Cannot find EcalSimulationParameters for " <<
name;
89 throw cms::Exception(
"Unknown",
"ECalSD") <<
"Cannot find EcalSimulationParameters for " <<
name <<
"\n";
107 }
else if (
name ==
"EcalHitsEB") {
110 dump = ((dumpGeom % 10) > 0);
111 }
else if (
name ==
"EcalHitsEE") {
114 dump = (((dumpGeom / 10) % 10) > 0);
115 }
else if (
name ==
"EcalHitsES") {
122 dump = (((dumpGeom / 100) % 10) > 0);
126 int type0 = dumpGeom / 1000;
127 type += (10 * type0);
133 edm::LogVerbatim(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
137 <<
" with three constants kB = " <<
birk1 / bunit <<
", C1 = " <<
birk2 138 <<
", C2 = " <<
birk3 <<
"\n Use of L3 parametrization " <<
useBirkL3 140 <<
" Slope for Light yield is set to " <<
slopeLY;
143 <<
" by Birk or light yield curve";
148 <<
" MeV,\tions below " <<
kmaxIon / CLHEP::MeV <<
" MeV \n\tDepth1 Name = " <<
depth1Name 157 if (
tfile.isAvailable()) {
159 static const std::string ctype[4] = {
"EB",
"EBref",
"EE",
"EERef"};
160 for (
int k = 0;
k < 4; ++
k) {
163 double xmin = (
k > 1) ? 3000.0 : 1000.0;
167 for (
int k = 0;
k < 4; ++
k)
181 const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
182 const G4Track* theTrack = aStep->GetTrack();
183 double edep = aStep->GetTotalEnergyDeposit();
190 int pdg = theTrack->GetDefinition()->GetPDGEncoding();
192 double ke = theTrack->GetKineticEnergy();
193 if (((
pdg / 1000000000 == 1 && ((
pdg / 10000) % 100) > 0 && ((
pdg / 10) % 100) > 0)) && (ke <
kmaxIon))
202 const G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
216 double wt2 = theTrack->GetWeight();
223 <<
" Light Collection Efficiency " <<
weight <<
":" << wt1 <<
" wt2= " << wt2
224 <<
" Weighted Energy Deposit " << edep / CLHEP::MeV <<
" MeV at " 225 << preStepPoint->GetPosition();
231 const G4StepPoint* hitPoint =
step.GetPreStepPoint();
232 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
233 if (lv->GetSensitiveDetector() !=
this)
236 double edep =
step.GetTotalEnergyDeposit();
251 primaryID = aTrack->GetTrackID();
260 const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
262 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
268 uint16_t depth1(0), depth2(0);
280 <<
std::dec <<
" Global " << (hitPoint->GetPosition()).
rho() <<
":" 284 <<
" L " << (ite ==
xtalLMap.end()) <<
":" << ite->second <<
" local " 293 double radl = hitPoint->GetMaterial()->GetRadlen();
297 int k1 = (lvname.find(
"EFRY") != std::string::npos) ? 2 : 0;
298 int k2 = (lvname.find(
"refl") != std::string::npos) ? 1 : 0;
300 double rz = (k1 == 0) ? (hitPoint->GetPosition()).
rho() :
std::abs((hitPoint->GetPosition()).
z());
301 edm::LogVerbatim(
"EcalSim") << lvname <<
" # " << k1 <<
":" << k2 <<
":" <<
kk <<
" rz " << rz <<
" D " << thisX0;
302 g2L_[
kk]->Fill(rz, thisX0);
305 G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
308 << hitPoint->GetPosition() <<
":" << (hitPoint->GetPosition()).
rho() <<
" Local " 309 << localPoint <<
" Crystal Length " <<
crystalLength <<
" Radl " << radl
310 <<
" crystalDepth " <<
crystalDepth <<
" Index " << thisX0 <<
" : " 318 const double invLayerSize = 0.1;
333 edm::LogVerbatim(
"EcalSim") <<
"EcalSD: updates numbering scheme for " << GetName();
339 std::vector<const G4LogicalVolume*> lvused;
340 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
341 std::map<const std::string, const G4LogicalVolume*> nameMap;
342 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
348 const G4LogicalVolume* lv = nameMap[lvname];
349 int ibec = (lvname.find(
"EFRY") == std::string::npos) ? 0 : 1;
350 int iref = (lvname.find(
"refl") == std::string::npos) ? 0 : 1;
351 int type = (ibec + iref == 1) ? 1 : -1;
353 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
357 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" in Depth 1 volume list";
360 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
364 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 365 <<
" in Depth 1 volume list";
371 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
375 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" in Depth 2 volume list";
378 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
382 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
"_refl" 383 <<
" in Depth 2 volume list";
390 if (!
any(lvused, lv)) {
391 lvused.push_back(lv);
393 xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv,
dz *
type));
394 lv = nameMap[lvname +
"_refl"];
396 xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, -
dz *
type));
403 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" Material " << matname
404 <<
" in noWeight list";
407 lv = nameMap[lvname];
411 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::initMap Logical Volume " << lvname <<
" Material " << matname
412 <<
" in noWeight list";
423 if (ite.first !=
nullptr)
443 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance " 445 <<
" crystal name = " << lv->GetName() <<
" " 452 <<
" crystal name = " << lv->GetName() <<
" " 461 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
462 int theSize = touch->GetHistoryDepth() + 1;
467 for (
int ii = 0;
ii < theSize;
ii++) {
472 << touch->GetReplicaNumber(
ii) <<
"]";
480 const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
481 double charge = preStepPoint->GetCharge();
483 if (
charge != 0. && aStep->GetStepLength() > 0.) {
484 const G4Material* mat = preStepPoint->GetMaterial();
485 double density = mat->GetDensity();
486 double dedx = aStep->GetTotalEnergyDeposit() / aStep->GetStepLength();
498 <<
charge <<
" dE/dx " << dedx <<
" Birk Const " << rkb <<
" Weight = " <<
weight 499 <<
" dE " << aStep->GetTotalEnergyDeposit();
Log< level::Info, true > LogVerbatim
bool isXtal(const G4LogicalVolume *)
T getParameter(std::string const &) const
std::vector< std::string > lvNames_
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
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
std::unique_ptr< EcalNumberingScheme > numberingScheme_
virtual int getTrackID(const G4Track *)
std::vector< double > dzs_
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
const std::vector< std::string_view > logicalNames(const std::string &readoutName) const
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
double getBirkL3(const G4Step *)
T getUntrackedParameter(std::string const &, T const &) const
int getTrackID(const G4Track *) override
std::vector< std::string > matNames_
T * make(const Args &...args) const
make new ROOT object
void addLevel(const std::string &name, const int ©Number)
std::map< const G4LogicalVolume *, double > xtalLMap
double getResponseWt(const G4Track *, int k=0)
EcalBaseNumber theBaseNumber
static const int kEcalDepthMask
Abs< T >::type abs(const T &t)
uint16_t getLayerIDForTimeSim()
static const int kEcalDepthOffset
const EcalSimulationParameters * ecalSimParameters_
G4ThreeVector currentLocalPoint
uint16_t getRadiationLength(const G4StepPoint *hitPoint, const G4LogicalVolume *lv)
std::vector< const G4LogicalVolume * > useDepth1
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
ECalSD(const std::string &, const EcalSimulationParameters *, const SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
std::string noNameSpace(const std::string &name)
double curve_LY(const G4LogicalVolume *)
EnergyResolutionVsLumi ageing
Log< level::Warning, false > LogWarning
void setNumberingScheme(EcalNumberingScheme *)
uint32_t setDetUnitId(const G4Step *) override
void setSize(const int &size)
double EnergyCorrected(const G4Step &, const G4Track *) override
uint16_t getDepth(const G4Step *) override