Belle II Software  release-08-01-10
ParticleSubset Class Reference

Specialised SelectSubset<Particle> that also fixes daughter indices and all ParticleLists. More...

#include <ParticleSubset.h>

Inheritance diagram for ParticleSubset:
Collaboration diagram for ParticleSubset:

Public Member Functions

void removeParticlesNotInLists (const std::vector< std::string > &listNames)
 Removes all Particles that are not in one of the given ParticleLists (or daughters of Particles in the lists). More...
 
void select (std::function< bool(const Particle *)> f)
 select Particles for which f returns true, discard others
 
void registerSubset (const StoreArray< Particle > &set, DataStore::EStoreFlags storeFlags=DataStore::c_ErrorIfAlreadyRegistered)
 Remove all non-selected objects from set. More...
 
void registerSubset (const StoreArray< Particle > &set, const std::string &subsetName, DataStore::EStoreFlags storeFlags=DataStore::c_ErrorIfAlreadyRegistered)
 Register the StoreArray<StoredClass> that will contain the subset of selected elements. More...
 
void inheritRelationsFrom (const StoreArray< T > &array, MoreArguments... moreArgs)
 Inherit relations pointing from Other to objects selected into this subset. More...
 
void inheritRelationsTo (const StoreArray< T > &array, MoreArguments... moreArgs)
 Inherit relations pointing from objects selected into this subset to Other. More...
 
void inheritAllRelations ()
 Automatically inherit all relations to or from the original set (if registered when calling this function). More...
 
void select (const std::function< bool(const Particle *)> &f)
 This method is the actual worker. More...
 
StoreAccessorBasegetSet () override
 Get accessor for original set.
 
StoreAccessorBasegetSubSet () override
 Get accessor for reduced set.
 
std::vector< std::string > getInheritFromArrays () const
 Get list of arrays we inherit relations from.
 
std::vector< std::string > getInheritToArrays () const
 Get list of arrays we inherit relations to.
 
bool getInheritToSelf () const
 Do we inherit relations from original set to itself?
 
void swapSetsAndDestroyOriginal ()
 Swap set and subset (+relations), and keep only the reduced set. More...
 

Protected Member Functions

void fixParticles (const std::map< int, int > &oldToNewMap)
 fix daughter indices, reset m_arrayPointer
 
void fixParticleLists (const std::map< int, int > &oldToNewMap)
 fix contents of particlelists by updating indices or removing entries.
 
void inheritRelationsFrom ()
 Empty method to stop the recursion of the variadic template. More...
 
void inheritRelationsTo ()
 Empty method to stop the recursion of the variadic template. More...
 
std::map< int, int > copySetWithRelations (std::function< bool(const Particle *)> f)
 Selects the elements, fill the subset and copies all the relations in which the set is involved.
 
void copyRelationsToSelf ()
 Copy any set -> set relations between selected objects.
 

Static Protected Member Functions

static void fixVector (std::vector< int > &vec, const std::map< int, int > &oldToNewMap)
 replace entries in vec via oldToNewMap, removing those not found.
 

Protected Attributes

StoreArray< Particle > * m_set
 The array we use as input.
 
StoreArray< Particle > * m_subset
 The array we create.
 
DataStore::EStoreFlags m_subsetFlags
 Flags used for m_subset.
 
std::vector< std::string > m_inheritFromArrays
 array names we inherit relations from.
 
std::vector< std::string > m_inheritToArrays
 array names we inherit relations to.
 
bool m_inheritToSelf = false
 If true, relations from set objects to set objects are copied. More...
 
bool m_reduceExistingSet = false
 If true, non-selected candidates are removed from m_set, m_subset only exists temporarily.
 

Detailed Description

Specialised SelectSubset<Particle> that also fixes daughter indices and all ParticleLists.

Relations are already handled in SelectSubset.

Can be used like SelectSubset via select(), or by calling removeParticlesNotInLists() instead.

Definition at line 22 of file ParticleSubset.h.

Member Function Documentation

◆ inheritAllRelations()

void inheritAllRelations ( )
inlineinherited

Automatically inherit all relations to or from the original set (if registered when calling this function).

Equivalent to calling inheritRelationsFrom()/To() for all related arrays.

Note: Do not combine with inheritRelationsFrom() and inheritRelationsTo().

Definition at line 301 of file SelectSubset.h.

◆ inheritRelationsFrom() [1/2]

void inheritRelationsFrom ( )
inlineprotectedinherited

Empty method to stop the recursion of the variadic template.


Definition at line 337 of file SelectSubset.h.

◆ inheritRelationsFrom() [2/2]

void inheritRelationsFrom ( const StoreArray< T > &  array,
MoreArguments...  moreArgs 
)
inlineinherited

Inherit relations pointing from Other to objects selected into this subset.

You can specify an unlimited number of arrays as arguments to this function.

Definition at line 250 of file SelectSubset.h.

◆ inheritRelationsTo() [1/2]

void inheritRelationsTo ( )
inlineprotectedinherited

Empty method to stop the recursion of the variadic template.


Definition at line 339 of file SelectSubset.h.

◆ inheritRelationsTo() [2/2]

void inheritRelationsTo ( const StoreArray< T > &  array,
MoreArguments...  moreArgs 
)
inlineinherited

Inherit relations pointing from objects selected into this subset to Other.

You can specify an unlimited number of arrays as arguments to this function.

Definition at line 275 of file SelectSubset.h.

