Belle II Software development
ParticleSubset Class Reference

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

#include <ParticleSubset.h>

Inheritance diagram for ParticleSubset:
SelectSubset< Particle > SelectSubsetBase

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).
 
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.
 
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.
 
void inheritRelationsFrom (const StoreArray< T > &array, MoreArguments... moreArgs)
 Inherit relations pointing from Other to objects selected into this subset.
 
void inheritRelationsTo (const StoreArray< T > &array, MoreArguments... moreArgs)
 Inherit relations pointing from objects selected into this subset to Other.
 
void inheritAllRelations ()
 Automatically inherit all relations to or from the original set (if registered when calling this function).
 
void select (const std::function< bool(const Particle *)> &f)
 This method is the actual worker.
 
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.
 

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.
 
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.
 
static void inheritRelationsFrom ()
 Empty method to stop the recursion of the variadic template.
 
static void inheritRelationsTo ()
 Empty method to stop the recursion of the variadic template.
 

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.
 
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

◆ copyRelationsToSelf()

void copyRelationsToSelf ( )
protectedinherited

Copy any set -> set relations between selected objects.

Definition at line 340 of file SelectSubset.h.

397 {
398 for (const StoredClass& subsetObject1 : *m_subset) {
399 //TODO: change relation direction to set -> subset?
400 const StoredClass* setObject1 = subsetObject1.template getRelatedFrom<StoredClass>(m_set->getName());
401
402 if (setObject1 != nullptr) {
403 //get all objects in original set related to setObject1
404 const RelationVector<StoredClass>& relations = setObject1->template getRelationsTo<StoredClass>(m_set->getName());
405 for (unsigned int iRel = 0; iRel < relations.size(); iRel++) {
406 const StoredClass* setObject2 = relations.object(iRel);
407 const double weight = relations.weight(iRel);
408 //if setObject2 was selected into subset, inherit relation
409 const StoredClass* subsetObject2 = setObject2->template getRelatedTo<StoredClass>(m_subset->getName());
410 if (subsetObject2) {
411 subsetObject1.addRelationTo(subsetObject2, weight);
412 }
413 }
414 }
415 }
416 }

◆ copySetWithRelations()

std::map< int, int > copySetWithRelations ( std::function< bool(const Particle *)> f)
protectedinherited

Selects the elements, fill the subset and copies all the relations in which the set is involved.

Definition at line 337 of file SelectSubset.h.

358 {
359 std::map<int, int> oldToNew;
360 for (const StoredClass& setObject : *m_set) {
361 if (!f(&setObject))
362 continue;
363
364 oldToNew[setObject.getArrayIndex()] = m_subset->getEntries();
365 const StoredClass* subsetObject = m_subset->appendNew(setObject);
366 if (!m_reduceExistingSet)
367 setObject.addRelationTo(subsetObject);
368 }
369
370
371 //TODO this is the slow bit, can probably be improved by directly dealing with indices
372 for (const auto& oldToNewPair : oldToNew) {
373 const StoredClass* setObject = (*m_set)[oldToNewPair.first];
374 const StoredClass* subsetObject = (*m_subset)[oldToNewPair.second];
375
376 for (std::string fromArray : m_inheritFromArrays) {
377 const RelationVector<RelationsObject>& relations = setObject->template getRelationsFrom<RelationsObject>(fromArray);
378 for (unsigned int iRel = 0; iRel < relations.size(); iRel++) {
379 relations.object(iRel)->addRelationTo(subsetObject, relations.weight(iRel));
380 }
381 }
382 for (std::string toArray : m_inheritToArrays) {
383 const RelationVector<RelationsObject>& relations = setObject->template getRelationsTo<RelationsObject>(toArray);
384 for (unsigned int iRel = 0; iRel < relations.size(); iRel++) {
385 subsetObject->addRelationTo(relations.object(iRel), relations.weight(iRel));
386 }
387 }
388 }
389
390 return oldToNew;
391 }

◆ fixParticleLists()

void fixParticleLists ( const std::map< int, int > & oldToNewMap)
protected

fix contents of particlelists by updating indices or removing entries.

Definition at line 69 of file ParticleSubset.cc.

