9 #include <analysis/modules/ParticleMCDecayString/ParticleMCDecayStringModule.h>
11 #include <mdst/dataobjects/MCParticle.h>
13 #include <framework/logging/Logger.h>
14 #include <framework/pcore/ProcHandler.h>
19 #include <boost/algorithm/string.hpp>
26 DataStore::c_Persistent), m_decayHash(0.0), m_decayHashExtended(0.0)
28 setDescription(
"Creates the Monte Carlo decay string of a Particle and its daughters. "
29 "The MC decay string of the particle is hashed and saved as a 32bit pattern in the extra info field decayHash of the particle. "
30 "The MC decay string of the particle + its daughters is hashed as well and saved as another 32bit pattern in the extra info field decayHashExtended of the particle. "
31 "The mapping hash <-> MC decay string in saved in a TTree by this module. "
32 "The 32bit pattern must be saved as a float (because our extra info field, variable manager and ntuple output only supports float) "
33 "but they just represent 32 bits of a hash! "
34 "The MC decay string can also be stored in an analysis ROOT file using the MCDecayString NtupleTool. "
35 "Details on the MC decay string format can be found here: `MCDecayString`");
37 addParam(
"listName",
m_listName,
"Particles from these ParticleList are used as input.");
38 addParam(
"fileName",
m_fileName,
"Filename in which the hash strings are saved, if empty the strings are not saved",
40 addParam(
"treeName",
m_treeName,
"Tree name in which the hash strings are saved", std::string(
"hashtable"));
41 addParam(
"conciseString",
m_useConciseString,
"If set to true, the code will use a more concise format for the string.",
false);
42 addParam(
"identifiers",
m_identifiers,
"Identifiers used to identify particles in the concise format.",
43 std::string(
"abcdefghijklmnopqrstuvwxyz"));
63 B2WARNING(
"Could not create file " <<
m_fileName);
71 B2WARNING(
"Tree with this name already exists: " <<
m_fileName);
80 m_tree->get().SetBasketSize(
"*", 1600);
81 m_tree->get().SetCacheSize(100000);
92 for (
unsigned iParticle = 0; iParticle <
m_pList->getListSize(); ++iParticle) {
100 uint32_t decayHash =
m_hasher(decayString);
101 uint32_t decayHashExtended =
m_hasher(decayStringExtended);
103 uint64_t m_decayHashFull = decayHash;
104 m_decayHashFull <<= 32;
105 m_decayHashFull += decayHashExtended;
108 assert(
sizeof(
float) ==
sizeof(uint32_t));
114 convert bitconverter;
116 bitconverter.i = decayHash;
122 bitconverter.i = decayHashExtended;
129 particle->addRelationTo(stringWrapper);
132 auto it =
m_hashset->get().find(m_decayHashFull);
134 m_hashset->get().insert(m_decayHashFull);
151 const bool writeError =
m_file->TestBit(TFile::kWriteError);
155 B2FATAL(
"A write error occurred while saving '" <<
m_fileName <<
"', please check if enough disk space is available.");
168 if (mcPMother ==
nullptr) {
210 std::string output =
" ";
212 output += std::to_string(p->getPDGCode());
214 if (not isFSP(p->getPDGCode())) {
216 for (
auto daughter : p->getDaughters()) {
233 if (not isFSP(p->getPDGCode())) {
234 for (
auto& daughter : p->getDaughters()) {
246 if (mcPMatched ==
nullptr)
254 if (mcPMatched->
getPDG() == 10022)
255 return decayString +
" (Virtual gamma match)";
263 std::stringstream ss;
269 ss << mcPMother->
getPDG();
271 if (not isFSP(mcPMother->
getPDG())) {
285 std::vector<std::string> decayStrings;
286 boost::split(decayStrings,
string, boost::is_any_of(
"|"));
288 if (decayStrings.empty()) {
289 B2WARNING(
"ParticleMCDecayStringModule: unable to convert decay string to concise format.");
293 unsigned int nParticles(decayStrings.size() - 1);
295 B2WARNING(
"ParticleMCDecayStringModule: not enough identifiers have been specified to use the concise string format:"
296 << std::endl <<
"Number of particles in your decay mode = " << nParticles << std::endl
298 <<
"Standard format will be used instead.");
303 std::string mode(
"");
304 std::vector<int> caretPositions;
305 for (
auto& decayString : decayStrings) {
306 std::string thisString(decayString);
312 int caretPosition(thisString.find(
'^'));
313 caretPositions.push_back(caretPosition);
314 if (caretPosition > -1) {
315 decayString.erase(caretPosition, 1);
320 std::string theDecayString(
"");
321 for (
auto thisString : decayStrings) {
322 if (thisString == mode) {
continue;}
325 char finalChar(thisString.back());
326 if (finalChar !=
' ') {thisString = thisString +
" ";}
328 if (
" (No match) " != thisString) {
329 if (
"" == theDecayString) {
330 theDecayString = thisString;
332 if (theDecayString != thisString) {
340 std::string modifiedString(theDecayString);
343 int nStrings(caretPositions.size());
344 for (
int iString(0); iString < nStrings; ++iString) {
346 int insertPosition(caretPositions.at(iString));
347 if (insertPosition > -1) {
348 for (
int jString(0); jString < iString; ++jString) {
349 if (caretPositions.at(jString) > -1 && caretPositions.at(jString) <= caretPositions.at(iString)) {
353 modifiedString.insert(insertPosition, identifier);
357 modifiedString = mode +
"|" + modifiedString;
360 bool noMatchStringAdded(
false);
361 for (
int iString(0); iString < nStrings; ++iString) {
362 int insertPosition(caretPositions.at(iString));
363 if (-1 == insertPosition) {
364 if (!noMatchStringAdded) {
365 modifiedString +=
" | No match: ";
366 noMatchStringAdded =
true;
372 string = modifiedString;
In the store you can park objects that have to be accessed by various modules.
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
A Class to store the Monte Carlo particle information.
std::vector< Belle2::MCParticle * > getDaughters() const
Get vector of all daughter particles, empty vector if none.
int getArrayIndex() const
Get 0-based index of the particle in the corresponding MCParticle list.
int getPDG() const
Return PDG code of particle.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
@ c_TerminateInAllProcesses
When using parallel processing, call this module's terminate() function in all processes().
float m_decayHash
Decay hash -> The hash of the decay string of the mother particle.
std::string getDecayStringFromParticle(const Particle *p)
get decay string of particle
virtual void initialize() override
Initialize the module.
const std::string c_ExtraInfoName
Name of the extraInfo, which is stored in each Particle.
virtual void event() override
Called for each event.
std::string m_decayString
The complete decay string.
std::string m_listName
Name of the particle list.
virtual void terminate() override
Terminate modules.
std::string m_fileName
Filename in which the hash strings are saved, if empty the strings are not saved.
std::string getMCDecayStringFromMCParticle(const MCParticle *mcPMatched)
get mc decay string from mc particle
std::hash< std::string > m_hasher
Hash function.
TFile * m_file
ROOT file to store the hashes and strings.
ParticleMCDecayStringModule()
Constructor.
bool m_useConciseString
Switch to use concise format for the extended string.
StoreObjPtr< RootMergeable< TTree > > m_tree
ROOT TNtuple containing the saved hashes and strings.
const std::string c_ExtraInfoNameExtended
Name of the extraInfo, which is stored in each Particle.
StoreObjPtr< SetMergeable< std::unordered_set< uint64_t > > > m_hashset
Mergeable unordered set containing the encountered hashes.
StoreArray< StringWrapper > m_stringWrapperArray
StoreArray of StringWrappers.
std::string m_treeName
Tree name in which the hash strings are saved.
std::string m_identifiers
Characters used to identify particles in the concise decay string format (default: alphabet).
void convertToConciseString(std::string &string)
Convert the extended string to a more concise format.
std::string buildMCDecayString(const MCParticle *mcPMother, const MCParticle *mcPMatched)
return decay string for mcPMother, highlight mcPMatched.
const MCParticle * getInitialParticle(const MCParticle *mcP)
search from mcP upwards for a particle that matches specified mother PDG codes.
float m_decayHashExtended
Extended decay hash -> The hash of the decay string of all daughter particles.
std::string getMCDecayStringFromParticle(const Particle *p)
get mc decay string from particle
StoreObjPtr< ParticleList > m_pList
input particle list
std::string getDecayString(const Particle &p)
get the decay string for p.
Class to store reconstructed particles.
static bool isOutputProcess()
Return true if the process is an output process.
static bool parallelProcessingUsed()
Returns true if multiple processes have been spawned, false in single-core mode.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
This class is a wrapper for strings, such as MCDecayStrings, to allow them to be associated with part...
void setString(const std::string &inputstring)
Set string.
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
MCParticle * getMother() const
Returns a pointer to the mother particle.
Abstract base class for different kinds of events.