Program Listing for File TauContainer.cxx

Return to documentation for file (Root/TauContainer.cxx)

#include "xAODAnaHelpers/TauContainer.h"

#include <iostream>

using namespace xAH;
using std::vector;
using std::string;

TauContainer::TauContainer(const std::string& name, const std::string& detailStr, float units, bool mc, bool storeSystSFs)
  : ParticleContainer(name, detailStr, units, mc, true, storeSystSFs)
{

  // trigger
  if ( m_infoSwitch.m_trigger ) {
    m_isTrigMatched          = new     vector<int>               ();
    m_isTrigMatchedToChain   = new     vector<vector<int> >      ();
    m_listTrigChains         = new     vector<std::string>       ();
  }

  if( m_infoSwitch.m_kinematic) {
    m_ntrk    = new  std::vector<int>   ();
    m_charge  = new  std::vector<float> ();
  }

  // might need to delete these
  if( m_infoSwitch.m_JetID) {
    m_isJetRNNSigVeryLoose = new  std::vector<int>   ();
    m_isJetRNNSigLoose     = new  std::vector<int>   ();
    m_isJetRNNSigMedium    = new  std::vector<int>   ();
    m_isJetRNNSigTight     = new  std::vector<int>   ();

    m_JetRNNScore          = new  std::vector<float>   ();
    m_JetRNNScoreSigTrans  = new  std::vector<float>   ();
  }

  if( m_infoSwitch.m_EleVeto) {
    m_isEleRNNLoose  = new  std::vector<int>   ();
    m_isEleRNNMedium = new  std::vector<int>   ();
    m_isEleRNNTight  = new  std::vector<int>   ();

    m_EleRNNScore    = new  std::vector<float> ();
    m_passEleOLR     = new  std::vector<int>   ();
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    m_tau_matchedJetWidth = new  std::vector<float>   ();
    m_tau_matchedJetJvt   = new  std::vector<float>   ();
  }

  if( m_infoSwitch.m_trackAll) {
    m_tau_tracks_pt       = new  std::vector< std::vector<float> > ();
    m_tau_tracks_eta      = new  std::vector< std::vector<float> > ();
    m_tau_tracks_phi      = new  std::vector< std::vector<float> > ();

    m_tau_tracks_isCore          = new  std::vector< std::vector<int> > ();
    m_tau_tracks_isWide          = new  std::vector< std::vector<int> > ();
    m_tau_tracks_failTrackFilter = new  std::vector< std::vector<int> > ();
    m_tau_tracks_passTrkSel      = new  std::vector< std::vector<int> > ();
    m_tau_tracks_isClCharged     = new  std::vector< std::vector<int> > ();
    m_tau_tracks_isClIso         = new  std::vector< std::vector<int> > ();
    m_tau_tracks_isClConv        = new  std::vector< std::vector<int> > ();
    m_tau_tracks_isClFake        = new  std::vector< std::vector<int> > ();
  }

  // scale factors w/ sys
  // per object
  if ( m_infoSwitch.m_effSF && m_mc ) {

    m_TauEff_SF = new std::map< std::string, std::vector< std::vector< float > > >();
    m_TauTrigEff_SF = new std::map< std::string, std::vector< std::vector< float > > >();

  }

}

