Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include <ostream>
00008
00009 #include "IOMC/ParticleGuns/interface/MultiParticleInConeGunProducer.h"
00010
00011 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00012 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
00013
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00016
00017
00018
00019
00020
00021 using namespace edm;
00022 using namespace std;
00023
00024 MultiParticleInConeGunProducer::MultiParticleInConeGunProducer(const ParameterSet& pset) :
00025 BaseFlatGunProducer(pset)
00026 {
00027
00028
00029 ParameterSet defpset ;
00030 ParameterSet pgun_params =
00031 pset.getParameter<ParameterSet>("PGunParameters") ;
00032
00033 fMinPt = pgun_params.getParameter<double>("MinPt");
00034 fMaxPt = pgun_params.getParameter<double>("MaxPt");
00035
00036 fInConeIds = pgun_params.getParameter< vector<int> >("InConeID");
00037 fMinDeltaR = pgun_params.getParameter<double>("MinDeltaR");
00038 fMaxDeltaR = pgun_params.getParameter<double>("MaxDeltaR");
00039 fMinMomRatio = pgun_params.getParameter<double>("MinMomRatio");
00040 fMaxMomRatio = pgun_params.getParameter<double>("MaxMomRatio");
00041
00042 fInConeMinEta = pgun_params.getParameter<double>("InConeMinEta");
00043 fInConeMaxEta = pgun_params.getParameter<double>("InConeMaxEta");
00044 fInConeMinPhi = pgun_params.getParameter<double>("InConeMinPhi");
00045 fInConeMaxPhi = pgun_params.getParameter<double>("InConeMaxPhi");
00046 fInConeMaxTry = pgun_params.getParameter<unsigned int>("InConeMaxTry");
00047
00048 produces<HepMCProduct>();
00049 produces<GenEventInfoProduct>();
00050 }
00051
00052 MultiParticleInConeGunProducer::~MultiParticleInConeGunProducer()
00053 {
00054
00055 }
00056
00057 void MultiParticleInConeGunProducer::produce(Event &e, const EventSetup& es)
00058 {
00059
00060 if ( fVerbosity > 0 )
00061 {
00062 cout << " MultiParticleInConeGunProducer : Begin New Event Generation" << endl ;
00063 }
00064
00065
00066
00067
00068
00069
00070
00071 fEvt = new HepMC::GenEvent() ;
00072
00073
00074
00075
00076
00077
00078 HepMC::GenVertex* Vtx = new HepMC::GenVertex(HepMC::FourVector(0.,0.,0.));
00079
00080
00081
00082 int barcode = 1 ;
00083 for (unsigned int ip=0; ip<fPartIDs.size(); ++ip)
00084 {
00085
00086 double pt = fRandomGenerator->fire(fMinPt, fMaxPt) ;
00087 double eta = fRandomGenerator->fire(fMinEta, fMaxEta) ;
00088 double phi = fRandomGenerator->fire(fMinPhi, fMaxPhi) ;
00089 int PartID = fPartIDs[ip] ;
00090 const HepPDT::ParticleData*
00091 PData = fPDGTable->particle(HepPDT::ParticleID(abs(PartID))) ;
00092 double mass = PData->mass().value() ;
00093 double theta = 2.*atan(exp(-eta)) ;
00094 double mom = pt/sin(theta) ;
00095 double px = pt*cos(phi) ;
00096 double py = pt*sin(phi) ;
00097 double pz = mom*cos(theta) ;
00098 double energy2= mom*mom + mass*mass ;
00099 double energy = sqrt(energy2) ;
00100
00101 HepMC::FourVector p(px,py,pz,energy) ;
00102 HepMC::GenParticle* Part =
00103 new HepMC::GenParticle(p,PartID,1);
00104 Part->suggest_barcode( barcode ) ;
00105 barcode++ ;
00106 Vtx->add_particle_out(Part);
00107
00108 if ( fAddAntiParticle ){}
00109
00110
00111 for (unsigned iPic=0; iPic!=fInConeIds.size();iPic++){
00112 unsigned int nTry=0;
00113 while(true){
00114
00115 double dR = fRandomGenerator->fire(fMinDeltaR, fMaxDeltaR);
00116
00117 double alpha = fRandomGenerator->fire(-3.14159265358979323846, 3.14159265358979323846);
00118 double dEta = dR*cos(alpha);
00119 double dPhi = dR*sin(alpha);
00120
00121
00122
00123
00124
00125
00126
00127 double etaIc = eta+dEta;
00128 double phiIc = phi+dPhi;
00129
00130 const unsigned int maxL=100;
00131 unsigned int iL=0;
00132 while(iL++<maxL){
00133 if (phiIc > 3.14159265358979323846) phiIc-=2*3.14159265358979323846;
00134 else if(phiIc <-3.14159265358979323846) phiIc+=2*3.14159265358979323846;
00135
00136 if (abs(phiIc)<3.14159265358979323846) break;
00137 }
00138
00139
00140
00141 if (nTry++<=fInConeMaxTry){
00142
00143 if (etaIc<fInConeMinEta || etaIc > fInConeMaxEta) continue;
00144 if (phiIc<fInConeMinPhi || phiIc > fInConeMaxPhi) continue;
00145 }
00146 else{
00147 if ( fVerbosity > 0 )
00148 {
00149 cout << " MultiParticleInConeGunProducer : could not produce a particle "
00150 << fInConeIds[iPic]<<" in cone "
00151 << fMinDeltaR<<" to "<<fMaxDeltaR<<" within the "<<fInConeMaxTry<<" allowed tries."<<endl;
00152 }
00153
00154
00155
00156 }
00157 int PartIDIc=fInConeIds[iPic];
00158 const HepPDT::ParticleData*
00159 PDataIc = fPDGTable->particle(HepPDT::ParticleID(abs(PartIDIc)));
00160
00161
00162 double momR = fRandomGenerator->fire(fMinMomRatio, fMaxMomRatio);
00163 double massIc= PDataIc->mass().value() ;
00164 double momIc = momR * mom;
00165 double energyIc = sqrt(momIc*momIc + massIc*massIc);
00166
00167 double thetaIc = 2.*atan(exp(-etaIc)) ;
00168 double pxIc = momIc*sin(thetaIc)*cos(phiIc);
00169 double pyIc = momIc*sin(thetaIc)*sin(phiIc);
00170 double pzIc = momIc*cos(thetaIc);
00171
00172 HepMC::FourVector pIc(pxIc,pyIc,pzIc,energyIc) ;
00173 HepMC::GenParticle* PartIc = new HepMC::GenParticle(pIc, PartIDIc, 1);
00174 PartIc->suggest_barcode( barcode ) ;
00175 barcode++ ;
00176 Vtx->add_particle_out(PartIc);
00177 break;
00178 }
00179 }
00180 }
00181
00182 fEvt->add_vertex(Vtx) ;
00183 fEvt->set_event_number(e.id().event()) ;
00184 fEvt->set_signal_process_id(20) ;
00185
00186 if ( fVerbosity > 0 )
00187 {
00188 fEvt->print() ;
00189 }
00190
00191 auto_ptr<HepMCProduct> BProduct(new HepMCProduct()) ;
00192 BProduct->addHepMCData( fEvt );
00193 e.put(BProduct);
00194
00195 auto_ptr<GenEventInfoProduct> genEventInfo(new GenEventInfoProduct(fEvt));
00196 e.put(genEventInfo);
00197
00198 if ( fVerbosity > 0 )
00199 {
00200 cout << " MultiParticleInConeGunProducer : Event Generation Done " << endl;
00201 }
00202 }
00203