Go to the documentation of this file.00001
00002
00003
00004 #include "IOMC/EventVertexGenerators/interface/BeamProfileVtxGenerator.h"
00005 #include "FWCore/Utilities/interface/Exception.h"
00006
00007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010 #include "CLHEP/Geometry/Transform3D.h"
00011 #include "CLHEP/Random/RandFlat.h"
00012 #include "CLHEP/Random/RandGaussQ.h"
00013 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00014 #include "CLHEP/Units/GlobalPhysicalConstants.h"
00015 #include "HepMC/SimpleVector.h"
00016
00017 #include<fstream>
00018 #include<string>
00019
00020 BeamProfileVtxGenerator::BeamProfileVtxGenerator(const edm::ParameterSet & p) :
00021 BaseEvtVtxGenerator(p), fRandom(0) {
00022
00023 meanX(p.getParameter<double>("BeamMeanX")*cm);
00024 meanY(p.getParameter<double>("BeamMeanY")*cm);
00025 beamPos(p.getParameter<double>("BeamPosition")*cm);
00026 sigmaX(p.getParameter<double>("BeamSigmaX")*cm);
00027 sigmaY(p.getParameter<double>("BeamSigmaY")*cm);
00028 double fMinEta = p.getParameter<double>("MinEta");
00029 double fMaxEta = p.getParameter<double>("MaxEta");
00030 double fMinPhi = p.getParameter<double>("MinPhi");
00031 double fMaxPhi = p.getParameter<double>("MaxPhi");
00032 eta(0.5*(fMinEta+fMaxEta));
00033 phi(0.5*(fMinPhi+fMaxPhi));
00034 psi(p.getParameter<double>("Psi"));
00035 nBinx = p.getParameter<int>("BinX");
00036 nBiny = p.getParameter<int>("BinY");
00037 ffile = p.getParameter<bool>("UseFile");
00038 fTimeOffset = p.getParameter<double>("TimeOffset")*ns*c_light;
00039
00040 if (ffile) {
00041 std::string file = p.getParameter<std::string>("File");
00042 ifstream is(file.c_str(), std::ios::in);
00043 if (is) {
00044 double elem,sum=0;
00045 while (!is.eof()) {
00046 is >> elem;
00047 fdistn.push_back(elem);
00048 sum += elem;
00049 }
00050 if (((int)(fdistn.size())) >= nBinx*nBiny) {
00051 double last = 0;
00052 for (unsigned int i=0; i<fdistn.size(); i++) {
00053 fdistn[i] /= sum;
00054 fdistn[i] += last;
00055 last = fdistn[i];
00056 }
00057 setType(false);
00058 } else {
00059 ffile = false;
00060 }
00061 } else {
00062 ffile = false;
00063 }
00064 }
00065 if (!ffile) {
00066 setType(p.getParameter<bool>("GaussianProfile"));
00067 }
00068
00069 edm::LogInfo("VertexGenerator") << "BeamProfileVtxGenerator: with "
00070 << "beam along eta = " << fEta
00071 << " (Theta = " << fTheta/deg
00072 << ") phi = " << fPhi/deg
00073 << ") psi = " << fPsi/deg
00074 << " centred at (" << fMeanX << ", "
00075 << fMeanY << ", " << fMeanZ << ") "
00076 << "and spread (" << fSigmaX << ", "
00077 << fSigmaY << ") of type Gaussian = "
00078 << fType << " use file " << ffile;
00079 if (ffile)
00080 edm::LogInfo("VertexGenerator") << "With " << nBinx << " bins "
00081 << " along X and " << nBiny
00082 << " bins along Y";
00083 }
00084
00085 BeamProfileVtxGenerator::~BeamProfileVtxGenerator() {
00086 delete fRandom;
00087 }
00088
00089
00090
00091 HepMC::FourVector* BeamProfileVtxGenerator::newVertex() {
00092 double aX, aY;
00093 if (ffile) {
00094 double r1 = (dynamic_cast<CLHEP::RandFlat*>(fRandom))->fire();
00095 int ixy = 0, ix, iy;
00096 for (unsigned int i=0; i<fdistn.size(); i++) {
00097 if (r1 > fdistn[i]) ixy = i+1;
00098 }
00099 if (ixy >= nBinx*nBiny) {
00100 ix = nBinx-1; iy = nBiny-1;
00101 } else {
00102 ix = ixy%nBinx; iy = (ixy-ix)/nBinx;
00103 }
00104 aX = 0.5*(2*ix-nBinx+2*(dynamic_cast<CLHEP::RandFlat*>(fRandom))->fire())*fSigmaX + fMeanX ;
00105 aY = 0.5*(2*iy-nBiny+2*(dynamic_cast<CLHEP::RandFlat*>(fRandom))->fire())*fSigmaY + fMeanY ;
00106 } else {
00107 if (fType) {
00108 aX = fSigmaX*(dynamic_cast<CLHEP::RandGaussQ*>(fRandom))->fire() +fMeanX;
00109 aY = fSigmaY*(dynamic_cast<CLHEP::RandGaussQ*>(fRandom))->fire() +fMeanY;
00110 } else {
00111 aX = (dynamic_cast<CLHEP::RandFlat*>(fRandom))->fire(-0.5*fSigmaX,0.5*fSigmaX) + fMeanX ;
00112 aY = (dynamic_cast<CLHEP::RandFlat*>(fRandom))->fire(-0.5*fSigmaY,0.5*fSigmaY) + fMeanY;
00113 }
00114 }
00115
00116 double xp, yp, zp ;
00117 if( 2.*M_PI < fabs(fPsi) )
00118 {
00119 xp = -aX*cos(fTheta)*cos(fPhi) +aY*sin(fPhi) +fMeanZ*sin(fTheta)*cos(fPhi);
00120 yp = -aX*cos(fTheta)*sin(fPhi) -aY*cos(fPhi) +fMeanZ*sin(fTheta)*sin(fPhi);
00121 zp = aX*sin(fTheta) +fMeanZ*cos(fTheta);
00122 }
00123 else
00124 {
00125 const HepGeom::Vector3D<double> av ( aX, aY, fMeanZ ) ;
00126
00127
00128
00129
00130
00131
00132
00133
00134 const HepGeom::RotateZ3D R1 ( fPhi - M_PI ) ;
00135 const HepGeom::Point3D<double> xUnit ( 0,1,0 ) ;
00136 const HepGeom::Point3D<double> zUnit ( 0,0,1 ) ;
00137 const HepGeom::Transform3D RXRZ ( HepGeom::Rotate3D( -fTheta, R1*xUnit )*R1 ) ;
00138 const HepGeom::Transform3D TRF ( HepGeom::Rotate3D(fPsi,RXRZ*zUnit)*RXRZ ) ;
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 const HepGeom::Vector3D<double> pv ( TRF*av ) ;
00157
00158 xp = pv.x() ;
00159 yp = pv.y() ;
00160 zp = pv.z() ;
00161 }
00162
00163
00164 if (fVertex == 0 ) fVertex = new HepMC::FourVector() ;
00165 fVertex->set(xp, yp, zp, fTimeOffset );
00166
00167 LogDebug("VertexGenerator") << "BeamProfileVtxGenerator: Vertex created "
00168 << "at (" << xp << ", " << yp << ", "
00169 << zp << ", " << fTimeOffset << ")";
00170 return fVertex;
00171 }
00172
00173 void BeamProfileVtxGenerator::sigmaX(double s) {
00174
00175 if (s>=0) {
00176 fSigmaX = s;
00177 } else {
00178 edm::LogWarning("VertexGenerator") << "Warning BeamProfileVtxGenerator:"
00179 << " Illegal resolution in X " << s
00180 << "- set to default value 0 cm";
00181 fSigmaX = 0;
00182 }
00183 }
00184
00185 void BeamProfileVtxGenerator::sigmaY(double s) {
00186
00187 if (s>=0) {
00188 fSigmaY = s;
00189 } else {
00190 edm::LogWarning("VertexGenerator") << "Warning BeamProfileVtxGenerator:"
00191 << " Illegal resolution in Y " << s
00192 << "- set to default value 0 cm";
00193 fSigmaY = 0;
00194 }
00195 }
00196
00197 void BeamProfileVtxGenerator::eta(double s) {
00198 fEta = s;
00199 fTheta = 2.0*atan(exp(-fEta));
00200 }
00201
00202 void BeamProfileVtxGenerator::setType(bool s) {
00203
00204 fType = s;
00205 delete fRandom;
00206
00207 if (fType == true)
00208 fRandom = new CLHEP::RandGaussQ(getEngine());
00209 else
00210 fRandom = new CLHEP::RandFlat(getEngine());
00211 }