Belle II Software  release-08-01-10
ParticleCopy.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 
9 #include <analysis/utility/ParticleCopy.h>
10 #include <analysis/dataobjects/Particle.h>
11 
12 #include <framework/datastore/StoreArray.h>
13 #include <iostream>
14 
15 using namespace Belle2;
16 using namespace std;
17 
19 {
20  StoreArray<Particle> array(original->getArrayName());
21 
22  // make a copy of a particle
23  Particle* copy = array.appendNew(*original);
24  copy->copyRelations(original);
25  copy->writeExtraInfo("original_index", original->getArrayIndex());
26 
27  // Copy its daughters as well.
28  // At this stage the copy of the particle
29  // internally stores daughter indices of original.
30  // Copy daughters as well.
31  unsigned nDaughters = original->getNDaughters();
32 
33  // If the particle has undergone Bremsstrahlung correction, removing its
34  // daughters (the original lepton and potential photons) and then appending
35  // the copied versions should not change its source type.
36  // Or, if the particle's source is V0, it should be kept as V0 rather than changing to Composite.
37  bool updateType = true;
38  if (copy->hasExtraInfo("bremsCorrected") ||
39  copy->getParticleSource() == Particle::EParticleSourceObject::c_V0)
40  updateType = false;
41 
42  for (unsigned iOld = 0; iOld < nDaughters; iOld++) {
43  const Particle* originalDaughter = original->getDaughter(iOld);
44 
45  Particle* daughterCopy = copyParticle(originalDaughter);
46 
47  // remove original daughter
48  copy->removeDaughter(originalDaughter, updateType);
49  // append copied daughter instead
50  copy->appendDaughter(daughterCopy, updateType);
51  }
52 
53  return copy;
54 }
55 
57 {
58  // If the particle has undergone Bremsstrahlung correction, removing its
59  // daughters (the original lepton and potential photons) and then appending
60  // the copied versions should not change its source type.
61  // Or, if the particle's source is V0, it should be kept as V0 rather than changing to Composite.
62  bool updateType = true;
63  if (mother->hasExtraInfo("bremsCorrected") ||
64  mother->getParticleSource() == Particle::EParticleSourceObject::c_V0)
65  updateType = false;
66 
67  unsigned nDaughters = mother->getNDaughters();
68  for (unsigned iOld_neverUsed = 0; iOld_neverUsed < nDaughters; iOld_neverUsed++) {
69  // always accessing the first daughter of mother that is being updated
70  const Particle* originalDaughter = mother->getDaughter(0);
71  Particle* daughterCopy = copyParticle(originalDaughter);
72 
73  // remove original daughter from the beginning of the daughters' vector
74  mother->removeDaughter(originalDaughter, updateType);
75  // append copied daughter instead at the end of the daughters' vector
76  mother->appendDaughter(daughterCopy, updateType);
77  }
78 }
Class to store reconstructed particles.
Definition: Particle.h:75
unsigned getNDaughters(void) const
Returns number of daughter particles.
Definition: Particle.h:685
const Particle * getDaughter(unsigned i) const
Returns a pointer to the i-th daughter particle.
Definition: Particle.cc:635
std::string getArrayName() const
Get name of array this object is stored in, or "" if not found.
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
void copyDaughters(Particle *mother)
Function copies all (grand-)^n-daughter particles of the argument mother Particle.
Definition: ParticleCopy.cc:56
Particle * copyParticle(const Particle *original)
Function takes argument Particle and creates a copy of it and copies of all its (grand-)^n-daughters.
Definition: ParticleCopy.cc:18
Abstract base class for different kinds of events.