TauContainer::~TauContainer()
{

  // trigger
  if ( m_infoSwitch.m_trigger ) {
    delete m_isTrigMatched         ;
    delete m_isTrigMatchedToChain  ;
    delete m_listTrigChains        ;
  }

  if (m_infoSwitch.m_kinematic){
    delete m_ntrk;
    delete m_charge;
  }

  // scale factors w/ sys
  // per object
  if ( m_infoSwitch.m_effSF && m_mc ) {

    delete m_TauEff_SF;
    delete m_TauTrigEff_SF;

  }

  // might need to delete these
  if( m_infoSwitch.m_JetID) {
    delete m_isJetRNNSigVeryLoose;
    delete m_isJetRNNSigLoose;
    delete m_isJetRNNSigMedium;
    delete m_isJetRNNSigTight;

    delete m_JetRNNScore;
    delete m_JetRNNScoreSigTrans;
  }

  if( m_infoSwitch.m_EleVeto) {
    delete m_isEleRNNLoose;
    delete m_isEleRNNMedium;
    delete m_isEleRNNTight;

    delete m_EleRNNScore;

    delete m_passEleOLR;
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    delete m_tau_matchedJetWidth;
    delete m_tau_matchedJetJvt;
  }

  if( m_infoSwitch.m_trackAll) {
    delete m_tau_tracks_pt;
    delete m_tau_tracks_eta;
    delete m_tau_tracks_phi;

    delete m_tau_tracks_isCore;
    delete m_tau_tracks_isWide;
    delete m_tau_tracks_failTrackFilter;
    delete m_tau_tracks_passTrkSel;
    delete m_tau_tracks_isClCharged;
    delete m_tau_tracks_isClIso;
    delete m_tau_tracks_isClConv;
    delete m_tau_tracks_isClFake;
  }

}

