24 #include <CLHEP/Units/SystemOfUnits.h>
32 #include <edm4hep/Constants.h>
33 #include <edm4hep/EventHeaderCollection.h>
34 #include <edm4hep/MCParticleCollection.h>
35 #include <edm4hep/EDM4hepVersion.h>
36 #if EDM4HEP_BUILD_VERSION >= EDM4HEP_VERSION(0, 99, 3)
37 #include <edm4hep/GeneratorEventParametersCollection.h>
40 #include <podio/Frame.h>
41 #include <podio/Reader.h>
55 for(
auto const&
key: source.template getKeys<int>()) {
58 for(
auto const&
key: source.template getKeys<float>()) {
61 for(
auto const&
key: source.template getKeys<double>()) {
64 for(
auto const&
key: source.template getKeys<std::string>()) {
72 for(
auto const&
key: source.template getKeys<int>()) {
75 for(
auto const&
key: source.template getKeys<float>()) {
78 for(
auto const&
key: source.template getKeys<double>()) {
81 for(
auto const&
key: source.template getKeys<std::string>()) {
87 for(
auto const&
key: source.template getKeys<int>()) {
90 for(
auto const&
key: source.template getKeys<float>()) {
93 for(
auto const&
key: source.template getKeys<double>()) {
96 for(
auto const&
key: source.template getKeys<std::string>()) {
133 , m_collectionName(
"MCParticles")
134 , m_eventHeaderCollectionName(
"EventHeader")
136 printout(INFO,
"EDM4hepFileReader",
"Created file reader. Try to open input %s",nam.c_str());
149 podio::Frame runFrame =
m_reader.readFrame(
"runs", 0);
150 parameters->ingestParameters(runFrame.getParameters());
151 }
catch (std::runtime_error& e) {
153 }
catch(std::invalid_argument&) {
157 printout(ERROR,
"EDM4hepFileReader::registerRunParameters",
"Failed to register run parameters: %s", e.what());
163 podio::Frame metaFrame =
m_reader.readFrame(
"metadata", 0);
164 fileParameters->ingestParameters(metaFrame.getParameters());
165 }
catch (std::runtime_error& e) {
167 }
catch(std::invalid_argument&) {
172 printout(ERROR,
"EDM4hepFileReader::registerRunParameters",
"Failed to register file parameters: %s", e.what());
179 MCPARTICLE_MAP::const_iterator ip = mcparts.find(partID);
180 if ( ip == mcparts.end() ) {
181 throw std::runtime_error(
"Unknown particle identifier look-up!");
191 podio::Frame frame =
m_reader.readFrame(
"events", event_number);
192 const auto& primaries = frame.get<edm4hep::MCParticleCollection>(
m_collectionName);
193 int eventNumber = event_number, runNumber = 0;
194 if (primaries.isValid()) {
197 if(eventHeaderCollection.isValid() && eventHeaderCollection.size() == 1){
198 const auto& eh = eventHeaderCollection.at(0);
199 eventNumber = eh.getEventNumber();
200 runNumber = eh.getRunNumber();
203 ctx->
event().
addExtension<edm4hep::MutableEventHeader>(
new edm4hep::MutableEventHeader(eh.clone()));
215 printout(WARNING,
"EDM4hepFileReader",
"No EventHeader collection found or too many event headers!");
225 #if EDM4HEP_BUILD_VERSION >= EDM4HEP_VERSION(0, 99, 3)
227 const auto &genEvtParameters = frame.get<edm4hep::GeneratorEventParametersCollection>(edm4hep::labels::GeneratorEventParameters);
228 if (genEvtParameters.isValid()) {
229 if (genEvtParameters.size() >= 1) {
230 const auto genParams = genEvtParameters[0];
233 ctx->event().addExtension(
new edm4hep::MutableGeneratorEventParameters(genParams.clone()));
236 if (genEvtParameters.size() > 1) {
237 printout(WARNING,
"EDM4hepFileReader",
"Multiple GeneratorEventParameters found in input file. Ignoring all but the first one!");
240 printout(DEBUG,
"EDM4hepFileReader",
"No GeneratorEventParameters found in input file");
243 printout(INFO,
"EDM4hepFileReader",
"read collection %s from event %d in run %d ",
250 printout(INFO,
"EDM4hepFileReader",
"We read the particle collection");
251 int NHEP = primaries.size();
254 printout(WARNING,
"EDM4hepFileReader",
"We have no particles");
259 std::vector<int> mcpcoll;
260 mcpcoll.resize(NHEP);
261 for(
int i=0; i<NHEP; ++i ) {
262 edm4hep::MCParticle p = primaries.at(i);
263 mcparts[p.getObjectID().index] = i;
264 mcpcoll[i] = p.getObjectID().index;
268 for(
int i=0; i<NHEP; ++i ) {
269 const auto& mcp = primaries.at(i);
271 const auto mom = mcp.getMomentum();
272 const auto vsx = mcp.getVertex();
273 const auto vex = mcp.getEndpoint();
274 const int pdg = mcp.getPDG();
275 #ifdef EDM4HEP_MCPARTICLE_HAS_HELICITY
278 p->
spin[2] = mcp.getHelicity();
280 const auto spin = mcp.getSpin();
281 p->
spin[0] = spin[0];
282 p->
spin[1] = spin[1];
283 p->
spin[2] = spin[2];
286 p->
charge = int(mcp.getCharge()*3.0);
287 p->
psx = mom[0]*CLHEP::GeV;
288 p->
psy = mom[1]*CLHEP::GeV;
289 p->
psz = mom[2]*CLHEP::GeV;
290 p->
time = mcp.getTime()*CLHEP::ns;
292 p->
vsx = vsx[0]*CLHEP::mm;
293 p->
vsy = vsx[1]*CLHEP::mm;
294 p->
vsz = vsx[2]*CLHEP::mm;
295 p->
vex = vex[0]*CLHEP::mm;
296 p->
vey = vex[1]*CLHEP::mm;
297 p->
vez = vex[2]*CLHEP::mm;
301 p->
mass = mcp.getMass()*CLHEP::GeV;
302 const auto par = mcp.getParents(), &dau=mcp.getDaughters();
303 for(
int num=dau.size(),k=0; k<num; ++k) {
304 edm4hep::MCParticle dau_k = dau[k];
305 p->
daughters.insert(GET_ENTRY(mcparts,dau_k.getObjectID().index));
307 for(
int num=par.size(),k=0; k<num; ++k) {
309 p->
parents.insert(GET_ENTRY(mcparts, par_k.getObjectID().index));
313 int genStatus = mcp.getGeneratorStatus();
329 if ( p->
parents.size() == 0 ) {
332 vertices.emplace_back( vtx );
338 vtx->
out.insert(p->
id) ;
349 particles.emplace_back(p);
358 _getParameterValue(parameters,
"MCParticleCollectionName", m_collectionName, m_collectionName);
359 _getParameterValue(parameters,
"EventHeaderCollectionName", m_eventHeaderCollectionName, m_eventHeaderCollectionName);
360 return EVENT_READER_OK;