10#include <analysis/modules/BremsCorrection/BelleBremRecoveryModule.h>
12#include <framework/logging/Logger.h>
13#include <framework/datastore/RelationArray.h>
16#include <mdst/dataobjects/Track.h>
19#include <analysis/DecayDescriptor/ParticleListName.h>
22#include <analysis/variables/ECLVariables.h>
25#include <TMatrixFSym.h>
26#include <Math/Vector3D.h>
27#include <Math/Vector4D.h>
28#include <Math/VectorUtil.h>
51Takes the charged particle from the given charged particle list (``inputListName``) and
52copies it to the output list (``outputListName``). The 4-vector of the nearest (all) photon(s)
53from ``gammaListName`` (considered as radiative) is added to the charged particle, if it is
54found inside the cone around the charged particle with the given maximum angle (``angleThreshold``).
60 "The initial charged particle list containing the charged particles to correct, should already exist.");
61 addParam(
"outputListName",
m_outputListName,
"The output charged particle list containing the corrected charged particles.");
62 addParam(
"gammaListName",
m_gammaListName,
"The gammas list containing possibly radiative gammas, should already exist.");
64 "The maximum angle in radians between the charged particle and the (radiative) gamma to be accepted.", 0.05);
65 addParam(
"multiplePhotons",
m_isMultiPho,
"If only the nearest photon to add then make it False otherwise true",
true);
67 "If false, a photon is used for correction of the closest charged particle in the inputList. "
68 "If true, a photon is allowed to be used for correction multiple times. "
69 "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.",
73 "Set to true if you want to write out the output list to a root file",
false);
82 B2ERROR(
"[BelleBremRecoveryModule] Invalid output ParticleList name: " <<
m_outputListName);
91 B2ERROR(
"[BelleBremRecoveryModule] Input and output particle list names are the same: " <<
m_inputListName);
93 B2ERROR(
"[BelleBremRecoveryModule] Invalid input particle list name: " <<
m_inputListName);
99 B2ERROR(
"[BelleBremRecoveryModule] Invalid gamma particle list name: " <<
m_gammaListName);
124 const unsigned int nGam =
m_gammaList->getListSize();
126 if (nLep == 0)
return;
130 std::vector<std::vector<Particle*>> selectedGammas_nLep;
134 for (
unsigned iLep = 0; iLep < nLep; iLep++) {
135 std::vector<Particle*> selectedGammas;
138 const ROOT::Math::XYZVector pLep = lepton->
getMomentum();
141 for (
unsigned iGam = 0; iGam < nGam; iGam++) {
143 const ROOT::Math::XYZVector pGam = gamma->
getMomentum();
145 const double angle = ROOT::Math::VectorUtil::Angle(pLep, pGam);
151 selectedGammas.push_back(gamma);
154 if (angle < gamma->getExtraInfo(
"angle_" + extraInfoSuffix)) {
156 int indexLep_prev = gamma->
getExtraInfo(
"indexLep_" + extraInfoSuffix);
157 selectedGammas_nLep[indexLep_prev].erase(std::remove(selectedGammas_nLep[indexLep_prev].begin(),
158 selectedGammas_nLep[indexLep_prev].end(),
160 selectedGammas_nLep[indexLep_prev].end());
163 selectedGammas.push_back(gamma);
168 selectedGammas.push_back(gamma);
175 std::sort(selectedGammas.begin(), selectedGammas.end(),
177 return photon1->getExtraInfo(
"angle_" + extraInfoSuffix) < photon2->getExtraInfo(
"angle_" + extraInfoSuffix);
181 selectedGammas_nLep[iLep] = selectedGammas;
188 for (
unsigned iLep = 0; iLep < nLep; iLep++) {
199 ROOT::Math::PxPyPzEVector new4Vec = lepton->
get4Vector();
201 TMatrixFSym corLepMatrix = lepErrorMatrix;
204 double bremsGammaEnergySum = 0.0;
215 for (
auto gamma : selectedGammas) {
217 new4Vec += gamma->get4Vector();
218 bremsGammaEnergySum += Variable::eclClusterE(gamma);
220 const TMatrixFSym& fsrErrorMatrix = gamma->getMomentumVertexErrorMatrix();
221 for (
int irow = 0; irow <= 3 ; irow++)
222 for (
int icol = irow; icol <= 3; icol++)
223 corLepMatrix(irow, icol) += fsrErrorMatrix(irow, icol);
227 B2DEBUG(19,
"[BelleBremRecoveryModule] Found a radiative gamma and added its 4-vector to the charge particle");
235 correctedLepton.
addExtraInfo(
"bremsCorrected",
float(bremsGammaEnergySum > 0));
236 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.