void TauContainer::setTree(TTree *tree)
{
  //
  // Connect branches
  ParticleContainer::setTree(tree);

  if ( m_infoSwitch.m_trigger ){
    connectBranch<int>         (tree, "isTrigMatched",        &m_isTrigMatched);
    connectBranch<vector<int> >(tree, "isTrigMatchedToChain", &m_isTrigMatchedToChain );
    connectBranch<string>      (tree, "listTrigChains",       &m_listTrigChains );
  }

  if ( m_infoSwitch.m_kinematic ){
    connectBranch<int>    (tree, "ntrk",       &m_ntrk);
    connectBranch<float>  (tree, "charge",     &m_charge );
  }

  if ( m_infoSwitch.m_effSF && m_mc ) {

    for (auto& taueff : m_infoSwitch.m_tauEffWPs) {
      tree->SetBranchStatus ( (m_name + "_TauEff_SF_" + taueff).c_str() , 1);
      tree->SetBranchAddress( (m_name + "_TauEff_SF_" + taueff).c_str() , & (*m_TauEff_SF)[ taueff ] );

    }

    for (auto& trig : m_infoSwitch.m_trigWPs) {
      tree->SetBranchStatus ( (m_name + "_TauTrigEff_SF_" + trig).c_str() , 1 );
      tree->SetBranchAddress( (m_name + "_TauTrigEff_SF_" + trig).c_str() , & (*m_TauTrigEff_SF)[ trig ] );

    }
  }

  // might need to delete these
  if ( m_infoSwitch.m_JetID ){
    connectBranch<int>    (tree, "isJetRNNSigVeryLoose",   &m_isJetRNNSigVeryLoose);
    connectBranch<int>    (tree, "isJetRNNSigLoose",       &m_isJetRNNSigLoose);
    connectBranch<int>    (tree, "isJetRNNSigMedium",      &m_isJetRNNSigMedium);
    connectBranch<int>    (tree, "isJetRNNSigTight",       &m_isJetRNNSigTight);

    connectBranch<float>  (tree, "JetRNNScore",         &m_JetRNNScore);
    connectBranch<float>  (tree, "JetRNNScoreSigTrans", &m_JetRNNScoreSigTrans);
  }

  if ( m_infoSwitch.m_EleVeto ){
    connectBranch<int>    (tree, "isEleRNNLoose",    &m_isEleRNNLoose);
    connectBranch<int>    (tree, "isEleRNNMedium",   &m_isEleRNNMedium);
    connectBranch<int>    (tree, "isEleRNNTight",    &m_isEleRNNTight);

    connectBranch<float>  (tree, "EleRNNScore",    &m_EleRNNScore);
    connectBranch<int>    (tree, "passEleOLR",     &m_passEleOLR);
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    connectBranch<float>  (tree, "matchedJetWidth",    &m_tau_matchedJetWidth);
    connectBranch<float>  (tree, "matchedJetJvt",    &m_tau_matchedJetJvt);
  }

  if( m_infoSwitch.m_trackAll) {
    tree->SetBranchStatus ( (m_name + "_tracks_pt").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_pt").c_str() , &m_tau_tracks_pt );

    tree->SetBranchStatus ( (m_name + "_tracks_eta").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_eta").c_str() , &m_tau_tracks_eta );

    tree->SetBranchStatus ( (m_name + "_tracks_phi").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_phi").c_str() , &m_tau_tracks_phi );

    tree->SetBranchStatus ( (m_name + "_tracks_isCore").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isCore").c_str() , &m_tau_tracks_isCore );

    tree->SetBranchStatus ( (m_name + "_tracks_isWide").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isWide").c_str() , &m_tau_tracks_isWide );

    tree->SetBranchStatus ( (m_name + "_tracks_failTrackFilter").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_failTrackFilter").c_str() , &m_tau_tracks_failTrackFilter );

    tree->SetBranchStatus ( (m_name + "_tracks_passTrkSel").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_passTrkSel").c_str() , &m_tau_tracks_passTrkSel );

    tree->SetBranchStatus ( (m_name + "_tracks_isClCharged").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isClCharged").c_str() , &m_tau_tracks_isClCharged );

    tree->SetBranchStatus ( (m_name + "_tracks_isClIso").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isClIso").c_str() , &m_tau_tracks_isClIso );

    tree->SetBranchStatus ( (m_name + "_tracks_isClConv").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isClConv").c_str() , &m_tau_tracks_isClConv );

    tree->SetBranchStatus ( (m_name + "_tracks_isClFake").c_str() , 1 );
    tree->SetBranchAddress( (m_name + "_tracks_isClFake").c_str() , &m_tau_tracks_isClFake );
  }

}

void TauContainer::updateParticle(uint idx, Tau& tau)
{
  ParticleContainer::updateParticle(idx,tau);

  // trigger
  if ( m_infoSwitch.m_trigger ) {
    tau.isTrigMatched         =     m_isTrigMatched         ->at(idx);
    tau.isTrigMatchedToChain  =     m_isTrigMatchedToChain  ->at(idx);
    tau.listTrigChains        =     m_listTrigChains        ->at(idx);
  }

  if ( m_infoSwitch.m_kinematic ) {
    tau.ntrk    =     m_ntrk    ->at(idx);
    tau.charge  =     m_charge  ->at(idx);
  }

  // scale factors w/ sys
  // per object
  if ( m_infoSwitch.m_effSF && m_mc ) {

    for (auto& taueff : m_infoSwitch.m_tauEffWPs) {
      tau.TauEff_SF[ taueff ] = (*m_TauEff_SF)[ taueff ].at(idx);
    }

    for (auto& trig : m_infoSwitch.m_trigWPs) {
      tau.TauTrigEff_SF[ trig ] = (*m_TauTrigEff_SF)[ trig ].at(idx);
    }
  }

  //  might need to delete these
  if ( m_infoSwitch.m_JetID ) {
    tau.isJetRNNSigVeryLoose   =   m_isJetRNNSigVeryLoose   ->at(idx);
    tau.isJetRNNSigLoose       =   m_isJetRNNSigLoose       ->at(idx);
    tau.isJetRNNSigMedium      =   m_isJetRNNSigMedium      ->at(idx);
    tau.isJetRNNSigTight       =   m_isJetRNNSigTight       ->at(idx);

    tau.JetRNNScore         =   m_JetRNNScore         ->at(idx);
    tau.JetRNNScoreSigTrans =   m_JetRNNScoreSigTrans ->at(idx);
  }

  if ( m_infoSwitch.m_EleVeto ) {
    tau.isEleRNNLoose   =  m_isEleRNNLoose   ->at(idx);
    tau.isEleRNNMedium  =  m_isEleRNNMedium  ->at(idx);
    tau.isEleRNNTight   =  m_isEleRNNTight   ->at(idx);

    tau.EleRNNScore     =  m_EleRNNScore     ->at(idx);

    tau.passEleOLR      =  m_passEleOLR      ->at(idx);
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    tau.matchedJetWidth  = m_tau_matchedJetWidth ->at(idx);
    tau.matchedJetJvt    = m_tau_matchedJetJvt ->at(idx);
  }

  if( m_infoSwitch.m_trackAll) {
    tau.tracks_pt  = m_tau_tracks_pt  ->at(idx);
    tau.tracks_eta = m_tau_tracks_eta ->at(idx);
    tau.tracks_phi = m_tau_tracks_phi ->at(idx);

    tau.tracks_isCore           = m_tau_tracks_isCore           ->at(idx);
    tau.tracks_isWide           = m_tau_tracks_isWide           ->at(idx);
    tau.tracks_failTrackFilter  = m_tau_tracks_failTrackFilter  ->at(idx);
    tau.tracks_passTrkSel       = m_tau_tracks_passTrkSel       ->at(idx);
    tau.tracks_isClCharged      = m_tau_tracks_isClCharged      ->at(idx);
    tau.tracks_isClIso          = m_tau_tracks_isClIso          ->at(idx);
    tau.tracks_isClConv         = m_tau_tracks_isClConv         ->at(idx);
    tau.tracks_isClFake         = m_tau_tracks_isClFake         ->at(idx);
  }

}


void TauContainer::setBranches(TTree *tree)
{

  ParticleContainer::setBranches(tree);

  if ( m_infoSwitch.m_trigger ){
    // this is true if there's a match for at least one trigger chain
    setBranch<int>(tree,"isTrigMatched", m_isTrigMatched);
    // a vector of trigger match decision for each tau trigger chain
    setBranch<vector<int> >(tree,"isTrigMatchedToChain", m_isTrigMatchedToChain );
    // a vector of strings for each tau trigger chain - 1:1 correspondence w/ vector above
    setBranch<string>(tree, "listTrigChains", m_listTrigChains );
  }

  if ( m_infoSwitch.m_kinematic ){
    setBranch<int>  (tree,"ntrk", m_ntrk);
    setBranch<float>(tree,"charge", m_charge );

  }

  if ( m_infoSwitch.m_effSF && m_mc ) {

    for (auto& taueff : m_infoSwitch.m_tauEffWPs) {
      tree->Branch( (m_name + "_TauEff_SF_" + taueff).c_str() , & (*m_TauEff_SF)[ taueff ] );
    }

    for (auto& trig : m_infoSwitch.m_trigWPs) {
      tree->Branch( (m_name + "_TauTrigEff_SF_" + trig).c_str() , & (*m_TauTrigEff_SF)[ trig ] );
    }
  }

  // might need to delete these
  if ( m_infoSwitch.m_JetID ){
    setBranch<int>   (tree,"isJetRNNSigVeryLoose", m_isJetRNNSigVeryLoose);
    setBranch<int>   (tree,"isJetRNNSigLoose", m_isJetRNNSigLoose);
    setBranch<int>   (tree,"isJetRNNSigMedium", m_isJetRNNSigMedium);
    setBranch<int>   (tree,"isJetRNNSigTight", m_isJetRNNSigTight);

    setBranch<float> (tree,"JetRNNScore", m_JetRNNScore);
    setBranch<float> (tree,"JetRNNScoreSigTrans", m_JetRNNScoreSigTrans);

  }

  if ( m_infoSwitch.m_EleVeto ){
    setBranch<int>   (tree,"isEleRNNLoose", m_isEleRNNLoose);
    setBranch<int>   (tree,"isEleRNNMedium", m_isEleRNNMedium);
    setBranch<int>   (tree,"isEleRNNTight", m_isEleRNNTight);

    setBranch<float> (tree,"EleRNNScore", m_EleRNNScore);

    setBranch<int>   (tree,"passEleOLR", m_passEleOLR);
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    setBranch<float>  (tree, "matchedJetWidth",    m_tau_matchedJetWidth);
    setBranch<float>  (tree, "matchedJetJvt",    m_tau_matchedJetJvt);
  }

  if( m_infoSwitch.m_trackAll) {
    tree->Branch( (m_name + "_tracks_pt").c_str() , &m_tau_tracks_pt );
    tree->Branch( (m_name + "_tracks_eta").c_str() , &m_tau_tracks_eta );
    tree->Branch( (m_name + "_tracks_phi").c_str() , &m_tau_tracks_phi );

    tree->Branch( (m_name + "_tracks_isCore").c_str() , &m_tau_tracks_isCore );
    tree->Branch( (m_name + "_tracks_isWide").c_str() , &m_tau_tracks_isWide );
    tree->Branch( (m_name + "_tracks_failTrackFilter").c_str() , &m_tau_tracks_failTrackFilter );
    tree->Branch( (m_name + "_tracks_passTrkSel").c_str() , &m_tau_tracks_passTrkSel );
    tree->Branch( (m_name + "_tracks_isClCharged").c_str() , &m_tau_tracks_isClCharged );
    tree->Branch( (m_name + "_tracks_isClIso").c_str() , &m_tau_tracks_isClIso );
    tree->Branch( (m_name + "_tracks_isClConv").c_str() , &m_tau_tracks_isClConv );
    tree->Branch( (m_name + "_tracks_isClFake").c_str() , &m_tau_tracks_isClFake );
  }

  return;
}



void TauContainer::clear()
{

  ParticleContainer::clear();

  if ( m_infoSwitch.m_trigger ) {
    m_isTrigMatched->clear();
    m_isTrigMatchedToChain->clear();
    m_listTrigChains->clear();
  }

  if ( m_infoSwitch.m_kinematic ) {
    m_ntrk->clear();
    m_charge->clear();
  }

  if ( m_infoSwitch.m_effSF && m_mc ) {

    for (auto& taueff : m_infoSwitch.m_tauEffWPs) {
      (*m_TauEff_SF)[ taueff ].clear();
    }

    for (auto& trig : m_infoSwitch.m_trigWPs) {
      (*m_TauTrigEff_SF)[ trig ].clear();
    }
  }

  // might need to delete these
  if ( m_infoSwitch.m_JetID ) {
    m_isJetRNNSigVeryLoose->clear();
    m_isJetRNNSigLoose->clear();
    m_isJetRNNSigMedium->clear();
    m_isJetRNNSigTight->clear();

    m_JetRNNScore->clear();
    m_JetRNNScoreSigTrans->clear();
  }

  if ( m_infoSwitch.m_EleVeto ) {
    m_isEleRNNLoose->clear();
    m_isEleRNNMedium->clear();
    m_isEleRNNTight->clear();

    m_EleRNNScore->clear();
    m_passEleOLR->clear();
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    m_tau_matchedJetWidth->clear();
    m_tau_matchedJetJvt->clear();
  }

  if( m_infoSwitch.m_trackAll) {
    m_tau_tracks_pt->clear();
    m_tau_tracks_eta->clear();
    m_tau_tracks_phi->clear();

    m_tau_tracks_isCore->clear();
    m_tau_tracks_isWide->clear();
    m_tau_tracks_failTrackFilter->clear();
    m_tau_tracks_passTrkSel->clear();
    m_tau_tracks_isClCharged->clear();
    m_tau_tracks_isClIso->clear();
    m_tau_tracks_isClConv->clear();
    m_tau_tracks_isClFake->clear();
  }

}


void TauContainer::FillTau( const xAOD::TauJet* tau ){
  return FillTau(static_cast<const xAOD::IParticle*>(tau));
}

void TauContainer::FillTau( const xAOD::IParticle* particle )
{

  ParticleContainer::FillParticle(particle);

  const xAOD::TauJet* tau=dynamic_cast<const xAOD::TauJet*>(particle);

  if ( m_infoSwitch.m_trigger ) {

    // retrieve map<string,char> w/ <chain,isMatched>
    //
    static SG::AuxElement::Accessor< std::map<std::string,char> > isTrigMatchedMapTauAcc("isTrigMatchedMapTau");

    std::vector<int> matches;

    if ( isTrigMatchedMapTauAcc.isAvailable( *tau ) ) {
      // loop over map and fill branches
      //
      for ( auto const &it : (isTrigMatchedMapTauAcc( *tau )) ) {
    matches.push_back( static_cast<int>(it.second) );
    m_listTrigChains->push_back( it.first );
      }
    } else {
      matches.push_back( -1 );
      m_listTrigChains->push_back("NONE");
    }

    m_isTrigMatchedToChain->push_back(matches);

    // if at least one match among the chains is found, say this tau is trigger matched
    if ( std::find(matches.begin(), matches.end(), 1) != matches.end() ) { m_isTrigMatched->push_back(1); }
    else { m_isTrigMatched->push_back(0); }

  }

  if ( m_infoSwitch.m_kinematic ) {

    m_charge->push_back( tau->charge()  );
    m_ntrk  ->push_back( tau->nTracks() );
  }

  if ( m_infoSwitch.m_effSF && m_mc ) {

    std::vector<float> junkSF(1,-1.0);

    static std::map< std::string, SG::AuxElement::Accessor< std::vector< float > > > accTauEffSF;
    static std::map< std::string, SG::AuxElement::Accessor< std::vector< float > > > accTauTrigSF;

    for (auto& taueff : m_infoSwitch.m_tauEffWPs) {
      std::string tauEffSF = "TauEff_SF_syst_" + taueff;
      accTauEffSF.insert( std::pair<std::string, SG::AuxElement::Accessor< std::vector< float > > > ( taueff , SG::AuxElement::Accessor< std::vector< float > >( tauEffSF ) ) );
      safeSFVecFill<float, xAOD::TauJet>( tau, accTauEffSF.at( taueff ), &m_TauEff_SF->at( taueff ), junkSF );
    }

    for (auto& trig : m_infoSwitch.m_trigWPs) {
      std::string trigEffSF = "TauEff_SF_syst_" + trig;
      accTauTrigSF.insert( std::pair<std::string, SG::AuxElement::Accessor< std::vector< float > > > ( trig , SG::AuxElement::Accessor< std::vector< float > >( trigEffSF ) ) );
      safeSFVecFill<float, xAOD::TauJet>( tau, accTauTrigSF.at( trig ), &m_TauTrigEff_SF->at( trig ), junkSF );
    }

  }

  // might need to delete these
  if ( m_infoSwitch.m_JetID ) {

    static SG::AuxElement::Accessor<int> isJetRNNSigVeryLooseAcc ("isJetRNNSigVeryLoose");
    safeFill<int, int, xAOD::TauJet>(tau, isJetRNNSigVeryLooseAcc, m_isJetRNNSigVeryLoose, -1);

    static SG::AuxElement::Accessor<int> isJetRNNSigLooseAcc ("isJetRNNSigLoose");
    safeFill<int, int, xAOD::TauJet>(tau, isJetRNNSigLooseAcc, m_isJetRNNSigLoose, -1);

    static SG::AuxElement::Accessor<int> isJetRNNSigMediumAcc ("isJetRNNSigMedium");
    safeFill<int, int, xAOD::TauJet>(tau, isJetRNNSigMediumAcc, m_isJetRNNSigMedium, -1);

    static SG::AuxElement::Accessor<int> isJetRNNSigTightAcc ("isJetRNNSigTight");
    safeFill<int, int, xAOD::TauJet>(tau, isJetRNNSigTightAcc, m_isJetRNNSigTight, -1);

    static SG::AuxElement::Accessor<float> JetRNNScoreAcc ("JetRNNScore");
    safeFill<float, float, xAOD::TauJet>(tau, JetRNNScoreAcc, m_JetRNNScore, -999.);

    static SG::AuxElement::Accessor<float> JetRNNScoreSigTransAcc ("JetRNNScoreSigTrans");
    safeFill<float, float, xAOD::TauJet>(tau, JetRNNScoreSigTransAcc, m_JetRNNScoreSigTrans, -999.);
  }

  if ( m_infoSwitch.m_EleVeto ) {

    static SG::AuxElement::Accessor<int> isEleRNNLooseAcc ("isEleRNNLoose");
    safeFill<int, int, xAOD::TauJet>(tau, isEleRNNLooseAcc, m_isEleRNNLoose, -1);

    static SG::AuxElement::Accessor<int> isEleRNNMediumAcc ("isEleRNNMedium");
    safeFill<int, int, xAOD::TauJet>(tau, isEleRNNMediumAcc, m_isEleRNNMedium, -1);

    static SG::AuxElement::Accessor<int> isEleRNNTightAcc ("isEleRNNTight");
    safeFill<int, int, xAOD::TauJet>(tau, isEleRNNTightAcc, m_isEleRNNTight, -1);

    static SG::AuxElement::Accessor<float> EleRNNScoreAcc ("EleRNNScore");
    safeFill<float, float, xAOD::TauJet>(tau, EleRNNScoreAcc, m_EleRNNScore, -999.);

    static SG::AuxElement::Accessor<int> passEleOLRAcc ("passEleOLR");
    safeFill<int, int, xAOD::TauJet>(tau, passEleOLRAcc, m_passEleOLR, -1);
  }

  if( m_infoSwitch.m_xahTauJetMatching) {
    static SG::AuxElement::Accessor< float > jetWidthAcc("JetWidth");
    safeFill<float, float, xAOD::TauJet>(tau, jetWidthAcc, m_tau_matchedJetWidth, -1.);
    static SG::AuxElement::Accessor< float > jetJvtAcc("JetJvt");
    safeFill<float, float, xAOD::TauJet>(tau, jetJvtAcc, m_tau_matchedJetJvt, -1.);
  }

  if( m_infoSwitch.m_trackAll) {
    static SG::AuxElement::ConstAccessor< std::vector<float>   >   tauTrackPtAcc("trackPt");
    safeVecFill<float, float, xAOD::TauJet>(tau, tauTrackPtAcc, m_tau_tracks_pt);

    static SG::AuxElement::ConstAccessor< std::vector<float>   >   tauTrackEtaAcc("trackEta");
    safeVecFill<float, float, xAOD::TauJet>(tau, tauTrackEtaAcc, m_tau_tracks_eta);

    static SG::AuxElement::ConstAccessor< std::vector<float>   >   tauTrackPhiAcc("trackPhi");
    safeVecFill<float, float, xAOD::TauJet>(tau, tauTrackPhiAcc, m_tau_tracks_phi);

    // track classification
    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsCoreAcc("trackIsCore");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsCoreAcc, m_tau_tracks_isCore);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsWideAcc("trackIsWide");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsWideAcc, m_tau_tracks_isWide);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackFailTrackFilterAcc("trackFailTrackFilter");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackFailTrackFilterAcc, m_tau_tracks_failTrackFilter);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackPassTrkSelAcc("trackPassTrkSel");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackPassTrkSelAcc, m_tau_tracks_passTrkSel);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsClChargedAcc("trackIsClCharged");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsClChargedAcc, m_tau_tracks_isClCharged);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsClIsoAcc("trackIsClIso");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsClIsoAcc, m_tau_tracks_isClIso);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsClConvAcc("trackIsClConv");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsClConvAcc, m_tau_tracks_isClConv);

    static SG::AuxElement::ConstAccessor< std::vector<int>   >   tauTrackIsClFakeAcc("trackIsClFake");
    safeVecFill<int, int, xAOD::TauJet>(tau, tauTrackIsClFakeAcc, m_tau_tracks_isClFake);
  }

  return;
}