10#include <analysis/modules/BremsCorrection/BelleBremRecoveryModule.h>
12#include <framework/logging/Logger.h>
15#include <mdst/dataobjects/Track.h>
18#include <analysis/DecayDescriptor/ParticleListName.h>
21#include <analysis/variables/ECLVariables.h>
24#include <TMatrixFSym.h>
25#include <Math/Vector3D.h>
26#include <Math/Vector4D.h>
27#include <Math/VectorUtil.h>
50Takes the charged particle from the given charged particle list (``inputListName``) and
51copies it to the output list (``outputListName``). The 4-vector of the nearest (all) photon(s)
52from ``gammaListName`` (considered as radiative) is added to the charged particle, if it is
53found inside the cone around the charged particle with the given maximum angle (``angleThreshold``).
59 "The initial charged particle list containing the charged particles to correct, should already exist.");
60 addParam(
"outputListName",
m_outputListName,
"The output charged particle list containing the corrected charged particles.");
61 addParam(
"gammaListName",
m_gammaListName,
"The gammas list containing possibly radiative gammas, should already exist.");
63 "The maximum angle in radians between the charged particle and the (radiative) gamma to be accepted.", 0.05);
64 addParam(
"multiplePhotons",
m_isMultiPho,
"If only the nearest photon to add then make it False otherwise true",
true);
66 "If false, a photon is used for correction of the closest charged particle in the inputList. "
67 "If true, a photon is allowed to be used for correction multiple times. "
68 "WARNING: One cannot use a photon twice to reconstruct a composite particle. Thus, for example, if e+ and e- are corrected with a gamma, they cannot form a J/psi -> e+ e- candidate.",
72 "Set to true if you want to write out the output list to a root file",
false);
81 B2ERROR(
"[BelleBremRecoveryModule] Invalid output ParticleList name: " <<
m_outputListName);
90 B2ERROR(
"[BelleBremRecoveryModule] Input and output particle list names are the same: " <<
m_inputListName);
92 B2ERROR(
"[BelleBremRecoveryModule] Invalid input particle list name: " <<
m_inputListName);
98 B2ERROR(
"[BelleBremRecoveryModule] Invalid gamma particle list name: " <<
m_gammaListName);
123 const unsigned int nGam =
m_gammaList->getListSize();
125 if (nLep == 0)
return;
129 std::vector<std::vector<Particle*>> selectedGammas_nLep;
133 for (
unsigned iLep = 0; iLep < nLep; iLep++) {
134 std::vector<Particle*> selectedGammas;
137 const ROOT::Math::XYZVector pLep = lepton->
getMomentum();
140 for (
unsigned iGam = 0; iGam < nGam; iGam++) {
142 const ROOT::Math::XYZVector pGam = gamma->
getMomentum();
144 const double angle = ROOT::Math::VectorUtil::Angle(pLep, pGam);
150 selectedGammas.push_back(gamma);
153 if (angle < gamma->getExtraInfo(
"angle_" + extraInfoSuffix)) {
155 int indexLep_prev = gamma->
getExtraInfo(
"indexLep_" + extraInfoSuffix);
156 selectedGammas_nLep[indexLep_prev].erase(std::remove(selectedGammas_nLep[indexLep_prev].begin(),
157 selectedGammas_nLep[indexLep_prev].end(),
159 selectedGammas_nLep[indexLep_prev].end());
162 selectedGammas.push_back(gamma);
167 selectedGammas.push_back(gamma);
174 std::sort(selectedGammas.begin(), selectedGammas.end(),
176 return photon1->getExtraInfo(
"angle_" + extraInfoSuffix) < photon2->getExtraInfo(
"angle_" + extraInfoSuffix);
180 selectedGammas_nLep[iLep] = selectedGammas;
187 for (
unsigned iLep = 0; iLep < nLep; iLep++) {
198 ROOT::Math::PxPyPzEVector new4Vec = lepton->
get4Vector();
200 TMatrixFSym corLepMatrix = lepErrorMatrix;
203 double bremsGammaEnergySum = 0.0;
214 for (
auto gamma : selectedGammas) {
216 new4Vec += gamma->get4Vector();
217 bremsGammaEnergySum += Variable::eclClusterE(gamma);
219 const TMatrixFSym& fsrErrorMatrix = gamma->getMomentumVertexErrorMatrix();
220 for (
int irow = 0; irow <= 3 ; irow++)
221 for (
int icol = irow; icol <= 3; icol++)
222 corLepMatrix(irow, icol) += fsrErrorMatrix(irow, icol);
226 B2DEBUG(19,
"[BelleBremRecoveryModule] Found a radiative gamma and added its 4-vector to the charge particle");
234 correctedLepton.
addExtraInfo(
"bremsCorrected",
float(bremsGammaEnergySum > 0));
235 correctedLepton.
addExtraInfo(
"bremsCorrectedPhotonEnergy", bremsGammaEnergySum);
void correctLepton(const Particle *lepton, std::vector< Particle * > selectedGammas)
Correct lepton kinematics using the selectedGammas.
StoreObjPtr< ParticleList > m_outputparticleList
StoreObjptr for output particlelist.
virtual void initialize() override
Initialize the Module.
std::string m_gammaListName
input ParticleList names
virtual void event() override
Event processor.
bool m_isMultiPho
multiple or one bremphoton addition option
StoreArray< Particle > m_particles
StoreArray of Particle objects.
double m_angleThres
input max angle to be accepted (in radian)
StoreArray< PIDLikelihood > m_pidlikelihoods
StoreArray of PIDLikelihood objects.
BelleBremRecoveryModule()
Constructor.
StoreObjPtr< ParticleList > m_gammaList
StoreObjptr for gamma list.
StoreObjPtr< ParticleList > m_inputparticleList
StoreObjptr for input charged particlelist.
StoreObjPtr< ParticleList > m_outputAntiparticleList
StoreObjptr for output antiparticlelist.
DecayDescriptor m_decaydescriptorGamma
Decay descriptor of the decay being reconstructed.
DecayDescriptor m_decaydescriptor
Decay descriptor of the charged particle decay.
bool m_writeOut
toggle output particle list btw.
bool m_usePhotonOnlyOnce
Each brems photon can be used to correct only one particle (the one with the smallest relation weight...
int m_pdgCode
PDG code of the combined mother particle.
std::string m_outputAntiListName
output anti-particle list name
std::string m_inputListName
input ParticleList names
std::string m_outputListName
output ParticleList name
EStoreFlags
Flags describing behaviours of objects etc.
@ c_WriteOut
Object/array should be saved by output modules.
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
Represents a particle in the DecayDescriptor.
int getPDGCode() const
Return PDG code.
bool init(const std::string &str)
Initialise the DecayDescriptor from given string.
const DecayDescriptorParticle * getMother() const
return mother.
A Class to store the Monte Carlo particle information.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Class to collect log likelihoods from TOP, ARICH, dEdx, ECL and KLM aimed for output to mdst includes...
Class to store reconstructed particles.
const Track * getTrack() const
Returns the pointer to the Track object that was used to create this Particle (ParticleType == c_Trac...
void appendDaughter(const Particle *daughter, const bool updateType=true, const int daughterProperty=c_Ordinary)
Appends index of daughter to daughters index array.
void writeExtraInfo(const std::string &name, const double value)
Sets the user defined extraInfo.
void setVertex(const ROOT::Math::XYZVector &vertex)
Sets position (decay vertex)
double getPValue() const
Returns chi^2 probability of fit if done or -1.
ROOT::Math::XYZVector getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
bool hasExtraInfo(const std::string &name) const
Return whether the extra info with the given name is set.
const PIDLikelihood * getPIDLikelihood() const
Returns the pointer to the PIDLikelihood object that is related to the Track, which was used to creat...
int getPDGCode(void) const
Returns PDG code.
ROOT::Math::PxPyPzEVector get4Vector() const
Returns Lorentz vector.
void addExtraInfo(const std::string &name, double value)
Sets the user-defined data of given name to the given value.
void set4Vector(const ROOT::Math::PxPyPzEVector &p4)
Sets Lorentz vector.
void setMomentumVertexErrorMatrix(const TMatrixFSym &errMatrix)
Sets 7x7 error matrix.
ROOT::Math::XYZVector getMomentum() const
Returns momentum vector.
void setPValue(double pValue)
Sets chi^2 probability of fit.
void updateMass(const int pdgCode)
Updates particle mass with the mass of the particle corresponding to the given PDG.
@ c_Flavored
Is either particle or antiparticle.
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
double getExtraInfo(const std::string &name) const
Return given value if set.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
T * appendNew()
Construct a new T object at the end of the array.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
std::string antiParticleListName(const std::string &listName)
Returns name of anti-particle-list corresponding to listName.
Abstract base class for different kinds of events.