11#include <framework/datastore/DataStore.h>
12#include <framework/datastore/StoreAccessorBase.h>
13#include <framework/utilities/ArrayIterator.h>
14#include <framework/dataobjects/RelationElement.h>
15#include <framework/dataobjects/RelationContainer.h>
16#include <framework/logging/Logger.h>
104 template <
class MapType = std::map<index_type, consol
idation_type> >
class ReplaceMap {
113 typename MapType::const_iterator iter =
m_replace.find(old);
117 return std::make_pair(old,
false);
132 template <
class VecType = std::vector<consol
idation_type> >
class ReplaceVec {
187 B2FATAL(
"Tried to create RelationArray '" << m_name <<
"' with a durability larger than the StoreArrays it relates");
206 B2FATAL(
"Tried to create RelationArray '" << m_name <<
"' with a durability larger than the StoreArrays it relates");
223 B2FATAL(
"Cannot guess relation name, please supply correct name");
236 inline operator bool()
const {
return isValid(); }
249 B2FATAL(
"trying to get accessor params from non-existing relation (this is likely a framework bug)");
258 B2FATAL(
"trying to get accessor params from non-existing relation (this is likely a framework bug)");
272 (*m_relations)->elements().Delete();
296 std::vector<weight_type> weights(to.size(), weight);
306 void add(
index_type from,
const std::vector<index_type>& to,
const std::vector<weight_type>& weights)
363 template<
class FunctionFrom,
class FunctionTo>
void consolidate(
const
364 FunctionFrom& replaceFrom = FunctionFrom(),
const FunctionTo &
385 if (params.first.empty()) {
386 B2FATAL(
"Cannot guess relation name, please supply correct name");
394 int index = (*m_relations)->elements().GetLast() + 1;
395 return static_cast<RelationElement*
>((*m_relations)->elements().AddrAt(index));
405 B2FATAL(
"Relation '" <<
m_name <<
"' exists but points " << direction <<
" wrong array:"
406 <<
" requested " <<
array.first <<
"(" <<
array.second <<
")"
407 <<
", got " << rel.first <<
"(" << rel.second <<
")"
436 void assertValid()
const {
if (!
isValid()) B2FATAL(
"RelationArray does not point to valid StoreObject"); }
446 B2FATAL(
"Couldn't create relation " <<
m_name <<
"!");
460 template<
class FROM,
class TO>
friend class RelationIndex;
461 template<
class FROM,
class TO>
friend class RelationIndexContainer;
465 template<
class FunctionFrom,
class FunctionTo>
469 B2ERROR(
"Cannot consolidate an invalid relation (" <<
m_name <<
")");
472 typedef std::map<index_type, weight_type> element_t;
473 typedef std::map<index_type, element_t > buffer_t;
479 buffer_t::iterator lastFromIter = buffer.end();
480 unsigned int nElements = (*m_relations)->getEntries();
481 TClonesArray& elements = (*m_relations)->elements();
482 for (
unsigned int i = 0; i < nElements; ++i) {
492 if (from.first != lastFromIndex || lastFromIter == buffer.end()) {
493 lastFromIter = buffer.insert(make_pair(from.first, element_t())).first;
494 lastFromIndex = from.first;
497 size_t size = element.getSize();
498 for (
size_t j = 0; j < size; ++j) {
503 double weight = element.getWeight(j);
509 if (from.second || to.second) {
517 lastFromIter->second[to.first] += weight;
523 for (buffer_t::iterator iter = buffer.begin(); iter != buffer.end(); ++iter) {
524 add(iter->first, iter->second.begin(), iter->second.end());
In the store you can park objects that have to be accessed by various modules.
EDurability
Durability types.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
static DataStore & Instance()
Instance of singleton Store.
bool createObject(TObject *object, bool replace, const StoreAccessorBase &accessor)
Create a new object/array in the DataStore or add an existing one.
TObject ** getObject(const StoreAccessorBase &accessor)
Get a pointer to a pointer of an object in the DataStore.
Optimizes class to iterate over TObjArray and classes inheriting from it.
ReplaceMap(MapType &replace)
Set reference to used replacement map.
consolidation_type operator()(index_type old) const
Take old index and return the new index.
MapType & m_replace
Reference of the used replacement map.
VecType & m_replace
Reference of the used replacement vector.
consolidation_type operator()(index_type old) const
Take old index and return the new index.
ReplaceVec(VecType &replace)
Set reference to used replacement vector.
const AccessorParams & getFromAccessorParams() const
Return the AccessorParams the attached relation points from.
bool getModified() const
Get modified flag of underlying container.
ObjArrayIterator< const TClonesArray, const RelationElement > const_iterator
STL-like const_iterator over the T objects (not T* ).
const_iterator begin() const
Return const_iterator to first entry.
AccessorParams m_accessorTo
Accessor params for to array.
RelationArray(const StoreArray< FROM > &from, const StoreArray< TO > &to, const std::string &name="", DataStore::EDurability durability=DataStore::c_Event)
Constructor which takes both store arrays and performs some sanity checks on the relation.
const AccessorParams & getToAccessorParams() const
Return the AccessorParams the attached relation points to.
void checkRelation(const std::string &direction, const AccessorParams &array, const AccessorParams &rel) const
Check that the AccessorParams stored in the relation and the one given to the constructor are the sam...
RelationContainer ** m_relations
Pointer that actually holds the relations.
RelationElement * next()
Return address where the next RelationElement should be created.
void ensureAttached() const
Attach to relation, if necessary.
void add(index_type from, const std::vector< index_type > &to, weight_type weight=1.0)
Add a new element to the relation.
bool isValid() const
Check whether the object was created.
std::pair< index_type, bool > consolidation_type
Typedef declaring the return value of any consolidation mapping.
void consolidate()
Consolidate Relation Elements.
RelationElement::index_type index_type
Typedef to simplify use of correct index_type.
EConsolidationAction
Modification actions for the consolidate member.
@ c_negativeWeight
Flip the sign of the weight to become negative if the original element got re-attributed.
@ c_zeroWeight
Set the weight of the relation to 0 if the original element got re-attributed.
@ c_deleteElement
Delete the whole relation element if the original element got re-attributed.
@ c_doNothing
Do nothing, just treat it as reordering.
~RelationArray()
Empty destructor.
void setModified(bool modified)
Set modified flag of underlying container.
void add(index_type from, const InputIterator &begin, const InputIterator &end)
Add a new element to the relation.
void add(index_type from, const std::vector< index_type > &to, const std::vector< weight_type > &weights)
Add a new element to the relation.
int getEntries() const
Get the number of elements.
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
RelationElement::weight_type weight_type
Typedef to simplify use of correct weight_type.
RelationArray(const AccessorParams &fromAccessor, const AccessorParams &toAccessor, DataStore::EDurability durability=DataStore::c_Event)
Constructor with AccessorParams for from- and to-side.
RelationArray(const AccessorParams ¶ms)
Constructor which accepts the AccessorParams of the relation.
RelationArray(const std::string &name, DataStore::EDurability durability=DataStore::c_Event)
Constructor which only accepts name and durability of the relation.
const_iterator end() const
Return const_iterator to last entry +1.
void assertCreated()
Create relation, if necessary.
bool create(bool replace=false)
Create an empty relation array in the data store.
AccessorParams m_accessorFrom
Accessor params for from array.
void clear() override
Clear all elements from the relation.
const RelationElement & operator[](int i) const
Imitate array functionality.
void assertValid() const
check that pointer exits, otherwise bail out.
Class to store relations between StoreArrays in the DataStore.
Class to store a single element of a relation.
unsigned int index_type
type used for indices.
float weight_type
type used for weights.
StoreAccessorBase(const std::string &name, DataStore::EDurability durability, TClass *objClass, bool isArray)
Constructor to access an object or array in the DataStore.
DataStore::EDurability m_durability
Store durability under which the object/array is saved.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
AccessorParams getAccessorParams() const
Return pair of name and durability under which stored object is saved.
std::string m_name
Store name under which this object/array is saved.
Accessor to arrays stored in the data store.
std::pair< std::string, DataStore::EDurability > AccessorParams
Pair of parameters needed to find an object in the DataStore.
Abstract base class for different kinds of events.
Struct for identity transformation on indices.
consolidation_type operator()(index_type old) const
Take old index and return the new index.