◆ registerSubset() [1/2]

void registerSubset ( const StoreArray< Particle > &  set,
const std::string &  subsetName,
DataStore::EStoreFlags  storeFlags = DataStore::c_ErrorIfAlreadyRegistered 
)
inlineinherited

Register the StoreArray<StoredClass> that will contain the subset of selected elements.

Parameters
setThe StoreArray<StoredClass> from which the elements will be selected
subsetNameThe name of the StoreArray<StoredClass> that will contain the selected elements
storeFlagsORed combination of DataStore::EStoreFlags.

Definition at line 229 of file SelectSubset.h.

◆ registerSubset() [2/2]

void registerSubset ( const StoreArray< Particle > &  set,
DataStore::EStoreFlags  storeFlags = DataStore::c_ErrorIfAlreadyRegistered 
)
inlineinherited

Remove all non-selected objects from set.

All relations registered so far are retained. TODO: consider moving this into StoreArray itself

Parameters
setThe StoreArray<StoredClass> from which to retain only selected elements
storeFlagsflags used for temporary arrays and relations. Should be changed from the default if you want multiple instances. c_DontWriteOut is always used.

Definition at line 215 of file SelectSubset.h.

◆ removeParticlesNotInLists()

void removeParticlesNotInLists ( const std::vector< std::string > &  listNames)

Removes all Particles that are not in one of the given ParticleLists (or daughters of Particles in the lists).

Removal is done immediately, there is no need to call select() afterwards.

Definition at line 28 of file ParticleSubset.cc.

29 {
30  std::unordered_set<int> indicesToKeep;
31  for (const auto& l : listNames) {
33  if (!list)
34  continue;
35 
36  if (list->getParticleCollectionName() == m_set->getName()) {
37  const int n = list->getListSize();
38  for (int i = 0; i < n; i++) {
39  const Particle* p = list->getParticle(i);
40  keepParticle(p, &indicesToKeep);
41  }
42  } else {
43  B2ERROR("ParticleList " << l << " uses Particle array '" << list->getParticleCollectionName() <<
44  "', but ParticleSubset uses different array '" << m_set->getName() << "'!");
45  }
46  }
47 
48  //remove everything not in indicesToKeep
49  auto selector = [indicesToKeep](const Particle * p) -> bool {
50  int idx = p->getArrayIndex();
51  return indicesToKeep.count(idx) == 1;
52  };
53  select(selector);
54 }
void select(std::function< bool(const Particle *)> f)
select Particles for which f returns true, discard others
Class to store reconstructed particles.
Definition: Particle.h:75
StoreArray< Particle > * m_set
The array we use as input.
Definition: SelectSubset.h:342
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96

◆ select()

void select ( const std::function< bool(const Particle *)> &  f)
inherited

This method is the actual worker.

It selects the elements, fill the subset and all the relations in which the subset is involved.

Parameters
fthe pointer to the function (or a nameless lambda expression) returning true for the elements to be selected and false for the others.

Definition at line 322 of file SelectSubset.h.

◆ swapSetsAndDestroyOriginal()

void swapSetsAndDestroyOriginal ( )
inherited

Swap set and subset (+relations), and keep only the reduced set.

Subset and associated relations will be empty afterwards.

Definition at line 14 of file SelectSubset.cc.

15 {
16  StoreAccessorBase* set = getSet();
18 
19  //replace set with subset
20  DataStore::Instance().replaceData(*subset, *set);
21 
22  //swap relations
23  for (const std::string& fromArray : m_inheritFromArrays) {
24  RelationArray setRel(DataStore::relationName(fromArray, set->getName()));
25  RelationArray subsetRel(DataStore::relationName(fromArray, subset->getName()));
26  DataStore::Instance().replaceData(subsetRel, setRel);
27  }
28  for (const std::string& toArray : m_inheritToArrays) {
29  RelationArray setRel(DataStore::relationName(set->getName(), toArray));
30  RelationArray subsetRel(DataStore::relationName(subset->getName(), toArray));
31  DataStore::Instance().replaceData(subsetRel, setRel);
32  }
33 }
static DataStore & Instance()
Instance of singleton Store.
Definition: DataStore.cc:54
static std::string relationName(const std::string &fromName, const std::string &toName, std::string const &namedRelation="")
Return storage name for a relation between two arrays of the given names.
Definition: DataStore.h:180
void replaceData(const StoreAccessorBase &from, const StoreAccessorBase &to)
For two StoreAccessors of same type, move all data in 'from' into 'to', discarding previous contents ...
Definition: DataStore.cc:343
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:62
std::vector< std::string > m_inheritFromArrays
array names we inherit relations from.
Definition: SelectSubset.h:54
virtual StoreAccessorBase * getSet()=0
Get accessor for original set.
virtual StoreAccessorBase * getSubSet()=0
Get accessor for reduced set.
std::vector< std::string > m_inheritToArrays
array names we inherit relations to.
Definition: SelectSubset.h:56
Base class for StoreObjPtr and StoreArray for easier common treatment.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
std::bitset< max - min+1 > subset(std::bitset< nbits > set)
extract a subset of bitstring, like substring.
Definition: Cosim.h:120

Member Data Documentation

◆ m_inheritToSelf

bool m_inheritToSelf = false
protectedinherited

If true, relations from set objects to set objects are copied.

(if both objects are selected!).

Definition at line 58 of file SelectSubset.h.


The documentation for this class was generated from the following files: