.. _program_listing_file_Root_ElectronHists.cxx:

Program Listing for File ElectronHists.cxx
==========================================

|exhale_lsh| :ref:`Return to documentation for file <file_Root_ElectronHists.cxx>` (``Root/ElectronHists.cxx``)

.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS

.. code-block:: cpp

   #include <xAODAnaHelpers/ElectronHists.h>
   #include <sstream>
   
   #include "xAODAnaHelpers/HelperFunctions.h"
   
   ANA_MSG_SOURCE(msgElectronHists, "ElectronHists")
   
   ElectronHists :: ElectronHists (std::string name, std::string detailStr) :
     IParticleHists(name, detailStr, "electron", "electron"),
     m_infoSwitch(new HelperClasses::ElectronInfoSwitch(m_detailStr))
   { }
   
   ElectronHists :: ~ElectronHists () {
     if(m_infoSwitch) delete m_infoSwitch;
   }
   
   StatusCode ElectronHists::initialize() {
     using namespace msgElectronHists;
     ANA_CHECK( IParticleHists::initialize());
   
     // isolation
     if( m_infoSwitch->m_isolation ) {
       if(m_debug) Info("ElectronHists::initialize()", "adding isolation plots");
   
       for (auto& isol : m_infoSwitch->m_isolWPs) {
         if (isol.empty() && isol == "NONE") continue;
   
         m_isIsolated[isol] = book(m_name, "isIsolated_" + isol,   "isIsolated_" + isol, 3, -1.5, 1.5);
       }
   
       m_ptcone20     = book(m_name, "ptcone20",     "ptcone20",     101, -0.2, 20);
       m_ptcone30     = book(m_name, "ptcone30",     "ptcone30",     101, -0.2, 20);
       m_ptcone40     = book(m_name, "ptcone40",     "ptcone40",     101, -0.2, 20);
       m_ptvarcone20  = book(m_name, "ptvarcone20",  "ptvarcone20",  101, -0.2, 20);
       m_ptvarcone30  = book(m_name, "ptvarcone30",  "ptvarcone30",  101, -0.2, 20);
       m_ptvarcone40  = book(m_name, "ptvarcone40",  "ptvarcone40",  101, -0.2, 20);
       m_topoetcone20 = book(m_name, "topoetcone20", "topoetcone20", 101, -0.2, 20);
       m_topoetcone30 = book(m_name, "topoetcone30", "topoetcone30", 101, -0.2, 20);
       m_topoetcone40 = book(m_name, "topoetcone40", "topoetcone40", 101, -0.2, 20);
   
       m_ptcone20_rel     = book(m_name, "ptcone20_rel",     "ptcone20_rel",     110, -0.2, 2);
       m_ptcone30_rel     = book(m_name, "ptcone30_rel",     "ptcone30_rel",     110, -0.2, 2);
       m_ptcone40_rel     = book(m_name, "ptcone40_rel",     "ptcone40_rel",     110, -0.2, 2);
       m_ptvarcone20_rel  = book(m_name, "ptvarcone20_rel",  "ptvarcone20_rel",  110, -0.2, 2);
       m_ptvarcone30_rel  = book(m_name, "ptvarcone30_rel",  "ptvarcone30_rel",  110, -0.2, 2);
       m_ptvarcone40_rel  = book(m_name, "ptvarcone40_rel",  "ptvarcone40_rel",  110, -0.2, 2);
       m_topoetcone20_rel = book(m_name, "topoetcone20_rel", "topoetcone20_rel", 110, -0.2, 2);
       m_topoetcone30_rel = book(m_name, "topoetcone30_rel", "topoetcone30_rel", 110, -0.2, 2);
       m_topoetcone40_rel = book(m_name, "topoetcone40_rel", "topoetcone40_rel", 110, -0.2, 2);
   }
   
     // PID
     if (m_infoSwitch->m_PID || m_infoSwitch->m_quality) {
       for (auto& PID : m_infoSwitch->m_PIDWPs) {
         if (PID.empty()) continue;
   
         m_PID[PID] = book(m_name, PID, PID, 3, -1.5, 1.5);
       }
     }
   
     return StatusCode::SUCCESS;
   }
   
   StatusCode ElectronHists::execute( const xAOD::Electron* electron, float eventWeight, const xAOD::EventInfo* eventInfo ) {
     return execute(static_cast<const xAOD::IParticle*>(electron), eventWeight, eventInfo);
   }
   
   StatusCode ElectronHists::execute( const xAOD::IParticle* particle, float eventWeight, const xAOD::EventInfo* eventInfo ) {
     using namespace msgElectronHists;
     ANA_CHECK( IParticleHists::execute(particle, eventWeight, eventInfo));
   
     if(m_debug) std::cout << "ElectronHists: in execute " <<std::endl;
   
     const xAOD::Electron* electron=dynamic_cast<const xAOD::Electron*>(particle);
     if(electron==0)
       {
         ANA_MSG_ERROR( "Cannot convert IParticle to Electron" );
         return StatusCode::FAILURE;
       }
   
     // isolation
     if ( m_infoSwitch->m_isolation ) {
       static std::map< std::string, SG::AuxElement::Accessor<char> > accIsol;
   
       for (auto& isol : m_infoSwitch->m_isolWPs) {
         if (!isol.empty() && isol != "NONE") {
           std::string isolWP = "isIsolated_" + isol;
           accIsol.insert( std::pair<std::string, SG::AuxElement::Accessor<char> > ( isol , SG::AuxElement::Accessor<char>( isolWP ) ) );
           
           if (accIsol.at(isol).isAvailable(*electron)) {
               m_isIsolated[isol]->Fill(accIsol.at(isol)(*electron), eventWeight);
           } else {
               m_isIsolated[isol]->Fill(-1 , eventWeight);
           }
         }
       }
   
       m_ptcone20    ->Fill( electron->isolation( xAOD::Iso::ptcone20    ) / 1e3, eventWeight );
       m_ptcone30    ->Fill( electron->isolation( xAOD::Iso::ptcone30    ) / 1e3, eventWeight );
       m_ptcone40    ->Fill( electron->isolation( xAOD::Iso::ptcone40    ) / 1e3, eventWeight );
       m_ptvarcone20 ->Fill( electron->isolation( xAOD::Iso::ptvarcone20 ) / 1e3, eventWeight );
       m_ptvarcone30 ->Fill( electron->isolation( xAOD::Iso::ptvarcone30 ) / 1e3, eventWeight );
       m_ptvarcone40 ->Fill( electron->isolation( xAOD::Iso::ptvarcone40 ) / 1e3, eventWeight );
       m_topoetcone20->Fill( electron->isolation( xAOD::Iso::topoetcone20) / 1e3, eventWeight );
       m_topoetcone30->Fill( electron->isolation( xAOD::Iso::topoetcone30) / 1e3, eventWeight );
       m_topoetcone40->Fill( electron->isolation( xAOD::Iso::topoetcone40) / 1e3, eventWeight );
   
       float electronPt = electron->pt();
       m_ptcone20_rel     ->Fill( electron->isolation( xAOD::Iso::ptcone20 )     / electronPt,  eventWeight );
       m_ptcone30_rel     ->Fill( electron->isolation( xAOD::Iso::ptcone30 )     / electronPt,  eventWeight );
       m_ptcone40_rel     ->Fill( electron->isolation( xAOD::Iso::ptcone40 )     / electronPt,  eventWeight );
       m_ptvarcone20_rel  ->Fill( electron->isolation( xAOD::Iso::ptvarcone20 )  / electronPt,  eventWeight );
       m_ptvarcone30_rel  ->Fill( electron->isolation( xAOD::Iso::ptvarcone30 )  / electronPt,  eventWeight );
       m_ptvarcone40_rel  ->Fill( electron->isolation( xAOD::Iso::ptvarcone40 )  / electronPt,  eventWeight );
       m_topoetcone20_rel ->Fill( electron->isolation( xAOD::Iso::topoetcone20 ) / electronPt,  eventWeight );
       m_topoetcone30_rel ->Fill( electron->isolation( xAOD::Iso::topoetcone30 ) / electronPt,  eventWeight );
       m_topoetcone40_rel ->Fill( electron->isolation( xAOD::Iso::topoetcone40 ) / electronPt,  eventWeight );
   
     }
   
     return StatusCode::SUCCESS;
   }
   
   
   
   StatusCode ElectronHists::execute( const xAH::Electron* elec, float eventWeight, const xAH::EventInfo* eventInfo ) {
     return execute(static_cast<const xAH::Particle*>(elec), eventWeight, eventInfo);
   }
   
   
   StatusCode ElectronHists::execute( const xAH::Particle* particle, float eventWeight, const xAH::EventInfo* /*eventInfo*/  ) {
     using namespace msgElectronHists;
     ANA_CHECK( IParticleHists::execute(particle, eventWeight));
   
     if(m_debug) std::cout << "ElectronHists: in execute " <<std::endl;
   
     const xAH::Electron* elec=dynamic_cast<const xAH::Electron*>(particle);
     if(elec==0)
       {
         ANA_MSG_ERROR( "Cannot convert IParticle to Electron" );
         return StatusCode::FAILURE;
       }
   
     // isolation
     if ( m_infoSwitch->m_isolation ) {
       for (auto& isol : m_infoSwitch->m_isolWPs) {
         if (isol.empty() && isol == "NONE") continue;
   
         m_isIsolated[isol]->Fill(elec->isIsolated.at(isol), eventWeight);
       }
   
       m_ptcone20    ->Fill( elec->ptcone20    , eventWeight );
       m_ptcone30    ->Fill( elec->ptcone30    , eventWeight );
       m_ptcone40    ->Fill( elec->ptcone40    , eventWeight );
       m_ptvarcone20 ->Fill( elec->ptvarcone20 , eventWeight );
       m_ptvarcone30 ->Fill( elec->ptvarcone30 , eventWeight );
       m_ptvarcone40 ->Fill( elec->ptvarcone40 , eventWeight );
       m_topoetcone20->Fill( elec->topoetcone20, eventWeight );
       m_topoetcone30->Fill( elec->topoetcone30, eventWeight );
       m_topoetcone40->Fill( elec->topoetcone40, eventWeight );
   
   
       float elecPt = elec->p4.Pt();
       m_ptcone20_rel     ->Fill( elec->ptcone20/elecPt        ,  eventWeight );
       m_ptcone30_rel     ->Fill( elec->ptcone30/elecPt        ,  eventWeight );
       m_ptcone40_rel     ->Fill( elec->ptcone40/elecPt        ,  eventWeight );
       m_ptvarcone20_rel  ->Fill( elec->ptvarcone20 /elecPt    ,  eventWeight );
       m_ptvarcone30_rel  ->Fill( elec->ptvarcone30 /elecPt    ,  eventWeight );
       m_ptvarcone40_rel  ->Fill( elec->ptvarcone40 /elecPt    ,  eventWeight );
       m_topoetcone20_rel ->Fill( elec->topoetcone20/elecPt    ,  eventWeight );
       m_topoetcone30_rel ->Fill( elec->topoetcone30/elecPt    ,  eventWeight );
       m_topoetcone40_rel ->Fill( elec->topoetcone40/elecPt    ,  eventWeight );
     }
   
   
     if ( m_infoSwitch->m_PID || m_infoSwitch->m_quality ) {
       for (auto& PID : m_infoSwitch->m_PIDWPs) {
         if (PID.empty()) continue;
   
         m_PID[PID]->Fill(elec->PID.at(PID), eventWeight);
       }
     }
   
     return StatusCode::SUCCESS;
   }