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 {
23
28
29 public:
30
35
40 virtual void initialize() override;
41
45 virtual void event() override;
46
47 private:
48
49 std::string m_PXDDigitsName;
51 std::string m_CDCHitsName;
52 std::string m_TOPDigitsName;
53 std::string m_ARICHDigitsName;
54 std::string m_KLMDigitsName;
55
56 std::string m_extensionName;
58
59 std::vector<std::string> m_components;
60
61 bool m_addPXD = false;
62 bool m_addSVD = false;
63 bool m_addCDC = false;
64 bool m_addTOP = false;
65 bool m_addARICH = false;
66 bool m_addKLM = false;
67
71 template <class Digit>
72 void registerDigits(const std::string& name)
73 {
74 StoreArray<Digit> digits(name);
75 digits.isOptional();
76 StoreArray<Digit> tmp; // just to get the default name
77 std::string nameBG = tmp.getName() + m_extensionName;
78 StoreArray<Digit> bgDigits(nameBG);
79 bgDigits.isOptional();
80 B2DEBUG(20, "optional input: " << digits.getName() << " " << bgDigits.getName());
81 }
82
87 template <class Digit>
88 void addBGDigits(const std::string& name)
89 {
90 // simulated digits
91 StoreArray<Digit> digits(name);
92 if (!digits.isValid()) {
93 B2DEBUG(20, digits.getName() << " are not valid");
94 return;
95 }
96
97 // background digits
98 StoreArray<Digit> tmp; // just to get the default name
99 std::string nameBG = tmp.getName() + m_extensionName;
100 StoreArray<Digit> bgDigits(nameBG);
101 if (!bgDigits.isValid()) {
102 B2DEBUG(20, bgDigits.getName() << " are not valid");
103 return;
104 }
105
106 // map unique channel ID with simulated digits
107 std::multimap<unsigned, Digit*> multimap;
108 for (auto& digit : digits) {
109 unsigned id = digit.getUniqueChannelID();
110 // multimap.emplace(id, &digit); /* Clang doesn't know this member! */
111 multimap.insert(std::pair<unsigned, Digit*>(id, &digit));
112 }
113
114 int size = digits.getEntries(); // for debug print
115
116 // add BG digits to simulated ones
117 typedef typename std::multimap<unsigned, Digit*>::iterator Iterator;
118 for (const auto& bgDigit : bgDigits) {
119 bool pileup = false;
120 unsigned id = bgDigit.getUniqueChannelID();
121 std::pair<Iterator, Iterator> range = multimap.equal_range(id);
122 for (Iterator it = range.first; it != range.second; ++it) {
123 auto* digit = it->second;
124 pileup = digit->addBGDigit(&bgDigit) == DigitBase::c_DontAppend;
125 if (pileup) break; // BG digit merged with simulated one
126 }
127 if (!pileup) digits.appendNew(bgDigit)->adjustAppendedBGDigit(); // BG digit not merged, therefore append and possibly modify
128 }
129
130 // debug printout
131 B2DEBUG(20, digits.getName() << ": before " << size
132 << " + " << bgDigits.getEntries() << "(BG)"
133 << ", after " << digits.getEntries()
134 << ", merged " << size + bgDigits.getEntries() - digits.getEntries());
135
136 }
137
138 };
139
141} // Belle2 namespace
142
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
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
Module()
Constructor.
Definition Module.cc:30
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 whether 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
Iterator for m_map.
Abstract base class for different kinds of events.