CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
ECalSD Class Reference

#include <ECalSD.h>

Inheritance diagram for ECalSD:
CaloSD SensitiveCaloDetector Observer< const BeginOfRun * > Observer< const BeginOfEvent * > Observer< const BeginOfTrack * > Observer< const EndOfTrack * > Observer< const EndOfEvent * > SensitiveDetector

Public Member Functions

 ECalSD (G4String, const DDCompactView &, SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
 
virtual uint16_t getDepth (G4Step *)
 
virtual double getEnergyDeposit (G4Step *)
 
virtual uint16_t getRadiationLength (G4Step *)
 
virtual int getTrackID (G4Track *)
 
virtual uint32_t setDetUnitId (G4Step *)
 
void setNumberingScheme (EcalNumberingScheme *)
 
virtual ~ECalSD ()
 
- Public Member Functions inherited from CaloSD
 CaloSD (G4String aSDname, const DDCompactView &cpv, SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *, int tSlice=1, bool ignoreTkID=false)
 
virtual void clear ()
 
virtual void DrawAll ()
 
virtual void EndOfEvent (G4HCofThisEvent *eventHC)
 
void fillHits (edm::PCaloHitContainer &, std::string n)
 
virtual void Initialize (G4HCofThisEvent *HCE)
 
virtual void PrintAll ()
 
virtual bool ProcessHits (G4Step *step, G4TouchableHistory *tHistory)
 
virtual bool ProcessHits (G4GFlashSpot *aSpot, G4TouchableHistory *)
 
virtual ~CaloSD ()
 
- Public Member Functions inherited from SensitiveCaloDetector
 SensitiveCaloDetector (std::string &iname, const DDCompactView &cpv, SensitiveDetectorCatalog &clg, edm::ParameterSet const &p)
 
- Public Member Functions inherited from SensitiveDetector
virtual void AssignSD (std::string &vname)
 
Local3DPoint ConvertToLocal3DPoint (G4ThreeVector point)
 
Local3DPoint FinalStepPosition (G4Step *s, coordinates)
 
virtual std::vector< std::string > getNames ()
 
Local3DPoint InitialStepPosition (G4Step *s, coordinates)
 
std::string nameOfSD ()
 
void NaNTrap (G4Step *step)
 
void Register ()
 
 SensitiveDetector (std::string &iname, const DDCompactView &cpv, SensitiveDetectorCatalog &, edm::ParameterSet const &p)
 
virtual ~SensitiveDetector ()
 
- Public Member Functions inherited from Observer< const BeginOfRun * >
 Observer ()
 
void slotForUpdate (const BeginOfRun *iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const BeginOfEvent * >
 Observer ()
 
void slotForUpdate (const BeginOfEvent *iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const BeginOfTrack * >
 Observer ()
 
void slotForUpdate (const BeginOfTrack *iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const EndOfTrack * >
 Observer ()
 
void slotForUpdate (const EndOfTrack *iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const EndOfEvent * >
 Observer ()
 
void slotForUpdate (const EndOfEvent *iT)
 
virtual ~Observer ()
 

Private Member Functions

double crystalLength (G4LogicalVolume *)
 
double curve_LY (G4Step *)
 
void getBaseNumber (const G4Step *)
 
double getBirkL3 (G4Step *)
 
std::vector< double > getDDDArray (const std::string &, const DDsvalues_type &)
 
std::vector< std::string > getStringArray (const std::string &, const DDsvalues_type &)
 
void initMap (G4String, const DDCompactView &)
 

Private Attributes

EnergyResolutionVsLumi ageing
 
bool ageingWithSlopeLY
 
double birk1
 
double birk2
 
double birk3
 
double birkCut
 
double birkSlope
 
std::string crystalMat
 
std::string depth1Name
 
std::string depth2Name
 
std::vector< G4LogicalVolume * > noWeight
 
EcalNumberingSchemenumberingScheme
 
double slopeLY
 
bool storeRL
 
bool storeTrack
 
EcalBaseNumber theBaseNumber
 
bool useBirk
 
bool useBirkL3
 
std::vector< G4LogicalVolume * > useDepth1
 
std::vector< G4LogicalVolume * > useDepth2
 
bool useWeight
 
std::map< G4LogicalVolume
*, double > 
xtalLMap
 

Additional Inherited Members

- Public Types inherited from SensitiveDetector
enum  coordinates { WorldCoordinates, LocalCoordinates }
 
- Protected Member Functions inherited from CaloSD
G4bool checkHit ()
 
virtual void clearHits ()
 
CaloG4HitcreateNewHit ()
 
virtual bool filterHit (CaloG4Hit *, double)
 
double getAttenuation (G4Step *aStep, double birk1, double birk2, double birk3)
 
int getNumberOfHits ()
 
double getResponseWt (G4Track *)
 
virtual G4bool getStepInfo (G4Step *aStep)
 
G4bool hitExists ()
 
virtual void initRun ()
 
void resetForNewPrimary (G4ThreeVector, double)
 
G4ThreeVector setToGlobal (G4ThreeVector, const G4VTouchable *)
 
G4ThreeVector setToLocal (G4ThreeVector, const G4VTouchable *)
 
virtual void update (const BeginOfRun *)
 This routine will be called when the appropriate signal arrives. More...
 
virtual void update (const BeginOfEvent *)
 This routine will be called when the appropriate signal arrives. More...
 
virtual void update (const BeginOfTrack *trk)
 This routine will be called when the appropriate signal arrives. More...
 
virtual void update (const EndOfTrack *trk)
 This routine will be called when the appropriate signal arrives. More...
 
virtual void update (const ::EndOfEvent *)
 
void updateHit (CaloG4Hit *)
 
- Protected Member Functions inherited from Observer< const EndOfEvent * >
virtual void update (const EndOfEvent *)=0
 This routine will be called when the appropriate signal arrives. More...
 
- Protected Attributes inherited from CaloSD
int checkHits
 
double correctT
 
bool corrTOFBeam
 
CaloG4HitcurrentHit
 
CaloHitID currentID
 
float edepositEM
 
float edepositHAD
 
double eminHit
 
double eminHitD
 
G4int emPDG
 
double energyCut
 
G4ThreeVector entranceLocal
 
G4ThreeVector entrancePoint
 
G4int epPDG
 
bool forceSave
 
G4int gammaPDG
 
float incidentEnergy
 
double kmaxIon
 
double kmaxNeutron
 
double kmaxProton
 
const SimTrackManagerm_trackManager
 
G4ThreeVector posGlobal
 
G4StepPoint * preStepPoint
 
CaloHitID previousID
 
int primIDSaved
 
bool runInit
 
bool suppressHeavy
 
G4Track * theTrack
 
double tmaxHit
 
bool useMap
 

Detailed Description

Definition at line 26 of file ECalSD.h.

Constructor & Destructor Documentation

ECalSD::ECalSD ( G4String  name,
const DDCompactView cpv,
SensitiveDetectorCatalog clg,
edm::ParameterSet const &  p,
const SimTrackManager manager 
)

Definition at line 37 of file ECalSD.cc.

References DDFilteredView::addFilter(), ageing, ageingWithSlopeLY, birk1, birk2, birk3, birkCut, birkSlope, crystalMat, depth1Name, depth2Name, DDSpecificsFilter::equals, alcazmumu_cfi::filter, DDFilteredView::firstChild(), g, getDDDArray(), edm::ParameterSet::getParameter(), getStringArray(), edm::ParameterSet::getUntrackedParameter(), initMap(), CaloSD::kmaxIon, CaloSD::kmaxNeutron, CaloSD::kmaxProton, LogDebug, DDFilteredView::mergedSpecifics(), DDSpecificsFilter::setCriteria(), EnergyResolutionVsLumi::setLumies(), setNumberingScheme(), slopeLY, storeRL, storeTrack, AlCaHLTBitMon_QueryRunRegistry::string, CaloSD::suppressHeavy, useBirk, useBirkL3, and useWeight.

39  :
40  CaloSD(name, cpv, clg, p, manager,
41  p.getParameter<edm::ParameterSet>("ECalSD").getParameter<int>("TimeSliceUnit"),
42  p.getParameter<edm::ParameterSet>("ECalSD").getParameter<bool>("IgnoreTrackID")),
43  numberingScheme(0){
44 
45  // static SimpleConfigurable<bool> on1(false, "ECalSD:UseBirkLaw");
46  // static SimpleConfigurable<double> bk1(0.00463,"ECalSD:BirkC1");
47  // static SimpleConfigurable<double> bk2(-0.03, "ECalSD:BirkC2");
48  // static SimpleConfigurable<double> bk3(1.0, "ECalSD:BirkC3");
49  // Values from NIM A484 (2002) 239-244: as implemented in Geant3
50  // useBirk = on1.value();
51  // birk1 = bk1.value()*(g/(MeV*cm2));
52  // birk2 = bk2.value()*(g/(MeV*cm2))*(g/(MeV*cm2));
53 
54  edm::ParameterSet m_EC = p.getParameter<edm::ParameterSet>("ECalSD");
55  useBirk = m_EC.getParameter<bool>("UseBirkLaw");
56  useBirkL3 = m_EC.getParameter<bool>("BirkL3Parametrization");
57  birk1 = m_EC.getParameter<double>("BirkC1")*(g/(MeV*cm2));
58  birk2 = m_EC.getParameter<double>("BirkC2");
59  birk3 = m_EC.getParameter<double>("BirkC3");
60  birkSlope = m_EC.getParameter<double>("BirkSlope");
61  birkCut = m_EC.getParameter<double>("BirkCut");
62  slopeLY = m_EC.getParameter<double>("SlopeLightYield");
63  storeTrack = m_EC.getParameter<bool>("StoreSecondary");
64  crystalMat = m_EC.getUntrackedParameter<std::string>("XtalMat","E_PbWO4");
65  bool isItTB = m_EC.getUntrackedParameter<bool>("TestBeam", false);
66  bool nullNS = m_EC.getUntrackedParameter<bool>("NullNumbering", false);
67  storeRL = m_EC.getUntrackedParameter<bool>("StoreRadLength", false);
68 
69  ageingWithSlopeLY = m_EC.getUntrackedParameter<bool>("AgeingWithSlopeLY", false);
70  if(ageingWithSlopeLY) ageing.setLumies(p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("DelivLuminosity"),
71  p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("InstLuminosity"));
72 
73  //Material list for HB/HE/HO sensitive detectors
74  std::string attribute = "ReadOutName";
76  DDValue ddv(attribute,name,0);
78  DDFilteredView fv(cpv);
79  fv.addFilter(filter);
80  fv.firstChild();
81  DDsvalues_type sv(fv.mergedSpecifics());
82  // Use of Weight
83  useWeight= true;
84  std::vector<double> tempD = getDDDArray("EnergyWeight",sv);
85  if (tempD.size() > 0) { if (tempD[0] < 0.1) useWeight = false; }
86  std::vector<std::string> tempS = getStringArray("Depth1Name",sv);
87  if (tempS.size() > 0) depth1Name = tempS[0];
88  else depth1Name = " ";
89  tempS = getStringArray("Depth2Name",sv);
90  if (tempS.size() > 0) depth2Name = tempS[0];
91  else depth2Name = " ";
92 
93  EcalNumberingScheme* scheme=0;
94  if (nullNS) scheme = 0;
95  else if (name == "EcalHitsEB") scheme = dynamic_cast<EcalNumberingScheme*>(new EcalBarrelNumberingScheme());
96  else if (name == "EcalHitsEE") scheme = dynamic_cast<EcalNumberingScheme*>(new EcalEndcapNumberingScheme());
97  else if (name == "EcalHitsES") {
98  if (isItTB) scheme = dynamic_cast<EcalNumberingScheme*>(new ESTBNumberingScheme());
99  else scheme = dynamic_cast<EcalNumberingScheme*>(new EcalPreshowerNumberingScheme());
100  useWeight = false;
101  } else {edm::LogWarning("EcalSim") << "ECalSD: ReadoutName not supported\n";}
102 
103  if (scheme) setNumberingScheme(scheme);
104 #ifdef DebugLog
105  LogDebug("EcalSim") << "Constructing a ECalSD with name " << GetName();
106 #endif
107  if (useWeight) {
108  edm::LogInfo("EcalSim") << "ECalSD:: Use of Birks law is set to "
109  << useBirk << " with three constants kB = "
110  << birk1 << ", C1 = " << birk2 << ", C2 = "
111  << birk3 <<"\n Use of L3 parametrization "
112  << useBirkL3 << " with slope " << birkSlope
113  << " and cut off " << birkCut << "\n"
114  << " Slope for Light yield is set to "
115  << slopeLY;
116  } else {
117  edm::LogInfo("EcalSim") << "ECalSD:: energy deposit is not corrected "
118  << " by Birk or light yield curve";
119  }
120 
121  edm::LogInfo("EcalSim") << "ECalSD:: Suppression Flag " << suppressHeavy
122  << " protons below " << kmaxProton << " MeV,"
123  << " neutrons below " << kmaxNeutron << " MeV and"
124  << " ions below " << kmaxIon << " MeV\n"
125  << " Depth1 Name = " << depth1Name
126  << " and Depth2 Name = " << depth2Name;
127 
128  if (useWeight) initMap(name,cpv);
129 
130 }
#define LogDebug(id)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool useBirkL3
Definition: ECalSD.h:54
double kmaxNeutron
Definition: CaloSD.h:134
std::vector< std::string > getStringArray(const std::string &, const DDsvalues_type &)
Definition: ECalSD.cc:502
double birkSlope
Definition: ECalSD.h:55
double slopeLY
Definition: ECalSD.h:56
void setLumies(double x, double y)
double birk1
Definition: ECalSD.h:55
bool useWeight
Definition: ECalSD.h:53
double kmaxProton
Definition: CaloSD.h:134
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
Definition: Activities.doc:4
bool storeRL
Definition: ECalSD.h:53
CaloSD(G4String aSDname, const DDCompactView &cpv, SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *, int tSlice=1, bool ignoreTkID=false)
Definition: CaloSD.cc:21
std::string depth1Name
Definition: ECalSD.h:57
bool storeTrack
Definition: ECalSD.h:53
double kmaxIon
Definition: CaloSD.h:134
bool suppressHeavy
Definition: CaloSD.h:132
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::...
Definition: DDsvalues.h:19
void initMap(G4String, const DDCompactView &)
Definition: ECalSD.cc:274
std::string depth2Name
Definition: ECalSD.h:57
bool ageingWithSlopeLY
Definition: ECalSD.h:62
bool useBirk
Definition: ECalSD.h:54
std::vector< double > getDDDArray(const std::string &, const DDsvalues_type &)
Definition: ECalSD.cc:483
double birk2
Definition: ECalSD.h:55
void setCriteria(const DDValue &nameVal, comp_op, log_op l=AND, bool asString=true, bool merged=true)
Definition: DDFilter.cc:285
EcalNumberingScheme * numberingScheme
Definition: ECalSD.h:52
EnergyResolutionVsLumi ageing
Definition: ECalSD.h:61
void setNumberingScheme(EcalNumberingScheme *)
Definition: ECalSD.cc:264
double birkCut
Definition: ECalSD.h:55
std::string crystalMat
Definition: ECalSD.h:57
double birk3
Definition: ECalSD.h:55
The DDGenericFilter is a runtime-parametrized Filter looking on DDSpecifcs.
Definition: DDFilter.h:37
ECalSD::~ECalSD ( )
virtual

Definition at line 132 of file ECalSD.cc.

References numberingScheme.

132  {
133  if (numberingScheme) delete numberingScheme;
134 }
EcalNumberingScheme * numberingScheme
Definition: ECalSD.h:52

Member Function Documentation

double ECalSD::crystalLength ( G4LogicalVolume *  lv)
private

Definition at line 429 of file ECalSD.cc.

References xtalLMap.

Referenced by curve_LY(), and getRadiationLength().

429  {
430 
431  double length= 230.;
432  std::map<G4LogicalVolume*,double>::const_iterator ite = xtalLMap.find(lv);
433  if (ite != xtalLMap.end()) length = ite->second;
434  return length;
435 }
std::map< G4LogicalVolume *, double > xtalLMap
Definition: ECalSD.h:58
double ECalSD::curve_LY ( G4Step *  aStep)
private

Definition at line 388 of file ECalSD.cc.

References ageing, ageingWithSlopeLY, EnergyResolutionVsLumi::calcLightCollectionEfficiencyWeighted(), crystalLength(), CaloSD::currentID, LogDebug, CaloSD::setToLocal(), slopeLY, CaloHitID::unitID(), and histoStyle::weight.

Referenced by getEnergyDeposit().

388  {
389 
390  G4StepPoint* stepPoint = aStep->GetPreStepPoint();
391  G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
392 
393  double weight = 1.;
394  G4ThreeVector localPoint = setToLocal(stepPoint->GetPosition(),
395  stepPoint->GetTouchable());
396 
397  double crlength = crystalLength(lv);
398 
399  if(ageingWithSlopeLY){
400  //position along the crystal in mm from 0 to 230 (in EB)
401  double depth = 0.5 * crlength + localPoint.z();
402 
403  if (depth >= -0.1 || depth <= crlength+0.1)
404  weight = ageing.calcLightCollectionEfficiencyWeighted(currentID.unitID(), depth/crlength);
405  }
406  else{
407  double dapd = 0.5 * crlength - localPoint.z();
408  if (dapd >= -0.1 || dapd <= crlength+0.1) {
409  if (dapd <= 100.)
410  weight = 1.0 + slopeLY - dapd * 0.01 * slopeLY;
411  } else {
412  edm::LogWarning("EcalSim") << "ECalSD: light coll curve : wrong distance "
413  << "to APD " << dapd << " crlength = "
414  << crlength <<" crystal name = " <<lv->GetName()
415  << " z of localPoint = " << localPoint.z()
416  << " take weight = " << weight;
417  }
418  }
419 #ifdef DebugLog
420  LogDebug("EcalSim") << "ECalSD, light coll curve : " << dapd
421  << " crlength = " << crlength
422  << " crystal name = " << lv->GetName()
423  << " z of localPoint = " << localPoint.z()
424  << " take weight = " << weight;
425 #endif
426  return weight;
427 }
G4ThreeVector setToLocal(G4ThreeVector, const G4VTouchable *)
Definition: CaloSD.cc:293
#define LogDebug(id)
double slopeLY
Definition: ECalSD.h:56
double crystalLength(G4LogicalVolume *)
Definition: ECalSD.cc:429
bool ageingWithSlopeLY
Definition: ECalSD.h:62
CaloHitID currentID
Definition: CaloSD.h:117
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
EnergyResolutionVsLumi ageing
Definition: ECalSD.h:61
int weight
Definition: histoStyle.py:50
uint32_t unitID() const
Definition: CaloHitID.h:22
void ECalSD::getBaseNumber ( const G4Step *  aStep)
private

Definition at line 437 of file ECalSD.cc.

References EcalBaseNumber::addLevel(), EcalBaseNumber::getCapacity(), cuy::ii, LogDebug, EcalBaseNumber::reset(), EcalBaseNumber::setSize(), and theBaseNumber.

Referenced by setDetUnitId().

437  {
438 
440  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
441  int theSize = touch->GetHistoryDepth()+1;
442  if ( theBaseNumber.getCapacity() < theSize ) theBaseNumber.setSize(theSize);
443  //Get name and copy numbers
444  if ( theSize > 1 ) {
445  for (int ii = 0; ii < theSize ; ii++) {
446  theBaseNumber.addLevel(touch->GetVolume(ii)->GetName(),touch->GetReplicaNumber(ii));
447 #ifdef DebugLog
448  LogDebug("EcalSim") << "ECalSD::getBaseNumber(): Adding level " << ii
449  << ": " << touch->GetVolume(ii)->GetName() << "["
450  << touch->GetReplicaNumber(ii) << "]";
451 #endif
452  }
453  }
454 
455 }
#define LogDebug(id)
int ii
Definition: cuy.py:588
void addLevel(const std::string &name, const int &copyNumber)
EcalBaseNumber theBaseNumber
Definition: ECalSD.h:60
void setSize(const int &size)
double ECalSD::getBirkL3 ( G4Step *  aStep)
private

Definition at line 457 of file ECalSD.cc.

References birk1, birkCut, birkSlope, DeDxDiscriminatorTools::charge(), create_public_lumi_plots::log, LogDebug, and histoStyle::weight.

Referenced by getEnergyDeposit().

457  {
458 
459  double weight = 1.;
460  double charge = aStep->GetPreStepPoint()->GetCharge();
461 
462  if (charge != 0. && aStep->GetStepLength() > 0) {
463  G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
464  double density = mat->GetDensity();
465  double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
466  double rkb = birk1/density;
467  if (dedx > 0) {
468  weight = 1. - birkSlope*log(rkb*dedx);
469  if (weight < birkCut) weight = birkCut;
470  else if (weight > 1.) weight = 1.;
471  }
472 #ifdef DebugLog
473  LogDebug("EcalSim") << "ECalSD::getBirkL3 in " << mat->GetName()
474  << " Charge " << charge << " dE/dx " << dedx
475  << " Birk Const " << rkb << " Weight = " << weight
476  << " dE " << aStep->GetTotalEnergyDeposit();
477 #endif
478  }
479  return weight;
480 
481 }
#define LogDebug(id)
double birkSlope
Definition: ECalSD.h:55
double birk1
Definition: ECalSD.h:55
double charge(const std::vector< uint8_t > &Ampls)
int weight
Definition: histoStyle.py:50
double birkCut
Definition: ECalSD.h:55
std::vector< double > ECalSD::getDDDArray ( const std::string &  str,
const DDsvalues_type sv 
)
private

Definition at line 483 of file ECalSD.cc.

References DDfetch(), DDValue::doubles(), LogDebug, and relativeConstraints::value.

Referenced by ECalSD().

484  {
485 
486 #ifdef DebugLog
487  LogDebug("EcalSim") << "ECalSD:getDDDArray called for " << str;
488 #endif
489  DDValue value(str);
490  if (DDfetch(&sv,value)) {
491 #ifdef DebugLog
492  LogDebug("EcalSim") << value;
493 #endif
494  const std::vector<double> & fvec = value.doubles();
495  return fvec;
496  } else {
497  std::vector<double> fvec;
498  return fvec;
499  }
500 }
#define LogDebug(id)
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:102
uint16_t ECalSD::getDepth ( G4Step *  aStep)
virtual

Reimplemented from CaloSD.

Definition at line 224 of file ECalSD.cc.

References any, getRadiationLength(), LogDebug, run_regression::ret, storeRL, useDepth1, and useDepth2.

224  {
225  G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
226  uint16_t ret = 0;
227  if (any(useDepth1,lv)) ret = 1;
228  else if (any(useDepth2,lv)) ret = 2;
229  else if (storeRL) ret = getRadiationLength(aStep);
230 #ifdef DebugLog
231  LogDebug("EcalSim") << "Volume " << lv->GetName() << " Depth " << ret;
232 #endif
233  return ret;
234 }
#define LogDebug(id)
std::vector< G4LogicalVolume * > useDepth1
Definition: ECalSD.h:59
bool storeRL
Definition: ECalSD.h:53
std::vector< G4LogicalVolume * > useDepth2
Definition: ECalSD.h:59
virtual uint16_t getRadiationLength(G4Step *)
Definition: ECalSD.cc:236
double ECalSD::getEnergyDeposit ( G4Step *  aStep)
virtual

Reimplemented from CaloSD.

Definition at line 136 of file ECalSD.cc.

References any, birk1, birk2, birk3, curve_LY(), CaloSD::getAttenuation(), getBirkL3(), CaloSD::getResponseWt(), TrackInformation::isPrimary(), ke, CaloSD::kmaxIon, CaloSD::kmaxNeutron, CaloSD::kmaxProton, LogDebug, noWeight, NULL, CaloSD::preStepPoint, CaloSD::suppressHeavy, CaloSD::theTrack, useBirk, useBirkL3, useWeight, and histoStyle::weight.

136  {
137 
138  if (aStep == NULL) {
139  return 0;
140  } else {
141  preStepPoint = aStep->GetPreStepPoint();
142  G4Track* theTrack = aStep->GetTrack();
143  double wt2 = theTrack->GetWeight();
144  G4String nameVolume = preStepPoint->GetPhysicalVolume()->GetName();
145 
146  // take into account light collection curve for crystals
147  double weight = 1.;
148  if (suppressHeavy) {
149  TrackInformation * trkInfo = (TrackInformation *)(theTrack->GetUserInformation());
150  if (trkInfo) {
151  int pdg = theTrack->GetDefinition()->GetPDGEncoding();
152  if (!(trkInfo->isPrimary())) { // Only secondary particles
153  double ke = theTrack->GetKineticEnergy()/MeV;
154  if (((pdg/1000000000 == 1 && ((pdg/10000)%100) > 0 &&
155  ((pdg/10)%100) > 0)) && (ke<kmaxIon)) weight = 0;
156  if ((pdg == 2212) && (ke < kmaxProton)) weight = 0;
157  if ((pdg == 2112) && (ke < kmaxNeutron)) weight = 0;
158 #ifdef DebugLog
159  if (weight == 0)
160  LogDebug("EcalSim") << "Ignore Track " << theTrack->GetTrackID()
161  << " Type " << theTrack->GetDefinition()->GetParticleName()
162  << " Kinetic Energy " << ke << " MeV";
163 #endif
164  }
165  }
166  }
167  G4LogicalVolume* lv = aStep->GetPreStepPoint()->GetTouchable()->GetVolume(0)->GetLogicalVolume();
168  if (useWeight && !any(noWeight,lv)) {
169  weight *= curve_LY(aStep);
170  if (useBirk) {
171  if (useBirkL3) weight *= getBirkL3(aStep);
172  else weight *= getAttenuation(aStep, birk1, birk2, birk3);
173  }
174  }
175  double wt1 = getResponseWt(theTrack);
176  double edep = aStep->GetTotalEnergyDeposit()*weight*wt1;
177  /*
178  if(wt2 != 1.0) {
179  std::cout << "ECalSD:: " << nameVolume
180  <<" LightWeight= " <<weight << " wt1= " <<wt1
181  << " wt2= " << wt2 << " "
182  << " Weighted Energy Deposit " << edep/MeV << " MeV"
183  << std::endl;
184  std::cout << theTrack->GetDefinition()->GetParticleName()
185  << " " << theTrack->GetKineticEnergy()
186  << " Id=" << theTrack->GetTrackID()
187  << " IdP=" << theTrack->GetParentID();
188  const G4VProcess* pr = theTrack->GetCreatorProcess();
189  if(pr) std::cout << " from " << pr->GetProcessName();
190  std::cout << std::endl;
191  }
192  */
193  if(wt2 > 0.0) { edep *= wt2; }
194 #ifdef DebugLog
195  LogDebug("EcalSim") << "ECalSD:: " << nameVolume
196  <<" Light Collection Efficiency " <<weight << ":" <<wt1
197  << " Weighted Energy Deposit " << edep/MeV << " MeV";
198 #endif
199  return edep;
200  }
201 }
#define LogDebug(id)
bool useBirkL3
Definition: ECalSD.h:54
double kmaxNeutron
Definition: CaloSD.h:134
double birk1
Definition: ECalSD.h:55
bool useWeight
Definition: ECalSD.h:53
#define NULL
Definition: scimark2.h:8
double kmaxProton
Definition: CaloSD.h:134
std::vector< G4LogicalVolume * > noWeight
Definition: ECalSD.h:59
double kmaxIon
Definition: CaloSD.h:134
bool suppressHeavy
Definition: CaloSD.h:132
double getAttenuation(G4Step *aStep, double birk1, double birk2, double birk3)
Definition: CaloSD.cc:462
G4Track * theTrack
Definition: CaloSD.h:118
double curve_LY(G4Step *)
Definition: ECalSD.cc:388
G4StepPoint * preStepPoint
Definition: CaloSD.h:120
bool useBirk
Definition: ECalSD.h:54
double getBirkL3(G4Step *)
Definition: ECalSD.cc:457
int ke
bool isPrimary() const
double getResponseWt(G4Track *)
Definition: CaloSD.cc:604
double birk2
Definition: ECalSD.h:55
int weight
Definition: histoStyle.py:50
double birk3
Definition: ECalSD.h:55
uint16_t ECalSD::getRadiationLength ( G4Step *  aStep)
virtual

Definition at line 236 of file ECalSD.cc.

References crystalLength(), NULL, CaloSD::setToLocal(), and useWeight.

Referenced by getDepth().

236  {
237 
238  uint16_t thisX0 = 0;
239  if (aStep != NULL) {
240  G4StepPoint* hitPoint = aStep->GetPreStepPoint();
241  G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
242 
243  if (useWeight) {
244  G4ThreeVector localPoint = setToLocal(hitPoint->GetPosition(),
245  hitPoint->GetTouchable());
246  double crlength = crystalLength(lv);
247  double radl = hitPoint->GetMaterial()->GetRadlen();
248  double detz = (float)(0.5*crlength + localPoint.z());
249  thisX0 = (uint16_t)floor(detz/radl);
250  }
251  }
252  return thisX0;
253 }
G4ThreeVector setToLocal(G4ThreeVector, const G4VTouchable *)
Definition: CaloSD.cc:293
bool useWeight
Definition: ECalSD.h:53
#define NULL
Definition: scimark2.h:8
double crystalLength(G4LogicalVolume *)
Definition: ECalSD.cc:429
std::vector< std::string > ECalSD::getStringArray ( const std::string &  str,
const DDsvalues_type sv 
)
private

Definition at line 502 of file ECalSD.cc.

References DDfetch(), LogDebug, DDValue::strings(), and relativeConstraints::value.

Referenced by ECalSD().

503  {
504 
505 #ifdef DebugLog
506  LogDebug("EcalSim") << "ECalSD:getStringArray called for " << str;
507 #endif
508  DDValue value(str);
509  if (DDfetch(&sv,value)) {
510 #ifdef DebugLog
511  LogDebug("EcalSim") << value;
512 #endif
513  const std::vector<std::string> & fvec = value.strings();
514  return fvec;
515  } else {
516  std::vector<std::string> fvec;
517  return fvec;
518  }
519 }
#define LogDebug(id)
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:102
int ECalSD::getTrackID ( G4Track *  aTrack)
virtual

Reimplemented from CaloSD.

Definition at line 203 of file ECalSD.cc.

References any, CaloSD::forceSave, CaloSD::getTrackID(), CaloSD::preStepPoint, storeTrack, useDepth1, and useDepth2.

203  {
204 
205  int primaryID(0);
206  bool flag(false);
207  if (storeTrack) {
208  G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
209  if (any(useDepth1,lv)) {
210  flag = true;
211  } else if (any(useDepth2,lv)) {
212  flag = true;
213  }
214  }
215  if (flag) {
216  forceSave = true;
217  primaryID = aTrack->GetTrackID();
218  } else {
219  primaryID = CaloSD::getTrackID(aTrack);
220  }
221  return primaryID;
222 }
long int flag
Definition: mlp_lapack.h:47
std::vector< G4LogicalVolume * > useDepth1
Definition: ECalSD.h:59
virtual int getTrackID(G4Track *)
Definition: CaloSD.cc:571
std::vector< G4LogicalVolume * > useDepth2
Definition: ECalSD.h:59
bool forceSave
Definition: CaloSD.h:137
bool storeTrack
Definition: ECalSD.h:53
G4StepPoint * preStepPoint
Definition: CaloSD.h:120
void ECalSD::initMap ( G4String  sd,
const DDCompactView cpv 
)
private

Definition at line 274 of file ECalSD.cc.

References DDFilteredView::addFilter(), any, crystalMat, ddtrap, depth1Name, depth2Name, DDSpecificsFilter::equals, alcazmumu_cfi::filter, DDFilteredView::firstChild(), i, LogDebug, DDFilteredView::logicalPart(), DDLogicalPart::material(), DDName::name(), SensitiveDetector::name, DDBase< N, C >::name(), DDFilteredView::next(), noWeight, DDSolid::parameters(), DDSpecificsFilter::setCriteria(), DDSolid::shape(), DDLogicalPart::solid(), AlCaHLTBitMon_QueryRunRegistry::string, useDepth1, useDepth2, and xtalLMap.

Referenced by ECalSD().

274  {
275 
276  G4String attribute = "ReadOutName";
278  DDValue ddv(attribute,sd,0);
280  DDFilteredView fv(cpv);
281  fv.addFilter(filter);
282  fv.firstChild();
283 
284  std::vector<G4LogicalVolume*> lvused;
285  const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
286  std::vector<G4LogicalVolume *>::const_iterator lvcite;
287  std::map<std::string, G4LogicalVolume *> nameMap;
288  for (auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
289  nameMap.insert(std::make_pair((*lvi)->GetName(), *lvi));
290 
291  bool dodet=true;
292  while (dodet) {
293  const std::string &matname = fv.logicalPart().material().name().name();
294  const std::string &lvname = fv.logicalPart().name().name();
295  G4LogicalVolume* lv = nameMap[lvname];
296  if (depth1Name != " ") {
297  if (strncmp(lvname.c_str(), depth1Name.c_str(), 4) == 0) {
298  if (!any(useDepth1, lv)) {
299  useDepth1.push_back(lv);
300 #ifdef DebugLog
301  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname
302  <<" in Depth 1 volume list";
303 #endif
304  }
305  G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
306  if (lvr != 0 && !any(useDepth1, lvr)) {
307  useDepth1.push_back(lvr);
308 #ifdef DebugLog
309  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
310  <<" in Depth 1 volume list";
311 #endif
312  }
313  }
314  }
315  if (depth2Name != " ") {
316  if (strncmp(lvname.c_str(), depth2Name.c_str(), 4) == 0) {
317  if (!any(useDepth2, lv)) {
318  useDepth2.push_back(lv);
319 #ifdef DebugLog
320  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname
321  <<" in Depth 2 volume list";
322 #endif
323  }
324  G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
325  if (lvr != 0 && !any(useDepth2,lvr)) {
326  useDepth2.push_back(lvr);
327 #ifdef DebugLog
328  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
329  <<" in Depth 2 volume list";
330 #endif
331  }
332  }
333  }
334  if (lv != 0) {
335  if (crystalMat.size() == matname.size() && !strcmp(crystalMat.c_str(), matname.c_str())) {
336  if (!any(lvused,lv)) {
337  lvused.push_back(lv);
338  const DDSolid & sol = fv.logicalPart().solid();
339  const std::vector<double> & paras = sol.parameters();
340 #ifdef DebugLog
341  LogDebug("EcalSim") << "ECalSD::initMap (for " << sd << "): Solid "
342  << lvname << " Shape " << sol.shape()
343  << " Parameter 0 = "<< paras[0]
344  << " Logical Volume " << lv;
345 #endif
346  if (sol.shape() == ddtrap) {
347  double dz = 2*paras[0];
348  xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
349  lv = nameMap[lvname + "_refl"];
350  if (lv != 0)
351  xtalLMap.insert(std::pair<G4LogicalVolume*,double>(lv,dz));
352  }
353  }
354  } else {
355  if (!any(noWeight,lv)) {
356  noWeight.push_back(lv);
357 #ifdef DebugLog
358  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname
359  << " Material " << matname <<" in noWeight list";
360 #endif
361  }
362  lv = nameMap[lvname];
363  if (lv != 0 && !any(noWeight,lv)) {
364  noWeight.push_back(lv);
365 #ifdef DebugLog
366  LogDebug("EcalSim") << "ECalSD::initMap Logical Volume " << lvname
367  << " Material " << matname <<" in noWeight list";
368 #endif
369  }
370  }
371  }
372  dodet = fv.next();
373  }
374 #ifdef DebugLog
375  LogDebug("EcalSim") << "ECalSD: Length Table for " << attribute << " = "
376  << sd << ":";
377  std::map<G4LogicalVolume*,double>::const_iterator ite = xtalLMap.begin();
378  int i=0;
379  for (; ite != xtalLMap.end(); ite++, i++) {
380  G4String name = "Unknown";
381  if (ite->first != 0) name = (ite->first)->GetName();
382  LogDebug("EcalSim") << " " << i << " " << ite->first << " " << name
383  << " L = " << ite->second;
384  }
385 #endif
386 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:150
std::vector< G4LogicalVolume * > useDepth1
Definition: ECalSD.h:59
std::vector< G4LogicalVolume * > noWeight
Definition: ECalSD.h:59
std::vector< G4LogicalVolume * > useDepth2
Definition: ECalSD.h:59
A DDSolid represents the shape of a part.
Definition: DDSolid.h:35
std::string depth1Name
Definition: ECalSD.h:57
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:144
std::string depth2Name
Definition: ECalSD.h:57
double sd
void setCriteria(const DDValue &nameVal, comp_op, log_op l=AND, bool asString=true, bool merged=true)
Definition: DDFilter.cc:285
std::map< G4LogicalVolume *, double > xtalLMap
Definition: ECalSD.h:58
std::string crystalMat
Definition: ECalSD.h:57
The DDGenericFilter is a runtime-parametrized Filter looking on DDSpecifcs.
Definition: DDFilter.h:37
uint32_t ECalSD::setDetUnitId ( G4Step *  aStep)
virtual

Implements CaloSD.

Definition at line 255 of file ECalSD.cc.

References getBaseNumber(), EcalNumberingScheme::getUnitID(), numberingScheme, and theBaseNumber.

255  {
256  if (numberingScheme == 0) {
257  return EBDetId(1,1)();
258  } else {
259  getBaseNumber(aStep);
261  }
262 }
void getBaseNumber(const G4Step *)
Definition: ECalSD.cc:437
EcalBaseNumber theBaseNumber
Definition: ECalSD.h:60
EcalNumberingScheme * numberingScheme
Definition: ECalSD.h:52
virtual uint32_t getUnitID(const EcalBaseNumber &baseNumber) const =0
void ECalSD::setNumberingScheme ( EcalNumberingScheme scheme)

Definition at line 264 of file ECalSD.cc.

References numberingScheme.

Referenced by ECalSD(), and HcalTB04Analysis::update().

264  {
265  if (scheme != 0) {
266  edm::LogInfo("EcalSim") << "EcalSD: updates numbering scheme for "
267  << GetName() << "\n";
268  if (numberingScheme) delete numberingScheme;
269  numberingScheme = scheme;
270  }
271 }
EcalNumberingScheme * numberingScheme
Definition: ECalSD.h:52

Member Data Documentation

EnergyResolutionVsLumi ECalSD::ageing
private

Definition at line 61 of file ECalSD.h.

Referenced by curve_LY(), and ECalSD().

bool ECalSD::ageingWithSlopeLY
private

Definition at line 62 of file ECalSD.h.

Referenced by curve_LY(), and ECalSD().

double ECalSD::birk1
private

Definition at line 55 of file ECalSD.h.

Referenced by ECalSD(), getBirkL3(), and getEnergyDeposit().

double ECalSD::birk2
private

Definition at line 55 of file ECalSD.h.

Referenced by ECalSD(), and getEnergyDeposit().

double ECalSD::birk3
private

Definition at line 55 of file ECalSD.h.

Referenced by ECalSD(), and getEnergyDeposit().

double ECalSD::birkCut
private

Definition at line 55 of file ECalSD.h.

Referenced by ECalSD(), and getBirkL3().

double ECalSD::birkSlope
private

Definition at line 55 of file ECalSD.h.

Referenced by ECalSD(), and getBirkL3().

std::string ECalSD::crystalMat
private

Definition at line 57 of file ECalSD.h.

Referenced by ECalSD(), and initMap().

std::string ECalSD::depth1Name
private

Definition at line 57 of file ECalSD.h.

Referenced by ECalSD(), and initMap().

std::string ECalSD::depth2Name
private

Definition at line 57 of file ECalSD.h.

Referenced by ECalSD(), and initMap().

std::vector<G4LogicalVolume*> ECalSD::noWeight
private

Definition at line 59 of file ECalSD.h.

Referenced by getEnergyDeposit(), and initMap().

EcalNumberingScheme* ECalSD::numberingScheme
private

Definition at line 52 of file ECalSD.h.

Referenced by setDetUnitId(), setNumberingScheme(), and ~ECalSD().

double ECalSD::slopeLY
private

Definition at line 56 of file ECalSD.h.

Referenced by curve_LY(), and ECalSD().

bool ECalSD::storeRL
private

Definition at line 53 of file ECalSD.h.

Referenced by ECalSD(), and getDepth().

bool ECalSD::storeTrack
private

Definition at line 53 of file ECalSD.h.

Referenced by ECalSD(), and getTrackID().

EcalBaseNumber ECalSD::theBaseNumber
private

Definition at line 60 of file ECalSD.h.

Referenced by getBaseNumber(), and setDetUnitId().

bool ECalSD::useBirk
private

Definition at line 54 of file ECalSD.h.

Referenced by ECalSD(), and getEnergyDeposit().

bool ECalSD::useBirkL3
private

Definition at line 54 of file ECalSD.h.

Referenced by ECalSD(), and getEnergyDeposit().

std::vector<G4LogicalVolume*> ECalSD::useDepth1
private

Definition at line 59 of file ECalSD.h.

Referenced by getDepth(), getTrackID(), and initMap().

std::vector<G4LogicalVolume*> ECalSD::useDepth2
private

Definition at line 59 of file ECalSD.h.

Referenced by getDepth(), getTrackID(), and initMap().

bool ECalSD::useWeight
private

Definition at line 53 of file ECalSD.h.

Referenced by ECalSD(), getEnergyDeposit(), and getRadiationLength().

std::map<G4LogicalVolume*,double> ECalSD::xtalLMap
private

Definition at line 58 of file ECalSD.h.

Referenced by crystalLength(), and initMap().