20#define verbosity debug
26 const std::vector<std::string>& keys,
29 auto check = [&header](
const std::string&
key) {
33 std::any_of(keys.cbegin(), keys.cend(),
check)
35 std::all_of(keys.cbegin(), keys.cend(),
check));
50 int subGenId =
getEventInfo(header, GenProp::SUBGENERATORID, -1);
59 LOG(
verbosity) <<
"Updating MC Collisions table w/bcId=" << bcId;
63 truncateFloatFraction(header.GetX(),
mask),
64 truncateFloatFraction(header.GetY(),
mask),
65 truncateFloatFraction(header.GetZ(),
mask),
69 getEventInfo(header, Key::planeAngle, header.GetRotZ()));
70 return encodedGeneratorId;
92 LOG(
verbosity) <<
"Updating HepMC cross-section table w/collisionId "
117 not
hasKeys(header, {Key::pdfParton1Id,
130 LOG(
verbosity) <<
"Updating HepMC PDF table w/collisionId " << collisionID;
157 not
hasKeys(header, {Key::nCollHard,
158 Key::nPartProjectile,
163 Key::nCollNWoundedNwounded,
164 Key::nSpecProjectileNeutron,
165 Key::nSpecTargetNeutron,
166 Key::nSpecProjectileProton,
167 Key::nSpecTargetProton,
176 int specNeutrons = (
getEventInfo(header, Key::nSpecProjectileNeutron, -1) +
178 int specProtons = (
getEventInfo(header, Key::nSpecProjectileProton, -1) +
181 LOG(
verbosity) <<
"Updating HepMC heavy-ion table w/collisionID "
196 getEventInfo(header, Key::planeAngle, header.GetRotZ()),
208 std::vector<MCTrack>
const& tracks,
211 uint32_t momentumMask,
212 uint32_t positionMask)
219 auto mapping = [&toStore](
int trackNo) {
220 auto iter = toStore.find(trackNo);
221 if (iter == toStore.end()) {
230 flags |= ProducedByTransport;
233 if (MCTrackNavigator::isPhysicalPrimary(track, tracks)) {
234 flags |= PhysicalPrimary;
237 int daughters[2] = {-1, -1};
238 std::vector<int> mothers;
241 mothers.push_back(
id);
244 mothers.push_back(
id);
252 daughters[1] = daughters[0];
254 if (daughters[0] < 0 and daughters[1] >= 0) {
255 LOG(error) <<
"Problematic daughters: " << daughters[0] <<
" and "
257 daughters[0] = daughters[1];
259 if (daughters[0] > daughters[1]) {
260 std::swap(daughters[0], daughters[1]);
264 float pX = float(track.
Px());
265 float pY = float(track.
Py());
266 float pZ = float(track.
Pz());
268 float vX = float(track.
Vx());
269 float vY = float(track.
Vy());
270 float vZ = float(track.
Vz());
271 float time = float(track.
T());
273 LOG(
verbosity) <<
"McParticle collisionId=" << collisionID <<
","
274 <<
"status=" << statusCode <<
","
275 <<
"hepmc=" << hepmc <<
","
277 <<
"nMothers=" << mothers.size() <<
","
278 <<
"daughters=" << daughters[0] <<
","
288 truncateFloatFraction(
weight, weightMask),
289 truncateFloatFraction(pX, momentumMask),
290 truncateFloatFraction(pY, momentumMask),
291 truncateFloatFraction(pZ, momentumMask),
292 truncateFloatFraction(energy, momentumMask),
293 truncateFloatFraction(vX, positionMask),
294 truncateFloatFraction(vY, positionMask),
295 truncateFloatFraction(vZ, positionMask),
296 truncateFloatFraction(
time, positionMask));
301 std::vector<MCTrack>
const& tracks,
307 uint32_t momentumMask,
308 uint32_t positionMask)
323 auto mapping = [&toStore](
int trackNo) {
324 auto iter = toStore.find(trackNo);
325 if (iter == toStore.end()) {
332 for (
int trackNo = tracks.size() - 1; trackNo >= 0; trackNo--) {
333 auto& track = tracks[trackNo];
334 auto hepmc = getHepMCStatusCode(track.getStatusCode());
336 if (toStore.find(trackNo) == toStore.end() and
345 not track.isPrimary() and
346 not MCTrackNavigator::isPhysicalPrimary(track, tracks) and
347 not MCTrackNavigator::isKeepPhysics(track, tracks)) {
348 LOG(
verbosity) <<
"Skipping track " << trackNo <<
" " << hepmc <<
" "
349 << mapping(trackNo) <<
" "
350 << track.isPrimary() <<
" "
351 << MCTrackNavigator::isPhysicalPrimary(track, tracks)
353 << MCTrackNavigator::isKeepPhysics(track, tracks);
361 toStore[trackNo] = 1;
367 if ((
id = track.getMotherTrackId()) >= 0) {
370 if ((
id = track.getSecondMotherTrackId()) >= 0) {
373 if ((
id = track.getFirstDaughterTrackId()) >= 0) {
376 if ((
id = track.getLastDaughterTrackId()) >= 0) {
385 LOG(
verbosity) <<
"Will store " << toStore.size() <<
" particles";
388 for (
size_t trackNo = 0U; trackNo < tracks.size(); trackNo++) {
389 auto storeIt = mapping(trackNo);
399 assert(
index == toStore.size());
402 <<
"Selected " << toStore.size() <<
" tracks out of "
403 << tracks.size() <<
" "
404 <<
"Collision # " << collisionID;
406 for (
size_t trackNo = 0U; trackNo < tracks.size(); trackNo++) {
407 auto storeIt = mapping(trackNo);
412 auto& track = tracks[trackNo];
413 auto hepmc = getHepMCStatusCode(track.getStatusCode());
414 uint8_t
flags = (background ? FromBackgroundEvent : 0);
o2::monitoring::tags::Key Key
General auxilliary methods.
Utility functions for MC particles.
int getProcess() const
get the production process (id) of this track
o2::mcgenstatus::MCGenStatusEncoding getStatusCode() const
get generator status code
Int_t getFirstDaughterTrackId() const
Int_t getLastDaughterTrackId() const
_T getWeight() const
return particle weight
Double_t GetEnergy() const
Int_t getSecondMotherTrackId() const
Int_t GetPdgCode() const
Accessors.
Int_t getMotherTrackId() const
GLuint GLuint GLfloat weight
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
TableCursor< aod::HepMCPdfInfos >::type PdfInfoCursor
bool updateHepMCHeavyIon(const HeavyIonCursor &cursor, int collisionID, short generatorID, o2::dataformats::MCEventHeader const &header, HepMCUpdate when=HepMCUpdate::anyKey)
bool hasKeys(o2::dataformats::MCEventHeader const &header, const std::vector< std::string > &keys, bool anyNotall=true)
TableCursor< aod::StoredMcParticles_001 >::type ParticleCursor
std::unordered_map< int, int > TrackToIndex
short updateMCCollisions(const CollisionCursor &cursor, int bcId, float time, o2::dataformats::MCEventHeader const &header, short generatorId=0, int sourceId=0, unsigned int mask=0xFFFFFFF0)
bool updateHepMCPdfInfo(const PdfInfoCursor &cursor, int collisionID, short generatorID, o2::dataformats::MCEventHeader const &header, HepMCUpdate when=HepMCUpdate::anyKey)
TableCursor< aod::HepMCHeavyIons >::type HeavyIonCursor
TableCursor< aod::HepMCXSections >::type XSectionCursor
uint32_t updateParticles(const ParticleCursor &cursor, int collisionID, std::vector< MCTrack > const &tracks, TrackToIndex &preselect, uint32_t offset=0, bool filter=false, bool background=false, uint32_t weightMask=0xFFFFFFF0, uint32_t momentumMask=0xFFFFFFF0, uint32_t positionMask=0xFFFFFFF0)
TableCursor< aod::McCollisions >::type CollisionCursor
bool updateHepMCXSection(const XSectionCursor &cursor, int collisionID, short generatorID, o2::dataformats::MCEventHeader const &header, HepMCUpdate when=HepMCUpdate::anyKey)
void updateParticle(const ParticleCursor &cursor, const TrackToIndex &toStore, int collisionID, o2::MCTrack const &track, std::vector< MCTrack > const &tracks, uint8_t flags=0, uint32_t weightMask=0xFFFFFFF0, uint32_t momentumMask=0xFFFFFFF0, uint32_t positionMask=0xFFFFFFF0)
const T getEventInfo(o2::dataformats::MCEventHeader const &header, std::string const &key, T const &def)
void check(const std::vector< std::string > &arguments, const std::vector< ConfigParamSpec > &workflowOptions, const std::vector< DeviceSpec > &deviceSpecs, CheckMatrix &matrix)
short getEncodedGenId(int generatorId, int sourceId, int subGeneratorId=-1)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"