IOMC
ParticleGuns
src
BeamMomentumGunProducer.cc
Go to the documentation of this file.
1
#include "
IOMC/ParticleGuns/interface/BeamMomentumGunProducer.h
"
2
3
#include "
SimDataFormats/GeneratorProducts/interface/HepMCProduct.h
"
4
#include "
SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h
"
5
6
#include "
FWCore/Framework/interface/Event.h
"
7
#include "
FWCore/ParameterSet/interface/ParameterSet.h
"
8
#include "
FWCore/MessageLogger/interface/MessageLogger.h
"
9
#include "
FWCore/ServiceRegistry/interface/Service.h
"
10
#include "
FWCore/Utilities/interface/RandomNumberGenerator.h
"
11
12
#include "CLHEP/Random/RandFlat.h"
13
14
#include "TFile.h"
15
16
namespace
CLHEP
{
17
class
HepRandomEngine;
18
}
19
20
namespace
edm
{
21
BeamMomentumGunProducer::BeamMomentumGunProducer
(
const
edm::ParameterSet
&
pset
)
22
:
FlatBaseThetaGunProducer
(
pset
),
23
parPDGId_(nullptr),
24
parX_(nullptr),
25
parY_(nullptr),
26
parZ_(nullptr),
27
parPx_(nullptr),
28
parPy_(nullptr),
29
parPz_(nullptr),
30
b_npar_(nullptr),
31
b_eventId_(nullptr),
32
b_parPDGId_(nullptr),
33
b_parX_(nullptr),
34
b_parY_(nullptr),
35
b_parZ_(nullptr),
36
b_parPx_(nullptr),
37
b_parPy_(nullptr),
38
b_parPz_(nullptr) {
39
edm::ParameterSet
pgun_params =
pset
.getParameter<
edm::ParameterSet
>(
"PGunParameters"
);
40
41
// doesn't seem necessary to check if pset is empty
42
xoff_
= pgun_params.
getParameter
<
double
>(
"XOffset"
);
43
yoff_
= pgun_params.
getParameter
<
double
>(
"YOffset"
);
44
zpos_
= pgun_params.
getParameter
<
double
>(
"ZPosition"
);
45
if
(
fVerbosity
> 0)
46
edm::LogVerbatim
(
"BeamMomentumGun"
)
47
<<
"Beam vertex offset (cm) "
<<
xoff_
<<
":"
<<
yoff_
<<
" and z position "
<<
zpos_
;
48
49
edm::FileInPath
fp
= pgun_params.
getParameter
<
edm::FileInPath
>(
"FileName"
);
50
std::string
infileName
=
fp
.fullPath();
51
52
fFile_
=
new
TFile(
infileName
.c_str());
53
fFile_
->GetObject(
"EventTree"
,
fTree_
);
54
nentries_
=
fTree_
->GetEntriesFast();
55
if
(
fVerbosity
> 0)
56
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"Total Events: "
<<
nentries_
<<
" in "
<<
infileName
;
57
58
// Set branch addresses and branch pointers
59
int
npart
=
fTree_
->SetBranchAddress(
"npar"
, &
npar_
, &
b_npar_
);
60
int
event
=
fTree_
->SetBranchAddress(
"eventId"
, &
eventId_
, &
b_eventId_
);
61
int
pdgid
=
fTree_
->SetBranchAddress(
"parPDGId"
, &
parPDGId_
, &
b_parPDGId_
);
62
int
parxx =
fTree_
->SetBranchAddress(
"parX"
, &
parX_
, &
b_parX_
);
63
int
paryy =
fTree_
->SetBranchAddress(
"parY"
, &
parY_
, &
b_parY_
);
64
int
parzz =
fTree_
->SetBranchAddress(
"parZ"
, &
parZ_
, &
b_parZ_
);
65
int
parpx =
fTree_
->SetBranchAddress(
"parPx"
, &
parPx_
, &
b_parPx_
);
66
int
parpy =
fTree_
->SetBranchAddress(
"parPy"
, &
parPy_
, &
b_parPy_
);
67
int
parpz =
fTree_
->SetBranchAddress(
"parPz"
, &
parPz_
, &
b_parPz_
);
68
if
((
npart
!= 0) || (
event
!= 0) || (
pdgid
!= 0) || (parxx != 0) || (paryy != 0) || (parzz != 0) || (parpx != 0) ||
69
(parpy != 0) || (parpz != 0))
70
throw
cms::Exception
(
"GenException"
) <<
"Branch address wrong in i/p file\n"
;
71
72
produces<HepMCProduct>(
"unsmeared"
);
73
produces<GenEventInfoProduct>();
74
75
if
(
fVerbosity
> 0)
76
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"BeamMonetumGun is initialzed"
;
77
}
78
79
void
BeamMomentumGunProducer::produce
(
edm::Event
&
e
,
const
edm::EventSetup
& es) {
80
if
(
fVerbosity
> 0)
81
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"BeamMomentumGunProducer : Begin New Event Generation"
;
82
83
edm::Service<edm::RandomNumberGenerator>
rng;
84
CLHEP::HepRandomEngine* engine = &rng->
getEngine
(
e
.streamID());
85
86
// event loop (well, another step in it...)
87
// no need to clean up GenEvent memory - done in HepMCProduct
88
// here re-create fEvt (memory)
89
//
90
fEvt
=
new
HepMC::GenEvent
();
91
92
// random entry generation for peaking event randomly from tree
93
long
int
rjentry = static_cast<long int>(CLHEP::RandFlat::shoot(engine, 0,
nentries_
- 1));
94
fTree_
->GetEntry(rjentry);
95
if
(
fVerbosity
> 0)
96
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"Entry "
<< rjentry <<
" : "
<<
eventId_
<<
" : "
<<
npar_
;
97
98
// loop over particles
99
int
barcode = 1;
100
for
(
unsigned
int
ip = 0; ip <
parPDGId_
->size(); ip++) {
101
int
partID =
parPDGId_
->at(ip);
102
const
HepPDT::ParticleData
* pData =
fPDGTable
->particle(
HepPDT::ParticleID
(
std::abs
(partID)));
103
double
mass
= pData->mass().value();
104
if
(
fVerbosity
> 0)
105
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"PDGId: "
<< partID <<
" mass: "
<<
mass
;
106
double
xp = (
xoff_
*
cm2mm_
+ (-1) *
parY_
->at(ip));
// 90 degree rotation applied
107
double
yp = (
yoff_
*
cm2mm_
+
parX_
->at(ip));
// 90 degree rotation applied
108
double
zp =
zpos_
*
cm2mm_
;
109
HepMC::GenVertex* Vtx =
new
HepMC::GenVertex(HepMC::FourVector(xp, yp, zp));
110
double
pxGeV =
MeV2GeV_
* (-1) *
parPy_
->at(ip);
// 90 degree rotation applied
111
double
pyGeV =
MeV2GeV_
*
parPx_
->at(ip);
// 90 degree rotation applied
112
double
pzGeV =
MeV2GeV_
*
parPz_
->at(ip);
113
double
theta
= CLHEP::RandFlat::shoot(engine,
fMinTheta
,
fMaxTheta
);
114
double
phi = CLHEP::RandFlat::shoot(engine,
fMinPhi
,
fMaxPhi
);
115
// rotation about Z axis
116
double
px1 = pxGeV *
cos
(phi) - pyGeV *
sin
(phi);
117
double
py1 = pxGeV *
sin
(phi) + pyGeV *
cos
(phi);
118
double
pz1 = pzGeV;
119
// rotation about Y axis
120
double
px
= px1 *
cos
(
theta
) + pz1 *
sin
(
theta
);
121
double
py
= py1;
122
double
pz = -px1 *
sin
(
theta
) + pz1 *
cos
(
theta
);
123
double
energy
=
std::sqrt
(
px
*
px
+
py
*
py
+ pz * pz +
mass
*
mass
);
124
125
if
(
fVerbosity
> 0) {
126
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"x:y:z [mm] "
<< xp <<
":"
<< yp <<
":"
<<
zpos_
;
127
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"px:py:pz [GeV] "
<<
px
<<
":"
<<
py
<<
":"
<< pz;
128
}
129
130
HepMC::FourVector
p
(
px
,
py
, pz,
energy
);
131
HepMC::GenParticle
*
part
=
new
HepMC::GenParticle
(
p
, partID, 1);
132
part
->suggest_barcode(barcode);
133
barcode++;
134
Vtx->add_particle_out(
part
);
135
136
if
(
fAddAntiParticle
) {
137
HepMC::FourVector ap(-
px
, -
py
, -pz,
energy
);
138
int
apartID = (partID == 22 || partID == 23) ? partID : -partID;
139
HepMC::GenParticle
* apart =
new
HepMC::GenParticle
(ap, apartID, 1);
140
apart->suggest_barcode(barcode);
141
if
(
fVerbosity
> 0)
142
edm::LogVerbatim
(
"BeamMomentumGun"
)
143
<<
"Add anti-particle "
<< apartID <<
":"
<< -
px
<<
":"
<< -
py
<<
":"
<< -pz;
144
barcode++;
145
Vtx->add_particle_out(apart);
146
}
147
148
fEvt
->add_vertex(Vtx);
149
}
150
151
fEvt
->set_event_number(
e
.id().event());
152
fEvt
->set_signal_process_id(20);
153
154
if
(
fVerbosity
> 0)
155
fEvt
->print();
156
157
std::unique_ptr<HepMCProduct> BProduct(
new
HepMCProduct
());
158
BProduct->addHepMCData(
fEvt
);
159
e
.put(
std::move
(BProduct),
"unsmeared"
);
160
161
std::unique_ptr<GenEventInfoProduct>
genEventInfo
(
new
GenEventInfoProduct
(
fEvt
));
162
e
.put(
std::move
(
genEventInfo
));
163
164
if
(
fVerbosity
> 0)
165
edm::LogVerbatim
(
"BeamMomentumGun"
) <<
"BeamMomentumGunProducer : Event Generation Done"
;
166
}
167
}
// namespace edm
GenEventInfoProduct
Definition:
GenEventInfoProduct.h:17
edm::RandomNumberGenerator::getEngine
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
edm::BeamMomentumGunProducer::b_parZ_
TBranch * b_parZ_
Definition:
BeamMomentumGunProducer.h:37
MessageLogger.h
multPhiCorr_741_25nsDY_cfi.py
py
Definition:
multPhiCorr_741_25nsDY_cfi.py:12
edm::BeamMomentumGunProducer::MeV2GeV_
static constexpr double MeV2GeV_
Definition:
BeamMomentumGunProducer.h:41
edm
HLT enums.
Definition:
AlignableModifier.h:19
RandomNumberGenerator.h
ZgammaFilter_cfi.HepMCProduct
HepMCProduct
Definition:
ZgammaFilter_cfi.py:9
personalPlayback.fp
fp
Definition:
personalPlayback.py:523
edm::BeamMomentumGunProducer::parPx_
std::vector< float > * parPx_
Definition:
BeamMomentumGunProducer.h:33
edm::BeamMomentumGunProducer::produce
void produce(Event &e, const EventSetup &es) override
Definition:
BeamMomentumGunProducer.cc:79
edm::FlatBaseThetaGunProducer::fEvt
HepMC::GenEvent * fEvt
Definition:
FlatBaseThetaGunProducer.h:43
npart
double npart
Definition:
HydjetWrapper.h:46
edm::BeamMomentumGunProducer::parPDGId_
std::vector< int > * parPDGId_
Definition:
BeamMomentumGunProducer.h:31
HepMC::GenEvent
Definition:
hepmc_rootio.cc:9
ParticleData
HepPDT::ParticleData ParticleData
Definition:
ParticleDataTable.h:9
edm::BeamMomentumGunProducer::nentries_
long int nentries_
Definition:
BeamMomentumGunProducer.h:27
edm::BeamMomentumGunProducer::cm2mm_
static constexpr double cm2mm_
Definition:
BeamMomentumGunProducer.h:40
funct::sin
Sin< T >::type sin(const T &t)
Definition:
Sin.h:22
edm::BeamMomentumGunProducer::BeamMomentumGunProducer
BeamMomentumGunProducer(const ParameterSet &)
Definition:
BeamMomentumGunProducer.cc:21
edm::FileInPath
Definition:
FileInPath.h:61
edm::FlatBaseThetaGunProducer::fMinPhi
double fMinPhi
Definition:
FlatBaseThetaGunProducer.h:39
part
part
Definition:
HCALResponse.h:20
edm::BeamMomentumGunProducer::fTree_
TTree * fTree_
Definition:
BeamMomentumGunProducer.h:26
funct::cos
Cos< T >::type cos(const T &t)
Definition:
Cos.h:22
edm::BeamMomentumGunProducer::parPy_
std::vector< float > * parPy_
Definition:
BeamMomentumGunProducer.h:33
Service.h
mathSSE::sqrt
T sqrt(T t)
Definition:
SSEVec.h:19
theta
Geom::Theta< T > theta() const
Definition:
Basic3DVectorLD.h:150
HCALHighEnergyHPDFilter_cfi.energy
energy
Definition:
HCALHighEnergyHPDFilter_cfi.py:5
CLHEP
Definition:
CocoaGlobals.h:27
edm::FlatBaseThetaGunProducer::fMaxTheta
double fMaxTheta
Definition:
FlatBaseThetaGunProducer.h:38
edm::FlatBaseThetaGunProducer::fMaxPhi
double fMaxPhi
Definition:
FlatBaseThetaGunProducer.h:40
edm::BeamMomentumGunProducer::parX_
std::vector< float > * parX_
Definition:
BeamMomentumGunProducer.h:32
edm::ParameterSet
Definition:
ParameterSet.h:47
AlCaHLTBitMon_ParallelJobs.p
def p
Definition:
AlCaHLTBitMon_ParallelJobs.py:153
edm::BeamMomentumGunProducer::xoff_
double xoff_
Definition:
BeamMomentumGunProducer.h:24
GenEventInfoProduct.h
Event.h
edm::BeamMomentumGunProducer::b_parX_
TBranch * b_parX_
Definition:
BeamMomentumGunProducer.h:37
edm::BeamMomentumGunProducer::parPz_
std::vector< float > * parPz_
Definition:
BeamMomentumGunProducer.h:33
edm::Service< edm::RandomNumberGenerator >
edm::FlatBaseThetaGunProducer::fMinTheta
double fMinTheta
Definition:
FlatBaseThetaGunProducer.h:37
edm::EventSetup
Definition:
EventSetup.h:58
edm::BeamMomentumGunProducer::b_parPz_
TBranch * b_parPz_
Definition:
BeamMomentumGunProducer.h:38
edm::BeamMomentumGunProducer::b_parPx_
TBranch * b_parPx_
Definition:
BeamMomentumGunProducer.h:38
edm::BeamMomentumGunProducer::b_eventId_
TBranch * b_eventId_
Definition:
BeamMomentumGunProducer.h:36
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition:
AlCaHLTBitMon_QueryRunRegistry.py:256
edm::FlatBaseThetaGunProducer::fPDGTable
ESHandle< HepPDT::ParticleDataTable > fPDGTable
Definition:
FlatBaseThetaGunProducer.h:47
edm::BeamMomentumGunProducer::zpos_
double zpos_
Definition:
BeamMomentumGunProducer.h:24
BeamMomentumGunProducer.h
edm::FlatBaseThetaGunProducer
Definition:
FlatBaseThetaGunProducer.h:21
multPhiCorr_741_25nsDY_cfi.px
px
Definition:
multPhiCorr_741_25nsDY_cfi.py:10
GenParticle.GenParticle
GenParticle
Definition:
GenParticle.py:18
eostools.move
def move(src, dest)
Definition:
eostools.py:511
genParticles2HepMC_cfi.genEventInfo
genEventInfo
Definition:
genParticles2HepMC_cfi.py:6
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition:
MessageLogger.h:128
Exception
Definition:
hltDiff.cc:245
edm::BeamMomentumGunProducer::npar_
int npar_
Definition:
BeamMomentumGunProducer.h:30
EgHLTOffHistBins_cfi.mass
mass
Definition:
EgHLTOffHistBins_cfi.py:34
edm::BeamMomentumGunProducer::fFile_
TFile * fFile_
Definition:
BeamMomentumGunProducer.h:25
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition:
ParameterSet.h:303
edm::BeamMomentumGunProducer::yoff_
double yoff_
Definition:
BeamMomentumGunProducer.h:24
edm::BeamMomentumGunProducer::b_parPy_
TBranch * b_parPy_
Definition:
BeamMomentumGunProducer.h:38
edm::BeamMomentumGunProducer::parZ_
std::vector< float > * parZ_
Definition:
BeamMomentumGunProducer.h:32
edm::BeamMomentumGunProducer::b_parPDGId_
TBranch * b_parPDGId_
Definition:
BeamMomentumGunProducer.h:36
edm::BeamMomentumGunProducer::eventId_
int eventId_
Definition:
BeamMomentumGunProducer.h:30
funct::abs
Abs< T >::type abs(const T &t)
Definition:
Abs.h:22
ParameterSet.h
edm::FlatBaseThetaGunProducer::fVerbosity
int fVerbosity
Definition:
FlatBaseThetaGunProducer.h:49
edm::BeamMomentumGunProducer::b_parY_
TBranch * b_parY_
Definition:
BeamMomentumGunProducer.h:37
HepMCProduct.h
event
Definition:
event.py:1
edm::Event
Definition:
Event.h:73
EgammaValidation_cff.pdgid
pdgid
Definition:
EgammaValidation_cff.py:29
LHEGenericFilter_cfi.ParticleID
ParticleID
Definition:
LHEGenericFilter_cfi.py:6
edm::BeamMomentumGunProducer::parY_
std::vector< float > * parY_
Definition:
BeamMomentumGunProducer.h:32
validateGeometry_cfg.infileName
infileName
Definition:
validateGeometry_cfg.py:22
muonDTDigis_cfi.pset
pset
Definition:
muonDTDigis_cfi.py:27
edm::BeamMomentumGunProducer::b_npar_
TBranch * b_npar_
Definition:
BeamMomentumGunProducer.h:36
edm::FlatBaseThetaGunProducer::fAddAntiParticle
bool fAddAntiParticle
Definition:
FlatBaseThetaGunProducer.h:51
MillePedeFileConverter_cfg.e
e
Definition:
MillePedeFileConverter_cfg.py:37
Generated for CMSSW Reference Manual by
1.8.16