Print

Print


Commit in slicPandora on MAIN
include/SiDFineGranularityContent.h+221added 1.1
       /SiDFineGranularityParticleId.h+170added 1.1
src/SiDFineGranularityParticleId.cc+779added 1.1
   /JobManager.cpp+1-11.15 -> 1.16
+1171-1
3 added + 1 modified, total 4 files
Adding classes to perform simple particle ID for SiD

slicPandora/include
SiDFineGranularityContent.h added at 1.1
diff -N SiDFineGranularityContent.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiDFineGranularityContent.h	3 Sep 2012 11:10:14 -0000	1.1
@@ -0,0 +1,221 @@
+/**
+ *  @file   PandoraPFANew/FineGranularityContent/include/FineGranularityContent.h
+ * 
+ *  @brief  Header file detailing content for use with a fine granularity particle flow detector
+ * 
+ *  $Log: SiDFineGranularityContent.h,v $
+ *  Revision 1.1  2012/09/03 11:10:14  jstrube
+ *  Adding classes to perform simple particle ID for SiD
+ *
+ */
+#ifndef SID_FINE_GRANULARITY_CONTENT_H
+#define SID_FINE_GRANULARITY_CONTENT_H 1
+
+#include "Cheating/CheatingClusterMergingAlgorithm.h"
+#include "Cheating/CheatingPfoCreationAlgorithm.h"
+#include "Cheating/CheatingTrackToClusterMatching.h"
+#include "Cheating/PerfectClusteringAlgorithm.h"
+#include "Cheating/PerfectFragmentRemovalAlgorithm.h"
+
+#include "Clustering/ClusteringParentAlgorithm.h"
+#include "Clustering/ConeClusteringAlgorithm.h"
+#include "Clustering/ForcedClusteringAlgorithm.h"
+#include "Clustering/InwardConeClusteringAlgorithm.h"
+#include "Clustering/LineClusteringAlgorithm.h"
+
+#include "FragmentRemoval/FragmentRemovalParentAlgorithm.h"
+#include "FragmentRemoval/MainFragmentRemovalAlgorithm.h"
+#include "FragmentRemoval/MergeSplitPhotonsAlgorithm.h"
+#include "FragmentRemoval/NeutralFragmentRemovalAlgorithm.h"
+#include "FragmentRemoval/PhotonFragmentRemovalAlgorithm.h"
+#include "FragmentRemoval/BeamHaloMuonRemovalAlgorithm.h"
+
+#include "Monitoring/CaloHitMonitoringAlgorithm.h"
+#include "Monitoring/DumpPfosMonitoringAlgorithm.h"
+#include "Monitoring/EfficiencyMonitoringAlgorithm.h"
+#include "Monitoring/EnergyMonitoringAlgorithm.h"
+#include "Monitoring/MCParticlesMonitoringAlgorithm.h"
+#include "Monitoring/VisualMonitoringAlgorithm.h"
+
+#include "ParticleId/FinalParticleIdAlgorithm.h"
+#include "ParticleId/MuonReconstructionAlgorithm.h"
+#include "ParticleId/PhotonReconstructionAlgorithm.h"
+#include "ParticleId/PhotonRecoveryAlgorithm.h"
+
+#include "Persistency/EventReadingAlgorithm.h"
+#include "Persistency/EventWritingAlgorithm.h"
+
+#include "PfoConstruction/CLICPfoSelectionAlgorithm.h"
+#include "PfoConstruction/KinkPfoCreationAlgorithm.h"
+#include "PfoConstruction/PfoCreationAlgorithm.h"
+#include "PfoConstruction/PfoCreationParentAlgorithm.h"
+#include "PfoConstruction/V0PfoCreationAlgorithm.h"
+
+#include "Reclustering/ExitingTrackAlg.h"
+#include "Reclustering/ForceSplitTrackAssociationsAlg.h"
+#include "Reclustering/ReclusteringParentAlgorithm.h"
+#include "Reclustering/ResolveTrackAssociationsAlg.h"
+#include "Reclustering/SplitMergedClustersAlg.h"
+#include "Reclustering/SplitTrackAssociationsAlg.h"
+#include "Reclustering/TrackDrivenAssociationAlg.h"
+#include "Reclustering/TrackDrivenMergingAlg.h"
+
+#include "TopologicalAssociation/BackscatteredTracksAlgorithm.h"
+#include "TopologicalAssociation/BackscatteredTracks2Algorithm.h"
+#include "TopologicalAssociation/BrokenTracksAlgorithm.h"
+#include "TopologicalAssociation/ConeBasedMergingAlgorithm.h"
+#include "TopologicalAssociation/IsolatedHitMergingAlgorithm.h"
+#include "TopologicalAssociation/LoopingTracksAlgorithm.h"
+#include "TopologicalAssociation/MipPhotonSeparationAlgorithm.h"
+#include "TopologicalAssociation/MuonPhotonSeparationAlgorithm.h"
+#include "TopologicalAssociation/MuonClusterAssociationAlgorithm.h"
+#include "TopologicalAssociation/ProximityBasedMergingAlgorithm.h"
+#include "TopologicalAssociation/ShowerMipMergingAlgorithm.h"
+#include "TopologicalAssociation/ShowerMipMerging2Algorithm.h"
+#include "TopologicalAssociation/ShowerMipMerging3Algorithm.h"
+#include "TopologicalAssociation/ShowerMipMerging4Algorithm.h"
+#include "TopologicalAssociation/SoftClusterMergingAlgorithm.h"
+#include "TopologicalAssociation/TopologicalAssociationParentAlgorithm.h"
+
+#include "TrackClusterAssociation/LoopingTrackAssociationAlgorithm.h"
+#include "TrackClusterAssociation/TrackClusterAssociationAlgorithm.h"
+#include "TrackClusterAssociation/TrackRecoveryAlgorithm.h"
+#include "TrackClusterAssociation/TrackRecoveryHelixAlgorithm.h"
+#include "TrackClusterAssociation/TrackRecoveryInteractionsAlgorithm.h"
+
+#include "Utility/ClusterPreparationAlgorithm.h"
+#include "Utility/EventPreparationAlgorithm.h"
+#include "Utility/PfoPreparationAlgorithm.h"
+#include "Utility/TrackPreparationAlgorithm.h"
+
+#include "FineGranularityEnergyCorrections.h"
+#include "SiDFineGranularityParticleId.h"
+
+#include "FineGranularityPseudoLayerCalculator.h"
+#include "FineGranularityShowerProfileCalculator.h"
+
+/**
+ *  @brief  FineGranularityContent class
+ */
+class FineGranularityContent
+{
+public:
+    #define FINE_GRANULARITY_ALGORITHM_LIST(d)                                                                                  \
+        d("CheatingClusterMerging",                 CheatingClusterMergingAlgorithm::Factory)                                   \
+        d("CheatingPfoCreation",                    CheatingPfoCreationAlgorithm::Factory)                                      \
+        d("CheatingTrackToClusterMatching",         CheatingTrackToClusterMatching::Factory)                                    \
+        d("PerfectClustering",                      PerfectClusteringAlgorithm::Factory)                                        \
+        d("PerfectFragmentRemoval",                 PerfectFragmentRemovalAlgorithm::Factory)                                   \
+        d("ClusteringParent",                       ClusteringParentAlgorithm::Factory)                                         \
+        d("ConeClustering",                         ConeClusteringAlgorithm::Factory)                                           \
+        d("ForcedClustering",                       ForcedClusteringAlgorithm::Factory)                                         \
+        d("InwardConeClustering",                   InwardConeClusteringAlgorithm::Factory)                                     \
+        d("LineClustering",                         LineClusteringAlgorithm::Factory)                                           \
+        d("FragmentRemovalParent",                  FragmentRemovalParentAlgorithm::Factory)                                    \
+        d("MainFragmentRemoval",                    MainFragmentRemovalAlgorithm::Factory)                                      \
+        d("MergeSplitPhotons",                       MergeSplitPhotonsAlgorithm::Factory)                                        \
+        d("NeutralFragmentRemoval",                 NeutralFragmentRemovalAlgorithm::Factory)                                   \
+        d("PhotonFragmentRemoval",                  PhotonFragmentRemovalAlgorithm::Factory)                                    \
+        d("BeamHaloMuonRemoval",                    BeamHaloMuonRemovalAlgorithm::Factory)                                      \
+        d("CaloHitMonitoring",                      CaloHitMonitoringAlgorithm::Factory)                                        \
+        d("DumpPfosMonitoring",                     DumpPfosMonitoringAlgorithm::Factory)                                       \
+        d("EfficiencyMonitoring",                   EfficiencyMonitoringAlgorithm::Factory)                                     \
+        d("EnergyMonitoring",                       EnergyMonitoringAlgorithm::Factory)                                         \
+        d("MCParticlesMonitoring",                  MCParticlesMonitoringAlgorithm::Factory)                                    \
+        d("VisualMonitoring",                       VisualMonitoringAlgorithm::Factory)                                         \
+        d("FinalParticleId",                        FinalParticleIdAlgorithm::Factory)                                          \
+        d("MuonReconstruction",                     MuonReconstructionAlgorithm::Factory)                                       \
+        d("PhotonReconstruction",                   PhotonReconstructionAlgorithm::Factory)                                     \
+        d("PhotonRecovery",                         PhotonRecoveryAlgorithm::Factory)                                           \
+        d("EventReading",                           EventReadingAlgorithm::Factory)                                             \
+        d("EventWriting",                           EventWritingAlgorithm::Factory)                                             \
+        d("CLICPfoSelection",                       CLICPfoSelectionAlgorithm::Factory)                                         \
+        d("KinkPfoCreation",                        KinkPfoCreationAlgorithm::Factory)                                          \
+        d("PfoCreation",                            PfoCreationAlgorithm::Factory)                                              \
+        d("PfoCreationParent",                      PfoCreationParentAlgorithm::Factory)                                        \
+        d("V0PfoCreation",                          V0PfoCreationAlgorithm::Factory)                                            \
+        d("ExitingTrack",                           ExitingTrackAlg::Factory)                                                   \
+        d("ForceSplitTrackAssociations",            ForceSplitTrackAssociationsAlg::Factory)                                    \
+        d("ReclusteringParent",                     ReclusteringParentAlgorithm::Factory)                                       \
+        d("ResolveTrackAssociations",               ResolveTrackAssociationsAlg::Factory)                                       \
+        d("SplitMergedClusters",                    SplitMergedClustersAlg::Factory)                                            \
+        d("SplitTrackAssociations",                 SplitTrackAssociationsAlg::Factory)                                         \
+        d("TrackDrivenAssociation",                 TrackDrivenAssociationAlg::Factory)                                         \
+        d("TrackDrivenMerging",                     TrackDrivenMergingAlg::Factory)                                             \
+        d("BackscatteredTracks",                    BackscatteredTracksAlgorithm::Factory)                                      \
+        d("BackscatteredTracks2",                   BackscatteredTracks2Algorithm::Factory)                                     \
+        d("BrokenTracks",                           BrokenTracksAlgorithm::Factory)                                             \
+        d("ConeBasedMerging",                       ConeBasedMergingAlgorithm::Factory)                                         \
+        d("IsolatedHitMerging",                     IsolatedHitMergingAlgorithm::Factory)                                       \
+        d("LoopingTracks",                          LoopingTracksAlgorithm::Factory)                                            \
+        d("MipPhotonSeparation",                    MipPhotonSeparationAlgorithm::Factory)                                      \
+        d("MuonPhotonSeparation",                   MuonPhotonSeparationAlgorithm::Factory)                                     \
+        d("MuonClusterAssociation",                 MuonClusterAssociationAlgorithm::Factory)                                   \
+        d("ProximityBasedMerging",                  ProximityBasedMergingAlgorithm::Factory)                                    \
+        d("ShowerMipMerging",                       ShowerMipMergingAlgorithm::Factory)                                         \
+        d("ShowerMipMerging2",                      ShowerMipMerging2Algorithm::Factory)                                        \
+        d("ShowerMipMerging3",                      ShowerMipMerging3Algorithm::Factory)                                        \
+        d("ShowerMipMerging4",                      ShowerMipMerging4Algorithm::Factory)                                        \
+        d("SoftClusterMerging",                     SoftClusterMergingAlgorithm::Factory)                                       \
+        d("TopologicalAssociationParent",           TopologicalAssociationParentAlgorithm::Factory)                             \
+        d("LoopingTrackAssociation",                LoopingTrackAssociationAlgorithm::Factory)                                  \
+        d("TrackRecovery",                          TrackRecoveryAlgorithm::Factory)                                            \
+        d("TrackRecoveryHelix",                     TrackRecoveryHelixAlgorithm::Factory)                                       \
+        d("TrackRecoveryInteractions",              TrackRecoveryInteractionsAlgorithm::Factory)                                \
+        d("TrackClusterAssociation",                TrackClusterAssociationAlgorithm::Factory)                                  \
+        d("ClusterPreparation",                     ClusterPreparationAlgorithm::Factory)                                       \
+        d("EventPreparation",                       EventPreparationAlgorithm::Factory)                                         \
+        d("PfoPreparation",                         PfoPreparationAlgorithm::Factory)                                           \
+        d("TrackPreparation",                       TrackPreparationAlgorithm::Factory)
+
+    #define FINE_GRANULARITY_ENERGY_CORRECTION_LIST(d)                                                                          \
+        d("CleanClusters",          pandora::HADRONIC,          &FineGranularityEnergyCorrections::CleanCluster)                \
+        d("ScaleHotHadrons",        pandora::HADRONIC,          &FineGranularityEnergyCorrections::ScaleHotHadronEnergy)        \
+        d("MuonCoilCorrection",     pandora::HADRONIC,          &FineGranularityEnergyCorrections::ApplyMuonEnergyCorrection)
+
+    #define FINE_GRANULARITY_PARTICLE_ID_LIST(d)                                                                                \
+        d("SiDFineGranularityEmShowerId",                       &SiDFineGranularityParticleId::EmShowerId)          \
+        d("SiDFineGranularityPhotonId",                         &SiDFineGranularityParticleId::PhotonId)            \
+        d("SiDFineGranularityElectronId",                       &SiDFineGranularityParticleId::ElectronId)          \
+        d("SiDFineGranularityMuonId",                           &SiDFineGranularityParticleId::MuonId)
+
+    #define FINE_GRANULARITY_SETTINGS_LIST(d)                                                                                   \
+        d("EnergyCorrections",                                  &FineGranularityEnergyCorrections::ReadSettings)                \
+        d("ParticleId",                                         &SiDFineGranularityParticleId::ReadSettings)
+
+    /**
+     *  @brief  Register all the fine granularity algorithms with pandora
+     * 
+     *  @param  pandora the pandora instance with which to register content
+     */
+    static pandora::StatusCode RegisterAlgorithms(pandora::Pandora &pandora);
+
+    /**
+     *  @brief  Register all the fine granularity helper functions with pandora
+     * 
+     *  @param  pandora the pandora instance with which to register content
+     */
+    static pandora::StatusCode RegisterHelperFunctions(pandora::Pandora &pandora);
+};
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+inline pandora::StatusCode FineGranularityContent::RegisterAlgorithms(pandora::Pandora &pandora)
+{
+    FINE_GRANULARITY_ALGORITHM_LIST(PANDORA_REGISTER_ALGORITHM);
+
+    return pandora::STATUS_CODE_SUCCESS;
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+inline pandora::StatusCode FineGranularityContent::RegisterHelperFunctions(pandora::Pandora &pandora)
+{
+    FINE_GRANULARITY_ENERGY_CORRECTION_LIST(PANDORA_REGISTER_ENERGY_CORRECTION);
+    FINE_GRANULARITY_PARTICLE_ID_LIST(PANDORA_REGISTER_PARTICLE_ID);
+    FINE_GRANULARITY_SETTINGS_LIST(PANDORA_REGISTER_SETTINGS);
+
+    return pandora::STATUS_CODE_SUCCESS;
+}
+
+#endif // #ifndef FINE_GRANULARITY_CONTENT_H

slicPandora/include
SiDFineGranularityParticleId.h added at 1.1
diff -N SiDFineGranularityParticleId.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiDFineGranularityParticleId.h	3 Sep 2012 11:10:14 -0000	1.1
@@ -0,0 +1,170 @@
+/**
+ *  @file   PandoraPFANew/FineGranularityContent/include/FineGranularityParticleId.h
+ * 
+ *  @brief  Header file for the fine granularity particle id class.
+ * 
+ *  $Log: SiDFineGranularityParticleId.h,v $
+ *  Revision 1.1  2012/09/03 11:10:14  jstrube
+ *  Adding classes to perform simple particle ID for SiD
+ *
+ */
+#ifndef SID_FINE_GRANULARITY_PARTICLE_ID_H
+#define SID_FINE_GRANULARITY_PARTICLE_ID_H 1
+
+#include "Pandora/PandoraInternal.h"
+#include "Pandora/PandoraInputTypes.h"
+#include "Pandora/StatusCodes.h"
+
+#include "Xml/tinyxml.h"
+
+/**
+ *  @brief  FineGranularityParticleId class
+ */
+class SiDFineGranularityParticleId
+{
+public:
+    /**
+     *  @brief  Whether a cluster is a candidate electromagnetic shower
+     * 
+     *  @param  pCluster address of the cluster
+     * 
+     *  @return boolean
+     */
+    static bool EmShowerId(const pandora::Cluster *const pCluster);
+
+    /**
+     *  @brief  Photon identification for use with fine granularity particle flow detectors
+     * 
+     *  @param  pCluster address of the cluster
+     * 
+     *  @return boolean
+     */
+    static bool PhotonId(const pandora::Cluster *const pCluster);
+
+    /**
+     *  @brief  Electron identification for use with fine granularity particle flow detectors
+     * 
+     *  @param  pCluster address of the cluster
+     * 
+     *  @return boolean
+     */
+    static bool ElectronId(const pandora::Cluster *const pCluster);
+
+    /**
+     *  @brief  Muon identification for use with fine granularity particle flow detectors
+     * 
+     *  @param  pCluster address of the cluster
+     * 
+     *  @return boolean
+     */
+    static bool MuonId(const pandora::Cluster *const pCluster);
+
+    /**
+     *  @brief  Read the fine granularity particle id settings
+     * 
+     *  @param  xmlHandle the relevant xml handle
+     */
+    static pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle);
+
+private:
+    typedef std::pair<float, float> HitEnergyDistance;
+    typedef std::vector<HitEnergyDistance> HitEnergyDistanceVector;
+
+    /**
+     *  @brief  Sort HitEnergyDistance objects by increasing distance
+     * 
+     *  @param  lhs the first hit energy distance pair
+     *  @param  rhs the second hit energy distance pair
+     */
+    static bool SortHitsByDistance(const HitEnergyDistance &lhs, const HitEnergyDistance &rhs);
+
+    static float        m_emShowerIdMipCut_0;               ///< Default cluster mip fraction cut for emshw id
+    static float        m_emShowerIdMipCutEnergy_1;         ///< Energy above which mip fraction cut value 1 is applied
+    static float        m_emShowerIdMipCut_1;               ///< Cluster mip fraction cut value 1
+    static float        m_emShowerIdMipCutEnergy_2;         ///< Energy above which mip fraction cut value 2 is applied
+    static float        m_emShowerIdMipCut_2;               ///< Cluster mip fraction cut value 2
+    static float        m_emShowerIdMipCutEnergy_3;         ///< Energy above which mip fraction cut value 3 is applied
+    static float        m_emShowerIdMipCut_3;               ///< Cluster mip fraction cut value 3
+    static float        m_emShowerIdMipCutEnergy_4;         ///< Energy above which mip fraction cut value 4 is applied
+    static float        m_emShowerIdMipCut_4;               ///< Cluster mip fraction cut value 4
+    static float        m_emShowerIdDCosRCutEnergy;         ///< Energy at which emshw id cut (on cluster fit result dCosR) changes
+    static float        m_emShowerIdDCosRLowECut;           ///< Low energy cut on cluster fit result dCosR
+    static float        m_emShowerIdDCosRHighECut;          ///< High energy cut on cluster fit result dCosR
+    static float        m_emShowerIdRmsCutEnergy;           ///< Energy at which emshw id cut (on cluster fit result rms) changes
+    static float        m_emShowerIdRmsLowECut;             ///< Low energy cut on cluster fit result rms
+    static float        m_emShowerIdRmsHighECut;            ///< High energy cut on cluster fit result rms
+    static float        m_emShowerIdMinCosAngle;            ///< Min angular correction used to adjust radiation length measures
+    static float        m_emShowerIdMaxInnerLayerRadLengths;///< Max number of radiation lengths before cluster inner layer
+    static float        m_emShowerIdMinLayer90RadLengths;   ///< Min number of radiation lengths before cluster layer90
+    static float        m_emShowerIdMaxLayer90RadLengths;   ///< Max number of radiation lengths before cluster layer90
+    static float        m_emShowerIdMinShowerMaxRadLengths; ///< Min number of radiation lengths before cluster shower max layer
+    static float        m_emShowerIdMaxShowerMaxRadLengths; ///< Max number of radiation lengths before cluster shower max layer
+    static float        m_emShowerIdHighRadLengths;         ///< Max number of radiation lengths expected to be spanned by em shower
+    static float        m_emShowerIdMaxHighRadLengthEnergyFraction;   ///< Max fraction of cluster energy above max expected radiation lengths
+    static float        m_emShowerIdMaxRadial90;            ///< Max value of transverse profile radial90
+
+    static unsigned int m_electronIdMaxInnerLayer;          ///< Max inner psuedo layer for fast electron id
+    static float        m_electronIdMaxEnergy;              ///< Max electromagnetic energy for fast electron id
+    static float        m_electronIdMaxProfileStart;        ///< Max shower profile start for fast electron id
+    static float        m_electronIdMaxProfileDiscrepancy;  ///< Max shower profile discrepancy for fast electron id
+    static float        m_electronIdProfileDiscrepancyForAutoId;    ///< Shower profile discrepancy for automatic fast electron selection
+    static float        m_electronIdMaxResidualEOverP;      ///< Max absolute difference between unity and ratio em energy / track momentum
+
+    static unsigned int m_muonIdMaxInnerLayer;              ///< Max inner psuedo layer for fast muon id
+    static float        m_muonIdMinTrackEnergy;             ///< Min energy of associated track for fast muon id
+    static float        m_muonIdMaxHCalHitEnergy;           ///< Max hadronic energy for an individual hcal hit (suppress fluctuations)
+    static unsigned int m_muonIdMinECalLayers;              ///< Min number of ecal layers for fast muon id
+    static unsigned int m_muonIdMinHCalLayers;              ///< Min number of hcal layers for fast muon id
+    static bool         m_muonIdShouldPerformGapCheck;      ///< Whether to perform muon recovery gap checks
+    static unsigned int m_muonIdMinHCalLayersForGapCheck;   ///< Min number of hcal layers to perform muon recovery gap check
+    static unsigned int m_muonIdMinMuonHitsForGapCheck;     ///< Min number of muon hits to perform muon recovery gap check
+    static float        m_muonIdECalEnergyCut0;             ///< Parameter 0 for ecal energy cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdECalEnergyCut1;             ///< Parameter 1 for ecal energy cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalEnergyCut0;             ///< Parameter 0 for hcal energy cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalEnergyCut1;             ///< Parameter 1 for hcal energy cut: cut = par0 + (par1 * trackEnergy)
+    static unsigned int m_muonIdMinECalLayersForFit;        ///< Min number of ecal layers to perform fit to ecal section of cluster
+    static unsigned int m_muonIdMinHCalLayersForFit;        ///< Min number of hcal layers to perform fit to hcal section of cluster
+    static unsigned int m_muonIdMinMuonLayersForFit;        ///< Min number of muon layers to perform fit to muon section of cluster
+    static unsigned int m_muonIdECalFitInnerLayer;          ///< Inner layer used for fit to ecal section of cluster
+    static unsigned int m_muonIdECalFitOuterLayer;          ///< Outer layer used for fit to ecal section of cluster
+    static unsigned int m_muonIdHCalFitInnerLayer;          ///< Inner layer used for fit to hcal section of cluster
+    static unsigned int m_muonIdHCalFitOuterLayer;          ///< Outer layer used for fit to hcal section of cluster
+    static float        m_muonIdECalRmsCut0;                ///< Parameter 0 for ecal rms cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdECalRmsCut1;                ///< Parameter 1 for ecal rms cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdECalMaxRmsCut;              ///< Max value of ecal rms cut
+    static float        m_muonIdHCalRmsCut0;                ///< Parameter 0 for hcal rms cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalRmsCut1;                ///< Parameter 0 for hcal rms cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalMaxRmsCut;              ///< Max value of hcal rms cut
+    static float        m_muonIdECalMipFractionCut0;        ///< Parameter 0 for ecal mip fraction cut: cut = par0 - (par1 * trackEnergy)
+    static float        m_muonIdECalMipFractionCut1;        ///< Parameter 1 for ecal mip fraction cut: cut = par0 - (par1 * trackEnergy)
+    static float        m_muonIdECalMaxMipFractionCut;      ///< Max value of ecal mip fraction cut
+    static float        m_muonIdHCalMipFractionCut0;        ///< Parameter 0 for hcal mip fraction cut: cut = par0 - (par1 * trackEnergy)
+    static float        m_muonIdHCalMipFractionCut1;        ///< Parameter 1 for hcal mip fraction cut: cut = par0 - (par1 * trackEnergy)
+    static float        m_muonIdHCalMaxMipFractionCut;      ///< Max value of hcal mip fraction cut
+    static float        m_muonIdECalHitsPerLayerCut0;       ///< Parameter 0 for ecal hits per layer cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdECalHitsPerLayerCut1;       ///< Parameter 1 for ecal hits per layer cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdECalMaxHitsPerLayerCut;     ///< Max value of ecal hits per layer cut
+    static float        m_muonIdHCalHitsPerLayerCut0;       ///< Parameter 0 for hcal hits per layer cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalHitsPerLayerCut1;       ///< Parameter 1 for hcal hits per layer cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdHCalMaxHitsPerLayerCut;     ///< Max value of hcal hits per layer cut
+    static float        m_muonIdCurlingTrackEnergy;         ///< Max energy for associated track to be considered as curling
+    static float        m_muonIdInBarrelHitFraction;        ///< Min fraction of hcal hits in barrel region to identify "barrel cluster"
+    static float        m_muonIdTightMipFractionCut;        ///< Tight mip fraction cut
+    static float        m_muonIdTightMipFractionECalCut;    ///< Tight ecal mip fraction cut
+    static float        m_muonIdTightMipFractionHCalCut;    ///< Tight hcal mip fraction cut
+    static unsigned int m_muonIdMinMuonHitsCut;             ///< Min number of hits in muon region
+    static unsigned int m_muonIdMinMuonTrackSegmentHitsCut; ///< Min number of muon track segment hits
+    static float        m_muonIdMuonRmsCut;                 ///< Muon rms cut
+    static float        m_muonIdMaxMuonHitsCut0;            ///< Parameter 0 for max muon hits cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdMaxMuonHitsCut1;            ///< Parameter 1 for max muon hits cut: cut = par0 + (par1 * trackEnergy)
+    static float        m_muonIdMaxMuonHitsCutMinValue;     ///< Min value of max muon hits cut
+};
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+inline bool SiDFineGranularityParticleId::SortHitsByDistance(const HitEnergyDistance &lhs, const HitEnergyDistance &rhs)
+{
+    return (lhs.second < rhs.second);
+}
+
+#endif // #ifndef FINE_GRANULARITY_PARTICLE_ID_H

