19 ISvcLocator* pSvcLocator)
30 std::set<xAOD::Iso::IsolationFlavour> runIsoType;
120 return StatusCode::SUCCESS;
128 return StatusCode::SUCCESS;
144 return StatusCode::FAILURE;
146 cellColl = cellcoll.
cptr();
180 return StatusCode::SUCCESS;
198 owningAlg->declare(coreCor.second);
202 noncoreCor.second.declare(owningAlg);
223 owningAlg->declare(coreCor.second);
232 for (
const auto& key : keys.isoDeco) {
233 isoDeco.emplace_back(key);
235 for (
const auto& coreCor : keys.coreCorDeco) {
236 coreCorDeco.emplace(coreCor);
238 for (
const auto& noncoreCor : keys.noncoreCorDeco) {
239 noncoreCorDeco.emplace(
241 std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>>{
242 std::begin(noncoreCor.second), std::end(noncoreCor.second) });
250 for (
const auto& key : keys.isoDeco) {
251 isoDeco.emplace_back(key);
253 for (
const auto& key : keys.isoDecoV) {
254 isoDecoV.emplace_back(key);
256 for (
const auto& coreCor : keys.coreCorDeco) {
257 coreCorDeco.emplace(coreCor);
270 std::set<xAOD::Iso::IsolationFlavour>& runIsoType,
271 std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>*
273 std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>*
275 const std::string& containerName,
276 const std::vector<std::vector<int>>& isoInts,
277 const std::vector<std::vector<int>>& corInts,
278 const std::vector<std::vector<int>>& corIntsExtra,
279 const std::string& customConfig)
282 std::string prefix = containerName +
".";
284 for (
size_t flavor = 0; flavor < isoInts.size(); flavor++) {
296 for (
size_t type = 0;
type < isoInts[flavor].size();
type++) {
306 oldIsoFlav != isoFlav) {
307 ATH_MSG_FATAL(
"Configuration error: can only have one type of "
308 "isolation in inner vector");
309 return StatusCode::FAILURE;
311 oldIsoFlav = isoFlav;
313 if (!customConfig.empty()) {
314 isoName +=
"_" + customConfig;
319 cisoH.
isoDeco.emplace_back(isoName);
322 tisoH.
isoDeco.emplace_back(isoName);
325 std::string isoNameV = prefix +
"ptvarcone" + std::to_string(coneSize);
326 if (!customConfig.empty()) {
327 isoNameV +=
"_" + customConfig;
329 tisoH.
isoDecoV.emplace_back(isoNameV);
332 << isoFlav <<
" not supported.");
333 return StatusCode::FAILURE;
339 ATH_MSG_WARNING(
"The configuration was malformed: an empty inner vector "
340 "was added; ignoring");
359 flavor, isoFlav, cisoH, corInts,
false, prefix, customConfig));
361 flavor, isoFlav, cisoH, corIntsExtra,
true, prefix, customConfig));
364 caloIsoMap->push_back(std::make_pair(isoFlav, cisoH));
367 "caloIsoMap was nullptr but the configuration attempted to use it");
368 return StatusCode::FAILURE;
379 flavor, isoFlav, tisoH, corInts,
false, prefix, customConfig));
381 flavor, isoFlav, tisoH, corIntsExtra,
true, prefix, customConfig));
384 trackIsoMap->push_back(std::make_pair(isoFlav, tisoH));
387 "trackIsoMap was nullptr but the configuration attempted to use it");
388 return StatusCode::FAILURE;
393 <<
" does not exist ! Check your inputs");
395 runIsoType.insert(isoFlav);
397 return StatusCode::SUCCESS;
405 const std::vector<std::vector<int>>& corInts,
407 const std::string& prefix,
408 const std::string& customConfig)
411 if (!corrsAreExtra) {
412 std::string bitsetName =
414 if (!customConfig.empty()) {
415 bitsetName +=
"_" + customConfig;
423 for (
size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
425 const auto cor =
static_cast<unsigned int>(corInts[flavor][corrType]);
432 std::string isoCorName = prefix;
440 if (!customConfig.empty()) {
441 isoCorName +=
"_" + customConfig;
458 if (!customConfig.empty()) {
459 corName +=
"_" + customConfig;
461 vec.emplace_back(corName);
468 return StatusCode::SUCCESS;
476 const std::vector<std::vector<int>>& corInts,
478 const std::string& prefix,
479 const std::string& customConfig)
482 if (!corrsAreExtra) {
483 std::string bitsetName =
485 if (!customConfig.empty()) {
486 bitsetName +=
"_" + customConfig;
494 for (
size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
495 const auto cor =
static_cast<unsigned int>(corInts[flavor][corrType]);
505 if (!customConfig.empty()) {
506 isoCorName +=
"_" + customConfig;
513 return StatusCode::SUCCESS;
518 const std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>&
522 for (
const auto& pr : caloIsoMap) {
525 const auto& keys = pr.second;
531 ATH_MSG_FATAL(
"Have a CaloIsoHelpHandles with no actual isolations; "
532 "something wrong happened");
533 return StatusCode::FAILURE;
538 if (readHandle.isAvailable()){
540 ATH_MSG_DEBUG(
"read (actually a write) handle for " << keys.isoDeco[0].key() <<
" already exists. "
541 <<
"Will not recompute." );
542 return StatusCode::SUCCESS;
545 if (!readHandle.isValid()) {
547 << keys.isoDeco[0].key());
548 return StatusCode::FAILURE;
551 for (
const auto *part : *readHandle) {
553 bool successfulCalc =
false;
556 CaloIsoResult, *part, keys.isoTypes, keys.CorrList, cellColl);
559 CaloIsoResult, *part, keys.isoTypes, keys.CorrList);
562 CaloIsoResult, *part, keys.isoTypes, keys.CorrList);
565 if (successfulCalc) {
566 for (
unsigned int i = 0; i < keys.isoTypes.size(); i++) {
567 float iso = CaloIsoResult.
etcones[i];
569 <<
" = " << iso / 1e3);
570 (handles.
isoDeco[i])(*part) = iso;
573 (handles.
corrBitsetDeco)(*part) = keys.CorrList.calobitset.to_ulong();
583 ATH_MSG_FATAL(
"Could not find core correction of required type: "
586 return StatusCode::FAILURE;
592 if (it == corIter->second.end()) {
596 return StatusCode::FAILURE;
600 (coreCorDecoPr.second)(*part) = it->second;
609 ATH_MSG_FATAL(
"Could not find noncore correction of required type: "
612 return StatusCode::FAILURE;
617 auto& vecHandles = noncoreCorDecoPr.second;
618 for (
size_t i = 0; i < vecHandles.size(); i++) {
619 (vecHandles[i])(*part) = corIter->second[i];
625 return StatusCode::FAILURE;
629 return StatusCode::SUCCESS;
634 const std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>&
637 for (
const auto& pr : trackIsoMap) {
639 const auto& keys = pr.second;
645 ATH_MSG_FATAL(
"Have a TrackIsoHelpHandles with no actual isolations; "
646 "something wrong happened");
647 return StatusCode::FAILURE;
652 if (readHandle.isAvailable()){
654 ATH_MSG_DEBUG(
"Decoration for for " << keys.isoDeco[0].key() <<
" already exists. "
655 <<
"Will not recompute." );
656 return StatusCode::SUCCESS;
659 if (!readHandle.isValid()) {
661 << keys.isoDeco[0].key());
662 return StatusCode::FAILURE;
665 for (
const auto *part : *readHandle) {
667 bool successfulCalc =
false;
669 const auto * eg =
dynamic_cast<const xAOD::Egamma*
>(part);
671 ATH_MSG_DEBUG(
"Doing track isolation on an egamma particle");
672 std::unique_ptr<xAOD::Vertex> trigVtx =
nullptr;
673 std::set<const xAOD::TrackParticle*> tracksToExclude;
679 trigVtx = std::make_unique<xAOD::Vertex>();
680 trigVtx->makePrivateStore();
681 trigVtx->setZ(el->trackParticle()->z0() + el->trackParticle()->vz());
682 ATH_MSG_DEBUG(
"will use a vertex at z = " << trigVtx->z() <<
" to compute electron track isolation");
691 const auto * gam =
dynamic_cast<const xAOD::Photon*
>(eg);
692 if (gam && gam->nVertices() > 0) {
695 tracksToExclude.insert(
710 ATH_MSG_DEBUG(
"Not doing track isolation on an egamma particle");
712 TrackIsoResult, *part, keys.isoTypes, keys.CorrList);
715 if (successfulCalc) {
716 for (
unsigned int i = 0; i < keys.isoTypes.size(); i++) {
717 float iso = TrackIsoResult.
ptcones[i];
720 <<
" = " << iso / 1e3
721 <<
", var cone = " << isoV / 1e3);
722 (handles.
isoDeco[i])(*part) = iso;
723 (handles.
isoDecoV[i])(*part) = isoV;
727 (handles.
corrBitsetDeco)(*part) = keys.CorrList.trackbitset.to_ulong();
735 ATH_MSG_FATAL(
"Could not find core correction of required type: "
738 return StatusCode::FAILURE;
742 (coreCorDecoPr.second)(*part) = corIter->second;
746 ATH_MSG_FATAL(
"Call to TrackIsolationTool failed for flavor "
748 return StatusCode::FAILURE;
752 return StatusCode::SUCCESS;
757 std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& caloIso)
759 for (
auto& iso : caloIso) {
760 iso.second.declare(
this);
766 std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>&
769 for (
auto& iso : trackIso) {
770 iso.second.declare(
this);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(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::string > m_customConfigFwd
IsolationBuilder()
Default constructor:
virtual ~IsolationBuilder()
Destructor:
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
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< std::vector< std::vector< int > > > m_fecorIntsExtra
Gaudi::Property< bool > m_useBremAssoc
std::vector< std::pair< xAOD::Iso::IsolationFlavour, TrackIsoHelpKey > > m_phTrackIso
std::vector< std::pair< xAOD::Iso::IsolationFlavour, CaloIsoHelpKey > > m_feCaloIso
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
Gaudi::Property< std::vector< std::vector< int > > > m_fecorInts
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)
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
ToolHandle< xAOD::ITrackIsolationTool > m_trackIsolationTool
Tool for neutral pflow isolation calculation.
Gaudi::Property< std::vector< std::vector< int > > > m_feisoInts
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
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