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
MuonBremsstrahlungSimulator Class Reference

#include <MuonBremsstrahlungSimulator.h>

Inheritance diagram for MuonBremsstrahlungSimulator:
MaterialEffectsSimulator

Public Member Functions

const XYZTLorentzVectordeltaP_BremMuon () const
 
const XYZTLorentzVectordeltaP_BremPhoton () const
 
 MuonBremsstrahlungSimulator (const RandomEngine *engine, double A, double Z, double density, double radLen, double photonEnergyCut, double photonFractECut)
 Constructor. More...
 
 ~MuonBremsstrahlungSimulator ()
 Default destructor. More...
 
- Public Member Functions inherited from MaterialEffectsSimulator
RHEP_const_iter beginDaughters () const
 Returns const iterator to the beginning of the daughters list. More...
 
int closestDaughterId ()
 The id of the closest charged daughter (filled for nuclear interactions only) More...
 
double eMass () const
 Electron mass in GeV/c2. More...
 
RHEP_const_iter endDaughters () const
 Returns const iterator to the end of the daughters list. More...
 
double excitE () const
 Mean excitation energy (in GeV) More...
 
 MaterialEffectsSimulator (const RandomEngine *engine, double A=28.0855, double Z=14.0000, double density=2.329, double radLen=9.360)
 
unsigned nDaughters () const
 Returns the number of daughters. More...
 
