Belle II Software development
BGOverlayExecutorModule.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#pragma once
10
11#include <framework/core/Module.h>
12#include <framework/datastore/StoreArray.h>
13#include <framework/dataobjects/DigitBase.h>
14#include <string>
15#include <map>
16#include <vector>
17
18namespace Belle2 {
28
29 public:
30
35
40 {}
41
46 virtual void initialize() override;
47
51 virtual void event() override;
52
53 private:
54
55 std::string m_PXDDigitsName;
57 std::string m_CDCHitsName;
58 std::string m_TOPDigitsName;
59 std::string m_ARICHDigitsName;
60 std::string m_KLMDigitsName;
62 std::string m_extensionName;
65 std::vector<std::string> m_components;
67 bool m_addPXD = false;
68 bool m_addSVD = false;
69 bool m_addCDC = false;
70 bool m_addTOP = false;
71 bool m_addARICH = false;
72 bool m_addKLM = false;
77 template <class Digit>
78 void registerDigits(const std::string& name)
79 {
80 StoreArray<Digit> digits(name);
81 digits.isOptional();
82 StoreArray<Digit> tmp; // just to get the default name
83 std::string nameBG = tmp.getName() + m_extensionName;
84 StoreArray<Digit> bgDigits(nameBG);
85 bgDigits.isOptional();
86 B2DEBUG(20, "optional input: " << digits.getName() << " " << bgDigits.getName());
87 }
88
93 template <class Digit>
94 void addBGDigits(const std::string& name)
95 {
96 // simulated digits
97 StoreArray<Digit> digits(name);
98 if (!digits.isValid()) {
99 B2DEBUG(20, digits.getName() << " are not valid");
100 return;
101 }
102
103 // background digits
104 StoreArray<Digit> tmp; // just to get the default name
105 std::string nameBG = tmp.getName() + m_extensionName;
106 StoreArray<Digit> bgDigits(nameBG);
107 if (!bgDigits.isValid()) {
108 B2DEBUG(20, bgDigits.getName() << " are not valid");
109 return;
110 }
111
112 // map unique channel ID with simulated digits
113 std::multimap<unsigned, Digit*> multimap;
114 for (auto& digit : digits) {
115 unsigned id = digit.getUniqueChannelID();
116 // multimap.emplace(id, &digit); /* Clang doesn't know this member! */
117 multimap.insert(std::pair<unsigned, Digit*>(id, &digit));
118 }
119
120 int size = digits.getEntries(); // for debug print
121
122 // add BG digits to simulated ones
123 typedef typename std::multimap<unsigned, Digit*>::iterator Iterator;
124 for (const auto& bgDigit : bgDigits) {
125 bool pileup = false;
126 unsigned id = bgDigit.getUniqueChannelID();
127 std::pair<Iterator, Iterator> range = multimap.equal_range(id);
128 for (Iterator it = range.first; it != range.second; ++it) {
129 auto* digit = it->second;
130 pileup = digit->addBGDigit(&bgDigit) == DigitBase::c_DontAppend;
131 if (pileup) break; // BG digit merged with simulated one
132 }
133 if (!pileup) digits.appendNew(bgDigit)->adjustAppendedBGDigit(); // BG digit not merged, therefore append and possibly modify
134 }
135
136 // debug printout
137 int diff = size + bgDigits.getEntries() - digits.getEntries();
138 B2DEBUG(20, digits.getName() << ": before " << size
139 << " + " << bgDigits.getEntries() << "(BG)"
140 << ", after " << digits.getEntries()
141 << ", merged " << diff);
142
143 }
144
145 };
146
148} // Belle2 namespace
149
Overlay of measured background with simulated data (Digits or Clusters)
std::string m_CDCHitsName
name of CDC collection to overlay with BG
std::string m_KLMDigitsName
name of KLM collection to overlay with BG
bool m_addCDC
if true add BG digits of CDC
std::vector< std::string > m_components
detector components included in overlay
std::string m_BackgroundInfoInstanceName
name BackgroundInfo name
bool m_addKLM
if true add BG digits of KLM
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
bool m_addSVD
if true add BG digits of SVD
std::string m_ARICHDigitsName
name of ARICH collection to overlay with BG
virtual ~BGOverlayExecutorModule()
Destructor.
bool m_addTOP
if true add BG digits of TOP
void registerDigits(const std::string &name)
Register simulated and BG digits (both as optional input)
std::string m_extensionName
name added to default branch names
void addBGDigits(const std::string &name)
Add BG digits to simulated ones.
bool m_addPXD
if true add BG digits of PXD
std::string m_TOPDigitsName
name of TOP collection to overlay with BG
bool m_addARICH
if true add BG digits of ARICH
std::string m_PXDDigitsName
name of PXD collection to overlay with BG
std::string m_SVDShaperDigitsName
name of SVD collection to overlay with BG
@ c_DontAppend
do not append BG digit to digits
Definition: DigitBase.h:33
Base class for Modules.
Definition: Module.h:72
const std::string & getName() const
Return name under which the object is saved in the DataStore.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
bool isValid() const
Check wether the array was registered.
Definition: StoreArray.h:288
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
map< unsigned, size_t >::const_iterator Iterator
Iteratior for m_map.
Abstract base class for different kinds of events.