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();
44 CaloSD(name, cpv, clg, p, manager,
89 std::vector<double> tempD =
getDDDArray(
"EnergyWeight",sv);
90 if (!tempD.empty()) {
if (tempD[0] < 0.1) useWeight =
false; }
92 edm::LogInfo(
"EcalSim") <<
"ECalSD:: useWeight " << tempD.size() <<
":" 93 << useWeight << std::endl;
108 }
else if (name ==
"EcalHitsEB") {
111 }
else if (name ==
"EcalHitsEE") {
114 }
else if (name ==
"EcalHitsES") {
124 edm::LogInfo(
"EcalSim") <<
"Constructing a ECalSD with name " << GetName();
127 edm::LogInfo(
"EcalSim") <<
"ECalSD:: Use of Birks law is set to " 128 << useBirk <<
" with three constants kB = " 129 << birk1 <<
", C1 = " << birk2 <<
", C2 = " 130 << birk3 <<
"\n Use of L3 parametrization " 131 << useBirkL3 <<
" with slope " << birkSlope
132 <<
" and cut off " << birkCut <<
"\n" 133 <<
" Slope for Light yield is set to " 136 edm::LogInfo(
"EcalSim") <<
"ECalSD:: energy deposit is not corrected " 137 <<
" by Birk or light yield curve";
141 <<
"\tprotons below " <<
kmaxProton <<
" MeV," 143 <<
"\tions below " <<
kmaxIon <<
" MeV" 146 <<
"\n\tstoreRL" << storeRL <<
":" << scaleRL
149 if (useWeight)
initMap(name,cpv);
154 static const std::string ctype[4] = {
"EB",
"EBref",
"EE",
"EERef"};
155 for (
int k=0;
k<4; ++
k) {
158 double xmin = (
k > 1) ? 3000.0 : 1000.0;
159 g2L_[
k] = ecDir.
make<TH2F>(name.c_str(),title.c_str(),100,
xmin,
160 xmin+1000.,100,0.0,3000.);
163 for (
int k=0;
k<4; ++
k) g2L_[
k] = 0;
175 if (aStep ==
nullptr) {
181 const G4String nameVolume =
preStepPoint->GetPhysicalVolume()->GetName();
188 int pdg =
theTrack->GetDefinition()->GetPDGEncoding();
191 if (((pdg/1000000000 == 1 && ((pdg/10000)%100) > 0 &&
192 ((pdg/10)%100) > 0)) && (ke<
kmaxIon)) weight = 0;
193 if ((pdg == 2212) && (ke <
kmaxProton)) weight = 0;
194 if ((pdg == 2112) && (ke <
kmaxNeutron)) weight = 0;
198 <<
" Type " <<
theTrack->GetDefinition()->GetParticleName()
199 <<
" Kinetic Energy " << ke <<
" MeV";
204 const G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
213 double edep = aStep->GetTotalEnergyDeposit()*weight*wt1;
235 if(wt2 > 0.0) { edep *= wt2; }
238 <<
" Light Collection Efficiency " << weight <<
":" 239 << wt1 <<
" Weighted Energy Deposit " << edep/
MeV 251 const G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
260 primaryID = aTrack->GetTrackID();
268 const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
269 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
273 uint16_t depth1 = (ite ==
xtalLMap.end()) ? 0 : (((ite->second) >= 0) ? 0 :
282 edm::LogVerbatim(
"EcalSim") <<
"ECalSD::Depth " << std::hex << depth1 <<
":" 283 << depth2 <<
":" << depth <<
std::dec <<
" L " 284 << (ite ==
xtalLMap.end()) <<
":" <<ite->second;
292 if (aStep !=
nullptr) {
293 const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
294 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
299 const G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
300 hitPoint->GetTouchable());
303 thisX0 = (uint16_t)floor(
scaleRL*depth/radl);
306 int k1 = (lvname.find(
"EFRY")!=std::string::npos) ? 2 : 0;
307 int k2 = (lvname.find(
"refl")!=std::string::npos) ? 1 : 0;
309 double rz = (k1 == 0) ? (hitPoint->GetPosition()).
rho() :
312 << kk <<
" rz " << rz <<
" D " << thisX0;
313 g2L_[
kk]->Fill(rz,thisX0);
318 << hitPoint->GetPosition() <<
":" 319 << (hitPoint->GetPosition()).
rho()
320 <<
" Local " << localPoint
321 <<
" Crystal Length " << crlength
322 <<
" Radl " << radl <<
" DetZ " << detz
323 <<
" Index " << thisX0
333 float layerSize = 1*cm;
336 if (aStep !=
nullptr ) {
337 const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
338 const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
339 const G4ThreeVector localPoint =
setToLocal(hitPoint->GetPosition(),
340 hitPoint->GetTouchable());
343 return (
int)detz/layerSize;
358 if (scheme !=
nullptr) {
359 edm::LogInfo(
"EcalSim") <<
"EcalSD: updates numbering scheme for " 368 G4String attribute =
"ReadOutName";
373 std::vector<const G4LogicalVolume*> lvused;
374 const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
375 std::vector<const G4LogicalVolume *>::const_iterator lvcite;
376 std::map<const std::string, const G4LogicalVolume *> nameMap;
377 for (
auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
378 nameMap.insert(std::make_pair((*lvi)->GetName(), *lvi));
384 const G4LogicalVolume* lv = nameMap[lvname];
385 int ibec = (lvname.find(
"EFRY") == std::string::npos) ? 0 : 1;
386 int iref = (lvname.find(
"refl") == std::string::npos) ? 0 : 1;
387 int type = (ibec+iref == 1) ? 1 : -1;
389 if (strncmp(lvname.c_str(),
depth1Name.c_str(), 4) == 0) {
393 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 394 << lvname <<
" in Depth 1 volume list";
397 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
401 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 403 <<
" in Depth 1 volume list";
409 if (strncmp(lvname.c_str(),
depth2Name.c_str(), 4) == 0) {
413 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 414 << lvname <<
" in Depth 2 volume list";
417 const G4LogicalVolume* lvr = nameMap[lvname +
"_refl"];
421 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 423 <<
" in Depth 2 volume list";
430 if (!
any(lvused,lv)) {
431 lvused.push_back(lv);
433 const std::vector<double> & paras = sol.
parameters();
435 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap (for " << sd
436 <<
"): Solid " << lvname <<
" Shape " 437 << sol.
shape() <<
" Parameter 0 = " 438 << paras[0] <<
" Logical Volume " << lv;
441 double dz = 2*paras[0];
442 xtalLMap.insert(std::pair<const G4LogicalVolume*,double>(lv,dz*type));
443 lv = nameMap[lvname +
"_refl"];
445 xtalLMap.insert(std::pair<const G4LogicalVolume*,double>(lv,-dz*type));
453 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 454 << lvname <<
" Material " << matname
455 <<
" in noWeight list";
458 lv = nameMap[lvname];
462 edm::LogInfo(
"EcalSim") <<
"ECalSD::initMap Logical Volume " 463 << lvname <<
" Material " << matname
464 <<
" in noWeight list";
472 edm::LogInfo(
"EcalSim") <<
"ECalSD: Length Table for " << attribute <<
" = " 476 G4String
name(
"Unknown");
477 if (ite.first != 0) name = (ite.first)->GetName();
478 edm::LogInfo(
"EcalSim") <<
" " << i <<
" " << ite.first <<
" " << name
479 <<
" L = " << ite.second;
487 const G4LogicalVolume* lv =
preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
498 if (depth >= -0.1 || depth <= crlength+0.1)
501 double dapd = crlength -
depth;
502 if (dapd >= -0.1 || dapd <= crlength+0.1) {
506 edm::LogWarning(
"EcalSim") <<
"ECalSD: light coll curve : wrong distance " 507 <<
"to APD " << dapd <<
" crlength = " 508 << crlength <<
" crystal name = " <<lv->GetName()
509 <<
" z of localPoint = " << localPoint.z()
510 <<
" take weight = " <<
weight;
524 const G4ThreeVector& localPoint) {
528 (
std::abs(0.5*(ite->second)+localPoint.z()));
536 const G4VTouchable* touch =
preStepPoint->GetTouchable();
537 int theSize = touch->GetHistoryDepth()+1;
541 for (
int ii = 0;
ii < theSize ;
ii++) {
544 edm::LogInfo(
"EcalSim") <<
"ECalSD::getBaseNumber(): Adding level " <<
ii 545 <<
": " << touch->GetVolume(
ii)->GetName() <<
"[" 546 << touch->GetReplicaNumber(
ii) <<
"]";
557 if (charge != 0. && aStep->GetStepLength() > 0.) {
559 double density = mat->GetDensity();
560 double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
561 double rkb =
birk1/density;
565 else if (weight > 1.) weight = 1.;
568 edm::LogInfo(
"EcalSim") <<
"ECalSD::getBirkL3 in " << mat->GetName()
569 <<
" Charge " << charge <<
" dE/dx " << dedx
570 <<
" Birk Const " << rkb <<
" Weight = " << weight
571 <<
" dE " << aStep->GetTotalEnergyDeposit();
589 const std::vector<double> & fvec = value.
doubles();
592 std::vector<double> fvec;
608 const std::vector<std::string> & fvec = value.
strings();
611 std::vector<std::string> fvec;
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3)
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.
double curve_LY(const G4Step *)
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 &)
virtual uint16_t getRadiationLength(const G4Step *)
void setLumies(double x, double y)
std::vector< const G4LogicalVolume * > noWeight
void getBaseNumber(const G4Step *)
static const int kEcalDepthRefz
bool any(const std::vector< T > &v, const T &what)
std::vector< const G4LogicalVolume * > useDepth2
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)
type of data representation of DDCompactView
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)
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::...
static const int kEcalDepthMask
Abs< T >::type abs(const T &t)
DDSolidShape shape(void) const
The type of the solid.
static const int kEcalDepthOffset
double crystalLength(const G4LogicalVolume *)
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 ...
G4StepPoint * preStepPoint
void initMap(const G4String &, const DDCompactView &)
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
std::map< const G4LogicalVolume *, double > xtalLMap
double getEnergyDeposit(G4Step *) override
double crystalDepth(const G4LogicalVolume *, const G4ThreeVector &)
std::vector< const G4LogicalVolume * > useDepth1
ECalSD(const std::string &, const DDCompactView &, const SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
bool firstChild()
set the current node to the first child ...
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
virtual uint16_t getLayerIDForTimeSim(const G4Step *)
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *)