CMS 3D CMS Logo

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

#include <DreamSD.h>

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

Public Member Functions

 DreamSD (G4String, const DDCompactView &, SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
 
virtual bool ProcessHits (G4Step *step, G4TouchableHistory *tHistory)
 
virtual uint32_t setDetUnitId (G4Step *)
 
virtual ~DreamSD ()
 
- 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 double getEnergyDeposit (G4Step *step)
 
virtual void Initialize (G4HCofThisEvent *HCE)
 
virtual void PrintAll ()
 
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 ()
 

Protected Member Functions

virtual G4bool getStepInfo (G4Step *aStep)
 
virtual void initRun ()
 
- 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)
 
virtual uint16_t getDepth (G4Step *)
 
int getNumberOfHits ()
 
double getResponseWt (G4Track *)
 
virtual int getTrackID (G4Track *)
 
G4bool hitExists ()
 
void resetForNewPrimary (G4ThreeVector, double)
 
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...
 

Private Types

typedef std::map
< G4LogicalVolume *, Doubles
DimensionMap
 
typedef std::pair< double, double > Doubles
 

Private Member Functions

double cherenkovDeposit_ (G4Step *aStep)
 Returns the total energy due to Cherenkov radiation. More...
 
const double crystalLength (G4LogicalVolume *) const
 
const double crystalWidth (G4LogicalVolume *) const
 
double curve_LY (G4Step *, int)
 
const double getAverageNumberOfPhotons_ (const double charge, const double beta, const G4Material *aMaterial, const G4MaterialPropertyVector *rIndex) const
 Returns average number of photons created by track. More...
 
const double getPhotonEnergyDeposit_ (const G4ParticleMomentum &p, const G4ThreeVector &x, const G4Step *aStep)
 Returns energy deposit for a given photon. More...
 
void initMap (G4String, const DDCompactView &)
 
bool setPbWO2MaterialProperties_ (G4Material *aMaterial)
 Sets material properties at run-time... More...
 

Private Attributes

double birk1
 
double birk2
 
double birk3
 
std::auto_ptr
< G4PhysicsOrderedFreeVector > 
chAngleIntegrals_
 Table of Cherenkov angle integrals vs photon momentum. More...
 
bool doCherenkov_
 
G4MaterialPropertiesTable * materialPropertiesTable
 
int nphotons_
 
TTree * ntuple_
 
float px_ [MAXPHOTONS]
 
float py_ [MAXPHOTONS]
 
float pz_ [MAXPHOTONS]
 
bool readBothSide_
 
int side
 
double slopeLY
 
bool useBirk
 
float x_ [MAXPHOTONS]
 
DimensionMap xtalLMap
 
float y_ [MAXPHOTONS]
 
float z_ [MAXPHOTONS]
 

Additional Inherited Members

- Public Types inherited from SensitiveDetector
enum  coordinates { WorldCoordinates, LocalCoordinates }
 
- 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 19 of file DreamSD.h.

Member Typedef Documentation

typedef std::map<G4LogicalVolume*,Doubles> DreamSD::DimensionMap
private

Definition at line 37 of file DreamSD.h.

typedef std::pair<double,double> DreamSD::Doubles
private

Definition at line 36 of file DreamSD.h.

Constructor & Destructor Documentation

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

Definition at line 26 of file DreamSD.cc.

References birk1, birk2, birk3, doCherenkov_, g, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), initMap(), edm::Service< T >::isAvailable(), TFileDirectory::make(), nphotons_, ntuple_, px_, py_, pz_, readBothSide_, slopeLY, useBirk, x_, y_, and z_.

28  :
29  CaloSD(name, cpv, clg, p, manager) {
30 
31  edm::ParameterSet m_EC = p.getParameter<edm::ParameterSet>("ECalSD");
32  useBirk= m_EC.getParameter<bool>("UseBirkLaw");
33  doCherenkov_ = m_EC.getParameter<bool>("doCherenkov");
34  birk1 = m_EC.getParameter<double>("BirkC1")*(g/(MeV*cm2));
35  birk2 = m_EC.getParameter<double>("BirkC2");
36  birk3 = m_EC.getParameter<double>("BirkC3");
37  slopeLY= m_EC.getParameter<double>("SlopeLightYield");
38  readBothSide_ = m_EC.getUntrackedParameter<bool>("ReadBothSide", false);
39 
40  edm::LogInfo("EcalSim") << "Constructing a DreamSD with name " << GetName() << "\n"
41  << "DreamSD:: Use of Birks law is set to "
42  << useBirk << " with three constants kB = "
43  << birk1 << ", C1 = " << birk2 << ", C2 = "
44  << birk3 << "\n"
45  << " Slope for Light yield is set to "
46  << slopeLY << "\n"
47  << " Parameterization of Cherenkov is set to "
48  << doCherenkov_ << " and readout both sides is "
49  << readBothSide_;
50 
51  initMap(name,cpv);
52 
53  // Init histogramming
55 
56  if ( !tfile.isAvailable() )
57  throw cms::Exception("BadConfig") << "TFileService unavailable: "
58  << "please add it to config file";
59 
60  ntuple_ = tfile->make<TTree>("tree","Cherenkov photons");
61  if (doCherenkov_) {
62  ntuple_->Branch("nphotons",&nphotons_,"nphotons/I");
63  ntuple_->Branch("px",px_,"px[nphotons]/F");
64  ntuple_->Branch("py",py_,"py[nphotons]/F");
65  ntuple_->Branch("pz",pz_,"pz[nphotons]/F");
66  ntuple_->Branch("x",x_,"x[nphotons]/F");
67  ntuple_->Branch("y",y_,"y[nphotons]/F");
68  ntuple_->Branch("z",z_,"z[nphotons]/F");
69  }
70 
71 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool readBothSide_
Definition: DreamSD.h:57
float y_[MAXPHOTONS]
Definition: DreamSD.h:71
double birk1
Definition: DreamSD.h:58
double birk3
Definition: DreamSD.h:58
float px_[MAXPHOTONS]
Definition: DreamSD.h:70
TTree * ntuple_
Definition: DreamSD.h:68
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
CaloSD(G4String aSDname, const DDCompactView &cpv, SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *, int tSlice=1, bool ignoreTkID=false)
Definition: CaloSD.cc:21
float z_[MAXPHOTONS]
Definition: DreamSD.h:71
int nphotons_
Definition: DreamSD.h:69
float pz_[MAXPHOTONS]
Definition: DreamSD.h:70
bool isAvailable() const
Definition: Service.h:47
double birk2
Definition: DreamSD.h:58
float x_[MAXPHOTONS]
Definition: DreamSD.h:71
bool doCherenkov_
Definition: DreamSD.h:57
double slopeLY
Definition: DreamSD.h:59
float py_[MAXPHOTONS]
Definition: DreamSD.h:70
T * make() const
make new ROOT object
void initMap(G4String, const DDCompactView &)
Definition: DreamSD.cc:191
bool useBirk
Definition: DreamSD.h:57
virtual DreamSD::~DreamSD ( )
inlinevirtual

Definition at line 25 of file DreamSD.h.

25 {}

Member Function Documentation

double DreamSD::cherenkovDeposit_ ( G4Step *  aStep)
private

Returns the total energy due to Cherenkov radiation.

Definition at line 293 of file DreamSD.cc.

References beta, DeDxDiscriminatorTools::charge(), funct::cos(), getAverageNumberOfPhotons_(), getPhotonEnergyDeposit_(), LogDebug, materialPropertiesTable, nphotons_, ntuple_, NULL, phi, px_, py_, pz_, funct::sin(), mathSSE::sqrt(), x_, y_, and z_.

Referenced by getStepInfo().

293  {
294 
295  double cherenkovEnergy = 0;
296  if (!materialPropertiesTable) return cherenkovEnergy;
297  G4Material* material = aStep->GetTrack()->GetMaterial();
298 
299  // Retrieve refractive index
300  const G4MaterialPropertyVector* Rindex = materialPropertiesTable->GetProperty("RINDEX");
301  if ( Rindex == NULL ) {
302  edm::LogWarning("EcalSim") << "Couldn't retrieve refractive index";
303  return cherenkovEnergy;
304  }
305 
306  LogDebug("EcalSim") << "Material properties: " << "\n"
307  << " Pmin = " << Rindex->GetMinPhotonEnergy()
308  << " Pmax = " << Rindex->GetMaxPhotonEnergy();
309 
310  // Get particle properties
311  G4StepPoint* pPreStepPoint = aStep->GetPreStepPoint();
312  G4StepPoint* pPostStepPoint = aStep->GetPostStepPoint();
313  G4ThreeVector x0 = pPreStepPoint->GetPosition();
314  G4ThreeVector p0 = aStep->GetDeltaPosition().unit();
315  const G4DynamicParticle* aParticle = aStep->GetTrack()->GetDynamicParticle();
316  const double charge = aParticle->GetDefinition()->GetPDGCharge();
317  // beta is averaged over step
318  double beta = 0.5*( pPreStepPoint->GetBeta() + pPostStepPoint->GetBeta() );
319  double BetaInverse = 1.0/beta;
320 
321  LogDebug("EcalSim") << "Particle properties: " << "\n"
322  << " charge = " << charge
323  << " beta = " << beta;
324 
325  // Now get number of photons generated in this step
326  double meanNumberOfPhotons = getAverageNumberOfPhotons_( charge, beta, material, Rindex );
327  if ( meanNumberOfPhotons <= 0.0 ) { // Don't do anything
328  LogDebug("EcalSim") << "Mean number of photons is zero: " << meanNumberOfPhotons
329  << ", stopping here";
330  return cherenkovEnergy;
331  }
332 
333  // number of photons is in unit of Geant4...
334  meanNumberOfPhotons *= aStep->GetStepLength();
335 
336  // Now get a poisson distribution
337  int numPhotons = static_cast<int>( G4Poisson(meanNumberOfPhotons) );
338  //edm::LogVerbatim("EcalSim") << "Number of photons = " << numPhotons;
339  if ( numPhotons <= 0 ) {
340  LogDebug("EcalSim") << "Poission number of photons is zero: " << numPhotons
341  << ", stopping here";
342  return cherenkovEnergy;
343  }
344 
345  // Material refraction properties
346  double Pmin = Rindex->GetMinPhotonEnergy();
347  double Pmax = Rindex->GetMaxPhotonEnergy();
348  double dp = Pmax - Pmin;
349  double maxCos = BetaInverse / Rindex->GetMaxProperty();
350  double maxSin2 = (1.0 - maxCos) * (1.0 + maxCos);
351 
352  // Finally: get contribution of each photon
353  for ( int iPhoton = 0; iPhoton<numPhotons; ++iPhoton ) {
354 
355  // Determine photon momentum
356  double randomNumber;
357  double sampledMomentum, sampledRI;
358  double cosTheta, sin2Theta;
359 
360  // sample a momentum (not sure why this is needed!)
361  do {
362  randomNumber = G4UniformRand();
363  sampledMomentum = Pmin + randomNumber * dp;
364  sampledRI = Rindex->GetProperty(sampledMomentum);
365  cosTheta = BetaInverse / sampledRI;
366 
367  sin2Theta = (1.0 - cosTheta)*(1.0 + cosTheta);
368  randomNumber = G4UniformRand();
369 
370  } while (randomNumber*maxSin2 > sin2Theta);
371 
372  // Generate random position of photon on cone surface
373  // defined by Theta
374  randomNumber = G4UniformRand();
375 
376  double phi = twopi*randomNumber;
377  double sinPhi = sin(phi);
378  double cosPhi = cos(phi);
379 
380  // Create photon momentum direction vector
381  // The momentum direction is still w.r.t. the coordinate system where the primary
382  // particle direction is aligned with the z axis
383  double sinTheta = sqrt(sin2Theta);
384  double px = sinTheta*cosPhi;
385  double py = sinTheta*sinPhi;
386  double pz = cosTheta;
387  G4ThreeVector photonDirection(px, py, pz);
388 
389  // Rotate momentum direction back to global (crystal) reference system
390  photonDirection.rotateUz(p0);
391 
392  // Create photon position and momentum
393  randomNumber = G4UniformRand();
394  G4ThreeVector photonPosition = x0 + randomNumber * aStep->GetDeltaPosition();
395  G4ThreeVector photonMomentum = sampledMomentum*photonDirection;
396 
397  // Collect energy on APD
398  cherenkovEnergy += getPhotonEnergyDeposit_( photonMomentum, photonPosition, aStep );
399 
400  // Ntuple variables
401  nphotons_ = numPhotons;
402  px_[iPhoton] = photonMomentum.x();
403  py_[iPhoton] = photonMomentum.y();
404  pz_[iPhoton] = photonMomentum.z();
405  x_[iPhoton] = photonPosition.x();
406  y_[iPhoton] = photonPosition.y();
407  z_[iPhoton] = photonPosition.z();
408  }
409 
410  // Fill ntuple
411  ntuple_->Fill();
412 
413 
414  return cherenkovEnergy;
415 
416 }
#define LogDebug(id)
const double beta
float y_[MAXPHOTONS]
Definition: DreamSD.h:71
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define NULL
Definition: scimark2.h:8
float px_[MAXPHOTONS]
Definition: DreamSD.h:70
TTree * ntuple_
Definition: DreamSD.h:68
double charge(const std::vector< uint8_t > &Ampls)
const double getAverageNumberOfPhotons_(const double charge, const double beta, const G4Material *aMaterial, const G4MaterialPropertyVector *rIndex) const
Returns average number of photons created by track.
Definition: DreamSD.cc:422
float z_[MAXPHOTONS]
Definition: DreamSD.h:71
T sqrt(T t)
Definition: SSEVec.h:46
int nphotons_
Definition: DreamSD.h:69
float pz_[MAXPHOTONS]
Definition: DreamSD.h:70
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
G4MaterialPropertiesTable * materialPropertiesTable
Definition: DreamSD.h:66
const double getPhotonEnergyDeposit_(const G4ParticleMomentum &p, const G4ThreeVector &x, const G4Step *aStep)
Returns energy deposit for a given photon.
Definition: DreamSD.cc:557
float x_[MAXPHOTONS]
Definition: DreamSD.h:71
float py_[MAXPHOTONS]
Definition: DreamSD.h:70
Definition: DDAxes.h:10
const double DreamSD::crystalLength ( G4LogicalVolume *  lv) const
private

Definition at line 270 of file DreamSD.cc.

References xtalLMap.

Referenced by curve_LY(), and getPhotonEnergyDeposit_().

270  {
271 
272  double length= -1.;
273  DimensionMap::const_iterator ite = xtalLMap.find(lv);
274  if (ite != xtalLMap.end()) length = ite->second.first;
275  return length;
276 
277 }
DimensionMap xtalLMap
Definition: DreamSD.h:60
const double DreamSD::crystalWidth ( G4LogicalVolume *  lv) const
private

Definition at line 280 of file DreamSD.cc.

References tablePrinter::width, and xtalLMap.

Referenced by getPhotonEnergyDeposit_().

280  {
281 
282  double width= -1.;
283  DimensionMap::const_iterator ite = xtalLMap.find(lv);
284  if (ite != xtalLMap.end()) width = ite->second.second;
285  return width;
286 
287 }
DimensionMap xtalLMap
Definition: DreamSD.h:60
double DreamSD::curve_LY ( G4Step *  aStep,
int  flag 
)
private

Definition at line 239 of file DreamSD.cc.

References crystalLength(), LogDebug, CaloSD::setToLocal(), slopeLY, and CommonMethods::weight().

Referenced by getStepInfo().

239  {
240 
241  G4StepPoint* stepPoint = aStep->GetPreStepPoint();
242  G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
243  G4String nameVolume= lv->GetName();
244 
245  double weight = 1.;
246  G4ThreeVector localPoint = setToLocal(stepPoint->GetPosition(),
247  stepPoint->GetTouchable());
248  double crlength = crystalLength(lv);
249  double localz = localPoint.x();
250  double dapd = 0.5 * crlength - flag*localz; // Distance from closest APD
251  if (dapd >= -0.1 || dapd <= crlength+0.1) {
252  if (dapd <= 100.)
253  weight = 1.0 + slopeLY - dapd * 0.01 * slopeLY;
254  } else {
255  edm::LogWarning("EcalSim") << "DreamSD: light coll curve : wrong distance "
256  << "to APD " << dapd << " crlength = "
257  << crlength << " crystal name = " << nameVolume
258  << " z of localPoint = " << localz
259  << " take weight = " << weight;
260  }
261  LogDebug("EcalSim") << "DreamSD, light coll curve : " << dapd
262  << " crlength = " << crlength
263  << " crystal name = " << nameVolume
264  << " z of localPoint = " << localz
265  << " take weight = " << weight;
266  return weight;
267 }
G4ThreeVector setToLocal(G4ThreeVector, const G4VTouchable *)
Definition: CaloSD.cc:292
#define LogDebug(id)
long int flag
Definition: mlp_lapack.h:47
double slopeLY
Definition: DreamSD.h:59
const double crystalLength(G4LogicalVolume *) const
Definition: DreamSD.cc:270
const double DreamSD::getAverageNumberOfPhotons_ ( const double  charge,
const double  beta,
const G4Material *  aMaterial,
const G4MaterialPropertyVector *  rIndex 
) const
private

Returns average number of photons created by track.

Definition at line 422 of file DreamSD.cc.

References beta, chAngleIntegrals_, and LogDebug.

Referenced by cherenkovDeposit_().

426 {
427  const G4double rFact = 369.81/(eV * cm);
428 
429  if( beta <= 0.0 ) return 0.0;
430 
431  double BetaInverse = 1./beta;
432 
433  // Vectors used in computation of Cerenkov Angle Integral:
434  // - Refraction Indices for the current material
435  // - new G4PhysicsOrderedFreeVector allocated to hold CAI's
436 
437  // Min and Max photon momenta
438  double Pmin = Rindex->GetMinPhotonEnergy();
439  double Pmax = Rindex->GetMaxPhotonEnergy();
440 
441  // Min and Max Refraction Indices
442  double nMin = Rindex->GetMinProperty();
443  double nMax = Rindex->GetMaxProperty();
444 
445  // Max Cerenkov Angle Integral
446  double CAImax = chAngleIntegrals_->GetMaxValue();
447 
448  double dp = 0., ge = 0., CAImin = 0.;
449 
450  // If n(Pmax) < 1/Beta -- no photons generated
451  if ( nMax < BetaInverse) { }
452 
453  // otherwise if n(Pmin) >= 1/Beta -- photons generated
454  else if (nMin > BetaInverse) {
455  dp = Pmax - Pmin;
456  ge = CAImax;
457  }
458  // If n(Pmin) < 1/Beta, and n(Pmax) >= 1/Beta, then
459  // we need to find a P such that the value of n(P) == 1/Beta.
460  // Interpolation is performed by the GetPhotonEnergy() and
461  // GetProperty() methods of the G4MaterialPropertiesTable and
462  // the GetValue() method of G4PhysicsVector.
463  else {
464  Pmin = Rindex->GetPhotonEnergy(BetaInverse);
465  dp = Pmax - Pmin;
466  // need boolean for current implementation of G4PhysicsVector
467  // ==> being phased out
468  bool isOutRange;
469  double CAImin = chAngleIntegrals_->GetValue(Pmin, isOutRange);
470  ge = CAImax - CAImin;
471 
472  }
473 
474  // Calculate number of photons
475  double numPhotons = rFact * charge/eplus * charge/eplus *
476  (dp - ge * BetaInverse*BetaInverse);
477 
478  LogDebug("EcalSim") << "@SUB=getAverageNumberOfPhotons"
479  << "CAImin = " << CAImin << "\n"
480  << "CAImax = " << CAImax << "\n"
481  << "dp = " << dp << ", ge = " << ge << "\n"
482  << "numPhotons = " << numPhotons;
483 
484 
485 
486  return numPhotons;
487 
488 }
#define LogDebug(id)
const double beta
std::auto_ptr< G4PhysicsOrderedFreeVector > chAngleIntegrals_
Table of Cherenkov angle integrals vs photon momentum.
Definition: DreamSD.h:65
double charge(const std::vector< uint8_t > &Ampls)
const double DreamSD::getPhotonEnergyDeposit_ ( const G4ParticleMomentum &  p,
const G4ThreeVector &  x,
const G4Step *  aStep 
)
private

Returns energy deposit for a given photon.

Definition at line 557 of file DreamSD.cc.

References crystalLength(), crystalWidth(), relval_parameters_module::energy, PMTResponse::getEfficiency(), LogDebug, and detailsBasic3DVector::y.

Referenced by cherenkovDeposit_().

560 {
561 
562  double energy = 0;
563 
564  // Crystal dimensions
565 
566  //edm::LogVerbatim("EcalSim") << p << x;
567 
568  // 1. Check if this photon goes straight to the APD:
569  // - assume that APD is at x=xtalLength/2.0
570  // - extrapolate from x=x0 to x=xtalLength/2.0 using momentum in x-y
571 
572  G4StepPoint* stepPoint = aStep->GetPreStepPoint();
573  G4LogicalVolume* lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
574  G4String nameVolume= lv->GetName();
575 
576  double crlength = crystalLength(lv);
577  double crwidth = crystalWidth(lv);
578  double dapd = 0.5 * crlength - x.x(); // Distance from closest APD
579  double y = p.y()/p.x()*dapd;
580 
581  LogDebug("EcalSim") << "Distance to APD: " << dapd
582  << " - y at APD: " << y;
583 
584  // Not straight: compute probability
585  if ( fabs(y)>crwidth*0.5 ) {
586 
587  }
588 
589  // 2. Retrieve efficiency for this wavelength (in nm, from MeV)
590  double waveLength = p.mag()*1.239e8;
591 
592 
593  energy = p.mag()*PMTResponse::getEfficiency(waveLength);
594 
595  LogDebug("EcalSim") << "Wavelength: " << waveLength << " - Energy: " << energy;
596 
597  return energy;
598 
599 }
#define LogDebug(id)
const double crystalWidth(G4LogicalVolume *) const
Definition: DreamSD.cc:280
x
Definition: VDTMath.h:216
const double crystalLength(G4LogicalVolume *) const
Definition: DreamSD.cc:270
static const double getEfficiency(const double &waveLengthNm)
Return efficiency for given photon wavelength (in nm)
Definition: PMTResponse.cc:6
bool DreamSD::getStepInfo ( G4Step *  aStep)
protectedvirtual

Reimplemented from CaloSD.

Definition at line 96 of file DreamSD.cc.

References birk1, birk2, birk3, cherenkovDeposit_(), CaloSD::currentID, curve_LY(), doCherenkov_, CaloSD::edepositEM, CaloSD::edepositHAD, CaloSD::getAttenuation(), TrackInformation::getIDonCaloSurface(), LogDebug, CaloSD::preStepPoint, setDetUnitId(), CaloHitID::setID(), side, CaloSD::theTrack, cond::rpcobgas::time, CaloHitID::unitID(), useBirk, and CommonMethods::weight().

Referenced by ProcessHits().

96  {
97 
98  preStepPoint = aStep->GetPreStepPoint();
99  theTrack = aStep->GetTrack();
100  G4String nameVolume = preStepPoint->GetPhysicalVolume()->GetName();
101 
102  // take into account light collection curve for crystals
103  double weight = 1.;
104  weight *= curve_LY(aStep, side);
105  if (useBirk) weight *= getAttenuation(aStep, birk1, birk2, birk3);
106  edepositEM = aStep->GetTotalEnergyDeposit() * weight;
107  LogDebug("EcalSim") << "DreamSD:: " << nameVolume << " Side " << side
108  <<" Light Collection Efficiency " << weight
109  << " Weighted Energy Deposit " << edepositEM/MeV
110  << " MeV";
111  // Get cherenkov contribution
112  if ( doCherenkov_ ) {
113  edepositHAD = cherenkovDeposit_( aStep );
114  } else {
115  edepositHAD = 0;
116  }
117 
118  double time = (aStep->GetPostStepPoint()->GetGlobalTime())/nanosecond;
119  unsigned int unitID= setDetUnitId(aStep);
120  if (side < 0) unitID++;
121  TrackInformation * trkInfo = (TrackInformation *)(theTrack->GetUserInformation());
122  int primaryID;
123 
124  if (trkInfo)
125  primaryID = trkInfo->getIDonCaloSurface();
126  else
127  primaryID = 0;
128 
129  if (primaryID == 0) {
130  edm::LogWarning("EcalSim") << "CaloSD: Problem with primaryID **** set by "
131  << "force to TkID **** "
132  << theTrack->GetTrackID() << " in Volume "
133  << preStepPoint->GetTouchable()->GetVolume(0)->GetName();
134  primaryID = theTrack->GetTrackID();
135  }
136 
137  bool flag = (unitID > 0);
138  G4TouchableHistory* touch =(G4TouchableHistory*)(theTrack->GetTouchable());
139  if (flag) {
140  currentID.setID(unitID, time, primaryID, 0);
141 
142  LogDebug("EcalSim") << "CaloSD:: GetStepInfo for"
143  << " PV " << touch->GetVolume(0)->GetName()
144  << " PVid = " << touch->GetReplicaNumber(0)
145  << " MVid = " << touch->GetReplicaNumber(1)
146  << " Unit " << currentID.unitID()
147  << " Edeposit = " << edepositEM << " " << edepositHAD;
148  } else {
149  LogDebug("EcalSim") << "CaloSD:: GetStepInfo for"
150  << " PV " << touch->GetVolume(0)->GetName()
151  << " PVid = " << touch->GetReplicaNumber(0)
152  << " MVid = " << touch->GetReplicaNumber(1)
153  << " Unit " << std::hex << unitID << std::dec
154  << " Edeposit = " << edepositEM << " " << edepositHAD;
155  }
156  return flag;
157 
158 }
#define LogDebug(id)
float edepositEM
Definition: CaloSD.h:120
long int flag
Definition: mlp_lapack.h:47
int getIDonCaloSurface() const
double birk1
Definition: DreamSD.h:58
double birk3
Definition: DreamSD.h:58
virtual uint32_t setDetUnitId(G4Step *)
Definition: DreamSD.cc:182
float edepositHAD
Definition: CaloSD.h:120
int side
Definition: DreamSD.h:62
double birk2
Definition: DreamSD.h:58
double getAttenuation(G4Step *aStep, double birk1, double birk2, double birk3)
Definition: CaloSD.cc:454
G4Track * theTrack
Definition: CaloSD.h:117
void setID(uint32_t unitID, double timeSlice, int trackID, uint16_t depth=0)
Definition: CaloHitID.cc:44
G4StepPoint * preStepPoint
Definition: CaloSD.h:119
double cherenkovDeposit_(G4Step *aStep)
Returns the total energy due to Cherenkov radiation.
Definition: DreamSD.cc:293
CaloHitID currentID
Definition: CaloSD.h:116
bool doCherenkov_
Definition: DreamSD.h:57
uint32_t unitID() const
Definition: CaloHitID.h:22
double curve_LY(G4Step *, int)
Definition: DreamSD.cc:239
bool useBirk
Definition: DreamSD.h:57
void DreamSD::initMap ( G4String  sd,
const DDCompactView cpv 
)
private

Definition at line 191 of file DreamSD.cc.

References DDFilteredView::addFilter(), DDSpecificsFilter::equals, alcazmumu_cfi::filter, DDFilteredView::firstChild(), i, LogDebug, DDFilteredView::logicalPart(), DDName::name(), SensitiveDetector::name, DDBase< N, C >::name(), DDFilteredView::next(), DDSolid::parameters(), DDSpecificsFilter::setCriteria(), DDSolid::shape(), DDLogicalPart::solid(), python.multivaluedict::sort(), tablePrinter::width, and xtalLMap.

Referenced by DreamSD().

191  {
192 
193  G4String attribute = "ReadOutName";
195  DDValue ddv(attribute,sd,0);
197  DDFilteredView fv(cpv);
198  fv.addFilter(filter);
199  fv.firstChild();
200 
201  const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance();
202  std::vector<G4LogicalVolume *>::const_iterator lvcite;
203  bool dodet=true;
204  while (dodet) {
205  const DDSolid & sol = fv.logicalPart().solid();
206  std::vector<double> paras(sol.parameters());
207  G4String name = sol.name().name();
208  G4LogicalVolume* lv=0;
209  for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++)
210  if ((*lvcite)->GetName() == name) {
211  lv = (*lvcite);
212  break;
213  }
214  LogDebug("EcalSim") << "DreamSD::initMap (for " << sd << "): Solid "
215  << name << " Shape " << sol.shape() <<" Parameter 0 = "
216  << paras[0] << " Logical Volume " << lv;
217  double length = 0, width = 0;
218  // Set length to be the largest size, width the smallest
219  std::sort( paras.begin(), paras.end() );
220  length = 2.0*paras.back();
221  width = 2.0*paras.front();
222  xtalLMap.insert( std::pair<G4LogicalVolume*,Doubles>(lv,Doubles(length,width)) );
223  dodet = fv.next();
224  }
225  LogDebug("EcalSim") << "DreamSD: Length Table for " << attribute << " = "
226  << sd << ":";
227  DimensionMap::const_iterator ite = xtalLMap.begin();
228  int i=0;
229  for (; ite != xtalLMap.end(); ite++, i++) {
230  G4String name = "Unknown";
231  if (ite->first != 0) name = (ite->first)->GetName();
232  LogDebug("EcalSim") << " " << i << " " << ite->first << " " << name
233  << " L = " << ite->second.first
234  << " W = " << ite->second.second;
235  }
236 }
#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
const N & name() const
Definition: DDBase.h:82
std::pair< double, double > Doubles
Definition: DreamSD.h:36
A DDSolid represents the shape of a part.
Definition: DDSolid.h:35
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:144
DimensionMap xtalLMap
Definition: DreamSD.h:60
double sd
void setCriteria(const DDValue &nameVal, comp_op, log_op l=AND, bool asString=true, bool merged=true)
Definition: DDFilter.cc:285
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
The DDGenericFilter is a runtime-parametrized Filter looking on DDSpecifcs.
Definition: DDFilter.h:37
void DreamSD::initRun ( )
protectedvirtual

Reimplemented from CaloSD.

Definition at line 162 of file DreamSD.cc.

References materialPropertiesTable, setPbWO2MaterialProperties_(), and xtalLMap.

162  {
163 
164  // Get the material and set properties if needed
165  DimensionMap::const_iterator ite = xtalLMap.begin();
166  G4LogicalVolume* lv = (ite->first);
167  G4Material* material = lv->GetMaterial();
168  edm::LogInfo("EcalSim") << "DreamSD::initRun: Initializes for material "
169  << material->GetName() << " in " << lv->GetName();
170  materialPropertiesTable = material->GetMaterialPropertiesTable();
171  if ( !materialPropertiesTable ) {
172  if ( !setPbWO2MaterialProperties_( material ) ) {
173  edm::LogWarning("EcalSim") << "Couldn't retrieve material properties table\n"
174  << " Material = " << material->GetName();
175  }
176  materialPropertiesTable = material->GetMaterialPropertiesTable();
177  }
178 }
bool setPbWO2MaterialProperties_(G4Material *aMaterial)
Sets material properties at run-time...
Definition: DreamSD.cc:494
G4MaterialPropertiesTable * materialPropertiesTable
Definition: DreamSD.h:66
DimensionMap xtalLMap
Definition: DreamSD.h:60
bool DreamSD::ProcessHits ( G4Step *  step,
G4TouchableHistory *  tHistory 
)
virtual

Reimplemented from CaloSD.

Definition at line 74 of file DreamSD.cc.

References CaloSD::createNewHit(), CaloSD::currentHit, CaloSD::edepositEM, CaloSD::edepositHAD, getStepInfo(), CaloSD::hitExists(), NULL, readBothSide_, and side.

74  {
75 
76  if (aStep == NULL) {
77  return true;
78  } else {
79  side = 1;
80  if (getStepInfo(aStep)) {
81  if (hitExists() == false && edepositEM+edepositHAD>0.)
83  if (readBothSide_) {
84  side = -1;
85  getStepInfo(aStep);
86  if (hitExists() == false && edepositEM+edepositHAD>0.)
88  }
89  }
90  }
91  return true;
92 }
float edepositEM
Definition: CaloSD.h:120
bool readBothSide_
Definition: DreamSD.h:57
virtual G4bool getStepInfo(G4Step *aStep)
Definition: DreamSD.cc:96
#define NULL
Definition: scimark2.h:8
float edepositHAD
Definition: CaloSD.h:120
int side
Definition: DreamSD.h:62
CaloG4Hit * currentHit
Definition: CaloSD.h:127
G4bool hitExists()
Definition: CaloSD.cc:299
CaloG4Hit * createNewHit()
Definition: CaloSD.cc:352
uint32_t DreamSD::setDetUnitId ( G4Step *  aStep)
virtual

Implements CaloSD.

Definition at line 182 of file DreamSD.cc.

References errorMatrix2Lands_multiChannel::id, and LogDebug.

Referenced by getStepInfo().

182  {
183  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
184  uint32_t id = (touch->GetReplicaNumber(1))*10 + (touch->GetReplicaNumber(0));
185  LogDebug("EcalSim") << "DreamSD:: ID " << id;
186  return id;
187 }
#define LogDebug(id)
bool DreamSD::setPbWO2MaterialProperties_ ( G4Material *  aMaterial)
private

Sets material properties at run-time...

Definition at line 494 of file DreamSD.cc.

References chAngleIntegrals_, getHLTprescales::index, LogDebug, and asciidump::table.

Referenced by initRun().

494  {
495 
496  std::string pbWO2Name("E_PbWO4");
497  if ( pbWO2Name != aMaterial->GetName() ) { // Wrong material!
498  edm::LogWarning("EcalSim") << "This is not the right material: "
499  << "expecting " << pbWO2Name
500  << ", got " << aMaterial->GetName();
501  return false;
502  }
503 
504  G4MaterialPropertiesTable* table = new G4MaterialPropertiesTable();
505 
506  // Refractive index as a function of photon momentum
507  // FIXME: Should somehow put that in the configuration
508  const int nEntries = 14;
509  double PhotonEnergy[nEntries] = { 1.7712*eV, 1.8368*eV, 1.90745*eV, 1.98375*eV, 2.0664*eV,
510  2.15625*eV, 2.25426*eV, 2.3616*eV, 2.47968*eV, 2.61019*eV,
511  2.75521*eV, 2.91728*eV, 3.09961*eV, 3.30625*eV };
512  double RefractiveIndex[nEntries] = { 2.17728, 2.18025, 2.18357, 2.18753, 2.19285,
513  2.19813, 2.20441, 2.21337, 2.22328, 2.23619,
514  2.25203, 2.27381, 2.30282, 2.34666 };
515 
516  table->AddProperty( "RINDEX", PhotonEnergy, RefractiveIndex, nEntries );
517  aMaterial->SetMaterialPropertiesTable(table); // FIXME: could this leak? What does G4 do?
518 
519  // Calculate Cherenkov angle integrals:
520  // This is an ad-hoc solution (we hold it in the class, not in the material)
522  std::auto_ptr<G4PhysicsOrderedFreeVector>( new G4PhysicsOrderedFreeVector() );
523 
524  int index = 0;
525  double currentRI = RefractiveIndex[index];
526  double currentPM = PhotonEnergy[index];
527  double currentCAI = 0.0;
528  chAngleIntegrals_->InsertValues(currentPM, currentCAI);
529  double prevPM = currentPM;
530  double prevCAI = currentCAI;
531  double prevRI = currentRI;
532  while ( ++index < nEntries ) {
533  currentRI = RefractiveIndex[index];
534  currentPM = PhotonEnergy[index];
535  currentCAI = 0.5*(1.0/(prevRI*prevRI) + 1.0/(currentRI*currentRI));
536  currentCAI = prevCAI + (currentPM - prevPM) * currentCAI;
537 
538  chAngleIntegrals_->InsertValues(currentPM, currentCAI);
539 
540  prevPM = currentPM;
541  prevCAI = currentCAI;
542  prevRI = currentRI;
543  }
544 
545  LogDebug("EcalSim") << "Material properties set for " << aMaterial->GetName();
546 
547  return true;
548 
549 }
#define LogDebug(id)
list table
Definition: asciidump.py:386
std::auto_ptr< G4PhysicsOrderedFreeVector > chAngleIntegrals_
Table of Cherenkov angle integrals vs photon momentum.
Definition: DreamSD.h:65

