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>
30 DataStore::c_Persistent), m_decayHash(0.0), m_decayHashExtended(0.0)
32 setDescription(
"Creates the Monte Carlo decay string of a Particle and its daughters. "
33 "The MC decay string of the particle is hashed and saved as a 32bit pattern in the extra info field decayHash of the particle. "
34 "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. "
35 "The mapping hash <-> MC decay string in saved in a TTree by this module. "
36 "The 32bit pattern must be saved as a float (because our extra info field, variable manager and ntuple output only supports float) "
37 "but they just represent 32 bits of a hash! "
38 "The MC decay string can also be stored in an analysis ROOT file using the MCDecayString NtupleTool. "
39 "Details on the MC decay string format can be found here: `MCDecayString`");
40 setPropertyFlags(c_ParallelProcessingCertified | c_TerminateInAllProcesses);
41 addParam(
"listName", m_listName,
"Particles from these ParticleList are used as input.");
42 addParam(
"fileName", m_fileName,
"Filename in which the hash strings are saved, if empty the strings are not saved",
44 addParam(
"treeName", m_treeName,
"Tree name in which the hash strings are saved", std::string(
"hashtable"));
45 addParam(
"conciseString", m_useConciseString,
"If set to true, the code will use a more concise format for the string.",
false);
46 addParam(
"identifiers", m_identifiers,
"Identifiers used to identify particles in the concise format.",
47 std::string(
"abcdefghijklmnopqrstuvwxyz"));
67 B2WARNING(
"Could not create file " <<
m_fileName);
75 B2WARNING(
"Tree with this name already exists: " <<
m_fileName);
84 m_tree->get().SetBasketSize(
"*", 1600);
85 m_tree->get().SetCacheSize(100000);
96 for (
unsigned iParticle = 0; iParticle <
m_pList->getListSize(); ++iParticle) {
104 uint32_t decayHash =
m_hasher(decayString);
105 uint32_t decayHashExtended =
m_hasher(decayStringExtended);
107 uint64_t m_decayHashFull = decayHash;
108 m_decayHashFull <<= 32;
109 m_decayHashFull += decayHashExtended;
112 assert(
sizeof(
float) ==
sizeof(uint32_t));
118 convert bitconverter;
120 bitconverter.i = decayHash;
126 bitconverter.i = decayHashExtended;
133 particle->addRelationTo(stringWrapper);
136 auto it =
m_hashset->get().find(m_decayHashFull);
138 m_hashset->get().insert(m_decayHashFull);
155 const bool writeError =
m_file->TestBit(TFile::kWriteError);
159 B2FATAL(
"A write error occurred while saving '" <<
m_fileName <<
"', please check if enough disk space is available.");
172 if (mcPMother ==
nullptr) {
214 std::string output =
" ";
216 output += std::to_string(p->getPDGCode());
218 if (not
isFSP(p->getPDGCode())) {
220 for (
auto daughter : p->getDaughters()) {
237 if (not
isFSP(p->getPDGCode())) {
238 for (
auto& daughter : p->getDaughters()) {
250 if (mcPMatched ==
nullptr)
258 if (mcPMatched->
getPDG() == 10022)
259 return decayString +
" (Virtual gamma match)";
267 std::stringstream ss;
273 ss << mcPMother->
getPDG();
289 std::vector<std::string> decayStrings;
290 boost::split(decayStrings,
string, boost::is_any_of(
"|"));
292 if (decayStrings.empty()) {
293 B2WARNING(
"ParticleMCDecayStringModule: unable to convert decay string to concise format.");
297 unsigned int nParticles(decayStrings.size() - 1);
299 B2WARNING(
"ParticleMCDecayStringModule: not enough identifiers have been specified to use the concise string format:"
300 << std::endl <<
"Number of particles in your decay mode = " << nParticles << std::endl
302 <<
"Standard format will be used instead.");
307 std::string mode(
"");
308 std::vector<int> caretPositions;
309 for (
auto& decayString : decayStrings) {
310 std::string thisString(decayString);
316 int caretPosition(thisString.find(
'^'));
317 caretPositions.push_back(caretPosition);
318 if (caretPosition > -1) {
319 decayString.erase(caretPosition, 1);
324 std::string theDecayString(
"");
325 for (
auto thisString : decayStrings) {
326 if (thisString == mode) {
continue;}
329 char finalChar(thisString.back());
330 if (finalChar !=
' ') {thisString = thisString +
" ";}
332 if (
" (No match) " != thisString) {
333 if (
"" == theDecayString) {
334 theDecayString = thisString;
336 if (theDecayString != thisString) {
344 std::string modifiedString(theDecayString);
347 int nStrings(caretPositions.size());
348 for (
int iString(0); iString < nStrings; ++iString) {
350 int insertPosition(caretPositions.at(iString));
351 if (insertPosition > -1) {
352 for (
int jString(0); jString < iString; ++jString) {
353 if (caretPositions.at(jString) > -1 && caretPositions.at(jString) <= caretPositions.at(iString)) {
357 modifiedString.insert(insertPosition, identifier);
361 modifiedString = mode +
"|" + modifiedString;
364 bool noMatchStringAdded(
false);
365 for (
int iString(0); iString < nStrings; ++iString) {
366 int insertPosition(caretPositions.at(iString));
367 if (-1 == insertPosition) {
368 if (!noMatchStringAdded) {
369 modifiedString +=
" | No match: ";
370 noMatchStringAdded =
true;
376 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.
Adds the Monte Carlo decay string to a Particle.
float m_decayHash
Decay hash -> The hash of the decay string of the mother particle.
const std::string c_ExtraInfoName
Name of the extraInfo, which is stored in each Particle.
std::string m_decayString
The complete decay string.
std::string m_listName
Name of the particle list.
std::string m_fileName
Filename in which the hash strings are saved, if empty the strings are not saved.
std::hash< std::string > m_hasher
Hash function.
TFile * m_file
ROOT file to store the hashes and strings.
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).
float m_decayHashExtended
Extended decay hash -> The hash of the decay string of all daughter particles.
StoreObjPtr< ParticleList > m_pList
input particle list
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.
bool isFSP(int pdg)
defines what is a final state particle for this purpose.
std::string getDecayStringFromParticle(const Particle *p)
get decay string of particle
virtual void initialize() override
Initialize the module.
virtual void event() override
Called for each event.
virtual void terminate() override
Terminate modules.
std::string getMCDecayStringFromMCParticle(const MCParticle *mcPMatched)
get mc decay string from mc particle
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.
std::string getMCDecayStringFromParticle(const Particle *p)
get mc decay string from particle
std::string getDecayString(const Particle &p)
get the decay string for p.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
MCParticle * getMother() const
Returns a pointer to the mother particle.
Abstract base class for different kinds of events.