40 #include "HepMC/GenEvent.h" 41 #include "HepMC/GenVertex.h" 42 #include "HepMC/GenParticle.h" 90 produces<edm::PSimHitContainer>(
"CTPPSHits");
116 std::vector<PSimHit> theCTPPSHits;
120 std::vector<math::XYZTLorentzVector> protonCTPPS;
122 for(HepMC::GenEvent::vertex_const_iterator ivtx = Evt->vertices_begin();ivtx!=Evt->vertices_end();ivtx++) {
123 if ((*ivtx)->id()!=0)
continue;
124 double prim_vtxZ=(*ivtx)->position().z()*
mm_to_m;
126 for(HepMC::GenVertex::particles_out_const_iterator
i=(*ivtx)->particles_out_const_begin();
i != (*ivtx)->particles_out_const_end();++
i) {
127 int pid = (*i)->pdg_id();
128 if(pid!=2212)
continue;
130 HepMC::GenVertex*
pv = (*i)->production_vertex();
131 const HepMC::FourVector& vertex = pv->position();
132 const HepMC::FourVector
p((*i)->momentum());
135 LocalPoint initialPosition_tr1, initialPosition_tr2, initialPosition_tof;
137 double t0_tr1 = 0., t0_tr2 = 0., t0_tof = 0.;
143 double x_tr1 = 0. , x_tr2 = 0. , x_tof = 0., y_tr1 = 0. , y_tr2 = 0. , y_tof = 0., z_tr1 = 0.;
149 if(
std::abs(vertex.eta())>8. && (*i)->status() == 1){
150 if (vertex.z()>0) Direction = 1;
151 else if (vertex.z() < 0 ) Direction = -1;
158 initialPosition_tr1 = xyzzy_tr1;
159 t0_tr1 = vertex.t()/c_light_s*
s_to_ns;
161 t0_tr2 = z_tr2*m_to_mm/c_light_s*
s_to_ns;
162 t0_tr2 = t0_tr1+(z_tr2-z_tr1)*m_to_mm/c_light_s*s_to_ns;
164 x_tr2 = x_tr1 + (
p.x()/
p.z())*(z_tr2-z_tr1)*
m_to_mm;
165 y_tr2 = y_tr1 + (
p.y()/
p.z())*(z_tr2-z_tr1)*
m_to_mm;
167 initialPosition_tr2 = xyzzy_tr2;
169 t0_tof = z_tof*m_to_mm/c_light_s*
s_to_ns;
170 t0_tof = (z_tof-prim_vtxZ)*m_to_mm/c_light_s*s_to_ns;
172 x_tof = x_tr1 + (
p.x()/
p.z())*(z_tof-z_tr1)*
m_to_mm;
173 y_tof = y_tr1 + (
p.y()/
p.z())*(z_tof-z_tr1)*
m_to_mm;
175 initialPosition_tof = xyzzy_tof;
186 PSimHit hit_tr1(xyzzy_tr1,xyzzy_tr1,0.,t0_tr1,0.,pid,2014314496,0,0.,0.,2);
187 PSimHit hit_tr2(xyzzy_tr2,xyzzy_tr2,0.,t0_tr2,0.,pid,2014838784,0,0.,0.,2);
188 PSimHit hit_tof(xyzzy_tof,xyzzy_tof,0.,t0_tof,0.,pid,2046820352,0,0.,0.,2);
189 theCTPPSHits.push_back(hit_tr1);
190 theCTPPSHits.push_back(hit_tr2);
191 theCTPPSHits.push_back(hit_tof);
194 PSimHit hit_tr1(xyzzy_tr1,xyzzy_tr1,0.,t0_tr1,0.,pid,2031091712,0,0.,0.,2);
195 PSimHit hit_tr2(xyzzy_tr2,xyzzy_tr2,0.,t0_tr2,0.,pid,2031616000,0,0.,0.,2);
196 PSimHit hit_tof(xyzzy_tof,xyzzy_tof,0.,t0_tof,0.,pid,2063597568,0,0.,0.,2);
197 theCTPPSHits.push_back(hit_tr1);
198 theCTPPSHits.push_back(hit_tr2);
199 theCTPPSHits.push_back(hit_tof);
206 for ( std::vector<PSimHit>::const_iterator
i = theCTPPSHits.begin();
207 i != theCTPPSHits.end();
i++ ) {
208 pctpps->push_back(*
i);
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
void produce(edm::Event &, const edm::EventSetup &) override
static const double c_light_s
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void beginStream(edm::StreamID) override
edm::Handle< edm::HepMCProduct > EvtHandle
static const double s_to_ns
void endStream() override
~CTPPSSimHitProducer() override
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
#define DEFINE_FWK_MODULE(type)
edm::EDGetTokenT< edm::HepMCProduct > mcEventToken
Abs< T >::type abs(const T &t)
const HepMC::GenEvent * GetEvent() const
static const double m_to_mm
static const double mm_to_m
std::vector< PSimHit > PSimHitContainer
CTPPSSimHitProducer(const edm::ParameterSet &)