Member Data Documentation

double DreamSD::birk1
private

Definition at line 58 of file DreamSD.h.

Referenced by DreamSD(), and getStepInfo().

double DreamSD::birk2
private

Definition at line 58 of file DreamSD.h.

Referenced by DreamSD(), and getStepInfo().

double DreamSD::birk3
private

Definition at line 58 of file DreamSD.h.

Referenced by DreamSD(), and getStepInfo().

std::auto_ptr<G4PhysicsOrderedFreeVector> DreamSD::chAngleIntegrals_
private

Table of Cherenkov angle integrals vs photon momentum.

Definition at line 65 of file DreamSD.h.

Referenced by getAverageNumberOfPhotons_(), and setPbWO2MaterialProperties_().

bool DreamSD::doCherenkov_
private

Definition at line 57 of file DreamSD.h.

Referenced by DreamSD(), and getStepInfo().

G4MaterialPropertiesTable* DreamSD::materialPropertiesTable
private

Definition at line 66 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and initRun().

int DreamSD::nphotons_
private

Definition at line 69 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

TTree* DreamSD::ntuple_
private

Definition at line 68 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

float DreamSD::px_[MAXPHOTONS]
private

Definition at line 70 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

float DreamSD::py_[MAXPHOTONS]
private

Definition at line 70 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

float DreamSD::pz_[MAXPHOTONS]
private

Definition at line 70 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

bool DreamSD::readBothSide_
private

Definition at line 57 of file DreamSD.h.

Referenced by DreamSD(), and ProcessHits().

int DreamSD::side
private

Definition at line 62 of file DreamSD.h.

Referenced by getStepInfo(), and ProcessHits().

double DreamSD::slopeLY
private

Definition at line 59 of file DreamSD.h.

Referenced by curve_LY(), and DreamSD().

bool DreamSD::useBirk
private

Definition at line 57 of file DreamSD.h.

Referenced by DreamSD(), and getStepInfo().

float DreamSD::x_[MAXPHOTONS]
private

Definition at line 71 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

DimensionMap DreamSD::xtalLMap
private

Definition at line 60 of file DreamSD.h.

Referenced by crystalLength(), crystalWidth(), initMap(), and initRun().

float DreamSD::y_[MAXPHOTONS]
private

Definition at line 71 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().

float DreamSD::z_[MAXPHOTONS]
private

Definition at line 71 of file DreamSD.h.

Referenced by cherenkovDeposit_(), and DreamSD().