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 &, const 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, const 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, const SensitiveDetectorCatalog &clg, edm::ParameterSet const &p)
 
- Public Member Functions inherited from SensitiveDetector
virtual void AssignSD (const std::string &vname)
 
Local3DPoint ConvertToLocal3DPoint (const 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, const 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 (const G4ThreeVector &, double)
 
G4ThreeVector setToGlobal (const G4ThreeVector &, const G4VTouchable *)
 
G4ThreeVector setToLocal (const 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,
const SensitiveDetectorCatalog clg,
edm::ParameterSet const &  p,
const SimTrackManager manager 
)

Definition at line 39 of file ECalSD.cc.

References DDFilteredView::addFilter(), ageing, ageingWithSlopeLY, birk1, birk2, birk3, birkCut, birkSlope, crystalMat, depth1Name, depth2Name, 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(), MeV, DDSpecificsFilter::setCriteria(), EnergyResolutionVsLumi::setLumies(), setNumberingScheme(), slopeLY, storeRL, storeTrack, AlCaHLTBitMon_QueryRunRegistry::string, CaloSD::suppressHeavy, useBirk, useBirkL3, and useWeight.

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

Definition at line 134 of file ECalSD.cc.

References numberingScheme.

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

Member Function Documentation

double ECalSD::crystalLength ( G4LogicalVolume *  lv)
private

Definition at line 431 of file ECalSD.cc.

References xtalLMap.

Referenced by curve_LY(), and getRadiationLength().

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

Definition at line 390 of file ECalSD.cc.

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

Referenced by getEnergyDeposit().

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

Definition at line 439 of file ECalSD.cc.

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

Referenced by setDetUnitId().

439  {
440 
442  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
443  int theSize = touch->GetHistoryDepth()+1;
444  if ( theBaseNumber.getCapacity() < theSize ) theBaseNumber.setSize(theSize);
445  //Get name and copy numbers
446  if ( theSize > 1 ) {
447  for (int ii = 0; ii < theSize ; ii++) {
448  theBaseNumber.addLevel(touch->GetVolume(ii)->GetName(),touch->GetReplicaNumber(ii));
449 #ifdef DebugLog
450  LogDebug("EcalSim") << "ECalSD::getBaseNumber(): Adding level " << ii
451  << ": " << touch->GetVolume(ii)->GetName() << "["
452  << touch->GetReplicaNumber(ii) << "]";
453 #endif
454  }
455  }
456 
457 }
#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 459 of file ECalSD.cc.

References birk1, birkCut, birkSlope, RecoTauCleanerPlugins::charge, create_public_lumi_plots::log, LogDebug, and histoStyle::weight.

Referenced by getEnergyDeposit().

459  {
460 
461  double weight = 1.;
462  double charge = aStep->GetPreStepPoint()->GetCharge();
463 
464  if (charge != 0. && aStep->GetStepLength() > 0) {
465  G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
466  double density = mat->GetDensity();
467  double dedx = aStep->GetTotalEnergyDeposit()/aStep->GetStepLength();
468  double rkb = birk1/density;
469  if (dedx > 0) {
470  weight = 1. - birkSlope*log(rkb*dedx);
471  if (weight < birkCut) weight = birkCut;
472  else if (weight > 1.) weight = 1.;
473  }
474 #ifdef DebugLog
475  LogDebug("EcalSim") << "ECalSD::getBirkL3 in " << mat->GetName()
476  << " Charge " << charge << " dE/dx " << dedx
477  << " Birk Const " << rkb << " Weight = " << weight
478  << " dE " << aStep->GetTotalEnergyDeposit();
479 #endif
480  }
481  return weight;
482 
483 }
#define LogDebug(id)
double birkSlope
Definition: ECalSD.h:55
double birk1
Definition: ECalSD.h:55
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 485 of file ECalSD.cc.

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

Referenced by ECalSD().

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

Reimplemented from CaloSD.

Definition at line 226 of file ECalSD.cc.

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

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

Reimplemented from CaloSD.

Definition at line 138 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, MeV, noWeight, NULL, CaloSD::preStepPoint, CaloSD::suppressHeavy, CaloSD::theTrack, useBirk, useBirkL3, useWeight, and histoStyle::weight.

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

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

Referenced by getDepth().

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

Definition at line 504 of file ECalSD.cc.

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

Referenced by ECalSD().

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

Reimplemented from CaloSD.

Definition at line 205 of file ECalSD.cc.

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

205  {
206 
207  int primaryID(0);
208  bool flag(false);
209  if (storeTrack) {
210  G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
211  if (any(useDepth1,lv)) {
212  flag = true;
213  } else if (any(useDepth2,lv)) {
214  flag = true;
215  }
216  }
217  if (flag) {
218  forceSave = true;
219  primaryID = aTrack->GetTrackID();
220  } else {
221  primaryID = CaloSD::getTrackID(aTrack);
222  }
223  return primaryID;
224 }
std::vector< G4LogicalVolume * > useDepth1
Definition: ECalSD.h:59
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:34
virtual int getTrackID(G4Track *)
Definition: CaloSD.cc:574
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 276 of file ECalSD.cc.

References DDFilteredView::addFilter(), any(), crystalMat, ddtrap, depth1Name, depth2Name, 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().

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

Implements CaloSD.

Definition at line 257 of file ECalSD.cc.

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

257  {
258  if (numberingScheme == 0) {
259  return EBDetId(1,1)();
260  } else {
261  getBaseNumber(aStep);
263  }
264 }
void getBaseNumber(const G4Step *)
Definition: ECalSD.cc:439
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 266 of file ECalSD.cc.

References numberingScheme.

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

266  {
267  if (scheme != 0) {
268  edm::LogInfo("EcalSim") << "EcalSD: updates numbering scheme for "
269  << GetName() << "\n";
270  if (numberingScheme) delete numberingScheme;
271  numberingScheme = scheme;
272  }
273 }
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().