Belle II Software prerelease-10-00-00a
RelationVector.cc
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#include <framework/datastore/RelationVector.h>
9#include <framework/datastore/RelationArray.h>
10
11using namespace Belle2;
12
14 const std::function<void(std::vector<RelationElement::index_type>&, std::vector<RelationElement::weight_type>&, size_t)>& f)
15{
16 const TObject* obj = m_relations.at(index).object;
17 float objweight = m_relations.at(index).weight;
18
19 for (const auto& name : m_relationNames) {
21
22 //fill fromIndex, toIndex the rght way around
23 unsigned int fromIndex, toIndex;
24 StoreEntry* entry = nullptr;
25 int otherIndex = -1;
26 if (!DataStore::Instance().findStoreEntry(obj, entry, otherIndex))
27 B2FATAL("RelationVectorBase points to object not in DataStore?");
28
29 if (m_name == rel.getFromAccessorParams().first and entry->name == rel.getToAccessorParams().first) {
30 fromIndex = m_index;
31 toIndex = otherIndex;
32 } else if (entry->name == rel.getFromAccessorParams().first and m_name == rel.getToAccessorParams().first) {
33 toIndex = m_index;
34 fromIndex = otherIndex;
35 } else {
36 continue;
37 }
38
39 //go through rel, see if we can find fromIndex and toIndex
40 for (int i = 0; i < rel.getEntries(); i++) {
41 if (rel[i].getFromIndex() == fromIndex) {
42 auto& toIndices = const_cast<std::vector<RelationElement::index_type>&>(rel[i].getToIndices());
43 auto& toWeights = const_cast<std::vector<RelationElement::weight_type>&>(rel[i].getWeights());
44 for (size_t j = 0; j < toIndices.size(); j++) {
45 //we also compare the weight here to handle duplicate relations properly
46 if (toIndices[j] == toIndex and toWeights[j] == objweight) {
47 f(toIndices, toWeights, j);
48 rel.setModified(true);
49 return;
50 }
51 }
52 }
53 }
54 }
55
56 B2FATAL("RelationVectorBase and DataStore differ!??");
57}
58
60{
61 if ((other.m_name != m_name) or (other.m_index != m_index))
62 B2FATAL("Trying to add RelationVectorBase for " << m_name << m_index << " and " << other.m_name << other.m_index << "!");
63
64 m_relations.insert(m_relations.end(), other.m_relations.begin(), other.m_relations.end());
65 if (!other.m_relations.empty())
66 m_relationNames.insert(m_relationNames.end(), other.m_relationNames.begin(), other.m_relationNames.end());
67}
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
Definition DataStore.h:59
static DataStore & Instance()
Instance of singleton Store.
Definition DataStore.cc:53
Low-level class to create/modify relations between StoreArrays.
const AccessorParams & getFromAccessorParams() const
Return the AccessorParams the attached relation points from.
const AccessorParams & getToAccessorParams() const
Return the AccessorParams the attached relation points to.
void setModified(bool modified)
Set modified flag of underlying container.
int getEntries() const
Get the number of elements.
void apply(int index, const std::function< void(std::vector< unsigned int > &, std::vector< float > &, size_t)> &f)
apply function to the relation associated with the RelationEntry at given index.
void add(const RelationVectorBase &other)
add another list of relations.
std::vector< RelationEntry > m_relations
The vector of relation entries.
RelationVectorBase()
Construct empty set.
int m_index
index of object these relations belong to.
std::string m_name
entry name of array containing object these relations belong to.
std::vector< std::string > m_relationNames
Names of associated relations.
Abstract base class for different kinds of events.
Wraps a stored array/object, stored under unique (name, durability) key.
Definition StoreEntry.h:22
std::string name
Name of the entry.
Definition StoreEntry.h:53