70{
72 for (const auto& entry : entryMap) {
73 if (!entry.second.ptr or !entry.second.object->InheritsFrom(ParticleList::Class()))
74 continue;
75
76 auto* list = static_cast<ParticleList*>(entry.second.ptr);
77 if (list->getParticleCollectionName() == m_set->getName()) {
78 fixVector(list->m_scList, oldToNewMap);
79 fixVector(list->m_fsList, oldToNewMap);
80 }
81 }
82}
StoreEntryMap & getStoreEntryMap(EDurability durability)
Get a reference to the object/array map.
Definition DataStore.h:325
@ 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
static void fixVector(std::vector< int > &vec, const std::map< int, int > &oldToNewMap)
replace entries in vec via oldToNewMap, removing those not found.
StoreArray< Particle > * m_set
const std::string & getName() const
Return name under which the object is saved in the DataStore.

◆ fixParticles()

void fixParticles ( const std::map< int, int > & oldToNewMap)
protected

fix daughter indices, reset m_arrayPointer

Definition at line 56 of file ParticleSubset.cc.

57{
58 TClonesArray* arrayPtr = m_set->getPtr();
59 for (Particle& p : *m_set) {
60 unsigned int n = p.m_daughterIndices.size();
61 for (unsigned int i = 0; i < n; i++) {
62 p.m_daughterIndices[i] = oldToNewMap.at(p.m_daughterIndices[i]);
63 }
64
65 p.m_arrayPointer = arrayPtr;
66 }
67}
TClonesArray * getPtr() const
Raw access to the underlying TClonesArray.
Definition StoreArray.h:311

◆ fixVector()

void fixVector ( std::vector< int > & vec,
const std::map< int, int > & oldToNewMap )
staticprotected

replace entries in vec via oldToNewMap, removing those not found.

Definition at line 84 of file ParticleSubset.cc.

85{
86 const std::vector<int> oldList(vec);
87 vec.clear();
88 for (const int idx : oldList) {
89 const auto& it = oldToNewMap.find(idx);
90 if (it != oldToNewMap.end())
91 vec.push_back(it->second);
92 }
93}

◆ getInheritFromArrays()

std::vector< std::string > getInheritFromArrays ( ) const
inlineinherited

Get list of arrays we inherit relations from.

Definition at line 32 of file SelectSubset.h.

32{ return m_inheritFromArrays; }

◆ getInheritToArrays()

std::vector< std::string > getInheritToArrays ( ) const
inlineinherited

Get list of arrays we inherit relations to.

Definition at line 34 of file SelectSubset.h.

34{ return m_inheritToArrays; }

◆ getInheritToSelf()

bool getInheritToSelf ( ) const
inlineinherited

Do we inherit relations from original set to itself?

Definition at line 36 of file SelectSubset.h.

36{ return m_inheritToSelf; }

◆ getSet()

StoreAccessorBase * getSet ( )
inlineoverridevirtualinherited

Get accessor for original set.

Implements SelectSubsetBase.

Definition at line 331 of file SelectSubset.h.

331{ return m_set; }

◆ getSubSet()

StoreAccessorBase * getSubSet ( )
inlineoverridevirtualinherited

Get accessor for reduced set.

Implements SelectSubsetBase.

Definition at line 333 of file SelectSubset.h.

333{ return m_subset; }

◆ 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 307 of file SelectSubset.h.

308 {
309 auto arrays = DataStore::Instance().getListOfRelatedArrays(*m_set);
310
311 for (const std::string& arrayName : arrays) {
312 StoreArray<TObject> array(arrayName, m_set->getDurability());
313 if (array == *m_subset)
314 continue; // from registerSubset(), ignore
315
316 if (array.optionalRelationTo(*m_set, m_set->getDurability()))
317 inheritRelationsFrom(array);
318 if (m_set->optionalRelationTo(array, m_set->getDurability()))
319 inheritRelationsTo(array);
320 }
321 }

◆ inheritRelationsFrom() [1/2]

static void inheritRelationsFrom ( )
inlinestaticprotectedinherited

Empty method to stop the recursion of the variadic template.

Definition at line 343 of file SelectSubset.h.

343{ }

◆ 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 256 of file SelectSubset.h.

257 {
258 if (array.getName() == m_set->getName()) {
259 m_inheritToSelf = true;
260 inheritRelationsFrom(*m_subset, moreArgs...);
261 } else {
262 const_cast<StoreArray<T>&>(array).isRequired();
263
264 DataStore::EStoreFlags flags = m_subsetFlags;
265 if (m_subset->notWrittenOut() or array.notWrittenOut())
266 flags |= DataStore::c_DontWriteOut;
267 array.registerRelationTo(*m_subset, m_subset->getDurability(), flags);
268
269 if (array.getName() != m_subset->getName())
270 m_inheritFromArrays.push_back(array.getName());
271
272 inheritRelationsFrom(moreArgs ...);
273 }
274 }

◆ inheritRelationsTo() [1/2]

static void inheritRelationsTo ( )
inlinestaticprotectedinherited

Empty method to stop the recursion of the variadic template.

Definition at line 345 of file SelectSubset.h.

345{ }

◆ 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 281 of file SelectSubset.h.

282 {
283 if (array.getName() == m_set->getName()) {
284 m_inheritToSelf = true;
285 inheritRelationsTo(*m_subset, moreArgs...);
286 } else {
287 const_cast<StoreArray<T>&>(array).isRequired();
288
289 DataStore::EStoreFlags flags = m_subsetFlags;
290 if (m_subset->notWrittenOut() or array.notWrittenOut())
291 flags |= DataStore::c_DontWriteOut;
292 m_subset->registerRelationTo(array, m_subset->getDurability(), flags);
293
294 if (array.getName() != m_subset->getName())
295 m_inheritToArrays.push_back(array.getName());
296
297 inheritRelationsTo(moreArgs ...);
298 }
299 }

◆ 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 235 of file SelectSubset.h.

237 {
238 if (m_set or m_subset) {
239 B2FATAL("SelectSubset::registerSubset() can only be called once!");
240 }
241
242 m_set = new StoreArray<StoredClass>(set);
243
244 m_subset = new StoreArray<StoredClass>(subsetName, m_set->getDurability());
245 m_subset->registerInDataStore(storeFlags);
246 m_subsetFlags = storeFlags;
247
248 set.registerRelationTo(*m_subset, m_subset->getDurability(), storeFlags);
249 }

◆ 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 221 of file SelectSubset.h.

223 {
224 m_reduceExistingSet = true;
225 registerSubset(set, set.getName() + "_tmpSubset", storeFlags | DataStore::c_DontWriteOut);
226
227 inheritAllRelations();
228 }
TString getName(const TObject *obj)
human-readable name (e.g.
Definition ObjectInfo.cc:45

◆ 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) {
32 StoreObjPtr<ParticleList> list(l);
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

◆ select() [1/2]

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

select Particles for which f returns true, discard others

Definition at line 31 of file ParticleSubset.h.

32 {
33 const std::map<int, int>& oldToNewMap = copySetWithRelations(f);
34
35 if (m_inheritToSelf) {
36 copyRelationsToSelf();
37 }
38
39 if (m_reduceExistingSet) {
40 swapSetsAndDestroyOriginal();
41 }
42
43 fixParticles(oldToNewMap);
44
45 fixParticleLists(oldToNewMap);
46 }

◆ select() [2/2]

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 328 of file SelectSubset.h.

421 {
422 copySetWithRelations(f);
423
424 if (m_inheritToSelf) {
425 copyRelationsToSelf();
426 }
427
428 if (m_reduceExistingSet) {
429 swapSetsAndDestroyOriginal();
430 }
431 }

◆ 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();
17 StoreAccessorBase* subset = getSubSet();
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 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:342
std::vector< std::string > m_inheritFromArrays
array names we inherit relations from.
virtual StoreAccessorBase * getSubSet()=0
Get accessor for reduced set.
virtual StoreAccessorBase * getSet()=0
Get accessor for original set.
std::vector< std::string > m_inheritToArrays
array names we inherit relations to.
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_inheritFromArrays

std::vector<std::string> m_inheritFromArrays
protectedinherited

array names we inherit relations from.

Definition at line 54 of file SelectSubset.h.

◆ m_inheritToArrays

std::vector<std::string> m_inheritToArrays
protectedinherited

array names we inherit relations to.

Definition at line 56 of file SelectSubset.h.

◆ 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.

◆ m_reduceExistingSet

bool m_reduceExistingSet = false
protectedinherited

If true, non-selected candidates are removed from m_set, m_subset only exists temporarily.

Definition at line 60 of file SelectSubset.h.

◆ m_set

StoreArray<Particle>* m_set
protectedinherited

The array we use as input.

Definition at line 348 of file SelectSubset.h.

◆ m_subset

StoreArray<Particle>* m_subset
protectedinherited

The array we create.

Definition at line 350 of file SelectSubset.h.

◆ m_subsetFlags

DataStore::EStoreFlags m_subsetFlags
protectedinherited

Flags used for m_subset.

Definition at line 352 of file SelectSubset.h.


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