CMS 3D CMS Logo

BeamProfileVtxGenerator.cc
Go to the documentation of this file.
1 
2 
5 
8 
9 #include <CLHEP/Geometry/Transform3D.h>
10 #include <CLHEP/Random/RandFlat.h>
11 #include <CLHEP/Random/RandGaussQ.h>
12 #include <CLHEP/Units/SystemOfUnits.h>
13 #include <CLHEP/Units/GlobalPhysicalConstants.h>
14 #include "HepMC/SimpleVector.h"
15 
16 #include <fstream>
17 #include <string>
18 
19 using CLHEP::cm;
20 using CLHEP::deg;
21 using CLHEP::ns;
22 
24  meanX(p.getParameter<double>("BeamMeanX") * cm);
25  meanY(p.getParameter<double>("BeamMeanY") * cm);
26  beamPos(p.getParameter<double>("BeamPosition") * cm);
27  sigmaX(p.getParameter<double>("BeamSigmaX") * cm);
28  sigmaY(p.getParameter<double>("BeamSigmaY") * cm);
29  double fMinEta = p.getParameter<double>("MinEta");
30  double fMaxEta = p.getParameter<double>("MaxEta");
31  double fMinPhi = p.getParameter<double>("MinPhi");
32  double fMaxPhi = p.getParameter<double>("MaxPhi");
33  eta(0.5 * (fMinEta + fMaxEta));
34  phi(0.5 * (fMinPhi + fMaxPhi));
35  psi(p.getParameter<double>("Psi"));
36  nBinx = p.getParameter<int>("BinX");
37  nBiny = p.getParameter<int>("BinY");
38  ffile = p.getParameter<bool>("UseFile");
39  fTimeOffset = p.getParameter<double>("TimeOffset") * ns * c_light;
40 
41  if (ffile) {
42  std::string file = p.getParameter<std::string>("File");
43  std::ifstream is(file.c_str(), std::ios::in);
44  if (is) {
45  double elem, sum = 0;
46  while (!is.eof()) {
47  is >> elem;
48  fdistn.push_back(elem);
49  sum += elem;
50  }
51  if (((int)(fdistn.size())) >= nBinx * nBiny) {
52  double last = 0;
53  for (unsigned int i = 0; i < fdistn.size(); i++) {
54  fdistn[i] /= sum;
55  fdistn[i] += last;
56  last = fdistn[i];
57  }
58  setType(false);
59  } else {
60  ffile = false;
61  }
62  } else {
63  ffile = false;
64  }
65  }
66  if (!ffile) {
67  setType(p.getParameter<bool>("GaussianProfile"));
68  }
69 
70  edm::LogInfo("VertexGenerator") << "BeamProfileVtxGenerator: with "
71  << "beam along eta = " << fEta << " (Theta = " << fTheta / deg
72  << ") phi = " << fPhi / deg << ") psi = " << fPsi / deg << " centred at (" << fMeanX
73  << ", " << fMeanY << ", " << fMeanZ << ") "
74  << "and spread (" << fSigmaX << ", " << fSigmaY << ") of type Gaussian = " << fType
75  << " use file " << ffile;
76  if (ffile)
77  edm::LogInfo("VertexGenerator") << "With " << nBinx << " bins "
78  << " along X and " << nBiny << " bins along Y";
79 }
80 
82 
83 //Hep3Vector * BeamProfileVtxGenerator::newVertex() {
84 HepMC::FourVector BeamProfileVtxGenerator::newVertex(CLHEP::HepRandomEngine* engine) const {
85  double aX, aY;
86  if (ffile) {
87  double r1 = engine->flat();
88  int ixy = 0, ix, iy;
89  for (unsigned int i = 0; i < fdistn.size(); i++) {
90  if (r1 > fdistn[i])
91  ixy = i + 1;
92  }
93  if (ixy >= nBinx * nBiny) {
94  ix = nBinx - 1;
95  iy = nBiny - 1;
96  } else {
97  ix = ixy % nBinx;
98  iy = (ixy - ix) / nBinx;
99  }
100  aX = 0.5 * (2 * ix - nBinx + 2 * engine->flat()) * fSigmaX + fMeanX;
101  aY = 0.5 * (2 * iy - nBiny + 2 * engine->flat()) * fSigmaY + fMeanY;
102  } else {
103  if (fType) {
104  aX = fSigmaX * CLHEP::RandGaussQ::shoot(engine) + fMeanX;
105  aY = fSigmaY * CLHEP::RandGaussQ::shoot(engine) + fMeanY;
106  } else {
107  aX = CLHEP::RandFlat::shoot(engine, -0.5 * fSigmaX, 0.5 * fSigmaX) + fMeanX;
108  aY = CLHEP::RandFlat::shoot(engine, -0.5 * fSigmaY, 0.5 * fSigmaY) + fMeanY;
109  }
110  }
111 
112  double xp, yp, zp;
113  if (2. * M_PI < fabs(fPsi)) {
114  xp = -aX * cos(fTheta) * cos(fPhi) + aY * sin(fPhi) + fMeanZ * sin(fTheta) * cos(fPhi);
115  yp = -aX * cos(fTheta) * sin(fPhi) - aY * cos(fPhi) + fMeanZ * sin(fTheta) * sin(fPhi);
116  zp = aX * sin(fTheta) + fMeanZ * cos(fTheta);
117  } else // for endcap testbeam, use 3rd angle psi
118  {
119  const HepGeom::Vector3D<double> av(aX, aY, fMeanZ);
120 
121  /*
122  static const double kRadToDeg ( 180./M_PI ) ;
123  std::cout<<"theta = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
124  <<fTheta*kRadToDeg<<", phi="<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
125  << fPhi*kRadToDeg <<", PSI="<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
126  <<fPsi*kRadToDeg<<std::endl ;
127 */
128  const HepGeom::RotateZ3D R1(fPhi - M_PI);
129  const HepGeom::Point3D<double> xUnit(0, 1, 0);
130  const HepGeom::Point3D<double> zUnit(0, 0, 1);
131  const HepGeom::Transform3D RXRZ(HepGeom::Rotate3D(-fTheta, R1 * xUnit) * R1);
132  const HepGeom::Transform3D TRF(HepGeom::Rotate3D(fPsi, RXRZ * zUnit) * RXRZ);
133  /*
134  std::cout<<"\n\n$$$$$$$$$$$Transform="
135  <<" thetaZ = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
136  <<TRF.getRotation().thetaZ()*kRadToDeg
137  <<", phiZ = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
138  <<TRF.getRotation().phiZ()*kRadToDeg
139  <<", thetaY = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
140  <<TRF.getRotation().thetaY()*kRadToDeg
141  <<", phiY = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
142  <<TRF.getRotation().phiY()*kRadToDeg
143  <<", thetaX = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
144  <<TRF.getRotation().thetaX()*kRadToDeg
145  <<", phiX = "<<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
146  <<TRF.getRotation().phiX()*kRadToDeg
147  <<std::setw(7) << std::setiosflags( std::ios::fixed ) << std::setprecision(5)
148  <<TRF.getTranslation()<<std::endl ;
149 */
150  const HepGeom::Vector3D<double> pv(TRF * av);
151 
152  xp = pv.x();
153  yp = pv.y();
154  zp = pv.z();
155  }
156 
157  LogDebug("VertexGenerator") << "BeamProfileVtxGenerator: Vertex created "
158  << "at (" << xp << ", " << yp << ", " << zp << ", " << fTimeOffset << ")";
159  return HepMC::FourVector(xp, yp, zp, fTimeOffset);
160  ;
161 }
162 
164  if (s >= 0) {
165  fSigmaX = s;
166  } else {
167  edm::LogWarning("VertexGenerator") << "Warning BeamProfileVtxGenerator:"
168  << " Illegal resolution in X " << s << "- set to default value 0 cm";
169  fSigmaX = 0;
170  }
171 }
172 
174  if (s >= 0) {
175  fSigmaY = s;
176  } else {
177  edm::LogWarning("VertexGenerator") << "Warning BeamProfileVtxGenerator:"
178  << " Illegal resolution in Y " << s << "- set to default value 0 cm";
179  fSigmaY = 0;
180  }
181 }
182 
184  fEta = s;
185  fTheta = 2.0 * atan(exp(-fEta));
186 }
187 
void meanY(double m=0)
set mean in Y in cm
void setType(bool m=true)
set type
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
void meanX(double m=0)
set mean in X in cm
void psi(double m=999)
set psi in radian
std::vector< double > fdistn
void sigmaX(double s=1.0)
set resolution in X in cm
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
def pv(vc)
Definition: MetAnalyzer.py:7
void beamPos(double m=0)
set mean in Z in cm
void phi(double m=0)
set phi in radian
void eta(double m=0)
set eta
#define M_PI
HepMC::FourVector newVertex(CLHEP::HepRandomEngine *) const override
return a new event vertex
Log< level::Info, false > LogInfo
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
BeamProfileVtxGenerator(const edm::ParameterSet &p)
void sigmaY(double s=1.0)
set resolution in Y in cm
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
Log< level::Warning, false > LogWarning
#define LogDebug(id)