XYZVector orthogonal (const XYZVector &) const
 A vector orthogonal to another one (because it's not in XYZTLorentzVector) More...
 
double radLenIncm () const
 One radiation length in cm. More...
 
double rho () const
 Density in g/cm3. More...
 
void setNormalVector (const GlobalVector &normal)
 Sets the vector normal to the surface traversed. More...
 
double theA () const
 A. More...
 
double theZ () const
 Z. More...
 
void updateState (ParticlePropagator &myTrack, double radlen)
 Compute the material effect (calls the sub class) More...
 
virtual ~MaterialEffectsSimulator ()
 

Private Member Functions

XYZTLorentzVector brem (ParticlePropagator &p) const
 Compute Brem photon energy and angles, if any. More...
 
void compute (ParticlePropagator &Particle)
 Generate Bremsstrahlung photons. More...
 
double gbteth (const double ener, const double partm, const double efrac) const
 A universal angular distribution - still from GEANT. More...
 
unsigned int poisson (double ymu)
 Generate numbers according to a Poisson distribution of mean ymu. More...
 

Private Attributes

XYZTLorentzVector brem_photon
 
double bremProba
 
double d
 
XYZTLorentzVector deltaPMuon
 
TF1 * f1
 
int npar
 
double photonEnergy
 The minimum photon energy to be radiated, in GeV. More...
 
double photonFractE
 The minimum photon fractional energy (wrt that of the electron) More...
 
double rand
 
double xmax
 
double xmin
 The fractional photon energy cut (determined from the above two) More...
 

Additional Inherited Members

- Public Types inherited from MaterialEffectsSimulator
typedef std::vector
< RawParticle >
::const_iterator 
RHEP_const_iter
 
- Protected Attributes inherited from MaterialEffectsSimulator
std::vector< RawParticle_theUpdatedState
 
double A
 
double density
 
double radLen
 
double radLengths
 
const RandomEnginerandom
 
int theClosestChargedDaughterId
 
GlobalVector theNormalVector
 
double Z
 

Detailed Description

Definition at line 31 of file MuonBremsstrahlungSimulator.h.

Constructor & Destructor Documentation

MuonBremsstrahlungSimulator::MuonBremsstrahlungSimulator ( const RandomEngine engine,
double  A,
double  Z,
double  density,
double  radLen,
double  photonEnergyCut,
double  photonFractECut 
)

Constructor.

Definition at line 22 of file MuonBremsstrahlungSimulator.cc.

References d, LogDebug, photonEnergy, and photonFractE.

24  :
26 {
27  // Set the minimal photon energy for a Brem from mu+/-
28  photonEnergy = photonEnergyCut;
29  photonFractE = photonFractECut;
30  d = 0.; //distance
31  LogDebug("MuonBremsstrahlungSimulator")<< "Starting the MuonBremsstrahlungSimulator"<< std::endl;
32 }
#define LogDebug(id)
MaterialEffectsSimulator(const RandomEngine *engine, double A=28.0855, double Z=14.0000, double density=2.329, double radLen=9.360)
double photonFractE
The minimum photon fractional energy (wrt that of the electron)
double photonEnergy
The minimum photon energy to be radiated, in GeV.
MuonBremsstrahlungSimulator::~MuonBremsstrahlungSimulator ( )
inline

Default destructor.

Definition at line 41 of file MuonBremsstrahlungSimulator.h.

41 {}

Member Function Documentation

XYZTLorentzVector MuonBremsstrahlungSimulator::brem ( ParticlePropagator p) const
private

Compute Brem photon energy and angles, if any.

Definition at line 131 of file MuonBremsstrahlungSimulator.cc.

References funct::cos(), f1, RandomEngine::flatShoot(), gbteth(), LogDebug, M_PI, phi, MaterialEffectsSimulator::random, funct::sin(), and theta().

Referenced by compute().

131  {
132 
133  // This is a simple version of a Muon Brem using Petrukhin model .
134  //Ref: http://pdg.lbl.gov/2008/AtomicNuclearProperties/adndt.pdf
135  double mumass = 0.105658367;//mu mass (GeV/c^2)
136  double xp =0.;
137  //+++++++++++++++++++++++++++++++++++++++++++++++++++
138  // Ref: Framework
139  //https://hypernews.cern.ch/HyperNews/CMS/get/swDevelopment/1969/1.html
140  // http://cmssw.cvs.cern.ch/cgi-bin/cmssw.cgi/CMSSW/DQM/DTMonitorClient/src/DTResolutionTest.cc?view=markup
142  try {
143 
144  xp = f1->GetRandom();
145  } catch (...) {
146 
147  edm::LogInfo ("MuonBremsstrahlungSimulator") << "Exception when fitting...";
148  }
149  LogDebug("MuonBremsstrahlungSimulator")<< "MuonBremsstrahlungSimulator: xp->" << xp << std::endl;
150 
151 
152  // Have photon energy. Now generate angles with respect to the z axis
153  // defined by the incoming particle's momentum.
154 
155  // Isotropic in phi
156  const double phi = random->flatShoot()*2*M_PI;
157  // theta from universal distribution
158  const double theta = gbteth(pp.e(),mumass,xp)*mumass/pp.e();
159 
160  // Make momentum components
161  double stheta = std::sin(theta);
162  double ctheta = std::cos(theta);
163  double sphi = std::sin(phi);
164  double cphi = std::cos(phi);
165 
166  return xp * pp.e() * XYZTLorentzVector(stheta*cphi,stheta*sphi,ctheta,1.);
167 
168 }
#define LogDebug(id)
tuple pp
Definition: createTree.py:15
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Theta< T > theta() const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
double gbteth(const double ener, const double partm, const double efrac) const
A universal angular distribution - still from GEANT.
#define M_PI
Definition: BFit3D.cc:3
double flatShoot(double xmin=0.0, double xmax=1.0) const
Definition: RandomEngine.h:30
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:15
Definition: DDAxes.h:10
void MuonBremsstrahlungSimulator::compute ( ParticlePropagator Particle)
privatevirtual

Generate Bremsstrahlung photons.

Implements MaterialEffectsSimulator.

Definition at line 38 of file MuonBremsstrahlungSimulator.cc.

References MaterialEffectsSimulator::_theUpdatedState, MaterialEffectsSimulator::A, brem(), brem_photon, bremProba, d, deltaPMuon, MaterialEffectsSimulator::density, f1, i, LogDebug, max(), RawParticle::momentum(), npar, PetrukhinFunc(), photonEnergy, photonFractE, poisson(), MaterialEffectsSimulator::radLen, MaterialEffectsSimulator::radLengths, RawParticle::rotate(), xmax, xmin, and MaterialEffectsSimulator::Z.

39 {
40 
41  double NA = 6.022e+23; //Avogadro's number
42 
43  if ( radLengths > 4. ) {
44  Particle.SetXYZT(0.,0.,0.,0.);
45  deltaPMuon.SetXYZT(0.,0.,0.,0.);
46  brem_photon.SetXYZT(0.,0.,0.,0.);
47  }
48 
49 // Hard brem probability with a photon Energy above photonEnergy.
50 
51  double EMuon = Particle.e();//Muon Energy
52  if (EMuon<photonEnergy) return;
53  xmin = std::max(photonEnergy/EMuon,photonFractE);//fraction of muon's energy transferred to the photon
54 
55  // xmax = photonEnergy/Particle.e();
56  if ( xmin >=1. || xmin <=0. ) return;
57 
58  xmax = 1.;
59  npar = 3 ;//Number of parameters
60 
61  // create TF1 using a free C function
62  f1 = new TF1("f1",PetrukhinFunc,xmin,xmax,npar);
63  //Setting parameters
64  f1->SetParameters(EMuon,A,Z);
66  //d = distance for several materials
67  //X0 = radLen
68  //d = radLengths * X0(for tracker,yoke,ECAL and HCAL)
69  d = radLengths * radLen ;
70  //Integration
71  bremProba = density * d *(NA/A)* (f1->Integral(0.,1.));
72 
73 
74  // Number of photons to be radiated.
75  unsigned int nPhotons = poisson(bremProba);
76  _theUpdatedState.reserve(nPhotons);
77 
78 
79  if ( !nPhotons ) return;
80 
81  //Rotate to the lab frame
82  double chi = Particle.theta();
83  double psi = Particle.phi();
84  RawParticle::RotationZ rotZ(psi);
85  RawParticle::RotationY rotY(chi);
86 
87 
88 
89  // Energy of these photons
90  for ( unsigned int i=0; i<nPhotons; ++i ) {
91 
92  // Check that there is enough energy left.
93  if ( Particle.e() < photonEnergy ) break;
94  LogDebug("MuonBremsstrahlungSimulator")<< "MuonBremsstrahlungSimulator parameters:"<< std::endl;
95  LogDebug("MuonBremsstrahlungSimulator")<< "xmin-> " << xmin << std::endl;
96  LogDebug("MuonBremsstrahlungSimulator")<< "Atomic Weight-> " << A << std::endl;
97  LogDebug("MuonBremsstrahlungSimulator")<< "Density-> " << density << std::endl;
98  LogDebug("MuonBremsstrahlungSimulator")<< "Distance-> " << d << std::endl;
99  LogDebug("MuonBremsstrahlungSimulator")<< "bremProba->" << bremProba << std::endl;
100  LogDebug("MuonBremsstrahlungSimulator")<< "nPhotons->" << nPhotons << std::endl;
101  LogDebug("MuonBremsstrahlungSimulator")<< " Muon_Energy-> " << EMuon << std::endl;
102  LogDebug("MuonBremsstrahlungSimulator")<< "X0-> "<< radLen << std::endl;
103  LogDebug("MuonBremsstrahlungSimulator")<< " radLengths-> " << radLengths << std::endl;
104 
105  // Add a photon
106  RawParticle thePhoton(22,brem(Particle));
107  if (thePhoton.E()>0.){
108 
109  thePhoton.rotate(rotY);
110  thePhoton.rotate(rotZ);
111 
112  _theUpdatedState.push_back(thePhoton);
113 
114  // Update the original mu +/-
115  deltaPMuon = Particle -= thePhoton.momentum();
116  // Information of brem photon
117  brem_photon.SetXYZT(thePhoton.Px(),thePhoton.Py(),thePhoton.Pz(),thePhoton.E());
118 
119  LogDebug("MuonBremsstrahlungSimulator")<< " Muon Bremsstrahlung: photon_energy-> " << thePhoton.E() << std::endl;
120  LogDebug("MuonBremsstrahlungSimulator")<< "photon_px->" << thePhoton.Px() << std::endl;
121  LogDebug("MuonBremsstrahlungSimulator")<< "photon_py->" << thePhoton.Py() << std::endl;
122  LogDebug("MuonBremsstrahlungSimulator")<< "photon_pz->" << thePhoton.Pz() << std::endl;
123 
124  }
125 
126  }
127 
128 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
double PetrukhinFunc(double *x, double *p)
double xmin
The fractional photon energy cut (determined from the above two)
XYZTLorentzVector brem(ParticlePropagator &p) const
Compute Brem photon energy and angles, if any.
ROOT::Math::RotationZ RotationZ
Definition: RawParticle.h:38
std::map< std::string, int, std::less< std::string > > psi
const XYZTLorentzVector & momentum() const
the momentum fourvector
Definition: RawParticle.h:285
const T & max(const T &a, const T &b)
ROOT::Math::RotationY RotationY
Definition: RawParticle.h:37
unsigned int poisson(double ymu)
Generate numbers according to a Poisson distribution of mean ymu.
double photonFractE
The minimum photon fractional energy (wrt that of the electron)
std::vector< RawParticle > _theUpdatedState
double photonEnergy
The minimum photon energy to be radiated, in GeV.
const XYZTLorentzVector& MuonBremsstrahlungSimulator::deltaP_BremMuon ( ) const
inline

Definition at line 45 of file MuonBremsstrahlungSimulator.h.

References deltaPMuon.

45 { return deltaPMuon ; }
const XYZTLorentzVector& MuonBremsstrahlungSimulator::deltaP_BremPhoton ( ) const
inline

Definition at line 48 of file MuonBremsstrahlungSimulator.h.

References brem_photon.

48 { return brem_photon ; }
double MuonBremsstrahlungSimulator::gbteth ( const double  ener,
const double  partm,
const double  efrac 
) const
private

A universal angular distribution - still from GEANT.

Definition at line 171 of file MuonBremsstrahlungSimulator.cc.

References beta, d, RandomEngine::flatShoot(), create_public_lumi_plots::log, M_PI, MaterialEffectsSimulator::random, and MaterialEffectsSimulator::theZ().

Referenced by brem().

173  {
174  const double alfa = 0.625;
175 
176  const double d = 0.13*(0.8+1.3/theZ())*(100.0+(1.0/ener))*(1.0+efrac);
177  const double w1 = 9.0/(9.0+d);
178  const double umax = ener*M_PI/partm;
179  double u;
180 
181  do {
182  double beta = (random->flatShoot()<=w1) ? alfa : 3.0*alfa;
183  u = -std::log(random->flatShoot()*random->flatShoot())/beta;
184  } while (u>=umax);
185 
186  return u;
187 }
const double beta
#define M_PI
Definition: BFit3D.cc:3
double flatShoot(double xmin=0.0, double xmax=1.0) const
Definition: RandomEngine.h:30
unsigned int MuonBremsstrahlungSimulator::poisson ( double  ymu)
private

Generate numbers according to a Poisson distribution of mean ymu.

Definition at line 191 of file MuonBremsstrahlungSimulator.cc.

References create_public_lumi_plots::exp, RandomEngine::flatShoot(), n, MaterialEffectsSimulator::random, and x.

Referenced by compute().

191  {
192 
193  unsigned int n = 0;
194  double prob = std::exp(-ymu);
195  double proba = prob;
196  double x = random->flatShoot();
197 
198  while ( proba <= x ) {
199  prob *= ymu / double(++n);
200  proba += prob;
201  }
202 
203  return n;
204 
205 }
double flatShoot(double xmin=0.0, double xmax=1.0) const
Definition: RandomEngine.h:30
Definition: DDAxes.h:10

Member Data Documentation

XYZTLorentzVector MuonBremsstrahlungSimulator::brem_photon
private

Definition at line 84 of file MuonBremsstrahlungSimulator.h.

Referenced by compute(), and deltaP_BremPhoton().

double MuonBremsstrahlungSimulator::bremProba
private

Definition at line 59 of file MuonBremsstrahlungSimulator.h.

Referenced by compute().

double MuonBremsstrahlungSimulator::d
private

Definition at line 65 of file MuonBremsstrahlungSimulator.h.

Referenced by compute(), gbteth(), and MuonBremsstrahlungSimulator().

XYZTLorentzVector MuonBremsstrahlungSimulator::deltaPMuon
private

Definition at line 82 of file MuonBremsstrahlungSimulator.h.

Referenced by compute(), and deltaP_BremMuon().

TF1* MuonBremsstrahlungSimulator::f1
private

Definition at line 53 of file MuonBremsstrahlungSimulator.h.

Referenced by brem(), and compute().

int MuonBremsstrahlungSimulator::npar
private

Definition at line 55 of file MuonBremsstrahlungSimulator.h.

Referenced by compute().

double MuonBremsstrahlungSimulator::photonEnergy
private

The minimum photon energy to be radiated, in GeV.

Definition at line 58 of file MuonBremsstrahlungSimulator.h.

Referenced by compute(), and MuonBremsstrahlungSimulator().

double MuonBremsstrahlungSimulator::photonFractE
private

The minimum photon fractional energy (wrt that of the electron)

Definition at line 61 of file MuonBremsstrahlungSimulator.h.

Referenced by compute(), and MuonBremsstrahlungSimulator().

double MuonBremsstrahlungSimulator::rand
private

Definition at line 64 of file MuonBremsstrahlungSimulator.h.

double MuonBremsstrahlungSimulator::xmax
private

Definition at line 64 of file MuonBremsstrahlungSimulator.h.

Referenced by svgfig.XAxis::__repr__(), and compute().

double MuonBremsstrahlungSimulator::xmin
private

The fractional photon energy cut (determined from the above two)

Definition at line 64 of file MuonBremsstrahlungSimulator.h.

Referenced by svgfig.XAxis::__repr__(), svgfig.Axes::__repr__(), svgfig.HGrid::__repr__(), svgfig.Grid::__repr__(), compute(), and svgfig.Axes::SVG().