slicPandora/src
SiDFineGranularityParticleId.cc added at 1.1
diff -N SiDFineGranularityParticleId.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiDFineGranularityParticleId.cc	3 Sep 2012 11:10:15 -0000	1.1
@@ -0,0 +1,779 @@
+/**
+ *  @file   PandoraPFANew/FineGranularityContent/src/FineGranularityParticleId.cc
+ * 
+ *  @brief  Implementation of the fine granularity particle id class.
+ * 
+ *  $Log: SiDFineGranularityParticleId.cc,v $
+ *  Revision 1.1  2012/09/03 11:10:15  jstrube
+ *  Adding classes to perform simple particle ID for SiD
+ *
+ */
+
+#include "Helpers/GeometryHelper.h"
+#include "Helpers/XmlHelper.h"
+
+#include "Objects/Cluster.h"
+#include "Objects/Track.h"
+
+#include "SiDFineGranularityParticleId.h"
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+using namespace pandora;
+
+bool SiDFineGranularityParticleId::EmShowerId(const Cluster *const pCluster)
+{
+    // Reject clusters starting outside inner fine granularity detectors
+    if (GeometryHelper::GetHitTypeGranularity(pCluster->GetInnerLayerHitType()) > FINE)
+        return false;
+
+    // Cut on cluster mip fraction
+    const float totalElectromagneticEnergy(pCluster->GetElectromagneticEnergy() - pCluster->GetIsolatedElectromagneticEnergy());
+
+    float mipCut(m_emShowerIdMipCut_0);
+
+    if (totalElectromagneticEnergy > m_emShowerIdMipCutEnergy_1)
+    {
+        mipCut = m_emShowerIdMipCut_1;
+    }
+    else if (totalElectromagneticEnergy > m_emShowerIdMipCutEnergy_2)
+    {
+        mipCut = m_emShowerIdMipCut_2;
+    }
+    else if (totalElectromagneticEnergy > m_emShowerIdMipCutEnergy_3)
+    {
+        mipCut = m_emShowerIdMipCut_3;
+    }
+    else if (totalElectromagneticEnergy > m_emShowerIdMipCutEnergy_4)
+    {
+        mipCut = m_emShowerIdMipCut_4;
+    }
+
+    if (pCluster->GetMipFraction() > mipCut)
+        return false;
+
+    // Cut on results of fit to all hits in cluster
+    float dCosR(0.f);
+    float clusterRms(0.f);
+
+    const ClusterHelper::ClusterFitResult &clusterFitResult(pCluster->GetFitToAllHitsResult());
+
+    if (clusterFitResult.IsFitSuccessful())
+    {
+        dCosR = clusterFitResult.GetRadialDirectionCosine();
+        clusterRms = clusterFitResult.GetRms();
+    }
+
+    const float dCosRCut(totalElectromagneticEnergy < m_emShowerIdDCosRCutEnergy ? m_emShowerIdDCosRLowECut : m_emShowerIdDCosRHighECut);
+
+    if (dCosR < dCosRCut)
+        return false;
+
+    const float rmsCut(totalElectromagneticEnergy < m_emShowerIdRmsCutEnergy ? m_emShowerIdRmsLowECut : m_emShowerIdRmsHighECut);
+
+    if (clusterRms > rmsCut)
+        return false;
+
+    const CartesianVector &clusterDirection(pCluster->GetFitToAllHitsResult().IsFitSuccessful() ?
+        pCluster->GetFitToAllHitsResult().GetDirection() : pCluster->GetInitialDirection());
+
+    const CartesianVector &clusterIntercept(pCluster->GetFitToAllHitsResult().IsFitSuccessful() ?
+        pCluster->GetFitToAllHitsResult().GetIntercept() : CartesianVector(0.f, 0.f, 0.f));
+
+    // Calculate properties of longitudinal shower profile: layer90 and shower max layer
+    bool foundLayer90(false);
+    float layer90EnergySum(0.f), showerMaxRadLengths(0.f), energyAboveHighRadLengths(0.f);
+    float nRadiationLengths(0.f), nRadiationLengthsInLastLayer(0.f), maxEnergyInlayer(0.f);
+    HitEnergyDistanceVector hitEnergyDistanceVector;
+
+    const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
+    const PseudoLayer innerPseudoLayer(pCluster->GetInnerPseudoLayer());
+    static const PseudoLayer firstPseudoLayer(GeometryHelper::GetPseudoLayerAtIp());
+
+    for (PseudoLayer iLayer = innerPseudoLayer, outerPseudoLayer = pCluster->GetOuterPseudoLayer(); iLayer <= outerPseudoLayer; ++iLayer)
+    {
+        OrderedCaloHitList::const_iterator iter = orderedCaloHitList.find(iLayer);
+
+        if ((orderedCaloHitList.end() == iter) || (iter->second->empty()))
+        {
+            nRadiationLengths += nRadiationLengthsInLastLayer;
+            continue;
+        }
+
+        // Extract information from the calo hits
+        float energyInLayer(0.f);
+        float nRadiationLengthsInLayer(0.f);
+
+        for (CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
+        {
+            float cosOpeningAngle(std::fabs((*hitIter)->GetCellNormalVector().GetCosOpeningAngle(clusterDirection)));
+            cosOpeningAngle = std::max(cosOpeningAngle, m_emShowerIdMinCosAngle);
+
+            const float hitEnergy((*hitIter)->GetElectromagneticEnergy());
+            energyInLayer += hitEnergy;
+            nRadiationLengthsInLayer += (*hitIter)->GetNCellRadiationLengths() / cosOpeningAngle;
+
+            const float radialDistance(((*hitIter)->GetPositionVector() - clusterIntercept).GetCrossProduct(clusterDirection).GetMagnitude());
+            hitEnergyDistanceVector.push_back(HitEnergyDistance(hitEnergy, radialDistance));
+        }
+
+        layer90EnergySum += energyInLayer;
+        nRadiationLengthsInLayer /= static_cast<float>(iter->second->size());
+        nRadiationLengthsInLastLayer = nRadiationLengthsInLayer;
+        nRadiationLengths += nRadiationLengthsInLayer;
+
+        // Cut on number of radiation lengths before cluster start
+        if (innerPseudoLayer == iLayer)
+        {
+            nRadiationLengths *= static_cast<float>(innerPseudoLayer + 1 - firstPseudoLayer);
+
+            if (nRadiationLengths > m_emShowerIdMaxInnerLayerRadLengths)
+                return false;
+        }
+
+        // Cut on number of radiation lengths before longitudinal layer90
+        if (!foundLayer90 && (layer90EnergySum > 0.9f * totalElectromagneticEnergy))
+        {
+            foundLayer90 = true;
+
+            if ((nRadiationLengths < m_emShowerIdMinLayer90RadLengths) || (nRadiationLengths > m_emShowerIdMaxLayer90RadLengths))
+                return false;
+        }
+
+        // Identify number of radiation lengths before shower max layer
+        if (energyInLayer > maxEnergyInlayer)
+        {
+            showerMaxRadLengths = nRadiationLengths;
+            maxEnergyInlayer = energyInLayer;
+        }
+
+        // Count energy above specified "high" number of radiation lengths
+        if (nRadiationLengths > m_emShowerIdHighRadLengths)
+        {
+            energyAboveHighRadLengths += energyInLayer;
+        }
+    }
+
+    // Cut on longitudinal shower profile properties
+    if ((showerMaxRadLengths < m_emShowerIdMinShowerMaxRadLengths) || (showerMaxRadLengths > m_emShowerIdMaxShowerMaxRadLengths))
+        return false;
+
+    if (energyAboveHighRadLengths > m_emShowerIdMaxHighRadLengthEnergyFraction * totalElectromagneticEnergy)
+        return false;
+
+    // Cut on transverse shower profile properties
+    std::sort(hitEnergyDistanceVector.begin(), hitEnergyDistanceVector.end(), SiDFineGranularityParticleId::SortHitsByDistance);
+    float radial90EnergySum(0.f), radial90(std::numeric_limits<float>::max());
+
+    for (HitEnergyDistanceVector::const_iterator iter = hitEnergyDistanceVector.begin(), iterEnd = hitEnergyDistanceVector.end(); iter != iterEnd; ++iter)
+    {
+        radial90EnergySum += iter->first;
+
+        if (radial90EnergySum > 0.9f * totalElectromagneticEnergy)
+        {
+            radial90 = iter->second;
+            break;
+        }
+    }
+
+    if (radial90 > m_emShowerIdMaxRadial90)
+        return false;
+
+    // Anything remaining at this point is classed as an electromagnetic shower
+    return true;
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+bool SiDFineGranularityParticleId::PhotonId(const Cluster *const pCluster)
+{
+    // Cluster with associated tracks is not a photon
+    if (!pCluster->GetAssociatedTrackList().empty())
+        return false;
+
+    return SiDFineGranularityParticleId::EmShowerId(pCluster);
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+bool SiDFineGranularityParticleId::ElectronId(const Cluster *const pCluster)
+{
+    const TrackList &associatedTrackList(pCluster->GetAssociatedTrackList());
+
+    if (associatedTrackList.empty())
+        return false;
+
+    const float electromagneticEnergy(pCluster->GetElectromagneticEnergy());
+
+    if (!SiDFineGranularityParticleId::EmShowerId(pCluster) && ((pCluster->GetInnerPseudoLayer() > m_electronIdMaxInnerLayer) ||
+        (electromagneticEnergy > m_electronIdMaxEnergy)))
+    {
+        return false;
+    }
+
+    const float showerProfileStart(pCluster->GetShowerProfileStart());
+    const float showerProfileDiscrepancy(pCluster->GetShowerProfileDiscrepancy());
+
+    if ((showerProfileStart > m_electronIdMaxProfileStart) || (showerProfileDiscrepancy > m_electronIdMaxProfileDiscrepancy))
+        return false;
+
+    if (showerProfileDiscrepancy < m_electronIdProfileDiscrepancyForAutoId)
+        return true;
+
+    for (TrackList::const_iterator iter = associatedTrackList.begin(), iterEnd = associatedTrackList.end(); iter != iterEnd; ++iter)
+    {
+        const float momentumAtDca((*iter)->GetMomentumAtDca().GetMagnitude());
+
+        if (0.f == momentumAtDca)
+            throw StatusCodeException(STATUS_CODE_FAILURE);
+
+        const float eOverP(electromagneticEnergy / momentumAtDca);
+
+        if (std::fabs(eOverP - 1.f) < m_electronIdMaxResidualEOverP)
+            return true;
+    }
+
+    return false;
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+bool SiDFineGranularityParticleId::MuonId(const Cluster *const pCluster)
+{
+    // Simple pre-selection cuts
+    if (pCluster->GetInnerPseudoLayer() > m_muonIdMaxInnerLayer)
+        return false;
+
+    const TrackList &trackList(pCluster->GetAssociatedTrackList());
+
+    if (trackList.size() != 1)
+        return false;
+
+    // For now only try to identify "high" energy muons
+    Track *pTrack = *(trackList.begin());
+
+    if (pTrack->GetEnergyAtDca() < m_muonIdMinTrackEnergy)
+        return false;
+
+    // Calculate cut variables
+    unsigned int nECalHits(0), nHCalHits(0), nMuonHits(0), nECalMipHits(0), nHCalMipHits(0), nHCalEndCapHits(0), nHCalBarrelHits(0);
+    float energyECal(0.), energyHCal(0.), directionCosine(0.);
+
+    typedef std::set<PseudoLayer> LayerList;
+    LayerList pseudoLayersECal, pseudoLayersHCal, pseudoLayersMuon, layersECal, layersHCal;
+
+    const CartesianVector &momentum(pTrack->GetTrackStateAtCalorimeter().GetMomentum());
+    const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
+
+    for (OrderedCaloHitList::const_iterator iter = orderedCaloHitList.begin(), iterEnd = orderedCaloHitList.end(); iter != iterEnd; ++iter)
+    {
+        for (CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
+        {
+            CaloHit *pCaloHit = *hitIter;
+
+            const PseudoLayer pseudoLayer(pCaloHit->GetPseudoLayer());
+            const unsigned int layer(pCaloHit->GetLayer());
+
+            if (pCaloHit->GetHitType() == ECAL)
+            {
+                nECalHits++;
+
+                if (pCaloHit->IsPossibleMip())
+                    nECalMipHits++;
+
+                pseudoLayersECal.insert(pseudoLayer);
+                layersECal.insert(layer);
+
+                energyECal += pCaloHit->GetHadronicEnergy();
+                directionCosine += momentum.GetCosOpeningAngle(pCaloHit->GetCellNormalVector());
+            }
+
+            else if (pCaloHit->GetHitType() == HCAL)
+            {
+                nHCalHits++;
+
+                if(pCaloHit->IsPossibleMip())
+                    nHCalMipHits++;
+
+                if (pCaloHit->GetDetectorRegion() == BARREL)
+                    nHCalBarrelHits++;
+
+                if (pCaloHit->GetDetectorRegion() == ENDCAP)
+                    nHCalEndCapHits++;
+
+                pseudoLayersHCal.insert(pseudoLayer);
+                layersHCal.insert(layer);
+
+                energyHCal += std::min(m_muonIdMaxHCalHitEnergy, pCaloHit->GetHadronicEnergy());
+            }
+
+            else if (pCaloHit->GetHitType() == MUON)
+            {
+                nMuonHits++;
+                pseudoLayersMuon.insert(pseudoLayer);
+            }
+        }
+    }
+
+    // Simple cuts on layer counts
+    const PseudoLayer nPseudoLayersECal(pseudoLayersECal.size());
+    const PseudoLayer nPseudoLayersHCal(pseudoLayersHCal.size());
+
+    if ((nPseudoLayersECal < m_muonIdMinECalLayers) && (layersECal.size() < m_muonIdMinECalLayers))
+        return false;
+
+    if ((nPseudoLayersHCal < m_muonIdMinHCalLayers) && (layersHCal.size() < m_muonIdMinHCalLayers))
+    {
+        if (!m_muonIdShouldPerformGapCheck || (nPseudoLayersHCal < m_muonIdMinHCalLayersForGapCheck) || (nMuonHits < m_muonIdMinMuonHitsForGapCheck))
+            return false;
+
+        if (!ClusterHelper::DoesClusterCrossGapRegion(pCluster, *(pseudoLayersHCal.begin()), *(pseudoLayersHCal.rbegin())))
+            return false;
+    }
+
+    // Calculate energies per layer
+    float energyECalDCos(0.), nHitsPerLayerECal(0.), nHitsPerLayerHCal(0.), mipFractionECal(0.), mipFractionHCal(0.);
+
+    if ((nECalHits > 0) && (nPseudoLayersECal > 0))
+    {
+        directionCosine /= static_cast<float>(nECalHits);
+        energyECalDCos = energyECal * directionCosine;
+
+        mipFractionECal = static_cast<float>(nECalMipHits) / static_cast<float>(nECalHits);
+        nHitsPerLayerECal = static_cast<float>(nECalHits) / static_cast<float>(nPseudoLayersECal);
+    }
+
+    if ((nHCalHits > 0) && (nPseudoLayersHCal > 0))
+    {
+        mipFractionHCal = static_cast<float>(nHCalMipHits) / static_cast<float>(nHCalHits);
+        nHitsPerLayerHCal = static_cast<float>(nHCalHits) / static_cast<float>(nPseudoLayersHCal);
+    }
+
+    // Loose energy cuts
+    const float trackEnergy(pTrack->GetEnergyAtDca());
+    const float eCalEnergyCut(m_muonIdECalEnergyCut0 + (m_muonIdECalEnergyCut1 * trackEnergy));
+    const float hCalEnergyCut(m_muonIdHCalEnergyCut0 + (m_muonIdHCalEnergyCut1 * trackEnergy));
+
+    if ((energyECalDCos > eCalEnergyCut) || (energyHCal > hCalEnergyCut))
+        return false;
+
+    // Calculate event shape variables for ecal
+    float eCalRms(std::numeric_limits<float>::max());
+    int nECalCutsFailed(0);
+
+    if (nPseudoLayersECal > m_muonIdMinECalLayersForFit)
+    {
+        ClusterHelper::ClusterFitResult newFitResult;
+        ClusterHelper::FitLayers(pCluster, m_muonIdECalFitInnerLayer, m_muonIdECalFitOuterLayer, newFitResult);
+
+        if (newFitResult.IsFitSuccessful())
+            eCalRms = newFitResult.GetRms();
+    }
+
+    const float rmsECalCut(std::min(m_muonIdECalRmsCut0 + (trackEnergy * m_muonIdECalRmsCut1), m_muonIdECalMaxRmsCut));
+
+    if (eCalRms > rmsECalCut)
+        nECalCutsFailed++;
+
+    const float mipFractionECalCut(std::min(m_muonIdECalMipFractionCut0 - (trackEnergy * m_muonIdECalMipFractionCut1), m_muonIdECalMaxMipFractionCut));
+
+    if (mipFractionECal < mipFractionECalCut)
+        nECalCutsFailed++;
+
+    const float nHitsPerLayerECalCut(std::min(m_muonIdECalHitsPerLayerCut0 + (trackEnergy * m_muonIdECalHitsPerLayerCut1), m_muonIdECalMaxHitsPerLayerCut));
+
+    if (nHitsPerLayerECal > nHitsPerLayerECalCut)
+        nECalCutsFailed++;
+
+    // Calculate event shape variables for hcal
+    // ATTN rms cut should be made wrt Kalman filter fit: cut makes no sense for tracks which loop back in hcal barrel
+    float hCalRms(std::numeric_limits<float>::max());
+    int nHCalCutsFailed(0);
+
+    if (nPseudoLayersHCal > m_muonIdMinHCalLayersForFit)
+    {
+        ClusterHelper::ClusterFitResult newFitResult;
+        ClusterHelper::FitLayers(pCluster, m_muonIdHCalFitInnerLayer, m_muonIdHCalFitOuterLayer, newFitResult);
+
+        if (newFitResult.IsFitSuccessful())
+            hCalRms = newFitResult.GetRms();
+    }
+
+    const bool inBarrel((nHCalEndCapHits == 0) ||
+        (static_cast<float>(nHCalBarrelHits) / static_cast<float>(nHCalBarrelHits + nHCalEndCapHits) >= m_muonIdInBarrelHitFraction));
+
+    float rmsHCalCut(std::min(m_muonIdHCalRmsCut0 + (trackEnergy * m_muonIdHCalRmsCut1), m_muonIdHCalMaxRmsCut));
+
+    if ((trackEnergy < m_muonIdCurlingTrackEnergy) && inBarrel)
+        rmsHCalCut = m_muonIdHCalMaxRmsCut;
+
+    if (hCalRms > rmsHCalCut)
+    {
+        // Impose tight cuts on MipFraction
+        if ((trackEnergy > m_muonIdCurlingTrackEnergy) || !inBarrel)
+        {
+            nHCalCutsFailed++;
+        }
+        else if ((pCluster->GetMipFraction() < m_muonIdTightMipFractionCut) || (mipFractionECal < m_muonIdTightMipFractionECalCut) ||
+                (mipFractionHCal < m_muonIdTightMipFractionHCalCut))
+        {
+            nHCalCutsFailed++;
+        }
+    }
+
+    const float mipFractionHCalCut(std::min(m_muonIdHCalMipFractionCut0 - (trackEnergy * m_muonIdHCalMipFractionCut1), m_muonIdHCalMaxMipFractionCut));
+
+    if (mipFractionHCal < mipFractionHCalCut)
+        nHCalCutsFailed++;
+
+    const float nHitsPerlayerHCalCut(std::min(m_muonIdHCalHitsPerLayerCut0 + (trackEnergy * m_muonIdHCalHitsPerLayerCut1), m_muonIdHCalMaxHitsPerLayerCut));
+
+    if (nHitsPerLayerHCal > nHitsPerlayerHCalCut)
+        nHCalCutsFailed++;
+
+    // Calculate event shape variables for muon
+    float muonRms(std::numeric_limits<float>::max());
+    int nMuonCutsPassed(0);
+
+    if (pseudoLayersMuon.size() > m_muonIdMinMuonLayersForFit)
+    { 
+        ClusterHelper::ClusterFitResult newFitResult;
+        ClusterHelper::FitLayers(pCluster, *pseudoLayersMuon.begin(), *pseudoLayersMuon.rbegin(), newFitResult);
+
+        if (newFitResult.IsFitSuccessful())
+            muonRms = newFitResult.GetRms();
+    }
+
+    const float maxMuonHitsCut(std::max(m_muonIdMaxMuonHitsCut0 + (m_muonIdMaxMuonHitsCut1 * trackEnergy), m_muonIdMaxMuonHitsCutMinValue));
+
+    if ((nMuonHits > m_muonIdMinMuonHitsCut) && (nMuonHits < maxMuonHitsCut))
+        nMuonCutsPassed++;
+
+    if ((nMuonHits > m_muonIdMinMuonTrackSegmentHitsCut) && (muonRms < m_muonIdMuonRmsCut))
+        nMuonCutsPassed++;
+
+    // Make final decision
+    const int nCutsFailed(nECalCutsFailed + nHCalCutsFailed - nMuonCutsPassed);
+
+    return nCutsFailed < 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+unsigned int SiDFineGranularityParticleId::m_electronIdMaxInnerLayer = 4;
+float SiDFineGranularityParticleId::m_electronIdMaxEnergy = 5.f;
+float SiDFineGranularityParticleId::m_electronIdMaxProfileStart = 4.5f;
+float SiDFineGranularityParticleId::m_electronIdMaxProfileDiscrepancy = 0.6f;
+float SiDFineGranularityParticleId::m_electronIdProfileDiscrepancyForAutoId = 0.5f;
+float SiDFineGranularityParticleId::m_electronIdMaxResidualEOverP = 0.2f;
+
+unsigned int SiDFineGranularityParticleId::m_muonIdMaxInnerLayer = 10;
+float SiDFineGranularityParticleId::m_muonIdMinTrackEnergy = 2.5f;
+float SiDFineGranularityParticleId::m_muonIdMaxHCalHitEnergy = 1.f;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinECalLayers = 20;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinHCalLayers = 20;
+bool SiDFineGranularityParticleId::m_muonIdShouldPerformGapCheck = true;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinHCalLayersForGapCheck = 4;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinMuonHitsForGapCheck = 3;
+float SiDFineGranularityParticleId::m_muonIdECalEnergyCut0 = 1.f;
+float SiDFineGranularityParticleId::m_muonIdECalEnergyCut1 = 0.05f;
+float SiDFineGranularityParticleId::m_muonIdHCalEnergyCut0 = 5.f;
+float SiDFineGranularityParticleId::m_muonIdHCalEnergyCut1 = 0.15f;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinECalLayersForFit = 10;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinHCalLayersForFit = 10;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinMuonLayersForFit = 4;
+unsigned int SiDFineGranularityParticleId::m_muonIdECalFitInnerLayer = 1;
+unsigned int SiDFineGranularityParticleId::m_muonIdECalFitOuterLayer = 30;
+unsigned int SiDFineGranularityParticleId::m_muonIdHCalFitInnerLayer = 31;
+unsigned int SiDFineGranularityParticleId::m_muonIdHCalFitOuterLayer = 79;
+float SiDFineGranularityParticleId::m_muonIdECalRmsCut0 = 20.f;
+float SiDFineGranularityParticleId::m_muonIdECalRmsCut1 = 0.2f;
+float SiDFineGranularityParticleId::m_muonIdECalMaxRmsCut = 50.f;
+float SiDFineGranularityParticleId::m_muonIdHCalRmsCut0 = 40.f;
+float SiDFineGranularityParticleId::m_muonIdHCalRmsCut1 = 0.1f;
+float SiDFineGranularityParticleId::m_muonIdHCalMaxRmsCut = 80.f;
+float SiDFineGranularityParticleId::m_muonIdECalMipFractionCut0 = 0.8f;
+float SiDFineGranularityParticleId::m_muonIdECalMipFractionCut1 = 0.05f;
+float SiDFineGranularityParticleId::m_muonIdECalMaxMipFractionCut = 0.6f;
+float SiDFineGranularityParticleId::m_muonIdHCalMipFractionCut0 = 0.8f;
+float SiDFineGranularityParticleId::m_muonIdHCalMipFractionCut1 = 0.02f;
+float SiDFineGranularityParticleId::m_muonIdHCalMaxMipFractionCut = 0.75f;
+float SiDFineGranularityParticleId::m_muonIdECalHitsPerLayerCut0 = 2.f;
+float SiDFineGranularityParticleId::m_muonIdECalHitsPerLayerCut1 = 0.02f;
+float SiDFineGranularityParticleId::m_muonIdECalMaxHitsPerLayerCut = 5.f;
+float SiDFineGranularityParticleId::m_muonIdHCalHitsPerLayerCut0 = 1.5f;
+float SiDFineGranularityParticleId::m_muonIdHCalHitsPerLayerCut1 = 0.05f;
+float SiDFineGranularityParticleId::m_muonIdHCalMaxHitsPerLayerCut = 8.f;
+float SiDFineGranularityParticleId::m_muonIdCurlingTrackEnergy = 4.f;
+float SiDFineGranularityParticleId::m_muonIdInBarrelHitFraction = 0.05f;
+float SiDFineGranularityParticleId::m_muonIdTightMipFractionCut = 0.85f;
+float SiDFineGranularityParticleId::m_muonIdTightMipFractionECalCut = 0.8f;
+float SiDFineGranularityParticleId::m_muonIdTightMipFractionHCalCut = 0.875f;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinMuonHitsCut = 2;
+unsigned int SiDFineGranularityParticleId::m_muonIdMinMuonTrackSegmentHitsCut = 8;
+float SiDFineGranularityParticleId::m_muonIdMuonRmsCut = 25.f;
+float SiDFineGranularityParticleId::m_muonIdMaxMuonHitsCut0 = 0.f;
+float SiDFineGranularityParticleId::m_muonIdMaxMuonHitsCut1 = 0.2f;
+float SiDFineGranularityParticleId::m_muonIdMaxMuonHitsCutMinValue = 30.f;
+
+float SiDFineGranularityParticleId::m_emShowerIdMipCut_0 = 0.9f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCutEnergy_1 = 15.f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCut_1 = 0.3f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCutEnergy_2 = 7.5f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCut_2 = 0.4f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCutEnergy_3 = 3.f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCut_3 = 0.6f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCutEnergy_4 = 1.5f;
+float SiDFineGranularityParticleId::m_emShowerIdMipCut_4 = 0.7f;
+float SiDFineGranularityParticleId::m_emShowerIdDCosRCutEnergy = 1.5f;
+float SiDFineGranularityParticleId::m_emShowerIdDCosRLowECut = 0.94f;
+float SiDFineGranularityParticleId::m_emShowerIdDCosRHighECut = 0.95f;
+float SiDFineGranularityParticleId::m_emShowerIdRmsCutEnergy = 40.f;
+float SiDFineGranularityParticleId::m_emShowerIdRmsLowECut = 40.f;
+float SiDFineGranularityParticleId::m_emShowerIdRmsHighECut = 90.f;
+float SiDFineGranularityParticleId::m_emShowerIdMinCosAngle = 0.3f;
+float SiDFineGranularityParticleId::m_emShowerIdMaxInnerLayerRadLengths = 10.f;
+float SiDFineGranularityParticleId::m_emShowerIdMinLayer90RadLengths = 4.f;
+float SiDFineGranularityParticleId::m_emShowerIdMaxLayer90RadLengths = 30.f;
+float SiDFineGranularityParticleId::m_emShowerIdMinShowerMaxRadLengths = 0.f;
+float SiDFineGranularityParticleId::m_emShowerIdMaxShowerMaxRadLengths = 25.f;
+float SiDFineGranularityParticleId::m_emShowerIdHighRadLengths = 40.f;
+float SiDFineGranularityParticleId::m_emShowerIdMaxHighRadLengthEnergyFraction = 0.04f;
+float SiDFineGranularityParticleId::m_emShowerIdMaxRadial90 = 40.f;
+
+//------------------------------------------------------------------------------------------------------------------------------------------
+
+StatusCode SiDFineGranularityParticleId::ReadSettings(const TiXmlHandle xmlHandle)
+{
+    // Electromagnetic shower id settings
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCut_0", m_emShowerIdMipCut_0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCutEnergy_1", m_emShowerIdMipCutEnergy_1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCut_1", m_emShowerIdMipCut_1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCutEnergy_2", m_emShowerIdMipCutEnergy_2));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCut_2", m_emShowerIdMipCut_2));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCutEnergy_3", m_emShowerIdMipCutEnergy_3));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCut_3", m_emShowerIdMipCut_3));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCutEnergy_4", m_emShowerIdMipCutEnergy_4));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMipCut_4", m_emShowerIdMipCut_4));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdDCosRCutEnergy", m_emShowerIdDCosRCutEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdDCosRLowECut", m_emShowerIdDCosRLowECut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdDCosRHighECut", m_emShowerIdDCosRHighECut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdRmsCutEnergy", m_emShowerIdRmsCutEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdRmsLowECut", m_emShowerIdRmsLowECut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdRmsHighECut", m_emShowerIdRmsHighECut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMinCosAngle", m_emShowerIdMinCosAngle));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMaxInnerLayerRadLengths", m_emShowerIdMaxInnerLayerRadLengths));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMinLayer90RadLengths", m_emShowerIdMinLayer90RadLengths));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMaxLayer90RadLengths", m_emShowerIdMaxLayer90RadLengths));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMinShowerMaxRadLengths", m_emShowerIdMinShowerMaxRadLengths));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "EmShowerIdMaxShowerMaxRadLengths", m_emShowerIdMaxShowerMaxRadLengths));
+
+    // Electron id settings
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdMaxInnerLayer", m_electronIdMaxInnerLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdMaxEnergy", m_electronIdMaxEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdMaxProfileStart", m_electronIdMaxProfileStart));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdMaxProfileDiscrepancy", m_electronIdMaxProfileDiscrepancy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdProfileDiscrepancyForAutoId", m_electronIdProfileDiscrepancyForAutoId));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "ElectronIdMaxResidualEOverP", m_electronIdMaxResidualEOverP));
+
+    // Muon id settings
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMaxInnerLayer", m_muonIdMaxInnerLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinTrackEnergy", m_muonIdMinTrackEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMaxHCalHitEnergy", m_muonIdMaxHCalHitEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinECalLayers", m_muonIdMinECalLayers));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinHCalLayers", m_muonIdMinHCalLayers));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdShouldPerformGapCheck", m_muonIdShouldPerformGapCheck));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinHCalLayersForGapCheck", m_muonIdMinHCalLayersForGapCheck));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinMuonHitsForGapCheck", m_muonIdMinMuonHitsForGapCheck));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalEnergyCut0", m_muonIdECalEnergyCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalEnergyCut1", m_muonIdECalEnergyCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalEnergyCut0", m_muonIdHCalEnergyCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalEnergyCut1", m_muonIdHCalEnergyCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinECalLayersForFit", m_muonIdMinECalLayersForFit));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinHCalLayersForFit", m_muonIdMinHCalLayersForFit));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinMuonLayersForFit", m_muonIdMinMuonLayersForFit));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalFitInnerLayer", m_muonIdECalFitInnerLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalFitOuterLayer", m_muonIdECalFitOuterLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalFitInnerLayer", m_muonIdHCalFitInnerLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalFitOuterLayer", m_muonIdHCalFitOuterLayer));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalRmsCut0", m_muonIdECalRmsCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalRmsCut1", m_muonIdECalRmsCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalMaxRmsCut", m_muonIdECalMaxRmsCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalRmsCut0", m_muonIdHCalRmsCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalRmsCut1", m_muonIdHCalRmsCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalMaxRmsCut", m_muonIdHCalMaxRmsCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalMipFractionCut0", m_muonIdECalMipFractionCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalMipFractionCut1", m_muonIdECalMipFractionCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalMaxMipFractionCut", m_muonIdECalMaxMipFractionCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalMipFractionCut0", m_muonIdHCalMipFractionCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalMipFractionCut1", m_muonIdHCalMipFractionCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalMaxMipFractionCut", m_muonIdHCalMaxMipFractionCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalHitsPerLayerCut0", m_muonIdECalHitsPerLayerCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalHitsPerLayerCut1", m_muonIdECalHitsPerLayerCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdECalMaxHitsPerLayerCut", m_muonIdECalMaxHitsPerLayerCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalHitsPerLayerCut0", m_muonIdHCalHitsPerLayerCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalHitsPerLayerCut1", m_muonIdHCalHitsPerLayerCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdHCalMaxHitsPerLayerCut", m_muonIdHCalMaxHitsPerLayerCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdCurlingTrackEnergy", m_muonIdCurlingTrackEnergy));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdInBarrelHitFraction", m_muonIdInBarrelHitFraction));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdTightMipFractionCut", m_muonIdTightMipFractionCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdTightMipFractionECalCut", m_muonIdTightMipFractionECalCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdTightMipFractionHCalCut", m_muonIdTightMipFractionHCalCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinMuonHitsCut", m_muonIdMinMuonHitsCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMinMuonTrackSegmentHitsCut", m_muonIdMinMuonTrackSegmentHitsCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMuonRmsCut", m_muonIdMuonRmsCut));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMaxMuonHitsCut0", m_muonIdMaxMuonHitsCut0));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMaxMuonHitsCut1", m_muonIdMaxMuonHitsCut1));
+
+    PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
+        "MuonIdMaxMuonHitsCutMinValue", m_muonIdMaxMuonHitsCutMinValue));
+
+    return STATUS_CODE_SUCCESS;
+}

slicPandora/src
JobManager.cpp 1.15 -> 1.16
diff -u -r1.15 -r1.16
--- JobManager.cpp	31 Jan 2012 15:08:34 -0000	1.15
+++ JobManager.cpp	3 Sep 2012 11:10:15 -0000	1.16
@@ -9,7 +9,7 @@
 // pandora
 #include "PfoConstructionAlgorithm.h"
 #include "FineGranularityPseudoLayerCalculator.h"
-#include "FineGranularityContent.h"
+#include "SiDFineGranularityContent.h"
 
 // lcio
 #include "IOIMPL/LCFactory.h"
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1