19 ISvcLocator* pSvcLocator)
30 std::set<xAOD::Iso::IsolationFlavour> runIsoType;
121 return StatusCode::SUCCESS;
129 return StatusCode::SUCCESS;
145 return StatusCode::FAILURE;
147 cellColl = cellcoll.
cptr();
177 ATH_MSG_DEBUG(
"About to execute forward electron track iso");
185 return StatusCode::SUCCESS;
203 owningAlg->declare(coreCor.second);
207 noncoreCor.second.declare(owningAlg);
228 owningAlg->declare(coreCor.second);
237 for (
const auto& key : keys.isoDeco) {
238 isoDeco.emplace_back(key);
240 for (
const auto& coreCor : keys.coreCorDeco) {
241 coreCorDeco.emplace(coreCor);
243 for (
const auto& noncoreCor : keys.noncoreCorDeco) {
244 noncoreCorDeco.emplace(
246 std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>>{
247 std::begin(noncoreCor.second), std::end(noncoreCor.second) });
255 for (
const auto& key : keys.isoDeco) {
256 isoDeco.emplace_back(key);
258 for (
const auto& key : keys.isoDecoV) {
259 isoDecoV.emplace_back(key);
261 for (
const auto& coreCor : keys.coreCorDeco) {
262 coreCorDeco.emplace(coreCor);
275 std::set<xAOD::Iso::IsolationFlavour>& runIsoType,
276 std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>*
278 std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>*
280 const std::string& containerName,
281 const std::vector<std::vector<int>>& isoInts,
282 const std::vector<std::vector<int>>& corInts,
283 const std::vector<std::vector<int>>& corIntsExtra,
284 const std::string& customConfig)
287 std::string prefix = containerName +
".";
289 for (
size_t flavor = 0; flavor < isoInts.size(); flavor++) {
301 for (
size_t type = 0;
type < isoInts[flavor].size();
type++) {
311 oldIsoFlav != isoFlav) {
312 ATH_MSG_FATAL(
"Configuration error: can only have one type of "
313 "isolation in inner vector");
314 return StatusCode::FAILURE;
316 oldIsoFlav = isoFlav;
318 if (!customConfig.empty()) {
319 isoName +=
"_" + customConfig;
324 cisoH.
isoDeco.emplace_back(isoName);
327 tisoH.
isoDeco.emplace_back(isoName);
330 std::string isoNameV = prefix +
"ptvarcone" + std::to_string(coneSize);
331 if (!customConfig.empty()) {
332 isoNameV +=
"_" + customConfig;
334 tisoH.
isoDecoV.emplace_back(isoNameV);
337 << isoFlav <<
" not supported.");
338 return StatusCode::FAILURE;
344 ATH_MSG_WARNING(
"The configuration was malformed: an empty inner vector "
345 "was added; ignoring");
364 flavor, isoFlav, cisoH, corInts,
false, prefix, customConfig));
366 flavor, isoFlav, cisoH, corIntsExtra,
true, prefix, customConfig));
368 caloIsoMap->push_back(std::make_pair(isoFlav, cisoH));
371 "caloIsoMap was nullptr but the configuration attempted to use it");
372 return StatusCode::FAILURE;
383 flavor, isoFlav, tisoH, corInts,
false, prefix, customConfig));
385 flavor, isoFlav, tisoH, corIntsExtra,
true, prefix, customConfig));
388 trackIsoMap->push_back(std::make_pair(isoFlav, tisoH));
391 "trackIsoMap was nullptr but the configuration attempted to use it");
392 return StatusCode::FAILURE;
397 <<
" does not exist ! Check your inputs");
399 runIsoType.insert(isoFlav);
401 return StatusCode::SUCCESS;
409 const std::vector<std::vector<int>>& corInts,
411 const std::string& prefix,
412 const std::string& customConfig)
414 if (!corrsAreExtra) {
415 std::string bitsetName =
417 if (!customConfig.empty()) {
418 bitsetName +=
"_" + customConfig;
426 for (
size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
428 const auto cor =
static_cast<unsigned int>(corInts[flavor][corrType]);
435 std::string isoCorName = prefix;
443 if (!customConfig.empty()) {
444 isoCorName +=
"_" + customConfig;
461 if (!customConfig.empty()) {
462 corName +=
"_" + customConfig;
464 vec.emplace_back(corName);
471 return StatusCode::SUCCESS;
479 const std::vector<std::vector<int>>& corInts,
481 const std::string& prefix,
482 const std::string& customConfig)
485 if (!corrsAreExtra) {
486 std::string bitsetName =
488 if (!customConfig.empty()) {
489 bitsetName +=
"_" + customConfig;
497 for (
size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
498 const auto cor =
static_cast<unsigned int>(corInts[flavor][corrType]);
508 if (!customConfig.empty()) {
509 isoCorName +=
"_" + customConfig;
516 return StatusCode::SUCCESS;
521 const std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>&
525 for (
const auto& pr : caloIsoMap) {
528 const auto& keys = pr.second;
534 ATH_MSG_FATAL(
"Have a CaloIsoHelpHandles with no actual isolations; "
535 "something wrong happened");
536 return StatusCode::FAILURE;
541 if (readHandle.isAvailable()){
543 ATH_MSG_DEBUG(
"read (actually a write) handle for " << keys.isoDeco[0].key() <<
" already exists. "
544 <<
"Will not recompute." );
545 return StatusCode::SUCCESS;
548 if (!readHandle.isValid()) {
550 << keys.isoDeco[0].key());
551 return StatusCode::FAILURE;
554 for (
const auto *part : *readHandle) {
556 bool successfulCalc =
false;
559 CaloIsoResult, *part, keys.isoTypes, keys.CorrList, cellColl);
562 CaloIsoResult, *part, keys.isoTypes, keys.CorrList);
565 CaloIsoResult, *part, keys.isoTypes, keys.CorrList);
568 if (successfulCalc) {
569 for (
unsigned int i = 0; i < keys.isoTypes.size(); i++) {
570 float iso = CaloIsoResult.
etcones[i];
572 <<
" = " << iso / 1e3);
573 (handles.
isoDeco[i])(*part) = iso;
576 (handles.
corrBitsetDeco)(*part) = keys.CorrList.calobitset.to_ulong();
586 ATH_MSG_FATAL(
"Could not find core correction of required type: "
589 return StatusCode::FAILURE;
595 if (it == corIter->second.end()) {
599 return StatusCode::FAILURE;
603 (coreCorDecoPr.second)(*part) = it->second;
612 ATH_MSG_FATAL(
"Could not find noncore correction of required type: "
615 return StatusCode::FAILURE;
620 auto& vecHandles = noncoreCorDecoPr.second;
621 for (
size_t i = 0; i < vecHandles.size(); i++) {
622 (vecHandles[i])(*part) = corIter->second[i];
628 return StatusCode::FAILURE;
632 return StatusCode::SUCCESS;
637 const std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>&
640 for (
const auto& pr : trackIsoMap) {
642 const auto& keys = pr.second;
648 ATH_MSG_FATAL(
"Have a TrackIsoHelpHandles with no actual isolations; "
649 "something wrong happened");
650 return StatusCode::FAILURE;
655 if (readHandle.isAvailable()){
657 ATH_MSG_DEBUG(
"Decoration for for " << keys.isoDeco[0].key() <<
" already exists. "
658 <<
"Will not recompute." );
659 return StatusCode::SUCCESS;
662 if (!readHandle.isValid()) {
664 << keys.isoDeco[0].key());
665 return StatusCode::FAILURE;
668 for (
const auto *part : *readHandle) {
670 bool successfulCalc =
false;
672 const auto * eg =
dynamic_cast<const xAOD::Egamma*
>(part);
674 ATH_MSG_DEBUG(
"Doing track isolation on an egamma particle");
675 std::unique_ptr<xAOD::Vertex> trigVtx =
nullptr;
676 std::set<const xAOD::TrackParticle*> tracksToExclude;
682 trigVtx = std::make_unique<xAOD::Vertex>();
683 trigVtx->makePrivateStore();
684 trigVtx->setZ(el->trackParticle()->z0() + el->trackParticle()->vz());
685 ATH_MSG_DEBUG(
"will use a vertex at z = " << trigVtx->z() <<
" to compute electron track isolation");
694 const auto * gam =
dynamic_cast<const xAOD::Photon*
>(eg);
695 if (gam && gam->nVertices() > 0) {
698 tracksToExclude.insert(
713 ATH_MSG_DEBUG(
"Not doing track isolation on an egamma particle");
715 TrackIsoResult, *part, keys.isoTypes, keys.CorrList);
718 if (successfulCalc) {
719 for (
unsigned int i = 0; i < keys.isoTypes.size(); i++) {
720 float iso = TrackIsoResult.
ptcones[i];
723 <<
" = " << iso / 1e3
724 <<
", var cone = " << isoV / 1e3);
725 (handles.
isoDeco[i])(*part) = iso;
726 (handles.
isoDecoV[i])(*part) = isoV;
730 (handles.
corrBitsetDeco)(*part) = keys.CorrList.trackbitset.to_ulong();
738 ATH_MSG_FATAL(
"Could not find core correction of required type: "
741 return StatusCode::FAILURE;
745 (coreCorDecoPr.second)(*part) = corIter->second;
749 ATH_MSG_FATAL(
"Call to TrackIsolationTool failed for flavor "
751 return StatusCode::FAILURE;
755 return StatusCode::SUCCESS;
760 std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& caloIso)
762 for (
auto& iso : caloIso) {
763 iso.second.declare(
this);
769 std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>&
772 for (
auto& iso : trackIso) {
773 iso.second.declare(
this);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
std::vector< size_t > vec
An algorithm that can be simultaneously executed in multiple threads.
Container class for CaloCell.
void declareIso(std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > &caloIso)
Gaudi::Property< std::string > m_ElectronContainerName
Containers (Is it best to make them as strings? Used by multiple handles).
StatusCode addTrackIsoCorrections(size_t flavor, xAOD::Iso::IsolationFlavour isoFlav, TrackIsoHelpKey &tisoH, const std::vector< std::vector< int > > &corInts, bool corrsAreExtra, const std::string &prefix, const std::string &customConfig)
called by initializeIso
virtual StatusCode initialize() override final
Gaudi::Property< std::vector< std::vector< int > > > m_fwdelisoInts
Gaudi::Property< std::string > m_customConfigFwd
IsolationBuilder()
Default constructor:
virtual ~IsolationBuilder()
Destructor:
Gaudi::Property< std::vector< std::vector< int > > > m_fwdelcorIntsExtra
Gaudi::Property< std::vector< std::vector< int > > > m_elcorIntsExtra
std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > m_elTrackIso
Gaudi::Property< std::string > m_customConfigPh
std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > m_fwdelCaloIso
Gaudi::Property< std::vector< std::vector< int > > > m_phisoInts
Isolation types (for the alg.
ToolHandle< xAOD::INeutralEFlowIsolationTool > m_pflowIsolationTool
Tool for neutral pflow isolation calculation.
Gaudi::Property< std::string > m_customConfigMu
std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > m_muCaloIso
ToolHandle< xAOD::ICaloTopoClusterIsolationTool > m_topoIsolationTool
Tool for topo isolation calculation.
Gaudi::Property< bool > m_useBremAssoc
std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > m_phTrackIso
Gaudi::Property< std::vector< std::vector< int > > > m_mucorIntsExtra
Gaudi::Property< std::vector< std::vector< int > > > m_muisoInts
Gaudi::Property< std::vector< std::vector< int > > > m_elisoInts
Isolation types.
std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > m_elCaloIso
StatusCode executeTrackIso(const std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > &trackIsoMap) const
virtual StatusCode execute(const EventContext &ctx) const override final
StatusCode addCaloIsoCorrections(size_t flavor, xAOD::Iso::IsolationFlavour isoFlav, CaloIsoHelpKey &cisoH, const std::vector< std::vector< int > > &corInts, bool corrsAreExtra, const std::string &prefix, const std::string &customConfig)
called by initializeIso
Gaudi::Property< std::vector< std::vector< int > > > m_mucorInts
Gaudi::Property< std::vector< std::vector< int > > > m_phcorIntsExtra
Gaudi::Property< bool > m_isTrigger
is the alg run at trigger level
Gaudi::Property< std::string > m_FwdElectronContainerName
Gaudi::Property< bool > m_storepileupCorrection
std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > m_muTrackIso
StatusCode initializeIso(std::set< xAOD::Iso::IsolationFlavour > &runIsoType, std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > *caloIsoMap, std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > *trackIsoMap, const std::string &containerName, const std::vector< std::vector< int > > &isoInts, const std::vector< std::vector< int > > &corInts, const std::vector< std::vector< int > > &corIntsExtra, const std::string &customConfig)
called by algorithm initialize per object (electron, photon, forward electron, muon)
std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > m_fwdelTrackIso
ToolHandle< xAOD::ICaloCellIsolationTool > m_cellIsolationTool
Tool for cell isolation calculation.
StatusCode executeCaloIso(const std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > &caloIsoMap, const CaloCellContainer *cellColl) const
Gaudi::Property< std::string > m_MuonContainerName
Gaudi::Property< std::vector< std::vector< int > > > m_fwdelcorInts
ToolHandle< xAOD::ITrackIsolationTool > m_trackIsolationTool
Tool for neutral pflow isolation calculation.
Gaudi::Property< std::string > m_customConfigEl
std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > m_phCaloIso
Gaudi::Property< std::vector< std::vector< int > > > m_elcorInts
SG::ReadHandleKey< CaloCellContainer > m_cellsKey
Cell container.
Gaudi::Property< bool > m_allTrackRemoval
static bool isCoreCor(xAOD::Iso::IsolationCaloCorrection corr)
virtual StatusCode finalize() override final
Gaudi::Property< std::vector< std::vector< int > > > m_phcorInts
Gaudi::Property< std::string > m_PhotonContainerName
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
DecorHandleKeyArray< WriteDecorHandle< T, S >, WriteDecorHandleKey< T >, Gaudi::DataHandle::Writer > WriteDecorHandleKeyArray
bool isFwdElectron(const xAOD::Egamma *eg)
is the object a Fwd electron
std::set< const xAOD::TrackParticle * > getTrackParticles(const xAOD::Egamma *eg, bool useBremAssoc=true, bool allParticles=true)
Return a list of all or only the best TrackParticle associated to the object.
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
bool isElectron(const xAOD::Egamma *eg)
is the object an electron (not Fwd)
IsolationFlavour isolationFlavour(IsolationType type)
convert Isolation Type into Isolation Flavour
IsolationType
Overall enumeration for isolation types in xAOD files.
IsolationFlavour
Enumeration for different ways of calculating isolation in xAOD files.
@ topoetcone
Topo-cluster ET-sum.
@ neflowisol
neutral eflow
@ etcone
Calorimeter isolation.
static const char * toCString(IsolationConeSize conesize)
IsolationCorrectionParameter
@ coreEnergy
energy stored for this correction
IsolationCaloCorrection
Enumeration for different ways of correcting isolation in xAOD files.
@ pileupCorrection
fully corrected
@ coreConeSC
core energy (super cluster).
@ coreCone
core energy (in dR<0.1).
@ core57cells
core 5x7 cells
float coneSize(IsolationConeSize type)
convert Isolation Size into cone size
std::string toString(const IsoType &iso)
Vertex_v1 Vertex
Define the latest version of the vertex class.
Egamma_v1 Egamma
Definition of the current "egamma version".
Photon_v1 Photon
Definition of the current "egamma version".
Electron_v1 Electron
Definition of the current "egamma version".
std::map< xAOD::Iso::IsolationCaloCorrection, SG::WriteDecorHandle< xAOD::IParticleContainer, float > > coreCorDeco
std::map< xAOD::Iso::IsolationCaloCorrection, std::vector< SG::WriteDecorHandle< xAOD::IParticleContainer, float > > > noncoreCorDeco
SG::WriteDecorHandle< xAOD::IParticleContainer, uint32_t > corrBitsetDeco
std::vector< SG::WriteDecorHandle< xAOD::IParticleContainer, float > > isoDeco
CaloIsoHelpHandles(const CaloIsoHelpKey &keys)
void declare(IDataHandleHolder *owningAlg)
only to be called after placed in the final location, to propagate dependencies
xAOD::CaloCorrection CorrList
to keep track of the corrections
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > isoDeco
The actual isolations.
std::map< xAOD::Iso::IsolationCaloCorrection, SG::WriteDecorHandleKey< xAOD::IParticleContainer > > coreCorDeco
The corrections (one per flavor).
std::vector< xAOD::Iso::IsolationType > isoTypes
the types of isolations to calculate
CaloIsoHelpKey(IDataHandleHolder *owningAlg)
constructor
SG::WriteDecorHandleKey< xAOD::IParticleContainer > corrBitsetDeco
std::map< xAOD::Iso::IsolationCaloCorrection, SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > > noncoreCorDeco
The corrections (one per flavor/type combination).
std::vector< SG::WriteDecorHandle< xAOD::IParticleContainer, float > > isoDecoV
std::map< xAOD::Iso::IsolationTrackCorrection, SG::WriteDecorHandle< xAOD::IParticleContainer, float > > coreCorDeco
TrackIsoHelpHandles(const TrackIsoHelpKey &keys)
SG::WriteDecorHandle< xAOD::IParticleContainer, uint32_t > corrBitsetDeco
std::vector< SG::WriteDecorHandle< xAOD::IParticleContainer, float > > isoDeco
std::vector< xAOD::Iso::IsolationType > isoTypes
the types of isolations to calculate
void declare(IDataHandleHolder *owningAlg)
only to be called after placed in the final location, to propagate dependencies
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > isoDecoV
SG::WriteDecorHandleKeyArray< xAOD::IParticleContainer > isoDeco
The actual isolations.
std::map< xAOD::Iso::IsolationTrackCorrection, SG::WriteDecorHandleKey< xAOD::IParticleContainer > > coreCorDeco
The corrections.
TrackIsoHelpKey(IDataHandleHolder *owningAlg)
constructor
SG::WriteDecorHandleKey< xAOD::IParticleContainer > corrBitsetDeco
xAOD::TrackCorrection CorrList
to keep track of the corrections
Iso::IsolationCaloCorrectionBitset calobitset
std::vector< float > etcones
std::map< Iso::IsolationCaloCorrection, std::vector< float > > noncoreCorrections
std::map< Iso::IsolationCaloCorrection, std::map< Iso::IsolationCorrectionParameter, float > > coreCorrections
Iso::IsolationTrackCorrectionBitset trackbitset
std::vector< float > ptcones
std::vector< float > ptvarcones_10GeVDivPt
std::map< Iso::IsolationTrackCorrection, float > coreCorrections