From a20c37ccbc932b1723aac23d446d04d0db228211 Mon Sep 17 00:00:00 2001
From: Justin Griffiths <justin.adam.griffiths@cern.ch>
Date: Wed, 25 May 2016 15:53:07 +0200
Subject: [PATCH] fix ATLASRECTS-3184 (tauRecTools-00-01-03)

	* tagging 00-01-03
	* fix ATLASRECTS-3184

2016 23-05-2016: griffith@cern.ch
	* about branches
	* 00-00-12 : 20.7/ ABR
	* 00-00-13 : r21 pre TauJet_v3
	* 00-00-14 : MIG5 (Rec::Vertex removal)

2016 23-05-2016: griffith@cern.ch
	* tagging 00-01-02
	* fix MvaTES for cosmics running

2016 14-05-2016: griffith@cern.ch
	* Updating to new EDM
	* not suitable for r<=20.7
	* branch off of tauRecTools-00-00-11 for r20.7 and older fixes


Former-commit-id: fd1f4dcc3f829b3069eeb871cb4218c6e3966549
---
 Reconstruction/tauRecTools/CMakeLists.txt     |   2 +-
 .../Root/CombinedP4FromRecoTaus.cxx           |  12 +-
 Reconstruction/tauRecTools/Root/LinkDef.h     |   4 +-
 .../tauRecTools/Root/MvaTESEvaluator.cxx      |  34 ++-
 .../Root/MvaTESVariableDecorator.cxx          |  47 ++-
 .../tauRecTools/Root/TauBuilderTool.cxx       |  36 ++-
 .../tauRecTools/Root/TauCalibrateLC.cxx       |  12 +-
 .../tauRecTools/Root/TauCommonCalcVars.cxx    |  74 ++---
 .../tauRecTools/Root/TauProcessorTool.cxx     |   9 +
 .../Root/TauSubstructureVariables.cxx         |   4 +-
 .../tauRecTools/Root/TauTrackClassifier.cxx   | 270 ++++++++++++++++++
 .../tauRecTools/Root/TauTrackFilter.cxx       | 121 ++++----
 Reconstruction/tauRecTools/cmt/requirements   |   2 +-
 .../share/TF2pileupForOfflineID_1p.root       | Bin 17230 -> 0 bytes
 .../share/TF2pileupForOfflineID_3p.root       | Bin 18865 -> 0 bytes
 .../tauRecTools/src/JetSeedBuilder.cxx        |  10 +-
 .../src/PhotonConversionVertex.cxx            |  12 +-
 .../tauRecTools/src/TauAxisSetter.cxx         |   8 +-
 .../tauRecTools/src/TauCalibrateEM.cxx        |   6 +-
 .../tauRecTools/src/TauConversionFinder.cxx   |  19 +-
 .../tauRecTools/src/TauConversionTagger.cxx   |   9 +-
 .../src/TauElectronVetoVariables.cxx          |  12 +-
 .../tauRecTools/src/TauPi0ClusterScaler.cxx   | 166 ++++++-----
 .../tauRecTools/src/TauPi0ClusterScaler.h     |  15 +-
 .../tauRecTools/src/TauPi0CreateROI.cxx       |   2 +-
 .../tauRecTools/src/TauPi0Selector.cxx        |  14 +-
 .../src/TauShotVariableHelpers.cxx            |   8 +-
 .../tauRecTools/src/TauTrackFinder.cxx        | 143 ++++++----
 .../tauRecTools/src/TauTrackFinder.h          |   7 +
 .../tauRecTools/src/TauVertexFinder.cxx       | 265 +++++++++--------
 .../tauRecTools/src/TauVertexFinder.h         |  70 ++---
 .../tauRecTools/src/TauVertexVariables.cxx    |   8 +-
 .../src/components/tauRecTools_entries.cxx    |   3 +
 .../tauRecTools/tauRecTools/ITauToolBase.h    |   4 +-
 .../tauRecTools/MvaTESVariableDecorator.h     |   2 +
 .../tauRecTools/tauRecTools/TauBuilderTool.h  |   2 +
 .../tauRecTools/tauRecTools/TauCalibrateLC.h  |   3 +-
 .../tauRecTools/TauProcessorTool.h            |   1 +
 .../tauRecTools/TauTrackClassifier.h          | 159 +++++++++++
 .../tauRecTools/tauRecTools/TauTrackFilter.h  |   1 +
 40 files changed, 1056 insertions(+), 520 deletions(-)
 create mode 100644 Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
 delete mode 100644 Reconstruction/tauRecTools/share/TF2pileupForOfflineID_1p.root
 delete mode 100644 Reconstruction/tauRecTools/share/TF2pileupForOfflineID_3p.root
 create mode 100644 Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h

diff --git a/Reconstruction/tauRecTools/CMakeLists.txt b/Reconstruction/tauRecTools/CMakeLists.txt
index cba8060dbeb0..8d2bbe9c02de 100644
--- a/Reconstruction/tauRecTools/CMakeLists.txt
+++ b/Reconstruction/tauRecTools/CMakeLists.txt
@@ -24,7 +24,7 @@ atlas_depends_on_subdirs( PUBLIC
                           Event/xAOD/xAODPFlow
                           GaudiKernel
                           InnerDetector/InDetRecTools/InDetRecToolInterfaces
-                          PhysicsAnalysis/TauID/TauAnalysisTools
+			  InnerDetector/InDetRecTools/InDetTrackSelectionTool
                           Reconstruction/Jet/JetEDM
                           Reconstruction/Particle
                           Reconstruction/RecoTools/ITrackToVertex
diff --git a/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx b/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
index 28cfabd82a5a..2c4fb4cac4e7 100644
--- a/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
+++ b/Reconstruction/tauRecTools/Root/CombinedP4FromRecoTaus.cxx
@@ -5,7 +5,7 @@
 // Framework include(s)
 #include "PathResolver/PathResolver.h"
 
-#include "TauAnalysisTools/HelperFunctions.h"
+//#include "TauAnalysisTools/HelperFunctions.h"
 
 // local include(s)
 #include "tauRecTools/CombinedP4FromRecoTaus.h"
@@ -139,7 +139,7 @@ StatusCode CombinedP4FromRecoTaus::initialize() {
 StatusCode CombinedP4FromRecoTaus::execute(xAOD::TauJet& xTau) {
   xAOD::TauJet* Tau = &xTau;
   int tmpDecayModeProto;
-  xTau.panTauDetail(xAOD::TauJetParameters::PanTauDetails::pantau_CellBasedInput_DecayModeProto, tmpDecayModeProto);
+  xTau.panTauDetail(xAOD::TauJetParameters::PanTauDetails::PanTau_DecayModeProto, tmpDecayModeProto);
   if(tmpDecayModeProto>xAOD::TauJetParameters::Mode_3pXn){
     xTau.auxdecor<float>("pt_combined")  = 1.;    
     return StatusCode::SUCCESS;
@@ -554,7 +554,7 @@ TLorentzVector CombinedP4FromRecoTaus::getCombinedP4(const xAOD::TauJet* tau) {
   ATH_MSG_DEBUG( "TauRecET: " << tauRecP4.Et() );
   xAOD::TauJetParameters::DecayMode decayMode = xAOD::TauJetParameters::DecayMode::Mode_Error;
   int tmpDecayMode;
-  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::pantau_CellBasedInput_DecayMode, tmpDecayMode)) {
+  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::PanTau_DecayMode, tmpDecayMode)) {
     decayMode = static_cast< xAOD::TauJetParameters::DecayMode>(tmpDecayMode);
   }
   ATH_MSG_DEBUG( "Decaymode is: " << decayMode );
@@ -598,7 +598,7 @@ TLorentzVector CombinedP4FromRecoTaus::getCalibratedConstituentP4(const xAOD::Ta
 
   xAOD::TauJetParameters::DecayMode decayMode = xAOD::TauJetParameters::DecayMode::Mode_Error;
   int tmpDecayMode;
-  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::pantau_CellBasedInput_DecayMode, tmpDecayMode)) {
+  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::PanTau_DecayMode, tmpDecayMode)) {
     decayMode = static_cast< xAOD::TauJetParameters::DecayMode>(tmpDecayMode);
   }
   ATH_MSG_DEBUG( "Decaymode is: " << decayMode );
@@ -638,7 +638,7 @@ TLorentzVector CombinedP4FromRecoTaus::getCalibratedTauRecP4(const xAOD::TauJet*
   ATH_MSG_DEBUG( "TauRecET: " << tauRecP4.Et() );
   xAOD::TauJetParameters::DecayMode decayMode = xAOD::TauJetParameters::DecayMode::Mode_Error;
   int tmpDecayMode;
-  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::pantau_CellBasedInput_DecayMode, tmpDecayMode)) {
+  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::PanTau_DecayMode, tmpDecayMode)) {
     decayMode = static_cast< xAOD::TauJetParameters::DecayMode>(tmpDecayMode);
   }
   ATH_MSG_DEBUG( "Decaymode is: " << decayMode );
@@ -679,7 +679,7 @@ TLorentzVector CombinedP4FromRecoTaus::getWeightedP4(const xAOD::TauJet* tau) {
   ATH_MSG_DEBUG( "TauRecET: " << tauRecP4.Et() );
   xAOD::TauJetParameters::DecayMode decayMode = xAOD::TauJetParameters::DecayMode::Mode_Error;
   int tmpDecayMode;
-  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::pantau_CellBasedInput_DecayMode, tmpDecayMode)) {
+  if (tau->panTauDetail(xAOD::TauJetParameters::PanTauDetails::PanTau_DecayMode, tmpDecayMode)) {
     decayMode = static_cast< xAOD::TauJetParameters::DecayMode>(tmpDecayMode);
   }
   ATH_MSG_DEBUG( "Decaymode is: " << decayMode );
diff --git a/Reconstruction/tauRecTools/Root/LinkDef.h b/Reconstruction/tauRecTools/Root/LinkDef.h
index c13ca4fb2dbc..6f73af0eb338 100644
--- a/Reconstruction/tauRecTools/Root/LinkDef.h
+++ b/Reconstruction/tauRecTools/Root/LinkDef.h
@@ -12,6 +12,7 @@
 #include "tauRecTools/ITauToolBase.h"
 #include "tauRecTools/MvaTESVariableDecorator.h"
 #include "tauRecTools/MvaTESEvaluator.h"
+#include "tauRecTools/TauTrackClassifier.h"
 #include "tauRecTools/CombinedP4FromRecoTaus.h"
 
 #ifdef __CINT__
@@ -23,7 +24,6 @@
 
 #endif
 
-
 #ifdef __CINT__
 
 #pragma link C++ class TauCalibrateLC+;
@@ -37,6 +37,8 @@
 #pragma link C++ class ITauToolBase+;
 #pragma link C++ class MvaTESVariableDecorator+;
 #pragma link C++ class MvaTESEvaluator+;
+#pragma link C++ class TauTrackClassifier+;
+#pragma link C++ class TrackMVABDT+;
 #pragma link C++ class CombinedP4FromRecoTaus+;
 
 #endif
diff --git a/Reconstruction/tauRecTools/Root/MvaTESEvaluator.cxx b/Reconstruction/tauRecTools/Root/MvaTESEvaluator.cxx
index 8c15a3bc1bca..3a92c1147312 100644
--- a/Reconstruction/tauRecTools/Root/MvaTESEvaluator.cxx
+++ b/Reconstruction/tauRecTools/Root/MvaTESEvaluator.cxx
@@ -7,7 +7,7 @@
 
 // tools include(s) 
 
-#include "TauAnalysisTools/HelperFunctions.h"
+//#include "TauAnalysisTools/HelperFunctions.h"
 
 //_____________________________________________________________________________
 MvaTESEvaluator::MvaTESEvaluator(const std::string& name)
@@ -75,36 +75,34 @@ StatusCode MvaTESEvaluator::execute(xAOD::TauJet& xTau){
   nVtx = xTau.auxdata<int>("nVtx");
   
   // Retrieve seed jet info
-  center_lambda = xTau.auxdata<double>("center_lambda");
-  first_eng_dens = xTau.auxdata<double>("first_eng_dens");
-  em_probability = xTau.auxdata<double>("em_probability");
-  second_lambda = xTau.auxdata<double>("second_lambda");
-  presampler_frac = xTau.auxdata<double>("presampler_frac");
-  nMuSeg = (float)xTau.auxdata<int>("GhostMuonSegmentCount");
-  
+  xTau.detail(xAOD::TauJetParameters::ClustersMeanCenterLambda, center_lambda);
+  xTau.detail(xAOD::TauJetParameters::ClustersMeanFirstEngDens, first_eng_dens);
+  xTau.detail(xAOD::TauJetParameters::ClustersMeanEMProbability,em_probability);
+  xTau.detail(xAOD::TauJetParameters::ClustersMeanSecondLambda, second_lambda);
+  xTau.detail(xAOD::TauJetParameters::ClustersMeanPresamplerFrac, presampler_frac);
+  int nMuSeg_i=0;
+  xTau.detail(xAOD::TauJetParameters::GhostMuonSegmentCount, nMuSeg_i);
+  nMuSeg=nMuSeg_i;
+
   // Retrieve pantau and LC-precalib TES
-  seedCalo_eta    = xTau.auxdata<float>("seedCalo_eta");
-  float pT_LC     = xTau.auxdata<float>("LC_TES_precalib");
+  seedCalo_eta    = xTau.etaDetectorAxis();
+  float pT_LC     = xTau.ptDetectorAxis();
   float pT_pantau = xTau.ptPanTauCellBased();
-  interpolPt      = xTau.auxdata<double>("LC_pantau_interpolPt");
+  xTau.detail(xAOD::TauJetParameters::LC_pantau_interpolPt, interpolPt);
   LC_D_interpolPt     = pT_LC / interpolPt;
   pantau_D_interpolPt = pT_pantau / interpolPt;
   
   // Retrieve substructures info
   nTracks = (float)xTau.nTracks();
-  nPi0PFOs = (float)xTau.auxdata<int>("nPi0PFOs");
-  PFOEngRelDiff = xTau.auxdata<double>("PFOEngRelDiff");  
+  nPi0PFOs = (float) xTau.nPi0s();
+  xTau.detail(xAOD::TauJetParameters::PFOEngRelDiff, PFOEngRelDiff);  
 
   // "Retrieve" spectator variables
   truthPtVis = 0.;
 
-  //  xTau.auxdecor<float>("ptMvaTES") = float( interpolPt * reader->EvaluateRegression( 0, "BDTG" ) );
   float ptMVA = float( interpolPt * reader->EvaluateRegression( 0, "BDTG" ) );
   if(ptMVA<1) ptMVA=1;
-  xTau.auxdecor<float>("ptFinalCalib") = ptMVA;
-  xTau.auxdecor<float>("etaFinalCalib") = xTau.auxdata<float>("etaPanTauCellBased");
-  xTau.auxdecor<float>("phiFinalCalib") = xTau.auxdata<float>("phiPanTauCellBased");
-  xTau.auxdecor<float>("mFinalCalib") = 0;
+  xTau.setP4(xAOD::TauJetParameters::FinalCalib, ptMVA, xTau.etaPanTauCellBased(), xTau.phiPanTauCellBased(), 0);
 
   return StatusCode::SUCCESS;
 
diff --git a/Reconstruction/tauRecTools/Root/MvaTESVariableDecorator.cxx b/Reconstruction/tauRecTools/Root/MvaTESVariableDecorator.cxx
index bfaca23b3f9a..173bbb35c2b6 100644
--- a/Reconstruction/tauRecTools/Root/MvaTESVariableDecorator.cxx
+++ b/Reconstruction/tauRecTools/Root/MvaTESVariableDecorator.cxx
@@ -6,7 +6,7 @@
 #include "tauRecTools/MvaTESVariableDecorator.h"
 
 // tools include(s) 
-#include "TauAnalysisTools/HelperFunctions.h"
+//#include "TauAnalysisTools/HelperFunctions.h"
 
 //_____________________________________________________________________________
 MvaTESVariableDecorator::MvaTESVariableDecorator(const std::string& name) 
@@ -30,7 +30,7 @@ StatusCode MvaTESVariableDecorator::eventInitialize()
   m_mu = m_xEventInfo->averageInteractionsPerCrossing();
 
   if(evtStore()->contains<xAOD::VertexContainer>("PrimaryVertices")){
-    ATH_CHECK(evtStore()->retrieve(m_xVertexContainer, "PrimaryVertices"));
+    ATH_CHECK(evtStore()->retrieve(m_xVertexContainer, "PrimaryVertices"));  
     m_nVtx = (int)m_xVertexContainer->size();
   }
   else {
@@ -45,6 +45,7 @@ StatusCode MvaTESVariableDecorator::eventInitialize()
 StatusCode MvaTESVariableDecorator::execute(xAOD::TauJet& xTau) {
   
   // Decorate event info
+  
   xTau.auxdata<double>("mu") = m_mu;
   xTau.auxdata<int>("nVtx") = m_nVtx;
  
@@ -57,10 +58,10 @@ StatusCode MvaTESVariableDecorator::execute(xAOD::TauJet& xTau) {
   double clE=0., Etot=0.;
   
   TLorentzVector LC_P4;
-  LC_P4.SetPtEtaPhiM(xTau.auxdata<float>("LC_TES_precalib"),
-                     xTau.auxdata<float>("seedCalo_eta"),
-                     xTau.auxdata<float>("seedCalo_phi"),
-                     xTau.m());
+  LC_P4.SetPtEtaPhiM(xTau.ptDetectorAxis(),
+		     xTau.etaDetectorAxis(),
+		     xTau.phiDetectorAxis(),
+		     xTau.m());
   
   // ----loop over jet seed constituents
   xAOD::JetConstituentVector vec = jet_seed->getConstituents();
@@ -100,30 +101,27 @@ StatusCode MvaTESVariableDecorator::execute(xAOD::TauJet& xTau) {
   }
   
   // ----retrieve Ghost Muon Segment Count (for punch-through studies)
-  const int nMuSeg = jet_seed->getAttribute<int>("GhostMuonSegmentCount");
+  int nMuSeg=0;
+  if(!jet_seed->getAttribute<int>("GhostMuonSegmentCount", nMuSeg)) nMuSeg=0;
   
   // ----decorating jet seed information to tau
-  xTau.auxdecor<double>("center_lambda")   = mean_center_lambda;
-  xTau.auxdecor<double>("first_eng_dens")  = mean_first_eng_dens;
-  xTau.auxdecor<double>("em_probability")  = mean_em_probability;
-  xTau.auxdecor<double>("second_lambda")   = mean_second_lambda;
-  xTau.auxdecor<double>("presampler_frac") = mean_presampler_frac;
-  xTau.auxdecor<int>("GhostMuonSegmentCount") = nMuSeg;
+  xTau.setDetail(xAOD::TauJetParameters::ClustersMeanCenterLambda, (float) mean_center_lambda);
+  xTau.setDetail(xAOD::TauJetParameters::ClustersMeanFirstEngDens, (float) mean_first_eng_dens);
+  xTau.setDetail(xAOD::TauJetParameters::ClustersMeanEMProbability, (float) mean_em_probability);
+  xTau.setDetail(xAOD::TauJetParameters::ClustersMeanSecondLambda, (float) mean_second_lambda);
+  xTau.setDetail(xAOD::TauJetParameters::ClustersMeanPresamplerFrac, (float) mean_presampler_frac);
+  xTau.setDetail(xAOD::TauJetParameters::GhostMuonSegmentCount, nMuSeg);
   
   // calculate PFO energy relative difference
   // ----summing corrected Pi0 PFO energies
   TLorentzVector Pi0_totalP4;
   Pi0_totalP4.SetPtEtaPhiM(0,0,0,0);
   
-  std::vector<TLorentzVector> Pi0PFOs;
-  TauAnalysisTools::createPi0Vectors(&xTau,Pi0PFOs);
-  
-  for(size_t i=0; i<Pi0PFOs.size(); i++){
-    Pi0_totalP4 += Pi0PFOs.at(i);
-  };
+  //This should be available in EDM as of TauJet_v3
+  //  TauAnalysisTools::createPi0Vectors(&xTau,Pi0PFOs);
+  for( size_t i=0; i !=  xTau.nPi0s(); ++i ) Pi0_totalP4+= xTau.pi0(i)->p4();
   
   double Pi0_totalE = Pi0_totalP4.E();
-  int    nPi0PFOs   = (int)Pi0PFOs.size();
   
   // ----summing charged PFO energies
   TLorentzVector charged_totalP4;
@@ -134,27 +132,24 @@ StatusCode MvaTESVariableDecorator::execute(xAOD::TauJet& xTau) {
   };
   
   double charged_totalE = charged_totalP4.E();
-  int    nChargedPFOs   = (int)xTau.nChargedPFOs();
   
   // ----calculate relative difference and decorate to tau
   double relDiff=0.;
   if(Pi0_totalE+charged_totalE){
     relDiff = (charged_totalE - Pi0_totalE) / (charged_totalE + Pi0_totalE) ;
   }
-  xTau.auxdecor<int>("nPi0PFOs")     = nPi0PFOs;
-  xTau.auxdecor<int>("nChargedPFOs") = nChargedPFOs;
-  xTau.auxdecor<double>("PFOEngRelDiff") = relDiff;
+  xTau.setDetail(xAOD::TauJetParameters::PFOEngRelDiff, (float) relDiff);
   
   // calculate interpolated pT
   double GeV = 1000.;
   double pt_pantau  = xTau.ptPanTauCellBased();
-  double pt_LC      = xTau.auxdata<float>("LC_TES_precalib");
+  double pt_LC      = xTau.ptDetectorAxis();
   double interpolWeight;
   
   interpolWeight = 0.5 * ( 1. + TMath::TanH( ( pt_LC/GeV - 250. ) / 20. ) );
   double LC_pantau_interpolPt = interpolWeight*pt_LC + (1.-interpolWeight)*pt_pantau;
   
-  xTau.auxdecor<double>("LC_pantau_interpolPt") = LC_pantau_interpolPt;
+  xTau.setDetail(xAOD::TauJetParameters::LC_pantau_interpolPt, (float) LC_pantau_interpolPt);
 
   return StatusCode::SUCCESS;
 
diff --git a/Reconstruction/tauRecTools/Root/TauBuilderTool.cxx b/Reconstruction/tauRecTools/Root/TauBuilderTool.cxx
index 239735e88a81..eb210a64ee6e 100644
--- a/Reconstruction/tauRecTools/Root/TauBuilderTool.cxx
+++ b/Reconstruction/tauRecTools/Root/TauBuilderTool.cxx
@@ -10,15 +10,18 @@
 #include "xAODTau/TauJetContainer.h"
 #include "xAODTau/TauJetAuxContainer.h"
 #include "xAODTau/TauDefs.h"
+#include "xAODTau/TauTrackContainer.h"
+#include "xAODTau/TauTrackAuxContainer.h"
 
 #include "tauRecTools/TauEventData.h"
 
-
 //________________________________________
 TauBuilderTool::TauBuilderTool(const std::string& type) :
   asg::AsgTool(type),
   m_tauContainerName("TauJets"),
   m_tauAuxContainerName("TauJetsAux."),
+  m_tauTrackContainerName("TauTracks"),
+  m_tauTrackAuxContainerName("TauTracksAux."),
   m_seedContainerName(""),
   m_maxEta(2.5),
   m_minPt(10000),
@@ -26,6 +29,8 @@ TauBuilderTool::TauBuilderTool(const std::string& type) :
 {
   declareProperty("TauContainer", m_tauContainerName);
   declareProperty("TauAuxContainer", m_tauAuxContainerName);
+  declareProperty("TauTrackContainer", m_tauTrackContainerName);
+  declareProperty("TauTrackAuxContainer", m_tauTrackAuxContainerName);
   declareProperty("SeedContainer", m_seedContainerName);
   declareProperty("MaxEta", m_maxEta);
   declareProperty("MinPt", m_minPt);
@@ -95,7 +100,8 @@ StatusCode TauBuilderTool::execute(){
 
   xAOD::TauJetContainer * pContainer = 0;
   xAOD::TauJetAuxContainer* pAuxContainer = 0;
-
+  xAOD::TauTrackContainer* pTracks = 0;
+  xAOD::TauTrackAuxContainer* pAuxTracks = 0;
 
 
   if (m_doCreateTauContainers) {        
@@ -123,6 +129,13 @@ StatusCode TauBuilderTool::execute(){
     ATH_MSG_DEBUG( "Recorded xAOD tau jets with key: "
 		   << m_tauAuxContainerName );
 
+
+    pTracks = new xAOD::TauTrackContainer();
+    ATH_CHECK( evtStore()->record( pTracks, m_tauTrackContainerName) );
+    pAuxTracks = new xAOD::TauTrackAuxContainer();
+    ATH_CHECK( evtStore()->record( pAuxTracks, m_tauTrackAuxContainerName));
+    pTracks->setStore( pAuxTracks );
+
   } else {
     //-------------------------------------------------------------------------
     // retrieve Tau Containers from StoreGate
@@ -192,7 +205,8 @@ StatusCode TauBuilderTool::execute(){
 
   ATH_MSG_VERBOSE("Number of seeds in the container: " << pSeedContainer->size());
 
-  for (; itS != itSE; ++itS) {
+  for (; itS != itSE; ++itS) {  
+
     const xAOD::Jet *pSeed = (*itS);
     ATH_MSG_VERBOSE("Seeds eta:" << pSeed->eta() << ", pt:" << pSeed->pt());
 
@@ -261,11 +275,24 @@ StatusCode TauBuilderTool::execute(){
 	(*p_itT1)->cleanup(&m_data);
 	(*p_itT1)->cleanup(&m_data);
       */
+      
+      //remove orphaned tracks before tau is deleted via pop_back
+      xAOD::TauJet* bad_tau = pContainer->back();
+      ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: ");
+      pTracks->erase(pTracks->end()-bad_tau->nAllTracks(), pTracks->end());
+
       //m_data.xAODTauContainer->pop_back();
       pContainer->pop_back();
-    } else
+    } else{
+      
+      //remove orphaned tracks before tau is deleted via pop_back
+      xAOD::TauJet* bad_tau = pContainer->back();
+      ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: ");
+      pTracks->erase(pTracks->end()-bad_tau->nAllTracks(), pTracks->end());
+      
       //m_data.xAODTauContainer->pop_back();
       pContainer->pop_back();
+    }
   }
 
 
@@ -282,6 +309,7 @@ StatusCode TauBuilderTool::execute(){
       return StatusCode::FAILURE;
   }
 
+
   //keep this here for future use (in case more than one seeding algo exist)
   /*
     p_itET = m_endTools.begin();
diff --git a/Reconstruction/tauRecTools/Root/TauCalibrateLC.cxx b/Reconstruction/tauRecTools/Root/TauCalibrateLC.cxx
index e0dbb09b514e..adb81f2b6db0 100644
--- a/Reconstruction/tauRecTools/Root/TauCalibrateLC.cxx
+++ b/Reconstruction/tauRecTools/Root/TauCalibrateLC.cxx
@@ -43,12 +43,6 @@ m_clusterCone(0.2)  //not used
     declareProperty("isCaloOnly",    m_isCaloOnly);
 }
 
-TauCalibrateLC::TauCalibrateLC() :
-  TauCalibrateLC("TauCalibrateLC")//c++11
-{
-}
-
-
 /********************************************************************/
 TauCalibrateLC::~TauCalibrateLC() {
 }
@@ -73,7 +67,7 @@ StatusCode TauCalibrateLC::initialize() {
         etaBinHist = dynamic_cast<TH1 *> (obj);
     }
     if (etaBinHist) {
-        TH1 * tmp = const_cast<TH1*> (etaBinHist);
+        TH1 * tmp = dynamic_cast<TH1*> (obj);
         tmp->SetDirectory(0);
     } else {
         ATH_MSG_FATAL("Failed to get an object with  key " << key);
@@ -99,7 +93,7 @@ StatusCode TauCalibrateLC::initialize() {
         etaCorrectionHist = dynamic_cast<TH1 *> (obj);
     }
     if (etaCorrectionHist) {
-        TH1 * tmp = const_cast<TH1*> (etaCorrectionHist);
+        TH1 * tmp = dynamic_cast<TH1*> (obj);
         tmp->SetDirectory(0);
     } else {
         ATH_MSG_FATAL("Failed to get an object with  key " << key);
@@ -116,7 +110,7 @@ StatusCode TauCalibrateLC::initialize() {
             slopeNPVHist[i] = dynamic_cast<TH1 *> (obj);
         }
         if (slopeNPVHist[i]) {
-            TH1 * tmp = const_cast<TH1*> (slopeNPVHist[i]);
+            TH1 * tmp = dynamic_cast<TH1*> (obj);
             tmp->SetDirectory(0);
         } else {
             ATH_MSG_FATAL("Failed to get an object with  key " << tmpSlopKey[i]);
diff --git a/Reconstruction/tauRecTools/Root/TauCommonCalcVars.cxx b/Reconstruction/tauRecTools/Root/TauCommonCalcVars.cxx
index c5f3d986560b..a8617e7f773b 100644
--- a/Reconstruction/tauRecTools/Root/TauCommonCalcVars.cxx
+++ b/Reconstruction/tauRecTools/Root/TauCommonCalcVars.cxx
@@ -23,7 +23,7 @@
 
 #include "tauRecTools/TauCommonCalcVars.h"
 #include "tauRecTools/KineUtils.h"
-
+#include <vector>
 //-----------------------------------------------------------------------------
 // Constructor
 //-----------------------------------------------------------------------------
@@ -106,54 +106,45 @@ StatusCode TauCommonCalcVars::execute(xAOD::TauJet& pTau) {
     // }
 
     // invariant mass of track system
-    if ((pTau.nTracks() + pTau.nWideTracks()) > 0) {
+    std::vector<const xAOD::TauTrack*> tauTracks = pTau.tracks(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged);
+    for( const xAOD::TauTrack* trk : pTau.tracks(xAOD::TauJetParameters::TauTrackFlag::classifiedIsolation) ) tauTracks.push_back(trk);
+    // if ((pTau.nTracks() + pTau.nWideTracks()) > 0) {
+    if (tauTracks.size()> 0) {
 
         TLorentzVector sumOfTrackVector;
 	TLorentzVector tempTrackVector;
 
-        for (unsigned int i = 0; i != pTau.nTracks(); ++i)
-	  {
-	    tempTrackVector.SetPtEtaPhiM( pTau.track(i)->pt(),  pTau.track(i)->eta(),  pTau.track(i)->phi(),  pTau.track(i)->m());
-            sumOfTrackVector += tempTrackVector;
-	  }
-        for (unsigned int i = 0; i != pTau.nWideTracks(); ++i)
+        for (const xAOD::TauTrack* tauTrk : tauTracks)
 	  {
-	    tempTrackVector.SetPtEtaPhiM( pTau.wideTrack(i)->pt(),  pTau.wideTrack(i)->eta(),  pTau.wideTrack(i)->phi(),  pTau.wideTrack(i)->m());
+	    tempTrackVector=tauTrk->p4();
             sumOfTrackVector += tempTrackVector;
 	  }
-
 	pTau.setDetail( xAOD::TauJetParameters::massTrkSys, static_cast<float>( sumOfTrackVector.M() ) );
 	float tempfloat = 0;
 	if ( pTau.detail( xAOD::TauJetParameters::massTrkSys, tempfloat ) )
-		ATH_MSG_VERBOSE("set massTrkSys " << tempfloat);
+	  ATH_MSG_VERBOSE("set massTrkSys " << tempfloat);
     }
 
     // width of track system squared (trkWidth2)
-    if (pTau.nTracks() > 1) {
+    //    if (pTau.nTracks() > 1) {  // originally looped over core+wide tracks below
+    if (tauTracks.size()> 0 && pTau.nTracks()>1) {
 
-        double leadTrkPhi = pTau.track(0)->phi();
-        double leadTrkEta = pTau.track(0)->eta();
+      double leadTrkPhi = pTau.track(0)->phi();//fix this depending on how we choose to define this
+      double leadTrkEta = pTau.track(0)->eta();//dito. new TauJet_v3 track sorting doesn't guarantee this will be the same track
 
         double ptSum = 0;
         double sumWeightedDR = 0;
         double sumWeightedDR2 = 0;
 
-        for (unsigned int i = 0; i != pTau.nTracks(); ++i) {
 
-	  double deltaR = Tau1P3PKineUtils::deltaR(leadTrkEta, leadTrkPhi, pTau.track(i)->eta(), pTau.track(i)->phi() );     
+        for (const xAOD::TauTrack* tauTrk : tauTracks){
 
-	  ptSum += pTau.track(i)->pt();
-	  sumWeightedDR += deltaR * (pTau.track(i)->pt());
-	  sumWeightedDR2 += deltaR * deltaR * (pTau.track(i)->pt());
-        }
+	  double deltaR = Tau1P3PKineUtils::deltaR(leadTrkEta, leadTrkPhi, tauTrk->eta(), tauTrk->phi() );     
 
-        for (unsigned int i = 0; i != pTau.nWideTracks(); ++i) {
+	  ptSum += tauTrk->pt();
+	  sumWeightedDR += deltaR * (tauTrk->pt());
+	  sumWeightedDR2 += deltaR * deltaR * (tauTrk->pt());
 
-	  double deltaR = Tau1P3PKineUtils::deltaR(leadTrkEta, leadTrkPhi, pTau.wideTrack(i)->eta(), pTau.wideTrack(i)->phi() );     
-	  
-	  ptSum += pTau.wideTrack(i)->pt();
-	  sumWeightedDR += deltaR * (pTau.wideTrack(i)->pt());
-	  sumWeightedDR2 += deltaR * deltaR * (pTau.wideTrack(i)->pt());
         }
 
         double trkWidth2 = sumWeightedDR2 / ptSum - sumWeightedDR * sumWeightedDR / ptSum / ptSum;
@@ -166,8 +157,9 @@ StatusCode TauCommonCalcVars::execute(xAOD::TauJet& pTau) {
     
     //FF: use now the 4-vector of the tau intermediate axis
     //P4EEtaPhiM P4CaloSeed(1., pDetails->seedCalo_eta(), pDetails->seedCalo_phi(), 0.);
-
-    if ((pTau.nWideTracks() + pTau.nTracks()) > 0) {
+    
+    //    if ((pTau.nWideTracks() + pTau.nTracks()) > 0) {
+    if (tauTracks.size()> 0) {
 
         double ptSum = 0;
         double innerPtSum = 0;
@@ -175,26 +167,20 @@ StatusCode TauCommonCalcVars::execute(xAOD::TauJet& pTau) {
         double innerSumWeightedDR = 0;
         double sumWeightedDR2 = 0;
 
-        for (unsigned int i = 0; i != pTau.nTracks(); ++i) {
 
-          double deltaR = Tau1P3PKineUtils::deltaR(pTau.eta(), pTau.phi(), pTau.track(i)->eta(), pTau.track(i)->phi() );     
+        for (const xAOD::TauTrack* tauTrk : tauTracks){
+
+          double deltaR = Tau1P3PKineUtils::deltaR(pTau.eta(), pTau.phi(), tauTrk->eta(), tauTrk->phi() );     
 	
-	  ptSum += pTau.track(i)->pt();
-	  sumWeightedDR += deltaR * (pTau.track(i)->pt());
-	  sumWeightedDR2 += deltaR * deltaR * (pTau.track(i)->pt());
+	  ptSum += tauTrk->pt();
+	  sumWeightedDR += deltaR * (tauTrk->pt());
+	  sumWeightedDR2 += deltaR * deltaR * (tauTrk->pt());
 
 	  //add calculation of innerTrkAvgDist
-	  innerPtSum += pTau.track(i)->pt();
-	  innerSumWeightedDR += deltaR * (pTau.track(i)->pt());
-        }
-
-        for (unsigned int i = 0; i != pTau.nWideTracks(); ++i) {
-
-          double deltaR = Tau1P3PKineUtils::deltaR(pTau.eta(), pTau.phi(), pTau.wideTrack(i)->eta(), pTau.wideTrack(i)->phi() );     
-          
-	  ptSum += pTau.wideTrack(i)->pt();
-	  sumWeightedDR += deltaR * (pTau.wideTrack(i)->pt());
-	  sumWeightedDR2 += deltaR * deltaR * (pTau.wideTrack(i)->pt());
+	  if(tauTrk->flag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged)){
+	    innerPtSum += tauTrk->pt();
+	    innerSumWeightedDR += deltaR * (tauTrk->pt());
+	  }
         }
 
         if (ptSum > 0.0001) {
diff --git a/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx b/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
index b304805894a6..d7928222168f 100644
--- a/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
+++ b/Reconstruction/tauRecTools/Root/TauProcessorTool.cxx
@@ -5,6 +5,8 @@
 #include "tauRecTools/TauProcessorTool.h"
 
 #include "xAODTau/TauJetContainer.h"
+#include "xAODTau/TauTrackContainer.h"
+#include "xAODTau/TauTrackAuxContainer.h"
 #include "xAODTracking/VertexContainer.h"
 #include "xAODTracking/VertexAuxContainer.h"
 #include "xAODPFlow/PFOContainer.h"
@@ -41,6 +43,7 @@ TauProcessorTool::TauProcessorTool(const std::string& type) :
   declareProperty("deepCopyHadronicPFOContainer", m_deep_copy_hadronicPFOContainer=true);
   declareProperty("deepCopyNeutralPFOContainer", m_deep_copy_neutralPFOContainer=true);
   declareProperty("deepCopySecVtxContainer", m_deep_copy_SecVtxContainer=false);  
+  declareProperty("deepCopyTauTrackContainer", m_deep_copy_TauTrackContainer=true);
 }
 
 //________________________________________
@@ -140,6 +143,12 @@ StatusCode TauProcessorTool::execute(){
       xAOD::Vertex* v(0);
       ATH_CHECK(deepCopy(pSecVtxContainer, pSecVtxAuxContainer, v, "TauSecondaryVertices"));
     }
+    if(m_deep_copy_TauTrackContainer){
+      xAOD::TauTrackContainer* pTrackContainer(0);
+      xAOD::TauTrackAuxContainer* pTauTrackAuxContainer(0);
+      xAOD::TauTrack* v(0);
+      ATH_CHECK(deepCopy(pTrackContainer, pTauTrackAuxContainer, v, "TauTracks"));
+    }
 
     if(m_deep_copy_neutralPFOContainer){
       xAOD::PFOContainer* neutralPFOContainer(0);
diff --git a/Reconstruction/tauRecTools/Root/TauSubstructureVariables.cxx b/Reconstruction/tauRecTools/Root/TauSubstructureVariables.cxx
index 89e740aac7f3..cbfce175b1b5 100644
--- a/Reconstruction/tauRecTools/Root/TauSubstructureVariables.cxx
+++ b/Reconstruction/tauRecTools/Root/TauSubstructureVariables.cxx
@@ -110,7 +110,7 @@ StatusCode TauSubstructureVariables::execute(xAOD::TauJet& pTau) {
 		if (!taujetseed) ATH_MSG_DEBUG("Taujet->jet() pointer is NULL: calo cluster variables will be set to -1111");
 		else ATH_MSG_DEBUG("problem in calculating calo cluster variables -> will be set to -1111");
 
-		pTau.setDetail(xAOD::TauJetParameters::numCells , static_cast<int>(0) );
+		if(!m_inAODmode) pTau.setDetail(xAOD::TauJetParameters::numCells , static_cast<int>(0) );
 		pTau.setDetail(xAOD::TauJetParameters::numTopoClusters , static_cast<int>(DEFAULT) );
 		pTau.setDetail(xAOD::TauJetParameters::numEffTopoClusters , static_cast<float>(DEFAULT) );
 		pTau.setDetail(xAOD::TauJetParameters::topoInvMass,  static_cast<float>(DEFAULT) );
@@ -312,7 +312,7 @@ StatusCode TauSubstructureVariables::execute(xAOD::TauJet& pTau) {
 	}
 
 	// set new approximate energy flow variables for tau ID
-	pTau.setDetail(xAOD::TauJetParameters::ptRatioEflowApprox, static_cast<float>(approxSubstructure4Vec.Pt()/ pTau.detail<float>(xAOD::TauJetParameters::LC_TES_precalib)) );
+	pTau.setDetail(xAOD::TauJetParameters::ptRatioEflowApprox, static_cast<float>(approxSubstructure4Vec.Pt()/ pTau.ptDetectorAxis()) );
 	pTau.setDetail(xAOD::TauJetParameters::mEflowApprox, static_cast<float>(approxSubstructure4Vec.M()) );
 
 
diff --git a/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx b/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
new file mode 100644
index 000000000000..d00e9b3629f0
--- /dev/null
+++ b/Reconstruction/tauRecTools/Root/TauTrackClassifier.cxx
@@ -0,0 +1,270 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ASG include(s)
+#include "PathResolver/PathResolver.h"
+
+// xAOD include(s)
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTau/TauTrackContainer.h"
+#include "xAODTau/TauxAODHelpers.h"
+
+// local include(s)
+#include "tauRecTools/TauTrackClassifier.h"
+
+using namespace tauRecTools;
+
+//==============================================================================
+// class TauTrackClassifier
+//==============================================================================
+
+//______________________________________________________________________________
+TauTrackClassifier::TauTrackClassifier(const std::string& sName)
+  : TauRecToolBase(sName)
+{
+  declareProperty("Classifiers", m_vClassifier );
+  declareProperty("TauTrackContainerName", m_tauTrackConName="TauTracks");
+}
+
+//______________________________________________________________________________
+TauTrackClassifier::~TauTrackClassifier()
+{
+}
+
+//______________________________________________________________________________
+StatusCode TauTrackClassifier::initialize()
+{
+  ATH_MSG_DEBUG("intialize classifiers");
+
+  for (auto cClassifier : m_vClassifier){
+    ATH_MSG_INFO("TauTrackClassifier tool : " << cClassifier );
+    ATH_CHECK(cClassifier.retrieve());
+  }
+  return StatusCode::SUCCESS;
+}
+
+//______________________________________________________________________________
+StatusCode TauTrackClassifier::execute(xAOD::TauJet& xTau)
+{
+  xAOD::TauTrackContainer* tauTrackCon = 0;
+  ATH_CHECK(evtStore()->retrieve(tauTrackCon, m_tauTrackConName));
+  std::vector<xAOD::TauTrack*> vTracks = xAOD::TauHelpers::allTauTracksNonConst(&xTau, tauTrackCon);
+  for (xAOD::TauTrack* xTrack : vTracks)
+  {
+    // reset all track flags and set status to unclassified
+    xTrack->setFlag(xAOD::TauJetParameters::classifiedCharged, false);
+    xTrack->setFlag(xAOD::TauJetParameters::classifiedConversion, false);
+    xTrack->setFlag(xAOD::TauJetParameters::classifiedIsolation, false);
+    xTrack->setFlag(xAOD::TauJetParameters::classifiedFake, false);
+    xTrack->setFlag(xAOD::TauJetParameters::unclassified, true);
+
+    // execute the bdt track classifier 
+    for (auto cClassifier : m_vClassifier)
+      CHECK(cClassifier->classifyTrack(*xTrack, xTau));
+  }
+  std::vector< ElementLink< xAOD::TauTrackContainer > > &tauTrackLinks(xTau.tauTrackLinksNonConst());
+  std::sort(tauTrackLinks.begin(), tauTrackLinks.end(), sortTracks);
+  float charge=0.0;
+  for( const xAOD::TauTrack* trk : xTau.tracks(xAOD::TauJetParameters::classifiedCharged) ){
+    charge += trk->track()->charge();
+  }
+  xTau.setCharge(charge);
+  return StatusCode::SUCCESS;
+}
+
+//==============================================================================
+// class TrackMVABDT
+//==============================================================================
+
+//______________________________________________________________________________
+TrackMVABDT::TrackMVABDT(const std::string& sName)
+  : TauRecToolBase(sName)
+  , m_sInputWeightsPath("")
+  , m_fThreshold(0.)
+  , m_iSignalType(xAOD::TauJetParameters::classifiedCharged)
+  , m_iBackgroundType(xAOD::TauJetParameters::classifiedFake)
+  , m_iExpectedFlag(xAOD::TauJetParameters::unclassified)
+  , m_rReader(0)
+{
+  declareProperty( "InputWeightsPath", m_sInputWeightsPath );
+  declareProperty( "Threshold", m_fThreshold );
+  declareProperty( "BackgroundType" , m_iBackgroundType );
+  declareProperty( "SignalType", m_iSignalType );
+  declareProperty( "ExpectedFlag", m_iExpectedFlag );
+  m_mParsedVarsBDT.clear();
+}
+
+//______________________________________________________________________________
+TrackMVABDT::~TrackMVABDT()
+{
+  delete m_rReader;
+}
+
+//______________________________________________________________________________
+StatusCode TrackMVABDT::initialize()
+{
+  m_rReader = new TMVA::Reader( "!Silent" );
+  m_mAvailableVars=
+    {
+      {"TracksAuxDyn.tauPt",tauPt}
+      , {"TracksAuxDyn.tauEta",tauEta}
+      , {"TracksAuxDyn.trackEta",trackEta}
+      , {"TracksAuxDyn.z0sinThetaTJVA",z0sinThetaTJVA}
+      , {"TracksAuxDyn.rConv",rConv}
+      , {"TracksAuxDyn.rConvII",rConvII}
+      , {"TracksAuxDyn.DRJetSeedAxis",DRJetSeedAxis}
+      , {"TracksAux.d0",d0}
+      , {"TracksAux.qOverP",qOverP}
+      , {"TracksAux.theta",theta}
+      , {"TracksAux.numberOfInnermostPixelLayerHits", numberOfInnermostPixelLayerHits}
+      , {"TracksAux.numberOfPixelHits",numberOfPixelHits}
+      , {"TracksAux.numberOfPixelDeadSensors",numberOfPixelDeadSensors}
+      , {"TracksAux.numberOfPixelSharedHits",numberOfPixelSharedHits}
+      , {"TracksAux.numberOfSCTHits",numberOfSCTHits}
+      , {"TracksAux.numberOfSCTDeadSensors",numberOfSCTDeadSensors}
+      , {"TracksAux.numberOfSCTSharedHits",numberOfSCTSharedHits}
+      , {"TracksAux.numberOfTRTHighThresholdHits",numberOfTRTHighThresholdHits}
+      , {"TracksAux.numberOfTRTHits",numberOfTRTHits}
+      , {"TracksAux.numberOfPixelHits+TracksAux.numberOfPixelDeadSensors", nPixHits}
+      , {"TracksAux.numberOfPixelHits+TracksAux.numberOfPixelDeadSensors+TracksAux.numberOfSCTHits+TracksAux.numberOfSCTDeadSensors", nSiHits}
+    };
+
+  for (auto fVar : m_mAvailableVars)
+    fVar.second = 0.;
+    
+  ATH_CHECK(addWeightsFile());
+  
+  return StatusCode::SUCCESS;
+}
+
+//______________________________________________________________________________
+StatusCode TrackMVABDT::classifyTrack(xAOD::TauTrack& xTrack, const xAOD::TauJet& xTau)
+{
+  setVars(xTrack, xTau);
+
+  //why?
+  if (xTrack.flag((xAOD::TauJetParameters::TauTrackFlag) m_iExpectedFlag)==false)
+    return StatusCode::SUCCESS;
+  
+  double dValue = m_rReader->EvaluateMVA( m_sInputWeightsPath );
+
+  xTrack.setFlag((xAOD::TauJetParameters::TauTrackFlag) m_iExpectedFlag, false);
+  if (m_fThreshold < dValue)
+    xTrack.setFlag((xAOD::TauJetParameters::TauTrackFlag) m_iSignalType, true);
+  else 
+    xTrack.setFlag((xAOD::TauJetParameters::TauTrackFlag) m_iBackgroundType, true);
+
+  xTrack.addBdtScore(dValue);
+
+  return StatusCode::SUCCESS;
+}
+
+//______________________________________________________________________________
+StatusCode TrackMVABDT::addWeightsFile()
+{
+  // better to replace that part at some point
+  m_sInputWeightsPath = PathResolverFindCalibFile(m_sInputWeightsPath);
+  ATH_MSG_DEBUG("InputWeightsPath: " << m_sInputWeightsPath);
+  
+  if (m_mParsedVarsBDT.empty())
+  {
+    ATH_CHECK(parseVariableContent());
+      
+    for (auto i : m_mParsedVarsBDT)
+      ATH_MSG_DEBUG(i.first<<" "<<i.second);
+    
+    for (size_t i = 0; i < m_mParsedVarsBDT.size(); i++){
+      std::string sVarName = m_mParsedVarsBDT[i];
+      m_rReader->AddVariable( sVarName, &(m_mAvailableVars[sVarName]));
+    }
+  }
+    
+  m_rReader->BookMVA( m_sInputWeightsPath, m_sInputWeightsPath );
+  return StatusCode::SUCCESS;
+}
+
+//______________________________________________________________________________
+StatusCode TrackMVABDT::parseVariableContent()
+{
+  // example     <Variable VarIndex="0" Expression="TracksAuxDyn.tauPt" Label="TracksAuxDyn.tauPt" Title="tauPt" Unit="" Internal="TracksAuxDyn.tauPt" Type="F" Min="1.50000762e+04" Max="5.32858625e+05"/>
+  std::string sLine;
+  std::ifstream sFileStream (m_sInputWeightsPath);
+  if (sFileStream.is_open())
+  {
+    while ( getline (sFileStream,sLine) )
+    {
+      size_t iPosVarindex = sLine.find("VarIndex=");
+	
+      if ( iPosVarindex == std::string::npos )
+        continue;
+	
+      iPosVarindex += 10;
+	
+      size_t iPosVarindexEnd = sLine.find("\"",iPosVarindex);
+      size_t iPosExpression = sLine.find("Expression=")+12;
+      size_t iPosExpressionEnd = sLine.find("\"",iPosExpression);
+	
+      int iVarIndex = std::stoi(sLine.substr(iPosVarindex, iPosVarindexEnd-iPosVarindex));
+      std::string sExpression = sLine.substr(iPosExpression, iPosExpressionEnd-iPosExpression);
+	
+      m_mParsedVarsBDT.insert(std::pair<int, std::string >(iVarIndex,sExpression));
+    }
+    sFileStream.close();
+    return StatusCode::SUCCESS;
+  }
+
+  ATH_MSG_ERROR("Unable to open file "<<m_sInputWeightsPath);
+  return StatusCode::FAILURE;
+}
+
+//______________________________________________________________________________
+void TrackMVABDT::setVars(const xAOD::TauTrack& xTrack, const xAOD::TauJet& xTau)
+{
+  const xAOD::TrackParticle* xTrackParticle = xTrack.track();
+  uint8_t iTracksNumberOfInnermostPixelLayerHits = 0; xTrackParticle->summaryValue(iTracksNumberOfInnermostPixelLayerHits, xAOD::numberOfInnermostPixelLayerHits);
+  uint8_t iTracksNPixelHits = 0; xTrackParticle->summaryValue(iTracksNPixelHits, xAOD::numberOfPixelHits);
+  uint8_t iTracksNPixelSharedHits = 0; xTrackParticle->summaryValue(iTracksNPixelSharedHits, xAOD::numberOfPixelSharedHits);
+  uint8_t iTracksNPixelDeadSensors = 0; xTrackParticle->summaryValue(iTracksNPixelDeadSensors, xAOD::numberOfPixelDeadSensors);
+  uint8_t iTracksNSCTHits = 0; xTrackParticle->summaryValue(iTracksNSCTHits, xAOD::numberOfSCTHits);
+  uint8_t iTracksNSCTSharedHits = 0; xTrackParticle->summaryValue(iTracksNSCTSharedHits, xAOD::numberOfSCTSharedHits);
+  uint8_t iTracksNSCTDeadSensors = 0; xTrackParticle->summaryValue(iTracksNSCTDeadSensors, xAOD::numberOfSCTDeadSensors);
+  uint8_t iTracksNTRTHighThresholdHits = 0; xTrackParticle->summaryValue( iTracksNTRTHighThresholdHits, xAOD::numberOfTRTHighThresholdHits);
+  uint8_t iTracksNTRTHits = 0; xTrackParticle->summaryValue( iTracksNTRTHits, xAOD::numberOfTRTHits);
+	
+  float fTracksNumberOfInnermostPixelLayerHits = (float)iTracksNumberOfInnermostPixelLayerHits;
+  float fTracksNPixelHits = (float)iTracksNPixelHits;
+  float fTracksNPixelDeadSensors = (float)iTracksNPixelDeadSensors;
+  float fTracksNPixelSharedHits = (float)iTracksNPixelSharedHits;
+  float fTracksNSCTHits = (float)iTracksNSCTHits;
+  float fTracksNSCTDeadSensors = (float)iTracksNSCTDeadSensors;
+  float fTracksNSCTSharedHits = (float)iTracksNSCTSharedHits;
+  float fTracksNTRTHighThresholdHits = (float)iTracksNTRTHighThresholdHits;
+  float fTracksNTRTHits = (float)iTracksNTRTHits;
+	
+  float fTracksNPixHits = fTracksNPixelHits + fTracksNPixelDeadSensors;
+  float fTracksNSiHits = fTracksNPixelHits + fTracksNPixelDeadSensors + fTracksNSCTHits + fTracksNSCTDeadSensors;
+  
+  
+  m_mAvailableVars["TracksAuxDyn.tauPt"] = xTau.pt();
+  m_mAvailableVars["TracksAuxDyn.tauEta"] = xTau.eta();
+  m_mAvailableVars["TracksAuxDyn.z0sinThetaTJVA"] = xTrack.z0sinThetaTJVA(xTau);
+  m_mAvailableVars["TracksAuxDyn.rConv"] = xTrack.rConv(xTau);
+  m_mAvailableVars["TracksAuxDyn.rConvII"] = xTrack.rConvII(xTau);
+  m_mAvailableVars["TracksAuxDyn.DRJetSeedAxis"] = xTrack.dRJetSeedAxis(xTau);
+  m_mAvailableVars["TracksAuxDyn.trackEta"] = xTrackParticle->d0();
+  m_mAvailableVars["TracksAux.d0"] = xTrackParticle->d0();
+  m_mAvailableVars["TracksAux.qOverP"] = xTrackParticle->qOverP();
+  m_mAvailableVars["TracksAux.theta"] = xTrackParticle->theta();
+  m_mAvailableVars["TracksAux.numberOfInnermostPixelLayerHits"] = fTracksNumberOfInnermostPixelLayerHits;
+  m_mAvailableVars["TracksAux.numberOfPixelHits"] = fTracksNPixelHits;
+  m_mAvailableVars["TracksAux.numberOfPixelDeadSensors"] = fTracksNPixelDeadSensors;
+  m_mAvailableVars["TracksAux.numberOfPixelSharedHits"] = fTracksNPixelSharedHits;
+  m_mAvailableVars["TracksAux.numberOfSCTHits"] = fTracksNSCTHits;
+  m_mAvailableVars["TracksAux.numberOfSCTDeadSensors"] = fTracksNSCTDeadSensors;
+  m_mAvailableVars["TracksAux.numberOfSCTSharedHits"] = fTracksNSCTSharedHits;
+  m_mAvailableVars["TracksAux.numberOfTRTHighThresholdHits"] = fTracksNTRTHighThresholdHits;
+  m_mAvailableVars["TracksAux.numberOfTRTHits"] = fTracksNTRTHits;
+  m_mAvailableVars["TracksAux.numberOfPixelHits+TracksAux.numberOfPixelDeadSensors"] = fTracksNPixHits;
+  m_mAvailableVars["TracksAux.numberOfPixelHits+TracksAux.numberOfPixelDeadSensors+TracksAux.numberOfSCTHits+TracksAux.numberOfSCTDeadSensors"] = fTracksNSiHits;
+}
diff --git a/Reconstruction/tauRecTools/Root/TauTrackFilter.cxx b/Reconstruction/tauRecTools/Root/TauTrackFilter.cxx
index df2cf026b42b..d89b61b185c6 100644
--- a/Reconstruction/tauRecTools/Root/TauTrackFilter.cxx
+++ b/Reconstruction/tauRecTools/Root/TauTrackFilter.cxx
@@ -23,18 +23,19 @@
 #include "tauRecTools/TauTrackFilterUtils.h"
 
 #include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTau/TauxAODHelpers.h"
 
 #include "TLorentzVector.h"
 
 void TrackFilterAlg(TLorentzVector tau,
-                    std::vector<TLorentzVector>* inputtracks20,
-                    std::vector<int>* inputtracks20charge,
-                    std::vector<TLorentzVector>* inputtracks40,
-                    std::vector<int>* inputtracks40charge,
-                    std::vector<TLorentzVector>* outputtracksgood,
-                    std::vector<int>* outputtracksgoodcharge,
-                    std::vector<TLorentzVector>* outputtracksbad,
-                    std::vector<int>* outputtracksbadcharge,
+                    std::vector<TLorentzVector>& inputtracks20,
+                    std::vector<int>& inputtracks20charge,
+                    std::vector<TLorentzVector>& inputtracks40,
+                    std::vector<int>& inputtracks40charge,
+                    std::vector<TLorentzVector>& outputtracksgood,
+                    std::vector<int>& outputtracksgoodcharge,
+                    std::vector<TLorentzVector>& outputtracksbad,
+                    std::vector<int>& outputtracksbadcharge,
                     int& nProng,
                     int& flag);
 
@@ -49,6 +50,7 @@ TauTrackFilter::TauTrackFilter(const std::string &name ) :
 {
     declareProperty("ConfigPath", m_configPath);
     declareProperty("TrackContainerName", m_trackContainerName = "InDetTrackParticles");
+    declareProperty("TauTrackContainerName", m_tauTrackConName = "TauTracks");
 }
 
 //-----------------------------------------------------------------------------
@@ -104,14 +106,14 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
                      pTau.phi(),
                      pTau.e()/1000); //GeV
 
-    std::vector<TLorentzVector>* inputtracks20 = new std::vector<TLorentzVector>;
-    std::vector<TLorentzVector>* inputtracks40 = new std::vector<TLorentzVector>;
-    std::vector<int>* inputtracks20charge = new std::vector<int>;
-    std::vector<int>* inputtracks40charge = new std::vector<int>;
-    std::vector<TLorentzVector>* outputtracksgood = new std::vector<TLorentzVector>;
-    std::vector<TLorentzVector>* outputtracksbad = new std::vector<TLorentzVector>;
-    std::vector<int>* outputtracksgoodcharge = new std::vector<int>;
-    std::vector<int>* outputtracksbadcharge = new std::vector<int>;
+    std::vector<TLorentzVector> inputtracks20;
+    std::vector<TLorentzVector> inputtracks40;
+    std::vector<int> inputtracks20charge;
+    std::vector<int> inputtracks40charge;
+    std::vector<TLorentzVector> outputtracksgood;
+    std::vector<TLorentzVector> outputtracksbad;
+    std::vector<int> outputtracksgoodcharge;
+    std::vector<int> outputtracksbadcharge;
     int nProng = 0;
     int flag = 0;
 
@@ -121,7 +123,7 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
     m_TrkPass.clear();
 
     for(unsigned int j=0; j<pTau.nTracks(); j++ ) {
-        const xAOD::TrackParticle *TauJetTrack = pTau.track(j);
+      const xAOD::TrackParticle *TauJetTrack = pTau.track(j)->track();
         TLorentzVector inputTrack;
         inputTrack.SetPtEtaPhiE(TauJetTrack->pt()/1000, //GeV
                                 TauJetTrack->eta(),
@@ -129,13 +131,13 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
                                 TauJetTrack->e()/1000); //GeV
         float dR = tau.DeltaR(inputTrack);
         if (dR < 0.2) {
-            inputtracks20->push_back(inputTrack);
-            inputtracks20charge->push_back(TauJetTrack->charge());
+            inputtracks20.push_back(inputTrack);
+            inputtracks20charge.push_back(TauJetTrack->charge());
             inputtracks20index.push_back(j);
         }
         else if (dR < 0.4) {
-            inputtracks40->push_back(inputTrack);
-            inputtracks40charge->push_back(TauJetTrack->charge());
+            inputtracks40.push_back(inputTrack);
+            inputtracks40charge.push_back(TauJetTrack->charge());
             inputtracks40index.push_back(j);
         }
 
@@ -157,14 +159,14 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
                    flag);
 
     // Store results
-    for (unsigned int j=0; j<outputtracksgood->size(); j++ ) {
-        for (unsigned int k=0; k<inputtracks20->size(); k++ ) {
-            if (outputtracksgood->at(j) == inputtracks20->at(k)) {
+    for (unsigned int j=0; j<outputtracksgood.size(); j++ ) {
+        for (unsigned int k=0; k<inputtracks20.size(); k++ ) {
+            if (outputtracksgood.at(j) == inputtracks20.at(k)) {
                 m_TrkPass.at(inputtracks20index.at(k)) = true;
             }
         }
-        for (unsigned int k=0; k<inputtracks40->size(); k++ ) {
-            if (outputtracksgood->at(j) == inputtracks40->at(k)) {
+        for (unsigned int k=0; k<inputtracks40.size(); k++ ) {
+            if (outputtracksgood.at(j) == inputtracks40.at(k)) {
                 m_TrkPass.at(inputtracks40index.at(k)) = true;
             }
         }
@@ -172,19 +174,12 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
     m_nProng = nProng;
     m_flag = flag;
 
-    // Cleanup
-    delete inputtracks20;
-    delete inputtracks20charge;
-    delete inputtracks40;
-    delete inputtracks40charge;
-    delete outputtracksgood;
-    delete outputtracksbad;
-    delete outputtracksgoodcharge;
-    delete outputtracksbadcharge;
-
     // Set values in EDM
+    xAOD::TauTrackContainer* tauTracks = 0;
+    ATH_CHECK(evtStore()->retrieve(tauTracks, m_tauTrackConName));
     for (unsigned int numTrack=0; numTrack<m_TrkPass.size(); numTrack++) {
-      pTau.setTrackFlag(pTau.track(numTrack), xAOD::TauJetParameters::failTrackFilter, !m_TrkPass.at(numTrack));
+      xAOD::TauTrack* tauTrk = xAOD::TauHelpers::tauTrackNonConst(&pTau, tauTracks, numTrack); //pTau.trackNonConst(numTrack);
+      tauTrk->setFlag(xAOD::TauJetParameters::failTrackFilter, !m_TrkPass.at(numTrack));
     }
     pTau.setTrackFilterProngs(m_nProng);
     pTau.setTrackFilterQuality(m_flag);
@@ -197,24 +192,24 @@ StatusCode TauTrackFilter::execute(xAOD::TauJet& pTau) {
 // Main algorithm
 //-----------------------------------------------------------------------------
 void TrackFilterAlg(TLorentzVector tau,
-                    std::vector<TLorentzVector>* inputtracks20,
-                    std::vector<int>* inputtracks20charge,
-                    std::vector<TLorentzVector>* inputtracks40,
-                    std::vector<int>* inputtracks40charge,
-                    std::vector<TLorentzVector>* outputtracksgood,
-                    std::vector<int>* outputtracksgoodcharge,
-                    std::vector<TLorentzVector>* outputtracksbad,
-                    std::vector<int>* outputtracksbadcharge,
+                    std::vector<TLorentzVector>& inputtracks20,
+                    std::vector<int>& inputtracks20charge,
+                    std::vector<TLorentzVector>& inputtracks40,
+                    std::vector<int>& inputtracks40charge,
+                    std::vector<TLorentzVector>& outputtracksgood,
+                    std::vector<int>& outputtracksgoodcharge,
+                    std::vector<TLorentzVector>& outputtracksbad,
+                    std::vector<int>& outputtracksbadcharge,
                     int& nProng,
                     int& flag) {
 
    std::vector<TauTrackFilterUtils::TrackInfo> unsorted,tracks,SScombination;
    TauTrackFilterUtils::TrackInfo track;
-   unsigned int tracknum = inputtracks20->size();
-   unsigned int widetracknum = inputtracks40->size();
+   unsigned int tracknum = inputtracks20.size();
+   unsigned int widetracknum = inputtracks40.size();
    for(unsigned int i=0;i<tracknum;i++){
-      track.p4 = (*inputtracks20)[i];
-      track.charge = (*inputtracks20charge)[i];
+      track.p4 = (inputtracks20)[i];
+      track.charge = (inputtracks20charge)[i];
       unsorted.push_back(track);
    }
    while (unsorted.size() > 0){
@@ -235,8 +230,8 @@ void TrackFilterAlg(TLorentzVector tau,
    
    bool test3prong = true, test2prong = true, test1prong = true;
    for(unsigned int i=0;i<widetracknum;i++){
-   	outputtracksbad->push_back((*inputtracks40)[i]);
-   	outputtracksbadcharge->push_back((*inputtracks40charge)[i]);
+   	outputtracksbad.push_back((inputtracks40)[i]);
+   	outputtracksbadcharge.push_back((inputtracks40charge)[i]);
    }
    if(tracknum > 4){ //Anything with more than 4 tracks is a fake.
       flag = 0;
@@ -283,8 +278,8 @@ void TrackFilterAlg(TLorentzVector tau,
       if(goodcombo){  //A Combination is found which passes 3prong hypothesis
          for(unsigned int i=0;i<combination.size();i++){
             if (isSS) SScombination.push_back(combination[i]);
-            outputtracksgood->push_back(combination[i].p4);
-            outputtracksgoodcharge->push_back(combination[i].charge);
+            outputtracksgood.push_back(combination[i].p4);
+            outputtracksgoodcharge.push_back(combination[i].charge);
          }
          if(isSS) flag = 0;
          else flag = 1;
@@ -293,8 +288,8 @@ void TrackFilterAlg(TLorentzVector tau,
          test2prong = false;
          if(!test1prong){ //Fill Bad Track in the Case of 4 trk taus
             if(tracknum == 4){
-            	outputtracksbad->push_back(tracks[3].p4);
-            	outputtracksbadcharge->push_back(tracks[3].charge);
+            	outputtracksbad.push_back(tracks[3].p4);
+            	outputtracksbadcharge.push_back(tracks[3].charge);
             }
          }
       }
@@ -305,14 +300,14 @@ void TrackFilterAlg(TLorentzVector tau,
       if(TauTrackFilterUtils::pass2prong(pair,tau)){
       	nProng = 2;
          for(unsigned int i=0;i<pair.size();i++){ //Fill Good Tracks
-            outputtracksgood->push_back(pair[i].p4);
-            outputtracksgoodcharge->push_back(pair[i].charge);
+            outputtracksgood.push_back(pair[i].p4);
+            outputtracksgoodcharge.push_back(pair[i].charge);
          }
          test1prong = false;
          if(tracknum == 3){
             flag = 2;
-         	outputtracksbad->push_back(tracks[2].p4); //Fill Bad Track in Case of 3 trk Taus
-         	outputtracksbadcharge->push_back(tracks[2].charge);
+         	outputtracksbad.push_back(tracks[2].p4); //Fill Bad Track in Case of 3 trk Taus
+         	outputtracksbadcharge.push_back(tracks[2].charge);
          }
          else flag = 1; //Good 2 Prong if only 2 trks
       }
@@ -338,13 +333,13 @@ void TrackFilterAlg(TLorentzVector tau,
             if(tracks[1].p4.Pt()/tracks[0].p4.Pt() < ratio10) goodcase = true; //Test 2trk taus most likely to actually be 1pngs
          }
          if((TauTrackFilterUtils::pass1prong(tracks[0].p4,tau))&&(goodcase)){ //A track is found which passes 1prong hypothesis
-            outputtracksgood->push_back(tracks[0].p4);
-            outputtracksgoodcharge->push_back(tracks[0].charge);
+            outputtracksgood.push_back(tracks[0].p4);
+            outputtracksgoodcharge.push_back(tracks[0].charge);
             nProng = 1;
             if (tracknum == 2){
                flag = 2;
-            	outputtracksbad->push_back(tracks[1].p4); //Fill Bad Track in Case of 3 trk Taus
-            	outputtracksbadcharge->push_back(tracks[1].charge);
+            	outputtracksbad.push_back(tracks[1].p4); //Fill Bad Track in Case of 3 trk Taus
+            	outputtracksbadcharge.push_back(tracks[1].charge);
             }
             else flag = 1;
          }
diff --git a/Reconstruction/tauRecTools/cmt/requirements b/Reconstruction/tauRecTools/cmt/requirements
index 1ba42c91abf4..3c53df7bfca3 100644
--- a/Reconstruction/tauRecTools/cmt/requirements
+++ b/Reconstruction/tauRecTools/cmt/requirements
@@ -51,7 +51,7 @@ use  VxVertex                   VxVertex-*                      Tracking/TrkEven
 #use  tauEvent                   tauEvent-*                      Reconstruction
 use  xAODCaloEvent              xAODCaloEvent-*                 Event/xAOD
 use  xAODPFlow                  xAODPFlow-*                     Event/xAOD
-use TauAnalysisTools            TauAnalysisTools-*              PhysicsAnalysis/TauID
+use InDetTrackSelectionTool InDetTrackSelectionTool-* InnerDetector/InDetRecTools
 
 
 
diff --git a/Reconstruction/tauRecTools/share/TF2pileupForOfflineID_1p.root b/Reconstruction/tauRecTools/share/TF2pileupForOfflineID_1p.root
deleted file mode 100644
index 9c291900a685fdad8f49e16df169aa7b6b1dabec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17230
zcmeI4WmJ@18}E@&B&C&<ZkS+(0qK(NR=TA-q*FjZx)DUWL=fo?0g)7>K|%ziLq*^W
z1H9+;!RNf^+w<jNt<jNvUwdCO_qu=U|G)ONb+EN{LP8p-MnXa|MnV#mhriI_?<L@`
zYw(vQ>iHYi1|%f(W29@6v`ULuPw<u#Ng~Co>l-)WqyJw&aY$zqX{vGKK#}+mGs9Oy
zLPArOu&^>AwS)iRY$svspkQihWnp6?C8h_o<8U}j?f*4~gmyL`VooF+c;-l&@E2lU
zBqXld|CKE2yR)3G51qwddxpsA`&m4SssxD8$-r69!cN7)OxDD}Sk=K&&(y-{6#kWH
zGBLUH0bu|Lgqekj9l!yA|A2watW53#{D@yOFu3!9fdB~4e~-h5+0TPGfnWfDiv<w~
z0fWv15!asuLZR?sc;NXk0C*O6J{cz%0^kO+AXbC{p^)=H#Pw%^KrRRv2)bO78wv%V
zg`Q8x$;|_Vfe=eV!7#3iToD21$%3H3|9l!C2nIl8dp;p25XudP=Zjbu%FPYEO!zDY
zkuea!4fszq{Ck0(=Zu(>6T|}pz<AD==H>xhB>h_m5CnxXGqbp9%c66lAPrqda=Ydg
zFK135OxR`icATp~!aCJMaj<eO=4J7Cw~H%*RBA*Bi*kKZK!^zQn>Xd!;bP`&pU4~B
zZtW><f4)Jvr;O{L7_%z8Wr(-O67TP^rO5mw@rCWodpb+Wdj{a$<-XHH-I-K+%A4MI
zuSKCIO5O9sjeT}M?tz#e?o+6U$l%WRi1MMSA456O-P_?EYhWXloE<%pILvJ~`upHq
zYsMJ+Ha>&aSLQDSb?=b2TkDi9vOSv6YNDFDPLh*vl7b>dIH8_`xy?twi&HK9ZkoY_
z7e_{`>gy1l#CyfAWf8vqK&R#^bM0U!iY`OtNSPX~6e%Ogt{$u>50#o@<?dCUSeo-1
z8CH=ey@<3FZoEBauXCT_Jy#MCqEk^CTnpnfGtM0vf12FAGhj1HD0Rx1Wzi)?7qhGA
z7OzGnaVI078vpS?`X*hmDpzq<3}$yNYj8~5<m!OF*q9N)a4Z4XaZI|x#7_TPTw39p
zcj)46QmCkuJ!2(``SEvj3swf=k6o2=+EK>lpBRLVy;`y833Awzgl8JB$3bqz5k=ep
zb6I6Izh;2q6HTbAR^tuiT#w&RP%?qhzN=%c8PN5q6)v?EcX<_r4O+VwBQ8n%?w%f_
znVeqdL+ppe_v(;n*7?YJQ8>r#;-B4qh?GR+f=Bpj$(yrSfgt8q6)DQ8lG~z|dt^h;
ztFhc2p61)AlsqzC1Pb9Tz!uCNu>VI6P3mM7%#6`?%p*4nS;nLk{SCbL4IoaQaL0KD
z-S)1@FAG6vwoP*spXj?J2`YxW)^~uk{^RUPO3A5d;*sf3xgXN=pCrw-X|v9B-7k8@
z;Qsj|G$F*Jfm6J);ZVgYbrG|Im3A_#e`b06_QcFm;+L80RrO_Eql2Z5x<w7F5*R%g
zU@32Vn!|64D|og=)sY8s$6KSV>7H5le%|`_`MJhh?pz-tWDUMbl9`o$2_H_vpBZ~u
zIy#<|up^_&0rBS!rxSVF-%r9l?M)tV`zRx`#0SpT-8jL}y!lB`#K^4<CX%TtoZXsr
zx48CZw)31WS5xI)W|fp(TCK;*j8UU;qIFlfhby6%!;I7^u4NOO9ugAjdj!X_5gdy=
z;}}}=CC5n4IA&mH=V0rm=VIY__Al#8l&SnT%0L_-5Eul$q{A8D&f#!Qvdduv8W8lm
z02z=23g;Q*;?ceWGB5`W1ct)6&Y^HN*9FM9IKTif2*mSu9D{Md!N3E&iZLh$2n>cm
zxc?SoK={;902lY4Fvi6JfkL?9poHfmzz-+pUnvHJaqz%@3A-TgZxn-Z0H8cjDC{p3
z13@`>cpxzNS8z@-2ntd*f?{zBl7vd+U9)7<_G3fZr^asiAI&FqCdZSx!M0|GAIFg~
z%iOVK>7<4#hwQQfbn8vf=rx6X*6}lHZ&JI**P;s#P=AZN6+Ksg^KtWd*g)%X@B7W;
znIkX3&Ay`zS>HXgd|siSScQI%F~hE-&kEo69w@vORwauidw}~iYL+~8wTa&|+$8&0
zw2i<Aua!ilK)Gc{c1+Gpx&3ZCLsjgCWPB~}4|9+f%cq2|KeH^7`Y@zEyp|j8*1R4x
zmm<>Dn;fZ}bUoeLtvxrR&B;H$LI-SXLf!_o7V*qlSdum4DYeGC<q<5NZ#yo_q+e5S
z>rN+%Z8%w)nn<>^Z<rUTy)MNjq%z!{>RINWSYbXBJk1*{GtI|_<fxPW3SaWO3p?1>
zq1@~{U`5NYjXasQ(agiU6D+%`vf9ngdNV6{vyPHnm=}!JRa#yV0!1Ffn~61=>oX&4
z%Rv_udibOe+;s<%@9aEE9~;_Iq;b70A_`mYx$jMHtLjYp*vH5n?<A@*VI*n-NJRm9
z%9^3?`c-bl3)Za}(@s&{WeE`x<0uvy39?2mNJDw4$wW5);hM7h+mN^(Y1w%kvrZTO
z4*ECh>LeLE=@=TKn$)F%IaA!BYBnh99El%;CVkbsLtcqsefm_o=IMg5K{6M=nk>O|
zEkm^Z_RmMf*gwDEN%uZ9f^^LpIu`~vR6NtLpiu|&`^$*uup5cvD>7)+7DgA7c89S9
zhrQ-d?hFgkd{Zd#8b@+exI<BCw4+DUnOeO8eu-#|vnEhA&e_?d*zL*3%tv%ZO0QE0
zMa8v9%!)HCM#xFOn1u!GlN6zA`;I*=nNf)H=k%h{BQtEvKN^cAi*>Z#Z8_*h?G5<(
z!!~@oq_<^kA(by`IC-ph^GldpP!5wMYLiBWtrhA$uT(z4pI|Sa8$O&+DF4!ruS<_B
zN)iQ$i|!+5aHp+x$gIh99CWy3#8Q<k%8fEZHOt&GVC7ts_N$_H%l%c}u0Pn3<AV+D
zY=dp@J@z~ZowaQ7VR(@_B9tv0jng2}ZvMuzxZttD{C1sn`{elGXb7ix;&H)&brCMd
zHV@I^@F~gxKPv#vvI+#tx)3Z2KVuoj(@U1!I-{47iH(zlgMrZ{#5DdJVhEK21_1w#
zV*eSxf-!{P;)Y%XUcne55Cno;6=Y|DKmgB$F8Uii1_VMNXG>nuV*u{U$a4XARgVF{
z5FSLfzw0qXzChRo1^)mtM8*Ih_n$y^9t^nnu+ZP+7ytm}z5p2&3R2haa%|dq2s)vF
zi;+V7RH`Q>*~*o>rE<Jdu}MC`KT{+>D<|g-am2t>;ay##dewT(eJ0g<H)i71oJ4H}
z{~HA%GlUou0d51_wx%hNm-3&|-NC!34c$kZ3<AJ0sceP!i7#(%m`T24)DAM=@*5SB
z%rD{d&eKduVvU+2<s@Rv>-9k&<mg(6C+}5+OP&Q{ez^iUEuR;hx_8K%ziJl8RNQfX
z-QuiS70A?KC4Ch8P?BE*!(Nc2mV=GefcG1KgRnC0n_^Vfv%z9k&}VNB<KxJ_A?fa<
z1-qQ)oO-t2mnPCVgvj=vDtix_u-~M!WvC;myx+HS)=k(J)0RZT=L2L@mV_lUDm;Cs
z%A1;%T>S2R{;$^?P57%Gp<)i#9+mF4iq>I|;gNUq08B#y--P+mk2p}Px%3UiJkq8j
zf6{I^I5Z+=VS2K>_wWw!D+g`)s1ASpj&iI$5t(@!R}^zEHz^B#hSAENMTQojDo3wS
zDqSoYk^YNHoMA#!)vPJOz%b(kKb#FJF7)^b57l|)_@0s_)%Xvfpqenu19e<W3}^mQ
z0H7IdESi--J9o?LxeQ7WB#5;7#j3ubx%)K9oHx$Qt7vhN7y5#Gq&`?&Pd<9$KJCYk
zc~(vtw7+0i(C~=LC&Zvsn8b_L>{hjE*&c+C7GsjGf3fDHK(}Q~{j<;cx*Om}Zu3ZG
zJk4ObGVvX4qWk+XB&GA>$n~PvbTxNyWOP&E7wynM>JO00Xq&?&b@LXTnIl)}%hGox
zh^4s4u8-Ok|Dbwa(!$rRP-5k!r`Pb==T6(F*`&o`Iv;^b$HO*}j#>UY9p8Wc>RI2K
z;XGXnwSLNZJY_jLON=qWf-B{{H~D_q>*&p?krmkj=Co0hpbsg#6P(wd9_wQfW%CDh
zYEdnGZ_wD}hH7Ir^gjkh%Gug9Sk!2*=yL)DpnSackH+7<6|7GpV=KF*_>~Up(B}K`
z7y3CLl#k1&X4I(C6kNPkAcGMpSjn9)wL3C03NzpEtwgya1$2o;PckV!jZ*5gK|WHw
zJjJY6V&sJ*s|A6qCIqsg&X9#Gc!@0H|B_#JPRa&O7Pgn*Qo8~!5Dau7O#W;n&&K}@
zE*R*-f&LA+002bbZ%z^c0qCUz{X1}h&t=pVaKUkPp@aSaF2vMu-}krNx-`sx;1(hl
z1VV_n^I_&o7kPm+(53gi<ktCeJdg`)F{2<go$D`QS-6V~HY2I6L}#hY+(znX&t)&2
z9yggRVRo{_A{`6}GkkILZn?B#{!58RTrqCkhSmB5sQWKSLPHrOA|CQTGJHycvfWIy
z(A}O7caW8=%<>iYj!b7x8@?XBbq+m98L1VkQ&^p|!E2I<BReyYq$0mcI_6me+Jaga
z+eh@X+^ni$yuc(X_7iF`9=wPI&<N1#9&yxaCuJLeV)&`Egbe?5HF;<ph#0b7=}J}Q
z%ptAV3#k1pYYt;r5_xadYK&jiE20mk&ZB3WlvLu7)qX*<45t3}n*EV9{Tt=$Dh>~6
z;&UTIr6nEPwUnB1Eg6`Ppl%FpQVRw=oWilpGL(thOA8>hj6_oA>|%&qF~$vp=D=hZ
zU*ax?J0q3u^NWJ`wANjQ+srF<Jt?>gpob;j=|-E=i0~Dq1*|e-wtI6~Yw;6%A1SyR
z(cx3p*x48t1Ax4`f!OP*F-o*}WnvCaRJ>VqcCqf)D&^|~D@h6Nts3}?+hJ+R9A-(y
z+=RL(F_pBARJ#%}IpSv3CvAwHqQ>!P`e9f@SX{G2g2vcO;*5bh3m<y2{ohiujHzck
z9P+7dk>|fiDz)$LRUMXy6?*_Fz0R@8lN2SMH|KrJ`$5BSU|@?!643z$)2-fp95(?W
zN!j*Cw+|-gVroE9$H4|A5=)NkMz^XL+4k4m8UZhFW^_L4<!dP-;A>iZr?vQFbQ_sc
zw;|*ULA{*+*j*k6;`(M@-RzLJTFdC8#4QsncN~b_Bi1zKDAg<8;}vJ>2N|Ch?UjaZ
zd*n%l=iwY^*bB0;;oTnJwJuNWe;zbdc6_^TbJr@_7`Ft9TB2dJF;NQW6#bFv+UVK1
zT3X3zRDaqrHJp{)z_Y}TDRr>;(*3*oN&Zo`&z%K7Td#_)V_S!o0lv=3pCk%;r(P@?
zj|V%dvmFh7ky`hE^Q<ITn11g4;a<2`jp@(Z3tQu~R84|E;-?#V?G9bqP~iR%b#4av
z^r#qZeX|KPb!zopxWHc`hz>i$KX7o>o;@x-weHX+V(ycxMc2CM$vfRw*j+>K?@Yz+
zO8jh!*JJF21FQ%Eu;%|;2P1^@>%0zz@Q+e9HYN`68kn$)nHbzd{*hqk&n@sm2VDW!
z<?t1Loj=roOXGP3V2D6?`RXk2H-23N!s~GGAp!oY06UKaai2y0#;=P=o=cT@wGxI1
z1%MIe^P;l$TOkZC`7Y@9cLW0f5rXfJ1OosrUGMJ%16<a@@KKPO&k5FViKv4OnWk1o
z9ONbVlVWz#IrpvGxWsmFjXzNp4^Q07C1ke7{`hE8H6>j26eTNB8gIk{U$`SR>|0B~
zoVb`U?lHCh44cPLc;k<FE0L6&bzs|>Bk$#<hH2+#JNOV@$(rz#Im-J2H|ELE+i)dN
zL>e1{!X0Vz@^U*(9l){UYXpot6+zM4p7T^9ZZL9=+)6rNpCp%TB)*7KU)Wwq_}6Py
zWEey$!4k5QOV`VK=z)EA=_u8bpWU|SFy2-**P2TdVJ}dj4(Y&(rQ>1_Y#R?{%fNV3
zZDH;qRlt}ZGi-R1Oj6k*oVLc7vFL&J*Zx~=`r{6|vK9CeJbLWRyE*s?uO#qavW?1S
z0BJj&?n%W|@g;wv`67L@oF;mOk8nn`2-k?Tl;4W}AoJdXcTwTG>LO`7-GvMJQ+qFO
zAZIDs?G1feS$tFUqW~GEIc?WNfDw-tljWgBW%sl$6HgOOTd*#$k~mgvq$993L0-9`
zSe!oBLLHD?d0k~b-A;5LRp^IOVWM*x>Kj&g(Mwy^jWko7gN2KjWXYhgmF&UiM^dh@
zF*L?LYZpJZ;Yd>^L@s8j|3c4E&RPwxc`3OXmWTDX9TV0+2*5-~%i0GRVOiF=-Wp}Z
z3qzk2H9BY$Uogh<a&NKO+Ny~b5Q+1fi>VmV*sd2wC*TwBMAwa-`?0!Jug2FDKE~#z
z+hU1VKg!GJL&Q1v`5Qi8)7&@W`YPUfA)>PBj<s9$zH`nPx*8O^_m;3ZGHtNHC7b}w
zi1OW&8J1$D<##o2uu)3xt?`)Nv+eo{?U}<RXs|TvO8+J*Y)W;qll^6Mf&0U#pPcDi
z?_U*Zo(>G*dP)Q){<ymenB32KnjBN#Z)oux)YG5vPmaHNZ^cJgw`KUlwrcye=(oMH
z2!-%XN|V=KxIdGQ9ZRjv-Sh+|vq}I*tcQ7m_s#Mq8<(DmHUYh>UE4yQC-{1w_O=x)
zZ21kLkm8~;zgiWG8-0IJ3zCs>)wQLCM(TalsqatRqn@-co)PHxJS%lkftpwu;i&3G
zpsELfs<<<)b-U;iRitNHOVnJ^LR?N<!NtTu)WFIX{`Qhq>R0p@1ju!%Vg6d~LLlO7
z{0gtm&;aDQbeLCgg$O*Wqg~+@f+;Y-g;2YSD?}uS>l`}2@d~jdjO!AuS8;U?GzbiV
zy1(!Wu`J}0%YVStc`$r$;XLEtDqe_SF!<8k{)Q_Md=KKh;KhN0)bqPfluH?r`1U31
zNvE`E%xhDI)M=}`a?pfPmM7wccSjSHwUtZMrCIyL!<af^pXjoPZ=vih_lXLBlVWzm
z+a3s4{l#a_jDBz?xsvEB&y3>k@@eYZ-C25$?IxO!9NU7_5WD_pUzy4xu>h({77^r<
z;Wn_SPDkVRhS78vXOz4%wt{S{ow=3gPh9GW0`tl^6P!22ntYE20^+pUmfCq=<UC}Q
zzfY4>+?^l4y-aP5uH>H_m;3qQI}jUvV08wjHQA7~IYS>I35IrSrFlx$Gv2tH)TLiU
z5?;$DsP-85aMdW!;eW+)j4_m9H0jk=x*H}pu|7Mj*ehl9202OJWg>3BHC7sEg@(_T
zG|0sso+Y9Lq#@{jDw_T@f1E4llRCclbuNns<(i(vIC@`jgi`&B(C$0nkpC3(*X|Bs
z%r`+<9f6337g_L+-3b$GrR^Au-c4la;*=Lf#+C0~jeer>0v3#0GJv17Xo^&V!pS@x
z7J6UX)FCPp>rLXkXd+$g(W1c%C(K;EB#mH)qgyOcu%~$@3n3euXpReOA)r8Z>4QVz
z#D^_RTeb4J(h$~>2lhcelpINs4{NgKNvc>mZg0+GK<u_hYL1iAf*x~v>he3nMVIFa
z<OJXRR?&}RfPk!|Y^TTVoyYUamLGXfnA;x4bNqbt;jUeQ?pId0=wgfI6P$fe5?fE&
zjmZ?by2Pu8#<?>8(Zfxkdy?ASIV{_w8&iEtgmOk6my^l8j?VV&nQs&!s`tPxYiYxj
z(#>9kAbexSuE(-ug&AePrsM349>c&6n0;Snyvu7N#QW)VJWxPxN7Ssb*t@iD*`_iC
zDBv3Oq5lx4mg=y?z>{khe6TR%=YNnELMQlI;QOxJ_lBb)AMAyesbNEpUGc1P3%rHW
z^^CIKw;Grq2{<}84%fK36-Y3xaVG&bnh!l(7N;XbP#y=Cf3qAL(<@sXAD?BsA@50>
zIV5#!qi>6(nd<o|L0sz5b1|eiUUMhS#SkUh`AY3H%N|a)DX$vgR}{4a9$)-!?<87H
zR(V<?ITp^!pOQpPvzEhA)`dV>9|C33XDFj^xkMSlHj2wBo?#5GyHwmA6)!RNTfGbZ
ze1f>3(7$tym%~>ecJ|BzLEuXTbcJGwVR-rd3d9hB03O)IidQKHkA%+*Lu>;62C?%<
z2=rp3;18}50U{m{Hv*l1p%`Kep74d(`x}e_fzZpGuV4(G(_d8=Vp13ka9Ox#M?va4
z=h%hpdOL2d95M0y1}-TkHoV?7F6UB#X;Fb!tXqkuQjab!Q<S5fQ!;e7L$Ua?T#JnO
zFE#%76O@x?4>p>Wth?yi(f)2MOm2g#soWLa(3k0eWOwl9QF7vs4gAFXUb;DaXTOm)
z*9=r08Xa1E&&-c__*SWWUhZ>S<&86}q6<OWg9II+jehgd-9CYmj7H^#>Te4yIthRt
z&qytLL7&sh4P8k}C9>hQuDslZ$zYubnHZ0-Atw=(ESr~UTqK491lq*wj#)Oh6WRjF
z6J(RQvK^_Nt?c3cF)IVAQri+QRK=dVSZUljXf4Vl7apdq)Eo|BOFzD?PU!qpmb7=N
z`K67C@(X<ov{c;|*#M$7E>ZqBr4Mxb-pP_i%2_kEG%LoobtLGCSf>uT@d44eIV;ve
zpw}9(%?z>EwP>je^5^KK$1`0wm0KUg)z!5Qnj3FT4a}|Ngwq<uzVhQ{G+8pQq}jTi
z;x8{LRTZQzNjkt=j%mTpFk_J%$`G$GM93utNR~;38^{*b8g~<>pEne}<8m{7C<(Fl
zM1!h`i85|%<%^hn@UL8<$Sat7ATQy_9bMB%oJ^+4ki8~JeE$*4;WTZ)ZhVni4QciI
z@}Rf<Iw2iJ5O;B&m?Y|Yh*FIHMhS)Q4?L02GznTC1XkGkdkt&>?am-7ly#sX7V<P1
zzZa20s8GsWfo|m7M@(HivJB-8%pY#p{(0y#I4zSk*qo{z@U6(YBzb_Sf6W8Hp;a4}
z29V6_Jp&b(Eve6coF;xwXk~`!gN<>02EN7q^P7*87;C5~Ia|^em!~3JHw7D=1xWxd
zi6P^l?rGla4+pNNE@Ss-_#$PgaOL)E^$yDnJ&k^fPo~<6x_>3Ylqzl7?tLy|-*K#^
z+2M9Ds0Oy5{=ofqs>{uk)=c2nJ~tI?(~$4GzWvg{kYS@&BgI0hr64gf#kObc3E@IT
z&X;~u0k8f(CeEB6<#gBLWkt58F;0=!F+M#P&Z(KSLKS8XkO-zDGVKc-B(*D{=jL|Z
z+~;j^S!tcAQ}`aoZ}p%m=U$#&KiS)%(;N0(91Q<4k5veaJw3x14gV#^5KR;+&en=f
zaESeP(O&hxwb&Ul0FcYhf<HS)`0yVg28Rvzf1DV6cM;K%@ZUWYU><~o`-5`?fiH^Z
ze})(U2u0MOu0RaF<fS0`1H=#?1^_~szrQf-d<giTO5GWve(Rt(zX1HF1_}hK;Eg8W
zzwAAphXBAAN{ko<sp{M~UNlft^+5~NkD@)8URVq!y)3>LYXJ>?*_|u0pLsVWAX8Zy
zST*vfgqchE)%_@p8dZ;Sk6jvnM!dE1IdN2R+$wM18=OR(%EDf|AFV`Fv`o!r-XEPV
ze|ucFMzhQO$R%1!nB6Xlx+#2%J#gNCH1L_ACTTha5BELiT-Bsx@{BtaWX$q$C)9zM
z(ULr(Ds<6LI%yV}sOh4eUK~d|xF{9}w=H31(?uUxwUyG-Lrns)+S#aIcE=H7_;5Ip
ze;N}>khjkY9A^`bQN6jq#vIi89P_J?|6sMca)@2d%kge5xsLs4*)A4T(5GtAx0J!{
z1T@;+6$P=zx605H6${&zFz`6(rIbH{?q6r~b>T~=DX8R40_2L!a8R?6M)U~}VQ09T
z4-XuMCTj=u6lWoE9En}G?<|XrH1ZgHhf@{QmQ}vpYZN;?##kD!FZvSO?5SNf%K%m{
zV~?+O4VrT^@xV`UjUf-&XhmECmP+TCB?6)$S*Af~?z2&Yl-CZFOoX_ZJ50TdVR>0`
zJi7TqquH&!Nc203S*6v*xD~Qm8ht@M>Qu9F@LK-;kq<IKzCF^u>?-P>;XR+K%yUSq
zL2H2k`xWvjh1L*Ay{{rV1}<$UV9c@sAn2#4I)43-2Pyr?g6d@4f7<w6d2*9bnqTIc
z(we1P<E?7ui~=vhGV$$S*lvxay3K8tYJAT>e^aiX#&+`~)lCg~dw&}_?5)Q3#6Eac
z>BpOouXy>2<-cWX>Vy$l-Fk523pQt_O+OD!(<iT8eKg@-?2?9}dhawxL88EKrNlo#
zJrvA*HGtE@`Z{|U-MZ0qkRa9Ub7w)Sha^?gy7gX%ZAX0GEpl=9_KwEW%N7Ku^@5xY
z4jUVWc2`w_vqTR+ySNPh*fBb_XPx!@NOW)*+4IZPjc4}oRn#PpXlL~1%c#Hzg~`MW
zPHR&QBW~MDAJ)5xr#i@Xo58dE3fE58G*Tz^+i;~(xUR#J0c#>@qb#HTH60yCoZQdM
zMOFCYO?Z|#KSf$E&4`!hb*1l}UUOh$35TQVBSLX4AW#*5hAM`YOH?81TqaIuf=kiq
zFD+l%|4l2zlL+q{xOft;;Oal)f94ew0K0HgS40;gk{f*PIe!Dz1yuf)R~M1zy8~B&
z1%`27=%zma>ns)s1oHgJJ0j+Vv-y9iE)e9RJa<)fae*$gzBG@BNntP$*9Eh<QIHmX
zbC1Jk#jc55HM|i`03EaC0qqf<Y-~hGAycJ@kWzVE(uDRKWg{sZX|;ihxfW^85?u^R
zLJz#bDw6X1xSva?DC@tg-9i-}gl{vZLSCjnTd#NDJ?)!3oTZ22B}z5OwWAFoH8F<v
zGqh6BG~bY*pl+n-I9c-wGVIqhsC?^IKj0(4%{#>nQ2izI#EuuAIge0gbl;qfru&Am
zmJ&Am#2x0mIy)Y6jyx{$(bx^Xm-Gx_tSM}ahWT8^z53FGia7>CGfFAituLg5!!2vA
zSb!cc*@_qlK6|sM;@9Tp6Xg^t)3<f>y)-OXm+b>N>$0<G))Z#J4zro0huS^v084M@
zE~~N)9|arNV&b4+CltTSeW+B#oAG{UusWsEm^D<bD0IJY8h`xth!__stMDQJ2=Z;C
zt?5W`<8@*$2Jfu(4h{_F=fm#8_=X=|Gfoqshlu`Y5%K=M`febehVGTCNDl!{9X-zd
zofi}$<gp{Ti_XXu!+2va4E0!59}%Lb57TjKcNC1UEdm*&Edk=onPi29=q4djx=zue
z1rZy{HMPWvJmnw6eVE616!DYW)|OUJW0M<+$A!prjJGJee@RLiZ#aVXn}*P%3;e<x
z@^G&;W#L=#BA00&!l<d;(C1hNLWF%kY0ci)Z3`50U%x5rjq91-@Im0Ge4BQ9h|U@X
z&K)y859ixzvbN}4Y0S#$6;WU^*zo<e!j@h2?O)WNI^82UG7@)FU}f&Hq{nLSeZ%38
z|DNNr`iH5in_$HbD|_Gro%cv)*Lf<e1CDI6>No6%HUtPfLQZZT)D^fV#ma8{2;$87
zmDUi~_DPpKvzJcgCoe_Qr=u3#NvhWG%O5s5-=>jOY8;jhz>e$8476xvwC0JhrItIN
z=LLW}$&T*Zpe;m?8QGe}=DlvIl6t!7U3c(x^nJM1F+JJB@?jH0iCNccil}>l#xW-+
zlf$kotD+s$g<q?mt+osV9P9SmTfl;O==pr@xJ}=-W`!OIozk$h&Ct!G<lNw*{6yEv
zCdpKSH#PwxAc$HXMUNCsbmdPnRr%>_1zX;H-jU`wEqRIy9tV6z^yI>uSV`T_poS!L
z2DP(JT_j^PRatnc9!tf^!NkDY#6il&)D~aN*4fa?{Vu%0*3!fn{+FW@yy>zM9m$;(
z-gMca)n`lAMdb4^6hG%SAnmrz=gRI8$w%V}M!os5RiO`i5=MBpNoW}CS0}cgO~tEg
zZw%GRq&`iL6AHU47d8rssm;6o?o9}CH}!Ef;fBw^0|hjXuQ@`T>;s~HdxtYP1v=4{
z-R<J{lai<B*MH5_Z{8uYa1Gdrqa_R{i|eLY^4`58Z9$J?ty9q!+emOrLhwZa&7iz&
zB5vn^eB1|piTIP9ue<&8ljNq;&use>#z<Nf-+r%iCI#zl{bVwlA`B(HleED5+I<f~
zDtd$;k$tR9@>EFcX3<2v+YQrNqW#a~74$^!(7pL0Q<%A_j@w%Hn!j%c#nWT?N`!%%
zKjp2Jf%Xo&MUGwz2}TEhxL4m#aWloCsEVpC(lSJ>()TA|wHeg?6jdmC#Ua(9|An9e
z@dOFl{TzFSv>39-2T&BkUCanyKe<KkafVvolP@%-A$7e0Yr{D~FoBXbY{kY+*3DxI
znFmQ<=ffvgiULsgC4%)@Pn3%|hFEqn^vPu`tHQ;_Ceu(?#OBcE1G*~;x56Ec3#Z!&
zdsUr|WdyV_TdO5itz+N#39x5AwQ(9y|4jVJY=FkQrKfEn4*SF5J7nzw4LnLfowmK+
zTdI}jxjRhmBlaVH^qX#eky>IUE;KJ#X<q2)R0)fr5f3ttz5ROJofE6s+xjausUKPU
zHr-vOge}Gr&BwL9hVd35V}x3=kKLr{{HTJz^gX*x<A-YGbb=eY9rhq%4F9R+FW4`E
zq@$>SRI9ssq|L`BW4kLAf}2epy~Lp>gTx!dvsDhy-9ym2p;Jwg#51~hCF7|}0%goo
zvm0|#7H*^c)c(|dVyMiScuT(QT0T~oQN^>EQ7%s0u>pr1>{MAkC;NgvG%NRVPmooz
z(nkAA)(rym4@Lm<I3B5;1G+2DM4I*+gF`7LAHLqQA)a~tVi|{nC2wBCkbA2@;YTNC
z(-Dk+%6>D}7d?V+w7d0z8q$~A2X~VScOUibQ{5waSRty0L+Y)@vn2zRM1Rxts7<th
zc$r96e5{F(I6z{&LeGc_LRe@caG>1aO{L^xc<>Xdm6^r<m_Ko5t=chnhSw!mi4_H6
zr^;`43{#%K{H69$IpW>S)UQYRYnC?Rk69|$vM8wEThJm^=RS6O8|%&H>BdOF7W1rO
z&XGX~@_L{YBl`ZZ7;zebAJvVBE&Fa#Rr35ovXA`J{_*c{dn(E%bj8HF6gTngOrpi_
z%C}^_Dp5$^Eb4MJ9zoXzI}@s8b*bEVySg2KWV~8t)Jm}zy;9Cv_g&qTBxmVvF@*0J
zl@-ht_FV0bdqkldZ&;jzX-Y-O_?X!m@6>&-p8HK7j-mWhgR98;=`P4VQggAN_Kb;V
z0wcezuf<0iNG?fOfrmZ9LOG_labncyCd?TniG)4WptVgmLUktOZSZYfTwx3HN3A7f
z)vue=Nvgdps#Pamx3y2zWhYPNa;Df~by62eI%y5y<PPq9aEFCVGk>{d(twgc(GA23
z%1^CRiJZrzX|z80p1WSo{P>rRN7OoDiozi*=x7sbLrQ99UUp~Y{VxLp2SUrHLeXlv
zg`;dONZ!MRs=1cAJG_GBXxN(xG;Oii^P%i~-QP2%w%YCINslVfsQngDOrN4Y?rXk|
zoC=GuwZZH7yfY*BzOaFG!lk`*qD2&vZ_o9UZ(vI!hEM`oCzhf=FN-k^9NqY6a}t%i
zMR?DbCtZ{KgME)yi|o25vNO4}ez)sqA^kaxZWeqCKOYus!Eb4rj@hi(bfR?$5!J~}
zg+q6)zmrTjuxHqN$FoEpa*y0qsP)J=tAQiXlTij8KPm@+)w(i(X6}c>SxAQ?j9&G$
z0w#9-SCPmPUkA?k8%hZimKzBL@-eTdR4`!DpLazVRS81{tcDLl24)#Bzom-I?ppk0
zNO$Dr`}Xtx<0rdx0ozlgYu`?vi%qZ7ms5ZJaGKFhMaFTWSbZCv<hh(9kduWEh4S@K
z9$gxi({xyEVM8!#-yq#Ri}#@wTJN^QlzcQ+3efpOhW7~V;;d@lNLau9N}z8a;LQ2N
zs4?#LAX4x(=VMf^uT4x$SVeZ#>{99mroDa`Awi`Xu~OF0x(T1<I^;rrY?dUCx~wO%
z@83wWyKxNpOd$HXCNjs}Y$N@^F(c?#kKE@Rb%9xlWEpBmn{9<OhZ0OZO{kC1(efk3
z+M-Ym%^;bCC-&>Dg#6*R!*tD&MK;zhgC*nMfudos^+=M`<kYTf*9D7cckeH@M6zag
zuuk3rY$+zgV$zwvq#sDP9esU_EL?^{u0=T^_F03XO=pPdS_|-AEghTOPJJ?$44z-~
zxBK=OQZo=7Hd<=;>jf;5iR}lVtQ(RJcRgOlzC7yw!Q@!M?P+7*HrL_*1yff-kDApj
z9wn8$xHi%#1g6(=BBHT?b;myGZK~(Gp>wNuNS9CVoF2)q;5p75o(H~Bu`=&Ok0n<?
zccMvnRfY9cx}8jqwv4BG0%ui(70rwqsm0=h@<lCP?0mqlIx>M7kLHE1#*uYciKogU
zd2Z<4oiCk#qrag+UrVa<t(IcW#}K)#EHLu<O^U<{r!=&auavyC+9z=-TIJSi*euw$
zA3M+yb7Q;ASKU>H=q&9f)P_Cv)oB4+t=>@FOktLj%;kErJ{i3J9AmuvS%eJhudG+H
z4By|AcT{9PKuroY2eoqb;8n8fdqTApS)HsveS?Qs7Pir9blN0C8S=3VH^WQC_0X&(
zT|ja3#{ypzHY+X0*l!`z3Z+hQc=F5P#34uDRpuY@O`wa4Z3fm>?JqkB_9O{8{AiJ|
z6E~l{rOqFlYd!JxWn*;BkuRE)JPbnvsM~Iqkuo#4{+N=e2%AIYmmq$(4iKB$G0M~T
zgh9)EmS`(+cy4l0T{A?Ib76(25h58FV2ppCquVv&I(6&L8=!ZFAE;wupZ3jRr*6=L
z3jP~7>jqv_e$bzss%4G$k<QNiz{L*^K0^E;P8GpV{UF58|2kC!zv?F35&nAu=xWF5
zKXw8Len0*_$$&ULhVaoWO#kRf2Ke3hw-@`Of9LX~-#^rg4Zjut_Lu@ezoF{9Ciai?
zn8I(zza4XbydD2c#~l2A{M#1vH>F*8_4XfW3xeO1fBPGLCl;dc{g3rG{0Cb9?$n;2
zcE8wE`6qU2;rHU-t*Ae@G5&K~QE*2napoqGF#fNbMEp+}@KXB!bd&J1yQsV?Bo68S
E01)HL5dZ)H

diff --git a/Reconstruction/tauRecTools/share/TF2pileupForOfflineID_3p.root b/Reconstruction/tauRecTools/share/TF2pileupForOfflineID_3p.root
deleted file mode 100644
index 3be443eab64f1fe1c8aa05d264f9ff8e625f3007..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 18865
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

diff --git a/Reconstruction/tauRecTools/src/JetSeedBuilder.cxx b/Reconstruction/tauRecTools/src/JetSeedBuilder.cxx
index f67c1dc36d25..6d23975ca841 100644
--- a/Reconstruction/tauRecTools/src/JetSeedBuilder.cxx
+++ b/Reconstruction/tauRecTools/src/JetSeedBuilder.cxx
@@ -179,8 +179,8 @@ StatusCode JetSeedBuilder::execute(xAOD::TauJet& pTau) {
 		// SL/SX trigger mode with negative jet_seed - do not set TauJet eta and phi in JetSeedBuilder
 		ATH_MSG_DEBUG("TauJet eta/phi will be set in Level2 Trigger for negative energy jet");
 
-		pTau.setDetail(xAOD::TauJetParameters::seedCalo_eta , static_cast<float>( pTau.eta() ) );
-		pTau.setDetail(xAOD::TauJetParameters::seedCalo_phi , static_cast<float>( pTau.phi() ) );
+		// pTau.setDetail(xAOD::TauJetParameters::seedCalo_eta , static_cast<float>( pTau.eta() ) );
+		// pTau.setDetail(xAOD::TauJetParameters::seedCalo_phi , static_cast<float>( pTau.phi() ) );
 
 		pTau.setP4(pJetSeed->pt(),pTau.eta(),pTau.phi(),0.0);
 
@@ -192,12 +192,12 @@ StatusCode JetSeedBuilder::execute(xAOD::TauJet& pTau) {
 			// sigstateH.controlObject(pJetSeed);
 		}
 
-		pTau.setDetail(xAOD::TauJetParameters::seedCalo_eta , static_cast<float>( pJetSeed->eta() ) );
-		pTau.setDetail(xAOD::TauJetParameters::seedCalo_phi , static_cast<float>( pJetSeed->phi() ) );
+		// pTau.setDetail(xAOD::TauJetParameters::seedCalo_eta , static_cast<float>( pJetSeed->eta() ) );
+		// pTau.setDetail(xAOD::TauJetParameters::seedCalo_phi , static_cast<float>( pJetSeed->phi() ) );
 		if ( pJetSeed->pt() > 1e-7)
 			pTau.setP4(static_cast<float>( pJetSeed->pt() ) ,static_cast<float>( pJetSeed->eta() ) ,static_cast<float>( pJetSeed->phi() ) ,0.0 );
 		else
-			pTau.setP4(static_cast<float>( pJetSeed->pt() ) ,static_cast<float>( pJetSeed->eta() ) ,static_cast<float>( pJetSeed->phi() ) , 0.0 );
+			pTau.setP4(static_cast<float>( 1e-7 ) ,static_cast<float>( pJetSeed->eta() ) ,static_cast<float>( pJetSeed->phi() ) , 0.0 );
 
 		//store 4-vector of seed
 		pTau.setP4( xAOD::TauJetParameters::JetSeed, pJetSeed->pt(), pJetSeed->eta(), pJetSeed->phi(), pJetSeed->m() );
diff --git a/Reconstruction/tauRecTools/src/PhotonConversionVertex.cxx b/Reconstruction/tauRecTools/src/PhotonConversionVertex.cxx
index 5acee948f63e..03b5efb82625 100644
--- a/Reconstruction/tauRecTools/src/PhotonConversionVertex.cxx
+++ b/Reconstruction/tauRecTools/src/PhotonConversionVertex.cxx
@@ -124,10 +124,14 @@ bool PhotonConversionVertex::openContainer(T* &container, std::string containerN
 
 template <class T>
 bool PhotonConversionVertex::saveContainer(T* &container, std::string containerName) {
-    StatusCode sc = evtStore()->record(container, containerName);
-    if (!container || sc.isFailure())
-        ATH_MSG_FATAL("Container (" << containerName << ") cannot be saved in StoreGate");
-    return container;
+  if(!container){
+    ATH_MSG_FATAL("Container (" << containerName << ") cannot be saved in StoreGate");
+    return false;
+  }
+  StatusCode sc = evtStore()->record(container, containerName);
+  if (sc.isFailure())
+    ATH_MSG_FATAL("Container (" << containerName << ") cannot be saved in StoreGate");
+  return container;
 }
 
 template <class T>
diff --git a/Reconstruction/tauRecTools/src/TauAxisSetter.cxx b/Reconstruction/tauRecTools/src/TauAxisSetter.cxx
index 81b7015147c5..360327ca3298 100644
--- a/Reconstruction/tauRecTools/src/TauAxisSetter.cxx
+++ b/Reconstruction/tauRecTools/src/TauAxisSetter.cxx
@@ -88,6 +88,10 @@ StatusCode TauAxisSetter::execute(xAOD::TauJet& pTau)
         if (BaryCenter.DeltaR(tempClusterVector) > m_clusterCone)
             continue;
 
+	ElementLink<xAOD::IParticleContainer> linkToCluster;
+	linkToCluster.toContainedElement( *(static_cast<const xAOD::IParticleContainer*> ((*cItr)->rawConstituent()->container())), (*cItr)->rawConstituent() );
+	pTau.addClusterLink(linkToCluster);
+
 	nConstituents++;
 	tauDetectorAxis += tempClusterVector;
     }
@@ -111,10 +115,6 @@ StatusCode TauAxisSetter::execute(xAOD::TauJet& pTau)
 
     ATH_MSG_VERBOSE("jet axis:" << (*pTau.jetLink())->pt()<< " " << (*pTau.jetLink())->eta() << " " << (*pTau.jetLink())->phi()  << " " << (*pTau.jetLink())->e() );
     // save values for detector axis.
-    // FixMe: consider dropping these details variables as they are duplicated in the detector axis 4 vector
-    pTau.setDetail(xAOD::TauJetParameters::LC_TES_precalib , static_cast<float>( tauDetectorAxis.Pt() ) );		  
-    pTau.setDetail(xAOD::TauJetParameters::seedCalo_eta, static_cast<float>( tauDetectorAxis.Eta() ) );
-    pTau.setDetail(xAOD::TauJetParameters::seedCalo_phi, static_cast<float>( tauDetectorAxis.Phi() ) );
     ATH_MSG_VERBOSE("detector axis:" << tauDetectorAxis.Pt()<< " " << tauDetectorAxis.Eta() << " " << tauDetectorAxis.Phi()  << " " << tauDetectorAxis.E() );
 
     // detectorAxis (set default) 
diff --git a/Reconstruction/tauRecTools/src/TauCalibrateEM.cxx b/Reconstruction/tauRecTools/src/TauCalibrateEM.cxx
index 5061009ebde1..e0ee73b556c0 100644
--- a/Reconstruction/tauRecTools/src/TauCalibrateEM.cxx
+++ b/Reconstruction/tauRecTools/src/TauCalibrateEM.cxx
@@ -110,7 +110,7 @@ StatusCode TauCalibrateEM::execute(xAOD::TauJet& pTau) {
 
     ATH_MSG_DEBUG("input variables: em_pt " << emscale_pt << " eta " << emscale_eta << " ntrack " << pTau.nTracks() << " emfrac " << emfrac);
 
-    double new_pt = evaluate_new_pt(emscale_pt / GeV, fabs(emscale_eta), pTau.nTracks(), emfrac);
+    /*double new_pt = */evaluate_new_pt(emscale_pt / GeV, fabs(emscale_eta), pTau.nTracks(), emfrac);
 
 
     // do NOT set TauJet energy, as this will be done in tauCalibrateLC
@@ -119,7 +119,9 @@ StatusCode TauCalibrateEM::execute(xAOD::TauJet& pTau) {
     // instead fill place holder in TauCommonDetails
     //pDetails->setSeedCalo_etEMCalib(new_pt * GeV);
     
-    pTau.setDetail( xAOD::TauJetParameters::EM_TES_scale, static_cast<float>( new_pt * GeV ) );
+    //r21 cleanup
+    ATH_MSG_WARNING("EM_TES_scale removed");
+    //pTau.setDetail( xAOD::TauJetParameters::EM_TES_scale, static_cast<float>( new_pt * GeV ) );
 
     return StatusCode::SUCCESS;
 }
diff --git a/Reconstruction/tauRecTools/src/TauConversionFinder.cxx b/Reconstruction/tauRecTools/src/TauConversionFinder.cxx
index a435d146412f..449b45b79391 100644
--- a/Reconstruction/tauRecTools/src/TauConversionFinder.cxx
+++ b/Reconstruction/tauRecTools/src/TauConversionFinder.cxx
@@ -119,21 +119,24 @@ StatusCode TauConversionFinder::eventFinalize() {
                 // Find conversion in normal tau tracks
                 if (m_do_normal) {
                     for (unsigned int j = 0; j < numTracks; ++j) {
-                        const xAOD::TrackParticle *pTauTrack = pTau.track(j);
-                        const Trk::Track* tau_trk_def = pTauTrack->track();
+		        //const xAOD::TrackParticle *pTauTrack = pTau.track(j);
+		        xAOD::TauTrack *pTauTrack = pTau.trackNonConst(j);
+		        const Trk::Track* tau_trk_def = pTauTrack->track()->track();
 
                         if (conv_trk == tau_trk_def) {
 
                             if (conv_trk->trackSummary()->getPID(Trk::eProbabilityHT) > m_eProb_cut) {
-                              if (!pTau.trackFlag(pTauTrack, xAOD::TauJetParameters::isConversion)) {
+                              //if (!pTau.trackFlag(pTauTrack, xAOD::TauJetParameters::isConversion)) {
+                              if (!pTauTrack->flag(xAOD::TauJetParameters::isConversionOld)) {
                                   ElementLink<xAOD::TrackParticleContainer> phoConvLink ;
-                                  phoConvLink.setElement(pTauTrack) ;
+                                  //phoConvLink.setElement(pTauTrack) ;
+				  phoConvLink.setElement(pTauTrack->track()) ;
                                   phoConvLink.setStorableObject( *trackContainer ) ;
-                                  phoConvLink.index();
-                                  pTau.addTrackLink( phoConvLink ) ;
-                                  pTau.setTrackFlag(pTauTrack, xAOD::TauJetParameters::isConversion, true);
+                                  //phoConvLink.index();
+				  pTauTrack->addTrackLink( phoConvLink );
+				  pTauTrack->setFlag(xAOD::TauJetParameters::isConversionOld, true);
                                     if (m_adjust_tau_charge)
-                                        pTau.setCharge(pTau.charge() - pTau.track(j)->charge());
+				      pTau.setCharge(pTau.charge() - pTau.track(j)->track()->charge());
 
                                     m_numProng--;
                                 }
diff --git a/Reconstruction/tauRecTools/src/TauConversionTagger.cxx b/Reconstruction/tauRecTools/src/TauConversionTagger.cxx
index b44a2ecb8949..1f1907c5e6cf 100644
--- a/Reconstruction/tauRecTools/src/TauConversionTagger.cxx
+++ b/Reconstruction/tauRecTools/src/TauConversionTagger.cxx
@@ -90,7 +90,7 @@ StatusCode TauConversionTagger::execute(xAOD::TauJet& pTau) {
 
   for(unsigned int j=0; j<pTau.nTracks(); j++ ) {
 
-    const xAOD::TrackParticle *TauJetTrack = pTau.track(j);
+    const xAOD::TrackParticle *TauJetTrack = pTau.track(j)->track();
     const Trk::Perigee* perigee = m_trackToVertexTool->perigeeAtVertex(*TauJetTrack, (*pTau.vertexLink())->position());
 
     // Declare TrackSummary info
@@ -169,8 +169,11 @@ StatusCode TauConversionTagger::execute(xAOD::TauJet& pTau) {
     }
 
     ATH_MSG_VERBOSE("Is tau track a conversion? : " << m_TrkIsConv);
-    if (m_TrkIsConv && !pTau.trackFlag(TauJetTrack, xAOD::TauJetParameters::isConversion))
-      pTau.setTrackFlag(TauJetTrack, xAOD::TauJetParameters::isConversion, true);
+    // if (m_TrkIsConv && !pTau.trackFlag(TauJetTrack, xAOD::TauJetParameters::isConversion))
+    //   pTau.setTrackFlag(TauJetTrack, xAOD::TauJetParameters::isConversion, true);
+    xAOD::TauTrack* tauTrack = pTau.trackNonConst(j);
+    if(m_TrkIsConv && !tauTrack->flag(xAOD::TauJetParameters::isConversionOld))
+      tauTrack->setFlag( xAOD::TauJetParameters::isConversionOld, true);
   }
 
   return StatusCode::SUCCESS;
diff --git a/Reconstruction/tauRecTools/src/TauElectronVetoVariables.cxx b/Reconstruction/tauRecTools/src/TauElectronVetoVariables.cxx
index 60edf799ae43..e5d949ded6a6 100644
--- a/Reconstruction/tauRecTools/src/TauElectronVetoVariables.cxx
+++ b/Reconstruction/tauRecTools/src/TauElectronVetoVariables.cxx
@@ -166,7 +166,7 @@ StatusCode TauElectronVetoVariables::execute(xAOD::TauJet& pTau)
 
     // get the extrapolation into the calo
     const Trk::CaloExtension* caloExtension = 0;
-    if( !m_caloExtensionTool->caloExtension(*pTau.track(0),caloExtension) || caloExtension->caloLayerIntersections().empty() ){
+    if( !m_caloExtensionTool->caloExtension(*pTau.track(0)->track(),caloExtension) || caloExtension->caloLayerIntersections().empty() ){
       ATH_MSG_WARNING("extrapolation of leading track to calo surfaces failed  " );
       return StatusCode::SUCCESS;
     }
@@ -340,23 +340,25 @@ StatusCode TauElectronVetoVariables::execute(xAOD::TauJet& pTau)
     uint8_t TRTHTOutliers;
     uint8_t TRTHits;
     uint8_t TRTOutliers;
+
+    const xAOD::TrackParticle* leadTrack = pTau.track(0)->track();
       
-    if ( !pTau.track(0)->summaryValue( TRTHits, xAOD::SummaryType::numberOfTRTHits ) )
+    if ( !leadTrack->summaryValue( TRTHits, xAOD::SummaryType::numberOfTRTHits ) )
       {
 	ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
 	return StatusCode::SUCCESS;
       }
-    if ( !pTau.track(0)->summaryValue( TRTHTHits, xAOD::SummaryType::numberOfTRTHighThresholdHits ) )
+    if ( !leadTrack->summaryValue( TRTHTHits, xAOD::SummaryType::numberOfTRTHighThresholdHits ) )
       {
 	ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
 	return StatusCode::SUCCESS;
       }
-    if ( !pTau.track(0)->summaryValue( TRTOutliers, xAOD::SummaryType::numberOfTRTOutliers ) )
+    if ( !leadTrack->summaryValue( TRTOutliers, xAOD::SummaryType::numberOfTRTOutliers ) )
       {
 	ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
 	return StatusCode::SUCCESS;
       }
-    if ( !pTau.track(0)->summaryValue( TRTHTOutliers, xAOD::SummaryType::numberOfTRTHighThresholdOutliers ) )
+    if ( !leadTrack->summaryValue( TRTHTOutliers, xAOD::SummaryType::numberOfTRTHighThresholdOutliers ) )
       {
 	ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
 	return StatusCode::SUCCESS;
diff --git a/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.cxx b/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.cxx
index 0a9a9de73bcf..02bc803bf643 100644
--- a/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.cxx
+++ b/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.cxx
@@ -37,6 +37,7 @@ TauPi0ClusterScaler::TauPi0ClusterScaler( const string& name ) :
     declareProperty("ParticleCaloExtensionTool", m_caloExtensionTool);
     declareProperty("ChargedPFOContainerName", m_chargedPFOContainerName); 
     declareProperty("runOnAOD", m_AODmode=false);
+    declareProperty("storeCaloSamplings", m_storeCaloSamplings=true);
 }
 
 //-------------------------------------------------------------------------
@@ -53,10 +54,6 @@ StatusCode TauPi0ClusterScaler::initialize()
     // retrieve tools
     ATH_MSG_DEBUG( "Retrieving tools" );
     CHECK( m_caloExtensionTool.retrieve() );
-    // Create vector with default values
-    for (int layer = 0 ; layer != CaloCell_ID::FCAL0; ++layer) {
-        m_defaultValues.push_back(-10.);
-    }
 
     return StatusCode::SUCCESS;
 }
@@ -77,7 +74,19 @@ StatusCode TauPi0ClusterScaler::eventInitialize() {
     CHECK( evtStore()->retrieve(m_chargedPFOContainer, m_chargedPFOContainerName) );
     CHECK( evtStore()->retrieve( m_chargedPFOAuxStore, m_chargedPFOContainerName + "Aux." ) );
   }
-    return StatusCode::SUCCESS;
+
+  //Check if TauTracks have sampling decorations
+  const xAOD::TauTrackContainer* tauTracks = 0;
+  ATH_CHECK( evtStore()->retrieve(tauTracks, "TauTracks") );
+  for( const xAOD::TauTrack* trk : *tauTracks ){
+    if( trk->isAvailable<float>("CaloSamplingEtaEM") ) {
+      m_caloSamplingsStored = true;
+      break;
+    }
+    m_caloSamplingsStored = false;
+  }
+
+  return StatusCode::SUCCESS;
 
 }
 
@@ -93,23 +102,11 @@ StatusCode TauPi0ClusterScaler::execute(xAOD::TauJet& pTau)
     // Clear vector of cell-based charged PFO Links. Required when rerunning on xAOD level.
     pTau.clearProtoChargedPFOLinks();
 
-    //---------------------------------------------------------------------
-    // only run on 1-5 prong taus 
-    //---------------------------------------------------------------------
-    if (pTau.nTracks() == 0 || pTau.nTracks() >5 ) {
-        return StatusCode::SUCCESS;
-    }
-    ATH_MSG_DEBUG("ClusterScaler: new tau. \tpt = " << pTau.pt() << "\teta = " << pTau.eta() << "\tphi = " << pTau.phi() << "\tnprongs = " << pTau.nTracks());
-
+    //incase tau is rejected, still fill vector of samplings
+    //so that TauTracks are consistently decorated
     //---------------------------------------------------------------------
     // get tau tracks
     //---------------------------------------------------------------------
-    vector<const xAOD::TrackParticle*> tracks;
-    for(unsigned iTrack = 0; iTrack<pTau.nTracks();++iTrack){
-        const xAOD::TrackParticle* track = pTau.track(iTrack);
-        tracks.push_back(track);
-    }
-
     //---------------------------------------------------------------------
     // prepare extrapolation of tracks to calo layers 
     //---------------------------------------------------------------------
@@ -118,16 +115,54 @@ StatusCode TauPi0ClusterScaler::execute(xAOD::TauJet& pTau)
     // which is called once per event (and not once per tau)
     m_tracksEtaAtSampling.clear();
     m_tracksPhiAtSampling.clear();
-    m_extrapolatedSamplings.clear();
-    // Fill with default values
-    for(int layer = 0 ; layer != CaloCell_ID::FCAL0; ++layer) {
-         m_extrapolatedSamplings.push_back(false);
-    }
-    for(unsigned iTrack = 0; iTrack<tracks.size();++iTrack){
-        m_tracksEtaAtSampling.push_back( m_defaultValues );
-        m_tracksPhiAtSampling.push_back( m_defaultValues );
+    vector<const xAOD::TauTrack*> tracks;
+    for(xAOD::TauTrack* track : pTau.allTracks()){
+      
+      float extrap_eta_EM, extrap_phi_EM, extrap_eta_Had, extrap_phi_Had;
+
+      if(m_caloSamplingsStored==false) {
+	//no decorations, so do calo extrapolations
+	int sampling_EM, sampling_Had;
+	if(fabs(track->eta())<1.45) sampling_EM = CaloSampling::EMB2;//2
+	else sampling_EM = CaloSampling::EME2;//6
+	if(fabs(track->eta())<1.0) sampling_Had = CaloSampling::TileBar1;
+	else if(fabs(track->eta())<1.5) sampling_Had = CaloSampling::TileExt1;
+	else sampling_Had = CaloSampling::HEC1;
+
+	getExtrapolatedPositions(track, sampling_EM, extrap_eta_EM, extrap_phi_EM);
+	getExtrapolatedPositions(track, sampling_Had, extrap_eta_Had, extrap_phi_Had);	
+	if(m_storeCaloSamplings) {
+	  //store the values in tracks
+	  track->setDetail(xAOD::TauJetParameters::CaloSamplingEtaEM, extrap_eta_EM);
+	  track->setDetail(xAOD::TauJetParameters::CaloSamplingPhiEM, extrap_phi_EM);
+	  track->setDetail(xAOD::TauJetParameters::CaloSamplingEtaHad, extrap_eta_Had);
+	  track->setDetail(xAOD::TauJetParameters::CaloSamplingPhiHad, extrap_phi_Had);
+	}
+      }
+      else {
+	//no need to perform calo extrapolation
+	track->detail(xAOD::TauJetParameters::CaloSamplingEtaEM, extrap_eta_EM );
+	track->detail(xAOD::TauJetParameters::CaloSamplingPhiEM, extrap_phi_EM );
+	track->detail(xAOD::TauJetParameters::CaloSamplingEtaHad, extrap_eta_Had);
+	track->detail(xAOD::TauJetParameters::CaloSamplingPhiHad, extrap_phi_Had);
+      }
+      if(track->flag(xAOD::TauJetParameters::classifiedCharged)) {
+	//now fill the extrapolated values in the v<v<float> >
+	tracks.push_back(track);
+	m_tracksEtaAtSampling.push_back({extrap_eta_EM, extrap_eta_Had});
+	m_tracksPhiAtSampling.push_back({extrap_phi_EM, extrap_phi_Had});
+      }
     }
+    
 
+    //---------------------------------------------------------------------
+    // only run on 1-5 prong taus 
+    //---------------------------------------------------------------------
+    if (pTau.nTracks() == 0 || pTau.nTracks() >5 ) {
+        return StatusCode::SUCCESS;
+    }
+    ATH_MSG_DEBUG("ClusterScaler: new tau. \tpt = " << pTau.pt() << "\teta = " << pTau.eta() << "\tphi = " << pTau.phi() << "\tnprongs = " << pTau.nTracks());
+    
     //---------------------------------------------------------------------
     // get energy in HCal associated to the different tracks
     //---------------------------------------------------------------------
@@ -138,10 +173,10 @@ StatusCode TauPi0ClusterScaler::execute(xAOD::TauJet& pTau)
     // Create charged PFOs
     //---------------------------------------------------------------------
     for(unsigned iTrack = 0; iTrack<tracks.size();++iTrack){
-        const xAOD::TrackParticle* track = tracks.at(iTrack);
+        const xAOD::TrackParticle* track = tracks.at(iTrack)->track();
         xAOD::PFO* chargedPFO = new xAOD::PFO();
         m_chargedPFOContainer->push_back(chargedPFO);
-        ElementLink<xAOD::TrackParticleContainer> myTrackLink = pTau.trackLinks().at(iTrack);
+        ElementLink<xAOD::TrackParticleContainer> myTrackLink = pTau.trackNonConst(iTrack)->trackLinks()[0];
         if(!chargedPFO->setTrackLink(myTrackLink)) ATH_MSG_WARNING("Could not add Track to PFO");
         chargedPFO->setCharge(track->charge());
         chargedPFO->setP4(track->pt(),track->eta(),track->phi(),track->m());
@@ -169,19 +204,12 @@ StatusCode TauPi0ClusterScaler::execute(xAOD::TauJet& pTau)
     unsigned nNeutPFO = pTau.nProtoNeutralPFOs();
     for(unsigned int iNeutPFO=0; iNeutPFO<nNeutPFO; iNeutPFO++, thisCluster++) {
         const xAOD::PFO* curNeutPFO_const = pTau.protoNeutralPFO( iNeutPFO );
-        int maxESample = 2;
-        if (fabs(curNeutPFO_const->eta()) > 1.45) maxESample = 6;
-        // check if tracks have been extrapolated to this sampling. Do so if this is not the case
-        if(m_extrapolatedSamplings.at(maxESample)==false){
-           this->getExtrapolatedPositions(tracks,maxESample);
-           m_extrapolatedSamplings.at(maxESample)=true;
-        }
 
         for(unsigned iTrack = 0; iTrack<tracks.size();++iTrack){
             if(EestInEcal.at(iTrack)<0.001) continue; // No need to subtract
 
             TLorentzVector extTrack;
-            extTrack.SetPtEtaPhiE(tracks.at(iTrack)->pt(), m_tracksEtaAtSampling.at(iTrack).at(maxESample), m_tracksPhiAtSampling.at(iTrack).at(maxESample), tracks.at(iTrack)->e());
+            extTrack.SetPtEtaPhiE(tracks.at(iTrack)->pt(), m_tracksEtaAtSampling.at(iTrack).at(0), m_tracksPhiAtSampling.at(iTrack).at(0), tracks.at(iTrack)->e());
             // get eta/phi distance of cell to track
             double deltaEta = extTrack.Eta()-curNeutPFO_const->eta();
             double deltaPhi = TVector2::Phi_mpi_pi( extTrack.Phi() - curNeutPFO_const->phi());;
@@ -252,35 +280,33 @@ StatusCode TauPi0ClusterScaler::execute(xAOD::TauJet& pTau)
 }
 
 void TauPi0ClusterScaler::getExtrapolatedPositions(
-    vector<const xAOD::TrackParticle*> tracks,
-    int sampling)
+    const xAOD::TauTrack* track,
+    int sampling, float& extrap_eta, float& extrap_phi)
 {
-    for (unsigned iTrack = 0 ; iTrack < tracks.size(); ++iTrack ) {
-        // get the extrapolation into the calo
-        ATH_MSG_DEBUG( "Try extrapolation of track with pt = " << tracks.at(iTrack)->pt() << ", eta " << tracks.at(iTrack)->eta() << ", phi" << tracks.at(iTrack)->phi()
-                      << " to layer " << sampling);
-        const Trk::CaloExtension* caloExtension = 0;
-        if (!m_caloExtensionTool->caloExtension(*tracks.at(iTrack),caloExtension)
-            || caloExtension->caloLayerIntersections().size() < (unsigned int)(sampling+1)) return;
-
-        // store if track extrapolation successful, only use entry layer
-        const Trk::TrackParameters* param_at_calo = caloExtension->caloLayerIntersections().at(sampling);
-        if (param_at_calo) {
-            ATH_MSG_DEBUG( "Extrapolated track with eta=" << tracks.at(iTrack)->eta()
-                            << " phi="<<tracks.at(iTrack)->phi()
-                            << " to eta=" << param_at_calo->position().eta()
-                            << " phi="<<param_at_calo->position().phi()
-                            );
-            m_tracksEtaAtSampling.at(iTrack).at(sampling)=param_at_calo->position().eta();
-            m_tracksPhiAtSampling.at(iTrack).at(sampling)=param_at_calo->position().phi();
-        }
-        else ATH_MSG_DEBUG("Could not extrapolate track with pt = " << tracks.at(iTrack)->pt() << ", eta " << tracks.at(iTrack)->eta() << ", phi" << tracks.at(iTrack)->phi()
-                          << " to layer " << sampling);
-    }
+  extrap_eta=-10;
+  extrap_phi=-10;
+  ATH_MSG_DEBUG( "Try extrapolation of track with pt = " << track->pt() << ", eta " << track->eta() << ", phi" << track->phi()
+		 << " to layer " << sampling);
+  const Trk::CaloExtension* caloExtension = 0;
+  if (!m_caloExtensionTool->caloExtension(*track->track(),caloExtension)
+      || caloExtension->caloLayerIntersections().size() < (unsigned int)(sampling+1)) return;
+  // store if track extrapolation successful, only use entry layer
+  const Trk::TrackParameters* param_at_calo = caloExtension->caloLayerIntersections().at(sampling);
+  if (param_at_calo) {
+    ATH_MSG_DEBUG( "Extrapolated track with eta=" << track->eta()
+		   << " phi="<<track->phi()
+		   << " to eta=" << param_at_calo->position().eta()
+		   << " phi="<<param_at_calo->position().phi()
+		   );
+    extrap_eta=param_at_calo->position().eta();
+    extrap_phi=param_at_calo->position().phi();
+  }
+  else ATH_MSG_DEBUG("Could not extrapolate track with pt = " << track->pt() << ", eta " << track->eta() << ", phi" << track->phi()
+		       << " to layer " << sampling);
 }
 
 vector<double> TauPi0ClusterScaler::getEstEcalEnergy(
-    vector<const xAOD::TrackParticle*> tracks,
+    vector<const xAOD::TauTrack*> tracks,
     const xAOD::TauJet& pTau,
     vector<vector<ElementLink<xAOD::IParticleContainer> > >& hadPFOLinks)
 {
@@ -310,28 +336,16 @@ vector<double> TauPi0ClusterScaler::getEstEcalEnergy(
                      "\t deltaEtaToTau = " << deltaEtaToTau << "\t deltaPhiToTau = " << deltaPhiToTau << "\t deltaRToTau_squared = " << deltaRToTau_squared );
         */
 
-        // Decide which sampling to extrapolate to. Choose Hcal samplings that usually contain most energy (|eta| dependent)
-        int                                   sample = 13; //         |eta| <= 1.0
-        if     ( fabs(curHadPFO->eta())>1.5 ) sample =  9; //  1.5 <  |eta| 
-        else if( fabs(curHadPFO->eta())>1.0 ) sample = 19; //  1.0 <  |eta| <= 1.5
-
-        // check if tracks have been extrapolated to this sampling. Do so if this is not the case
-        if(m_extrapolatedSamplings.at(sample)==false){
-           this->getExtrapolatedPositions(tracks,sample);
-           ATH_MSG_DEBUG("Extrapolate to layer " << sample << "\teta = "
-                         << m_tracksEtaAtSampling.at(0).at(sample) << "\t phi = " << m_tracksPhiAtSampling.at(0).at(sample) );
-           m_extrapolatedSamplings.at(sample)=true;
-        }
 
         // Assign PFO to track
         int closestTrack = -1;
         double dRToClosestTrack_squared = 0.16; // XXX can be tuned later
         for(unsigned iTrack = 0; iTrack<tracks.size();++iTrack){
-            const xAOD::TrackParticle* track = tracks.at(iTrack);
+	    const xAOD::TrackParticle* track = tracks.at(iTrack)->track();
 
             // set extrapolated track direction
             TLorentzVector extTrack;
-            extTrack.SetPtEtaPhiE(track->pt(), m_tracksEtaAtSampling.at(iTrack).at(sample), m_tracksPhiAtSampling.at(iTrack).at(sample), track->e());
+            extTrack.SetPtEtaPhiE(track->pt(), m_tracksEtaAtSampling.at(iTrack).at(1), m_tracksPhiAtSampling.at(iTrack).at(1), track->e());
 
             // get eta/phi distance of cell to track
             double deltaEta = extTrack.Eta()-curHadPFO->eta();
diff --git a/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.h b/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.h
index 2cc3ed596015..ac68d0225a3f 100644
--- a/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.h
+++ b/Reconstruction/tauRecTools/src/TauPi0ClusterScaler.h
@@ -42,14 +42,13 @@ private:
     ToolHandle<Trk::IParticleCaloExtensionTool> m_caloExtensionTool;
 
     /** @brief extrapolated position of tracks and vector of bools to keep track for which samplings this has already been done */
-    std::vector<std::vector<double> > m_tracksEtaAtSampling;
-    std::vector<std::vector<double> > m_tracksPhiAtSampling;
-    std::vector<bool> m_extrapolatedSamplings;
-    std::vector<double> m_defaultValues;
+    //inner vector is size 2: EM, Had layers
+    std::vector<std::vector<float> > m_tracksEtaAtSampling;
+    std::vector<std::vector<float> > m_tracksPhiAtSampling;
 
     /** @brief get extrapolated track position at each layer */
-    void getExtrapolatedPositions( std::vector<const xAOD::TrackParticle*>,
-                                   int sampling);
+    void getExtrapolatedPositions( const xAOD::TauTrack*,
+                                   int sampling, float& eta, float& phi);
 
     /** @brief new charged PFO container and name */
     xAOD::PFOContainer* m_chargedPFOContainer;
@@ -58,10 +57,12 @@ private:
 
     /** @brief run on AOD */
     bool m_AODmode;
+    bool m_storeCaloSamplings;//configurable to store whether you want calo samplings on TauTracks
+    bool m_caloSamplingsStored=false;//check whether TauJets have sampling decorations or not
 
     /** @brief estimate energy deposited in Ecal by each charged pion */
     std::vector<double> getEstEcalEnergy(
-            std::vector<const xAOD::TrackParticle*> tracks,
+            std::vector<const xAOD::TauTrack*> tracks,
             const xAOD::TauJet& pTau,
             std::vector<std::vector<ElementLink<xAOD::IParticleContainer> > >& hadPFOLinks);
             
diff --git a/Reconstruction/tauRecTools/src/TauPi0CreateROI.cxx b/Reconstruction/tauRecTools/src/TauPi0CreateROI.cxx
index 763b2d9c802e..0e73063fdbc5 100644
--- a/Reconstruction/tauRecTools/src/TauPi0CreateROI.cxx
+++ b/Reconstruction/tauRecTools/src/TauPi0CreateROI.cxx
@@ -166,7 +166,7 @@ void TauPi0CreateROI::storeCell(const CaloCell* cell){
 
     if(isNewCell){
         CaloCell* copyCell = cell->clone();
-        m_pPi0CellContainer->push_back(const_cast<CaloCell*> (copyCell));
+        m_pPi0CellContainer->push_back(copyCell);
         m_addedCellsMap[cellHash] = copyCell;
     }
 }
diff --git a/Reconstruction/tauRecTools/src/TauPi0Selector.cxx b/Reconstruction/tauRecTools/src/TauPi0Selector.cxx
index 67fa5d2e2613..a0c9609bbc6d 100644
--- a/Reconstruction/tauRecTools/src/TauPi0Selector.cxx
+++ b/Reconstruction/tauRecTools/src/TauPi0Selector.cxx
@@ -51,7 +51,7 @@ StatusCode TauPi0Selector::execute(xAOD::TauJet& pTau)
     // Clear vector of cell-based pi0 PFO Links. Required when rerunning on xAOD level.
     pTau.clearProtoPi0PFOLinks();
     // Set proto decay mode to "not set". Will be overwritten for taus with 1-5 tracks
-    pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_NotSet);
+    pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_NotSet);
 
     //---------------------------------------------------------------------
     // only run on 1-5 prong taus 
@@ -61,7 +61,7 @@ StatusCode TauPi0Selector::execute(xAOD::TauJet& pTau)
     }
 
     // Set proto decay mode to "other". Will be overwritten for taus with 1 or 3 tracks
-    pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_Other);
+    pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_Other);
 
     //---------------------------------------------------------------------
     // retrieve neutral PFOs from tau. Apply selection and create links to
@@ -115,13 +115,13 @@ StatusCode TauPi0Selector::execute(xAOD::TauJet& pTau)
     // pTau.setMPanTauCellBasedProto(  p4.M());
 
     if(pTau.nTracks()==1){
-      if(nRecoPi0s==0)      pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1p0n);
-      else if(nRecoPi0s==1) pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1p1n);
-      else                  pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1pXn);
+      if(nRecoPi0s==0)      pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1p0n);
+      else if(nRecoPi0s==1) pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1p1n);
+      else                  pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_1pXn);
     }
     if(pTau.nTracks()==3){
-      if(nRecoPi0s==0) pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_3p0n);
-      else             pTau.setPanTauDetail(xAOD::TauJetParameters::pantau_CellBasedInput_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_3pXn);
+      if(nRecoPi0s==0) pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_3p0n);
+      else             pTau.setPanTauDetail(xAOD::TauJetParameters::PanTau_DecayModeProto, xAOD::TauJetParameters::DecayMode::Mode_3pXn);
     }
 
     
diff --git a/Reconstruction/tauRecTools/src/TauShotVariableHelpers.cxx b/Reconstruction/tauRecTools/src/TauShotVariableHelpers.cxx
index 3645dd3b5db9..87eeb517b977 100644
--- a/Reconstruction/tauRecTools/src/TauShotVariableHelpers.cxx
+++ b/Reconstruction/tauRecTools/src/TauShotVariableHelpers.cxx
@@ -323,10 +323,10 @@ namespace TauShotVariableHelpers {
         float pt_largerWindow  = 0.;
         float pt_smallerWindow = 0.;
         for(int iCell = 0; iCell != nCells_eta; ++iCell ){
-            if(fabs(iCell-seedIndex)>largerWindow/2) continue;
+            if(abs(iCell-seedIndex)>largerWindow/2) continue;
             if(shotCells.at(0).at(iCell)!=NULL) pt_largerWindow+=shotCells.at(0).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(0).at(iCell));
             if(shotCells.at(1).at(iCell)!=NULL) pt_largerWindow+=shotCells.at(1).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(1).at(iCell));
-            if(fabs(iCell-seedIndex)>smallerWindow/2) continue;
+            if(abs(iCell-seedIndex)>smallerWindow/2) continue;
             if(shotCells.at(0).at(iCell)!=NULL) pt_smallerWindow+=shotCells.at(0).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(0).at(iCell));
             if(shotCells.at(1).at(iCell)!=NULL) pt_smallerWindow+=shotCells.at(1).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(1).at(iCell));
         }
@@ -344,10 +344,10 @@ namespace TauShotVariableHelpers {
         float pt_largerWindow  = 0.;
         float pt_smallerWindow = 0.;
         for(int iCell = 0; iCell != nCells_eta; ++iCell ){
-            if(fabs(iCell-seedIndex)>largerWindow/2) continue;
+            if(abs(iCell-seedIndex)>largerWindow/2) continue;
             if(shotCells.at(0).at(iCell)!=NULL) pt_largerWindow+=shotCells.at(0).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(0).at(iCell));
             if(shotCells.at(1).at(iCell)!=NULL) pt_largerWindow+=shotCells.at(1).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(1).at(iCell));
-            if(fabs(iCell-seedIndex)>smallerWindow/2) continue;
+            if(abs(iCell-seedIndex)>smallerWindow/2) continue;
             if(shotCells.at(0).at(iCell)!=NULL) pt_smallerWindow+=shotCells.at(0).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(0).at(iCell));
             if(shotCells.at(1).at(iCell)!=NULL) pt_smallerWindow+=shotCells.at(1).at(iCell)->pt()*m_caloWeightTool->wtCell(shotCells.at(1).at(iCell));
         }
diff --git a/Reconstruction/tauRecTools/src/TauTrackFinder.cxx b/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
index 9ab9fa9621f3..d3bd289915d6 100644
--- a/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
+++ b/Reconstruction/tauRecTools/src/TauTrackFinder.cxx
@@ -8,6 +8,7 @@
 
 #include "xAODTau/TauJet.h"
 #include "xAODTau/TauJetContainer.h"
+#include "xAODTau/TauTrackContainer.h"
 
 #include "TauTrackFinder.h"
 #include "tauRecTools/KineUtils.h"
@@ -19,6 +20,7 @@ TauTrackFinder::TauTrackFinder(const std::string& name ) :
                 m_caloExtensionTool("Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"),
 		m_trackSelectorTool_tau(""),
 		m_trackToVertexTool("Reco::TrackToVertex"),
+		m_trackSelectorTool_tau_xAOD(""),
 		m_z0maxDelta(1000),
 		m_applyZ0cut(false),
 		m_storeInOtherTrks(true),
@@ -28,12 +30,15 @@ TauTrackFinder::TauTrackFinder(const std::string& name ) :
 	declareProperty("MaxJetDrTau", m_maxJetDr_tau = 0.2);
 	declareProperty("MaxJetDrWide", m_maxJetDr_wide = 0.4);
 	declareProperty("TrackSelectorToolTau", m_trackSelectorTool_tau);
+	declareProperty("TrackSelectorToolTauxAOD", m_trackSelectorTool_tau_xAOD);
 	declareProperty("TrackParticleContainer", m_inputTrackParticleContainerName = "InDetTrackParticles");
+	declareProperty("TrackParticleContainer", m_inputTauTrackContainerName = "TauTracks");
         declareProperty("ParticleCaloExtensionTool",   m_caloExtensionTool );
         declareProperty("TrackToVertexTool",m_trackToVertexTool);
 	declareProperty("maxDeltaZ0wrtLeadTrk", m_z0maxDelta);
 	declareProperty("removeTracksOutsideZ0wrtLeadTrk", m_applyZ0cut);
         declareProperty("StoreRemovedCoreWideTracksInOtherTracks", m_storeInOtherTrks = true);
+	declareProperty("removeDuplicateCoreTracks", m_removeDuplicateCoreTracks = true);
 	declareProperty("BypassSelector", m_bypassSelector = false);
 	declareProperty("BypassExtrapolator", m_bypassExtrapolator = false);
 }
@@ -46,6 +51,7 @@ StatusCode TauTrackFinder::initialize() {
 
 	// Get the TrackSelectorTool
 	if (!retrieveTool(m_trackSelectorTool_tau)) return StatusCode::FAILURE;
+	//if (!retrieveTool(m_trackSelectorTool_tau_xAOD)) return StatusCode::FAILURE;
 
 	// Get the TJVA
 	if (!retrieveTool(m_trackToVertexTool)) return StatusCode::FAILURE;
@@ -77,10 +83,14 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 	StatusCode sc;
 	// get the track particle container from StoreGate
 	const xAOD::TrackParticleContainer* trackParticleCont = 0;
+	xAOD::TauTrackContainer* tauTrackCon = 0;
 
 	//for tau trigger
 	bool inTrigger = tauEventData()->inTrigger();
-	if (inTrigger)   sc = tauEventData()->getObject( "TrackContainer", trackParticleCont );
+	if (inTrigger)   {
+	  ATH_CHECK(tauEventData()->getObject( "TrackContainer", trackParticleCont ));	
+	  ATH_CHECK(tauEventData()->getObject( "TauTrackContainer", tauTrackCon ));
+	}
 
 	if( !inTrigger || !trackParticleCont || sc.isFailure() ) {
 		// try standard
@@ -90,6 +100,14 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 		}
 	}
 
+	if( !inTrigger || !tauTrackCon || sc.isFailure() ) {
+		// try standard
+		if (!openContainer(tauTrackCon, m_inputTauTrackContainerName)) {
+			if (!inTrigger) return StatusCode::FAILURE; // in offline we don't reconstruct tau candidates without having a track container
+			else return StatusCode::SUCCESS; // we don't want stop trigger if there is no track container
+		}
+	}
+
 	std::vector<const xAOD::TrackParticle*> tauTracks;
 	std::vector<const xAOD::TrackParticle*> wideTracks;
 	std::vector<const xAOD::TrackParticle*> otherTracks;
@@ -106,12 +124,6 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 		this->removeOffsideTracksWrtLeadTrk(tauTracks, wideTracks, otherTracks, pVertex, m_z0maxDelta);
 	}
 
-	//clear tracks first (needed for "rerun mode" if called on AODs again)
-	pTau.clearTrackLinks();
-	pTau.clearWideTrackLinks();
-	pTau.clearOtherTrackLinks();
-
-	bool alreadyUsed = false;
 	//check for tracks used in multiple taus
 	xAOD::TauJetContainer* pContainer = tauEventData()->xAODTauContainer;
 	if(pContainer==0){
@@ -122,34 +134,25 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 	  return StatusCode::FAILURE;
 	}
 
-	
-	for (std::vector<const xAOD::TrackParticle*>::iterator track_it = tauTracks.begin(); track_it != tauTracks.end() ;)
-	{
-		alreadyUsed = false;
-
-		//loop over all up-to-now reconstructed tau candidates
-		xAOD::TauJetContainer::const_iterator tau_it = pContainer->begin();
-		xAOD::TauJetContainer::const_iterator tau_end = pContainer->end();
-		for( ; tau_it != tau_end; tau_it++ )
-		{
-		        if( (*tau_it) == &pTau ) continue;
-			//loop over core tracks
-			for (unsigned int j = 0; j < (*tau_it)->nTracks(); ++j)
-			{
-				if ((*track_it) == (*tau_it)->track(j))
-				{
-					ATH_MSG_WARNING("Found a track that is identical with a track already associated to another tau. Will not add this track to more than one tau candidate");
-					alreadyUsed = true;
-				}
-			}
-		}
 
-		//if this track has already been used by another tau, don't associate it to this new one
-		if (alreadyUsed)    track_it = tauTracks.erase(track_it);
-		else ++track_it;
+	if(m_removeDuplicateCoreTracks){
+	  bool alreadyUsed = false;
+	  for (std::vector<const xAOD::TrackParticle*>::iterator track_it = tauTracks.begin(); track_it != tauTracks.end() ;)
+	    {
+	      alreadyUsed = false;
+	      
+	      //loop over all up-to-now core tracks
+	      for( const xAOD::TauTrack* tau_trk : (*tauTrackCon) ) {
+		if(! tau_trk->flagWithMask( (1<<xAOD::TauJetParameters::TauTrackFlag::coreTrack) | (1<<xAOD::TauJetParameters::TauTrackFlag::passTrkSelector))) continue; //originally it was coreTrack&passTrkSelector
+		if( (*track_it) == tau_trk->track()) alreadyUsed = true;
+	      }
+	      //if this track has already been used by another tau, don't associate it to this new one
+	      if(alreadyUsed) ATH_MSG_WARNING( "Found Already Used track new, now removing: " << *track_it );
+	      if (alreadyUsed)    track_it = tauTracks.erase(track_it);
+	      else ++track_it;
+	    }
 	}
 
-
 	// associated track to tau candidate and calculate charge
 	float charge = 0;
 	for (unsigned int i = 0; i < tauTracks.size(); ++i) {
@@ -160,9 +163,24 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 				<< " phi " << trackParticle->phi()
 		);
 		charge += trackParticle->charge();
+
+		xAOD::TauTrack* track = new xAOD::TauTrack();
+		tauTrackCon->push_back(track);
 		ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
 		linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
-		pTau.addTrackLink(linkToTrackParticle);
+		track->addTrackLink(linkToTrackParticle);
+		track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+		//track->setCharge(track->charge());
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true);
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true);
+		// in case TrackClassifier is not run, still get sensible results
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedCharged, true); 
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+		//track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelectionTight, m_trackSelectorTool_tau_xAOD->accept(trackParticle));
+		ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+		linkToTauTrack.toContainedElement(*tauTrackCon, track);
+		pTau.addTauTrackLink(linkToTauTrack);
+
 		ATH_MSG_VERBOSE(name() 	<< " added core track nr: " << i
 				<< " eta " << pTau.track(i)->eta()
 				<< " phi " << pTau.track(i)->phi()
@@ -182,13 +200,24 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 				<< " eta " << trackParticle->eta()
 				<< " phi " << trackParticle->phi()
 		);
+
+		xAOD::TauTrack* track = new xAOD::TauTrack();
+		tauTrackCon->push_back(track);
 		ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
 		linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
-		pTau.addWideTrackLink(linkToTrackParticle);
-		ATH_MSG_VERBOSE(name() 	<< " added wide track nr: " << i
-				<< " eta " << pTau.wideTrack(i)->eta()
-				<< " phi " << pTau.wideTrack(i)->phi()
-		);
+		track->addTrackLink(linkToTrackParticle);
+		track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+		//track->setCharge(track->charge());
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true);
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelector, true);
+		// in case TrackClassifier is not run, still get sensible results
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedIsolation, true); // for sake of trigger, reset in TauTrackClassifier
+		track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+		//track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelectionTight, m_trackSelectorTool_tau_xAOD->accept(trackParticle));
+		ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+		linkToTauTrack.toContainedElement(*tauTrackCon, track);
+		pTau.addTauTrackLink(linkToTauTrack);
+
 	}
 
 	/// was
@@ -201,13 +230,24 @@ StatusCode TauTrackFinder::execute(xAOD::TauJet& pTau) {
 				<< " eta " << trackParticle->eta()
 				<< " phi " << trackParticle->phi()
 		);
-		ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
-		linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
-		pTau.addOtherTrackLink(linkToTrackParticle);
-		ATH_MSG_VERBOSE(name() 	<< " added other track nr: " << i
-				<< " eta " << pTau.otherTrack(i)->eta()
-				<< " phi " << pTau.otherTrack(i)->phi()
-		);
+
+		// bool accepted=m_trackSelectorTool_tau_xAOD->accept(trackParticle);
+		// if(accepted){
+		  xAOD::TauTrack* track = new xAOD::TauTrack();
+		  tauTrackCon->push_back(track);
+		  ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
+		  linkToTrackParticle.toContainedElement(*trackParticleCont, trackParticle);
+		  track->addTrackLink(linkToTrackParticle);
+		  track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
+		  float dR = track->p4().DeltaR(pTau.p4());
+		  if(dR<=0.2) track->setFlag(xAOD::TauJetParameters::TauTrackFlag::coreTrack, true);
+		  else track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true);
+		  track->setFlag(xAOD::TauJetParameters::TauTrackFlag::unclassified, true); 
+		  // track->setFlag(xAOD::TauJetParameters::TauTrackFlag::passTrkSelectionTight, accepted);
+		  ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
+		  linkToTauTrack.toContainedElement(*tauTrackCon, track);
+		  pTau.addTauTrackLink(linkToTauTrack);
+		// }
 	}
 
 
@@ -287,10 +327,11 @@ StatusCode TauTrackFinder::extrapolateToCaloSurface(xAOD::TauJet& pTau) {
 
         Trk::TrackParametersIdHelper parsIdHelper;
 
-	for (unsigned int itr = 0; itr < 10 && itr < pTau.nTracks(); ++itr) {
-
-		const xAOD::TrackParticle *orgTrack = pTau.track(itr);
-                
+	//	for (unsigned int itr = 0; itr < 10 && itr < pTau.nAllTracks(); ++itr) {
+	
+	for( xAOD::TauTrack* tauTrack : pTau.allTracks() ) {
+		const xAOD::TrackParticle *orgTrack = tauTrack->track();
+		
                 if( !orgTrack ) continue;
 
                 // get the extrapolation into the calo
@@ -306,8 +347,8 @@ StatusCode TauTrackFinder::extrapolateToCaloSurface(xAOD::TauJet& pTau) {
                   CaloSampling::CaloSample sample = parsIdHelper.caloSample((*cur)->cIdentifier());
                   
                   if( sample == CaloSampling::EME1 || sample == CaloSampling::EMB1 ){
-                    pTau.setTrackEtaStrip( itr,  (*cur)->position().eta() );
-                    pTau.setTrackPhiStrip( itr,  (*cur)->position().phi() );
+		    tauTrack->setEtaStrip((*cur)->position().eta());
+		    tauTrack->setPhiStrip((*cur)->position().phi());
                     break;
                   }
                 }
diff --git a/Reconstruction/tauRecTools/src/TauTrackFinder.h b/Reconstruction/tauRecTools/src/TauTrackFinder.h
index e6ad1425b930..2206aec17aca 100644
--- a/Reconstruction/tauRecTools/src/TauTrackFinder.h
+++ b/Reconstruction/tauRecTools/src/TauTrackFinder.h
@@ -15,6 +15,9 @@
 
 #include "VxVertex/RecVertex.h"
 
+// xAOD Tracking Tool
+#include "InDetTrackSelectionTool/IInDetTrackSelectionTool.h"
+
 namespace Trk {
   class ITrackSelectorTool;
   class IParticleCaloExtensionTool;
@@ -110,6 +113,7 @@ private:
     std::string m_inputTauJetContainerName;
     std::string m_inputTrackParticleContainerName;
     std::string m_inputPrimaryVertexContainerName;
+    std::string m_inputTauTrackContainerName;
 
     //-------------------------------------------------------------
     //! tools
@@ -117,6 +121,8 @@ private:
     ToolHandle< Trk::IParticleCaloExtensionTool >  m_caloExtensionTool;
     ToolHandle<Trk::ITrackSelectorTool> m_trackSelectorTool_tau;
     ToolHandle<Reco::ITrackToVertex> m_trackToVertexTool;
+    ToolHandle<InDet::IInDetTrackSelectionTool> m_trackSelectorTool_tau_xAOD;
+
     
     //-------------------------------------------------------------
     //! Input parameters for algorithm
@@ -130,6 +136,7 @@ private:
     float m_z0maxDelta;
     bool m_applyZ0cut;
     bool m_storeInOtherTrks;
+    bool m_removeDuplicateCoreTracks;
     std::vector<float> m_vDeltaZ0coreTrks;
     std::vector<float> m_vDeltaZ0wideTrks;
 
diff --git a/Reconstruction/tauRecTools/src/TauVertexFinder.cxx b/Reconstruction/tauRecTools/src/TauVertexFinder.cxx
index 09fbbee02024..1367033dd700 100644
--- a/Reconstruction/tauRecTools/src/TauVertexFinder.cxx
+++ b/Reconstruction/tauRecTools/src/TauVertexFinder.cxx
@@ -4,8 +4,8 @@
 
 #include "TauVertexFinder.h"
 
-//#include "VxVertex/RecVertex.h"
-//#include "VxVertex/VxCandidate.h"
+#include "VxVertex/RecVertex.h"
+#include "VxVertex/VxCandidate.h"
 
 #include "xAODTracking/VertexContainer.h"
 #include "xAODTracking/Vertex.h"
@@ -15,16 +15,18 @@
 #include "xAODTau/TauJet.h"
 
 TauVertexFinder::TauVertexFinder(const std::string& name ) :
-TauRecToolBase(name),
-m_printMissingContainerINFO(true),
-m_maxJVF(-100.),
-m_assocTracksName(""),
-m_trackVertexAssocName("")
+  TauRecToolBase(name),
+  m_printMissingContainerINFO(true),
+  m_maxJVF(-100.),
+  m_TrackSelectionToolForTJVA(""),
+  m_assocTracksName(""),
+  m_trackVertexAssocName("")
 {
-    declareProperty("UseTJVA", m_useTJVA=true);
-    declareProperty("PrimaryVertexContainer", m_inputPrimaryVertexContainerName = "PrimaryVertices");
-    declareProperty("AssociatedTracks",m_assocTracksName);
-    declareProperty("TrackVertexAssociation",m_trackVertexAssocName);
+  declareProperty("UseTJVA", m_useTJVA=true);
+  declareProperty("PrimaryVertexContainer", m_inputPrimaryVertexContainerName = "PrimaryVertices");
+  declareProperty("AssociatedTracks",m_assocTracksName);
+  declareProperty("TrackVertexAssociation",m_trackVertexAssocName);
+  declareProperty("InDetTrackSelectionToolForTJVA",m_TrackSelectionToolForTJVA);
 }
 
 TauVertexFinder::~TauVertexFinder() {
@@ -32,23 +34,24 @@ TauVertexFinder::~TauVertexFinder() {
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 StatusCode TauVertexFinder::initialize() {
-    if (m_useTJVA) ATH_MSG_INFO("using TJVA to determine tau vertex");
-    return StatusCode::SUCCESS;
+  if (m_useTJVA) ATH_MSG_INFO("using TJVA to determine tau vertex");
+  ATH_CHECK(retrieveTool(m_TrackSelectionToolForTJVA));
+  return StatusCode::SUCCESS;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 StatusCode TauVertexFinder::finalize() {
-    return StatusCode::SUCCESS;
+  return StatusCode::SUCCESS;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 StatusCode TauVertexFinder::eventInitialize() {
-    return StatusCode::SUCCESS;
+  return StatusCode::SUCCESS;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 StatusCode TauVertexFinder::eventFinalize() {
-    return StatusCode::SUCCESS;
+  return StatusCode::SUCCESS;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -64,107 +67,117 @@ StatusCode TauVertexFinder::execute(xAOD::TauJet& pTau) {
   sc = tauEventData()->getObject("VxPrimaryCandidate", vxContainer);
   
   if (sc.isFailure() || !vxContainer) { //not in trigger mode or no vxContainer was set by trigger
-        ATH_MSG_DEBUG("no VxPrimaryCandidateContainer for trigger -> try standard way");
-        if (!openContainer(vxContainer, m_inputPrimaryVertexContainerName)) {
-          if (m_printMissingContainerINFO) {
-            ATH_MSG_INFO(m_inputPrimaryVertexContainerName << " container not found --> skip TauVertexFinder (no further info)");
-            m_printMissingContainerINFO=false;
-          }
-          return StatusCode::SUCCESS;
-        }
-
-        // find default PrimaryVertex (needed if TJVA is switched off or fails)
-        // see: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/VertexReselectionOnAOD
-        // code adapted from 
-        // https://svnweb.cern.ch/trac/atlasoff/browser/Tracking/TrkEvent/VxVertex/trunk/VxVertex/PrimaryVertexSelector.h
-        if (vxContainer->size()>0) {   
-          // simple loop through and get the primary vertex
-          xAOD::VertexContainer::const_iterator vxIter    = vxContainer->begin();
-          xAOD::VertexContainer::const_iterator vxIterEnd = vxContainer->end();
-          for ( size_t ivtx = 0; vxIter != vxIterEnd; ++vxIter, ++ivtx ){
-            // the first and only primary vertex candidate is picked
-            if ( (*vxIter)->vertexType() ==  xAOD::VxType::PriVtx){
-              primaryVertex = (*vxIter);
-              break;
-            }
-          }
-        }
+    ATH_MSG_DEBUG("no VxPrimaryCandidateContainer for trigger -> try standard way");
+    if (!openContainer(vxContainer, m_inputPrimaryVertexContainerName)) {
+      if (m_printMissingContainerINFO) {
+	ATH_MSG_INFO(m_inputPrimaryVertexContainerName << " container not found --> skip TauVertexFinder (no further info)");
+	m_printMissingContainerINFO=false;
+      }
+      return StatusCode::SUCCESS;
     }
-    else { // trigger mode
-      // find default PrimaryVertex (highest sum pt^2)
-      if (vxContainer->size()>0) primaryVertex = (*vxContainer)[0];
+
+    // find default PrimaryVertex (needed if TJVA is switched off or fails)
+    // see: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/VertexReselectionOnAOD
+    // code adapted from 
+    // https://svnweb.cern.ch/trac/atlasoff/browser/Tracking/TrkEvent/VxVertex/trunk/VxVertex/PrimaryVertexSelector.h
+    if (vxContainer->size()>0) {   
+      // simple loop through and get the primary vertex
+      xAOD::VertexContainer::const_iterator vxIter    = vxContainer->begin();
+      xAOD::VertexContainer::const_iterator vxIterEnd = vxContainer->end();
+      for ( size_t ivtx = 0; vxIter != vxIterEnd; ++vxIter, ++ivtx ){
+	// the first and only primary vertex candidate is picked
+	if ( (*vxIter)->vertexType() ==  xAOD::VxType::PriVtx){
+	  primaryVertex = (*vxIter);
+	  break;
+	}
+      }
     }
+  }
+  else { // trigger mode
+    // find default PrimaryVertex (highest sum pt^2)
+    if (vxContainer->size()>0) primaryVertex = (*vxContainer)[0];
+  }
     
-    ATH_MSG_VERBOSE("size of VxPrimaryContainer is: "  << vxContainer->size() );
+  ATH_MSG_VERBOSE("size of VxPrimaryContainer is: "  << vxContainer->size() );
     
-    // associate vertex to tau
-    if (primaryVertex) pTau.setVertex(vxContainer, primaryVertex);
+  // associate vertex to tau
+  if (primaryVertex) pTau.setVertex(vxContainer, primaryVertex);
        
-    //stop here if TJVA is disabled or vertex container is empty
-    if (!m_useTJVA || vxContainer->size()==0) return StatusCode::SUCCESS;
-
-    // try to find new PV with TJVA
-    ATH_MSG_DEBUG("TJVA enabled -> try to find new PV for the tau candidate");
-
-    ElementLink<xAOD::VertexContainer> newPrimaryVertexLink = getPV_TJVA(pTau, *vxContainer );
-    if (newPrimaryVertexLink.isValid()) {
-      // set new primary vertex
-      // will overwrite default one which was set above
-      pTau.setVertexLink(newPrimaryVertexLink);
-      // save highest JVF value
-      pTau.setDetail(xAOD::TauJetParameters::TauJetVtxFraction,static_cast<float>(m_maxJVF));
-      ATH_MSG_DEBUG("TJVA vertex found and set");
-    }
-    else {
-      ATH_MSG_DEBUG("couldn't find new PV for TJVA");
-    }
-
-    return StatusCode::SUCCESS;
+  //stop here if TJVA is disabled or vertex container is empty
+  if (!m_useTJVA || vxContainer->size()==0) return StatusCode::SUCCESS;
+
+  // try to find new PV with TJVA
+  ATH_MSG_DEBUG("TJVA enabled -> try to find new PV for the tau candidate");
+
+  ElementLink<xAOD::VertexContainer> newPrimaryVertexLink = getPV_TJVA(pTau, *vxContainer );
+  if (newPrimaryVertexLink.isValid()) {
+    // set new primary vertex
+    // will overwrite default one which was set above
+    pTau.setVertexLink(newPrimaryVertexLink);
+    // save highest JVF value
+    pTau.setDetail(xAOD::TauJetParameters::TauJetVtxFraction,static_cast<float>(m_maxJVF));
+    ATH_MSG_DEBUG("TJVA vertex found and set");
+  }
+  else {
+    ATH_MSG_DEBUG("couldn't find new PV for TJVA");
+  }
+
+  return StatusCode::SUCCESS;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 ElementLink<xAOD::VertexContainer> TauVertexFinder::getPV_TJVA(const xAOD::TauJet& pTau, const xAOD::VertexContainer& vertices)
 {
-	const xAOD::Jet* pJetSeed = (*pTau.jetLink());
-
-    // the implementation follows closely the example given in modifyJet(...) in https://svnweb.cern.ch/trac/atlasoff/browser/Reconstruction/Jet/JetMomentTools/trunk/Root/JetVertexFractionTool.cxx#15
-
-    // Get the tracks associated to the jet
-    std::vector<const xAOD::TrackParticle*> assocTracks;
-    if (! pJetSeed->getAssociatedObjects(m_assocTracksName, assocTracks)) {
-    	ATH_MSG_ERROR("Could not retrieve the AssociatedObjects named \""<< m_assocTracksName <<"\" from jet");
-    	return ElementLink<xAOD::VertexContainer>();
-    }
-
-    // Get the TVA object
-    const jet::TrackVertexAssociation* tva = NULL;
-    if (evtStore()->retrieve(tva,m_trackVertexAssocName).isFailure()) {
-    	ATH_MSG_ERROR("Could not retrieve the TrackVertexAssociation from evtStore: " << m_trackVertexAssocName);
-    	return ElementLink<xAOD::VertexContainer>();
-    }
-
-    // Calculate Jet Vertex Fraction
-    std::vector<float> jvf;
-    jvf.resize(vertices.size());
-    for (size_t iVertex = 0; iVertex < vertices.size(); ++iVertex) {
-      jvf.at(iVertex) = getJetVertexFraction(vertices.at(iVertex),assocTracks,tva);
-    }
+  const xAOD::Jet* pJetSeed = (*pTau.jetLink());
+  std::vector<const xAOD::TrackParticle*> tracksForTJVA;
+  const double dDeltaRMax(0.2);
+
+  // the implementation follows closely the example given in modifyJet(...) in https://svnweb.cern.ch/trac/atlasoff/browser/Reconstruction/Jet/JetMomentTools/trunk/Root/JetVertexFractionTool.cxx#15
+
+  // Get the tracks associated to the jet
+  std::vector<const xAOD::TrackParticle*> assocTracks;
+  if (! pJetSeed->getAssociatedObjects(m_assocTracksName, assocTracks)) {
+    ATH_MSG_ERROR("Could not retrieve the AssociatedObjects named \""<< m_assocTracksName <<"\" from jet");
+    return ElementLink<xAOD::VertexContainer>();
+  }
+
+  // Store tracks that meet TJVA track selection criteria and are between deltaR of 0.2 with the jet seed
+  // To be included in the TJVA calculation
+  // Maybe not as efficient as deleting unwanted tracks from assocTrack but quicker and safer for now.
+  for ( auto xTrack : assocTracks ){
+    if ( (xTrack->p4().DeltaR(pJetSeed->p4())<dDeltaRMax) && m_TrackSelectionToolForTJVA->accept(*xTrack) )
+      tracksForTJVA.push_back(xTrack);
+  }
+
+  // Get the TVA object
+  const jet::TrackVertexAssociation* tva = NULL;
+  if (evtStore()->retrieve(tva,m_trackVertexAssocName).isFailure()) {
+    ATH_MSG_ERROR("Could not retrieve the TrackVertexAssociation from evtStore: " << m_trackVertexAssocName);
+    return ElementLink<xAOD::VertexContainer>();
+  }
+
+  // Calculate Jet Vertex Fraction
+  std::vector<float> jvf;
+  jvf.resize(vertices.size());
+  for (size_t iVertex = 0; iVertex < vertices.size(); ++iVertex) {
+    jvf.at(iVertex) = getJetVertexFraction(vertices.at(iVertex),tracksForTJVA,tva);
+  }
     
-    // Get the highest JVF vertex and store maxJVF for later use
-    // Note: the official JetMomentTools/JetVertexFractionTool doesn't provide any possibility to access the JVF value, but just the vertex.
-    m_maxJVF=-100.;
-    size_t maxIndex = 0;
-    for (size_t iVertex = 0; iVertex < jvf.size(); ++iVertex) {
-    	if (jvf.at(iVertex) > m_maxJVF) {
-          m_maxJVF = jvf.at(iVertex);
-          maxIndex = iVertex;
-        }
+  // Get the highest JVF vertex and store maxJVF for later use
+  // Note: the official JetMomentTools/JetVertexFractionTool doesn't provide any possibility to access the JVF value, but just the vertex.
+  m_maxJVF=-100.;
+  size_t maxIndex = 0;
+  for (size_t iVertex = 0; iVertex < jvf.size(); ++iVertex) {
+    if (jvf.at(iVertex) > m_maxJVF) {
+      m_maxJVF = jvf.at(iVertex);
+      maxIndex = iVertex;
     }
+  }
 
-    // Set the highest JVF vertex
-    ElementLink<xAOD::VertexContainer> vtxlink = ElementLink<xAOD::VertexContainer>(vertices,vertices.at(maxIndex)->index());
+  // Set the highest JVF vertex
+  ElementLink<xAOD::VertexContainer> vtxlink = ElementLink<xAOD::VertexContainer>(vertices,vertices.at(maxIndex)->index());
 
-    return vtxlink;
+  return vtxlink;
 }
 
 // reimplementation of JetVertexFractionTool::getJetVertexFraction(const xAOD::Vertex* vertex, const std::vector<const xAOD::TrackParticle*>& tracks, const jet::TrackVertexAssociation* tva) const
@@ -172,40 +185,40 @@ ElementLink<xAOD::VertexContainer> TauVertexFinder::getPV_TJVA(const xAOD::TauJe
 // see https://svnweb.cern.ch/trac/atlasoff/browser/Reconstruction/Jet/JetMomentTools/trunk/Root/JetVertexFractionTool.cxx
 float TauVertexFinder::getJetVertexFraction(const xAOD::Vertex* vertex, const std::vector<const xAOD::TrackParticle*>& tracks, const jet::TrackVertexAssociation* tva) const
 {
-    float sumTrackPV = 0;
-    float sumTrackAll = 0;
-    for (size_t iTrack = 0; iTrack < tracks.size(); ++iTrack)
+  float sumTrackPV = 0;
+  float sumTrackAll = 0;
+  for (size_t iTrack = 0; iTrack < tracks.size(); ++iTrack)
     {
-        const xAOD::TrackParticle* track = tracks.at(iTrack);
-        const xAOD::Vertex* ptvtx = tva->associatedVertex(track);
-        if (ptvtx != nullptr) {  // C++11 feature
-        	if (ptvtx->index() == vertex->index()) sumTrackPV += track->pt();
-        }
-        sumTrackAll += track->pt();
+      const xAOD::TrackParticle* track = tracks.at(iTrack);
+      const xAOD::Vertex* ptvtx = tva->associatedVertex(track);
+      if (ptvtx != nullptr) {  // C++11 feature
+	if (ptvtx->index() == vertex->index()) sumTrackPV += track->pt();
+      }
+      sumTrackAll += track->pt();
 
     }
-    return sumTrackAll!=0 ? sumTrackPV/sumTrackAll : 0;
+  return sumTrackAll!=0 ? sumTrackPV/sumTrackAll : 0;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 // Helpers
 template <class T>
 bool TauVertexFinder::openContainer(T* &container, std::string containerName, bool printFATAL) {
-    StatusCode sc = evtStore()->retrieve(container, containerName);
-    if (sc.isFailure() || !container) {
-      if (printFATAL) ATH_MSG_FATAL("Container (" << containerName << ") not found in StoreGate");
-      return 0;
-    }
-    return container;
+  StatusCode sc = evtStore()->retrieve(container, containerName);
+  if (sc.isFailure() || !container) {
+    if (printFATAL) ATH_MSG_FATAL("Container (" << containerName << ") not found in StoreGate");
+    return 0;
+  }
+  return container;
 }
 
 template <class T>
 bool TauVertexFinder::retrieveTool(T & tool) {
-    if (tool.retrieve().isFailure()) {
-        ATH_MSG_FATAL("Failed to retrieve tool " << tool);
-        return false;
-    } else {
-        ATH_MSG_VERBOSE("Retrieved tool " << tool);
-    }
-    return true;
+  if (tool.retrieve().isFailure()) {
+    ATH_MSG_FATAL("Failed to retrieve tool " << tool);
+    return false;
+  } else {
+    ATH_MSG_VERBOSE("Retrieved tool " << tool);
+  }
+  return true;
 }
diff --git a/Reconstruction/tauRecTools/src/TauVertexFinder.h b/Reconstruction/tauRecTools/src/TauVertexFinder.h
index de30101ac0ea..8aca69d0bffe 100644
--- a/Reconstruction/tauRecTools/src/TauVertexFinder.h
+++ b/Reconstruction/tauRecTools/src/TauVertexFinder.h
@@ -9,6 +9,7 @@
 #include "GaudiKernel/ToolHandle.h"
 #include "xAODTracking/VertexContainer.h"
 #include "JetEDM/TrackVertexAssociation.h"
+#include "InDetTrackSelectionTool/InDetTrackSelectionTool.h"
 
 /////////////////////////////////////////////////////////////////////////////
 
@@ -25,50 +26,51 @@
 
 class TauVertexFinder : virtual public TauRecToolBase {
 public:
-    //-------------------------------------------------------------
-    //! Constructor and Destructor
-    //-------------------------------------------------------------
-    TauVertexFinder(const std::string& name);
-    ASG_TOOL_CLASS2(TauVertexFinder, TauRecToolBase, ITauToolBase);
-    ~TauVertexFinder();
+  //-------------------------------------------------------------
+  //! Constructor and Destructor
+  //-------------------------------------------------------------
+  TauVertexFinder(const std::string& name);
+  ASG_TOOL_CLASS2(TauVertexFinder, TauRecToolBase, ITauToolBase);
+  ~TauVertexFinder();
 
-    //-------------------------------------------------------------
-    //! Algorithm functions
-    //-------------------------------------------------------------
-    virtual StatusCode initialize();
-    virtual StatusCode eventInitialize();
-    virtual StatusCode execute(xAOD::TauJet& pTau);
-    virtual StatusCode eventFinalize();
-    virtual StatusCode finalize();
+  //-------------------------------------------------------------
+  //! Algorithm functions
+  //-------------------------------------------------------------
+  virtual StatusCode initialize();
+  virtual StatusCode eventInitialize();
+  virtual StatusCode execute(xAOD::TauJet& pTau);
+  virtual StatusCode eventFinalize();
+  virtual StatusCode finalize();
 
-    virtual void cleanup(xAOD::TauJet* ) { }
-    virtual void print() const { }
+  virtual void cleanup(xAOD::TauJet* ) { }
+  virtual void print() const { }
 
-    ElementLink<xAOD::VertexContainer> getPV_TJVA(const xAOD::TauJet& tauJet, const xAOD::VertexContainer& vertices);
+  ElementLink<xAOD::VertexContainer> getPV_TJVA(const xAOD::TauJet& tauJet, const xAOD::VertexContainer& vertices);
 
 private:
-    float getJetVertexFraction(const xAOD::Vertex* vertex, const std::vector<const xAOD::TrackParticle*>& tracks, const jet::TrackVertexAssociation* tva) const;
+  float getJetVertexFraction(const xAOD::Vertex* vertex, const std::vector<const xAOD::TrackParticle*>& tracks, const jet::TrackVertexAssociation* tva) const;
         
-    //-------------------------------------------------------------
-    //! Convenience functions to handle storegate objects
-    //-------------------------------------------------------------
-    template <class T>
-    bool openContainer(T* &container, std::string containerName, bool printFATAL=false);
+  //-------------------------------------------------------------
+  //! Convenience functions to handle storegate objects
+  //-------------------------------------------------------------
+  template <class T>
+  bool openContainer(T* &container, std::string containerName, bool printFATAL=false);
 
-    template <class T>
-    bool retrieveTool(T &tool);
+  template <class T>
+  bool retrieveTool(T &tool);
 
 private:
-    bool m_printMissingContainerINFO;
-    float m_maxJVF;
+  bool m_printMissingContainerINFO;
+  float m_maxJVF;
+  ToolHandle< InDet::IInDetTrackSelectionTool > m_TrackSelectionToolForTJVA;
 
-    //-------------------------------------------------------------
-    //! Configureables
-    //-------------------------------------------------------------
-    bool m_useTJVA;
-    std::string m_inputPrimaryVertexContainerName;
-    std::string m_assocTracksName;
-    std::string m_trackVertexAssocName;    
+  //-------------------------------------------------------------
+  //! Configureables
+  //-------------------------------------------------------------
+  bool m_useTJVA;
+  std::string m_inputPrimaryVertexContainerName;
+  std::string m_assocTracksName;
+  std::string m_trackVertexAssocName;    
 };
 
 #endif // not TAUREC_TAUVERTEXFINDER_H
diff --git a/Reconstruction/tauRecTools/src/TauVertexVariables.cxx b/Reconstruction/tauRecTools/src/TauVertexVariables.cxx
index 5960a223fee0..07ae82fd651c 100644
--- a/Reconstruction/tauRecTools/src/TauVertexVariables.cxx
+++ b/Reconstruction/tauRecTools/src/TauVertexVariables.cxx
@@ -131,7 +131,7 @@ StatusCode TauVertexVariables::execute(xAOD::TauJet& pTau) {
 	    if (tauEventData()->hasObject("Beamspot")) scBeam = tauEventData()->getObject("Beamspot", vxcand);
 
 	    if(scBeam){
-	      myIPandSigma = m_trackToVertexIPEstimator->estimate(pTau.track(0), vxcand);
+	      myIPandSigma = m_trackToVertexIPEstimator->estimate(pTau.track(0)->track(), vxcand);
 	    } else {
 	      ATH_MSG_DEBUG("No Beamspot object in tau candidate");
 	    }
@@ -142,7 +142,7 @@ StatusCode TauVertexVariables::execute(xAOD::TauJet& pTau) {
 
 	    //check if vertex has a valid type (skip if vertex has type NoVtx)
 	    if (vxcand->vertexType() > 0){
-	      myIPandSigma = m_trackToVertexIPEstimator->estimate(pTau.track(0), vxcand);
+	      myIPandSigma = m_trackToVertexIPEstimator->estimate(pTau.track(0)->track(), vxcand);
 	    }
 
 	  }
@@ -204,10 +204,10 @@ StatusCode TauVertexVariables::execute(xAOD::TauJet& pTau) {
 	std::vector<const xAOD::TrackParticle*> xaodTracks;
 	std::vector<const Trk::Track*> origTracks;
 	for (unsigned i = 0; i < pTau.nTracks(); ++i) {
-		xaodTracks.push_back(pTau.track(i));
+                xaodTracks.push_back(pTau.track(i)->track());
 		ATH_MSG_VERBOSE("xAOD::TrackParticle " <<i<<": "<< pTau.track(i)->pt() << " "  << pTau.track(i)->eta()  << " "  << pTau.track(i)->phi());
 		if (pTau.track(i)->track()) {
-			origTracks.push_back(pTau.track(i)->track());
+		  origTracks.push_back(pTau.track(i)->track()->track());
 
 			// for debugging
 			/*
diff --git a/Reconstruction/tauRecTools/src/components/tauRecTools_entries.cxx b/Reconstruction/tauRecTools/src/components/tauRecTools_entries.cxx
index 7f25d5e6416d..a635f917a838 100644
--- a/Reconstruction/tauRecTools/src/components/tauRecTools_entries.cxx
+++ b/Reconstruction/tauRecTools/src/components/tauRecTools_entries.cxx
@@ -29,6 +29,7 @@
 #include "tauRecTools/TauBuilderTool.h"
 #include "tauRecTools/MvaTESEvaluator.h"
 #include "tauRecTools/MvaTESVariableDecorator.h"
+#include "tauRecTools/TauTrackClassifier.h"
 #include "tauRecTools/CombinedP4FromRecoTaus.h"
 
 
@@ -65,4 +66,6 @@ DECLARE_TOOL_FACTORY( TauProcessorTool             )
 DECLARE_TOOL_FACTORY( TauBuilderTool             )
 DECLARE_TOOL_FACTORY( MvaTESVariableDecorator )
 DECLARE_TOOL_FACTORY( MvaTESEvaluator )
+DECLARE_NAMESPACE_TOOL_FACTORY( tauRecTools, TauTrackClassifier  )
+DECLARE_NAMESPACE_TOOL_FACTORY( tauRecTools, TrackMVABDT         )
 DECLARE_TOOL_FACTORY( CombinedP4FromRecoTaus )
diff --git a/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h b/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
index 2125058976c2..953f17d1b1f2 100644
--- a/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
+++ b/Reconstruction/tauRecTools/tauRecTools/ITauToolBase.h
@@ -51,8 +51,8 @@ class ITauToolBase : virtual public asg::IAsgTool
 
   virtual void setTauEventData(TauEventData* data) = 0;
 
-  //make virtual
-  virtual StatusCode readConfig() {return StatusCode::SUCCESS; }
+  //make pure
+  virtual StatusCode readConfig() = 0;
 
 };
 
diff --git a/Reconstruction/tauRecTools/tauRecTools/MvaTESVariableDecorator.h b/Reconstruction/tauRecTools/tauRecTools/MvaTESVariableDecorator.h
index 980d2bb90848..94eab92a82f3 100644
--- a/Reconstruction/tauRecTools/tauRecTools/MvaTESVariableDecorator.h
+++ b/Reconstruction/tauRecTools/tauRecTools/MvaTESVariableDecorator.h
@@ -30,6 +30,8 @@ class MvaTESVariableDecorator
   const xAOD::VertexContainer* m_xVertexContainer; //!
   int m_mu; //!
   int m_nVtx; //!
+  
+  
 };
 
 
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauBuilderTool.h b/Reconstruction/tauRecTools/tauRecTools/TauBuilderTool.h
index c8776c84da2a..73229c053429 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauBuilderTool.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauBuilderTool.h
@@ -32,6 +32,8 @@ class TauBuilderTool : public asg::AsgTool, virtual public ITauToolExecBase {
  private:
   std :: string                 m_tauContainerName;             //!< tau output container
   std :: string                 m_tauAuxContainerName;             //!< tau output aux store container
+  std::string m_tauTrackContainerName;
+  std::string m_tauTrackAuxContainerName;
   std::string m_seedContainerName;            //!< seed input container
   double m_maxEta; //!< only build taus with eta_seed < m_maxeta
   double m_minPt;  //!< only build taus with pt_seed > m_minpt
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauCalibrateLC.h b/Reconstruction/tauRecTools/tauRecTools/TauCalibrateLC.h
index 5c76e9702eff..0599d63f1fb7 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauCalibrateLC.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauCalibrateLC.h
@@ -25,8 +25,7 @@ public:
 
   ASG_TOOL_CLASS2( TauCalibrateLC, TauRecToolBase, ITauToolBase )
 
-  TauCalibrateLC(const std::string& type);
-  TauCalibrateLC();
+  TauCalibrateLC(const std::string& name="TauCalibrateLC");
     ~TauCalibrateLC();
 
     virtual StatusCode initialize();
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauProcessorTool.h b/Reconstruction/tauRecTools/tauRecTools/TauProcessorTool.h
index 5b4ec84d8e47..adfe60f6b6a5 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauProcessorTool.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauProcessorTool.h
@@ -41,6 +41,7 @@ class TauProcessorTool : public asg::AsgTool, virtual public ITauToolExecBase {
   bool                          m_deep_copy_hadronicPFOContainer;
   bool                          m_deep_copy_neutralPFOContainer;
   bool                          m_deep_copy_SecVtxContainer;
+  bool                          m_deep_copy_TauTrackContainer;
   TauEventData m_data;
   ToolHandleArray<ITauToolBase>  m_tools;
 
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h b/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h
new file mode 100644
index 000000000000..e87aaaea93e3
--- /dev/null
+++ b/Reconstruction/tauRecTools/tauRecTools/TauTrackClassifier.h
@@ -0,0 +1,159 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TAUREC_TAUTRACKCLASSIFIER_H
+#define TAUREC_TAUTRACKCLASSIFIER_H
+
+// ASG include(s)
+#include "AsgTools/AsgTool.h"
+#include "AsgTools/ToolHandleArray.h"
+
+// xAOD include(s)
+#include "xAODTau/TauJet.h"
+#include "xAODTau/TauTrack.h"
+
+// local include(s)
+#include "tauRecTools/TauRecToolBase.h"
+
+// ROOT include(s)
+#include "TMVA/Reader.h"
+
+/**
+ * @brief Implementation of a TrackClassifier based on an MVA 
+ * 
+ * @author Dirk Duschinger
+ *                                                                              
+ */
+
+namespace tauRecTools
+{
+  
+class TrackMVABDT;
+  
+//______________________________________________________________________________
+class TauTrackClassifier
+  : virtual public TauRecToolBase
+{
+public:
+
+  ASG_TOOL_CLASS2( TauTrackClassifier, TauRecToolBase, ITauToolBase )
+
+  TauTrackClassifier(const std::string& sName="TauTrackClassifier");
+  ~TauTrackClassifier();
+
+  // retrieve all track classifier sub tools
+  virtual StatusCode initialize();
+  // pass all tracks in the tau cone to all track classifier sub tools
+  virtual StatusCode execute(xAOD::TauJet& pTau);
+
+private:
+  ToolHandleArray<TrackMVABDT> m_vClassifier;
+  std::string m_tauTrackConName;
+
+}; // class TauTrackClassifier
+  
+//______________________________________________________________________________
+class TrackMVABDT
+  : public TauRecToolBase
+{
+  /// Create a proper constructor for Athena
+  ASG_TOOL_CLASS2( TrackMVABDT,
+                   TauRecToolBase,
+		   ITauToolBase)
+  
+  public:
+  
+  TrackMVABDT(const std::string& sName);
+  ~TrackMVABDT();
+
+  // configure the TMVA reader object and build a general map to store variables
+  // for possible TMVA inputs. Only Variables defined in the xml weights file
+  // are passed to the TMVA reader
+  StatusCode initialize();
+  
+  // executes TMVA reader to get the BDT score, makes the decision and resets
+  // classification flags
+  StatusCode classifyTrack(xAOD::TauTrack& xTrack, const xAOD::TauJet& xTau);
+  // set BDT input variables in the corresponding map entries
+  void setVars(const xAOD::TauTrack& xTrack, const xAOD::TauJet& xTau);
+
+  // load the xml weights file and configure the TMVA reader with the correct
+  // variable addresses
+  StatusCode addWeightsFile();
+  // parse the weights file for the line showing the input variable used by that
+  // particular BDT names and store them
+  StatusCode parseVariableContent();
+  
+private:
+  // configurable variables
+  std::string m_sInputWeightsPath; 
+  float m_fThreshold;
+  int m_iSignalType;
+  int m_iBackgroundType;
+  int m_iExpectedFlag;
+  
+private:
+  TMVA::Reader* m_rReader; //!
+
+  std::map<int, std::string> m_mParsedVarsBDT; //!
+  std::map<std::string, float> m_mAvailableVars; //!
+
+  // possible bdt input variables
+  float tauPt;
+  float tauEta;
+  float trackEta;
+  float z0sinThetaTJVA;
+  float rConv;
+  float rConvII;
+  float DRJetSeedAxis;
+  float d0;
+  float qOverP;
+  float theta;
+  float numberOfInnermostPixelLayerHits;
+  float numberOfPixelHits;
+  float numberOfPixelDeadSensors;
+  float numberOfPixelSharedHits;
+  float numberOfSCTHits;
+  float numberOfSCTDeadSensors;
+  float numberOfSCTSharedHits;
+  float numberOfTRTHighThresholdHits;
+  float numberOfTRTHits;
+  float nPixHits;
+  float nSiHits;
+  
+}; // class TrackMVABDT
+
+
+ xAOD::TauTrack::TrackFlagType isolateClassifiedBits(xAOD::TauTrack::TrackFlagType flag){
+   static int flagsize=sizeof(flag)*8;
+   flag=flag<<(flagsize-xAOD::TauJetParameters::classifiedFake-1);
+   flag=flag>>(flagsize-xAOD::TauJetParameters::classifiedCharged+1);
+   return flag;
+ }
+
+//bool sortTracks(xAOD::TauTrack* xTrack1, xAOD::TauTrack* xTrack2)
+ bool sortTracks(const ElementLink<xAOD::TauTrackContainer> &l1, const ElementLink<xAOD::TauTrackContainer> &l2)
+{
+  //should we be safe and ask if the links are available?
+  const xAOD::TauTrack* xTrack1 = *l1;
+  const xAOD::TauTrack* xTrack2 = *l2;
+
+  //return classified charged, then isolation (wide tracks), else by pt
+  xAOD::TauTrack::TrackFlagType f1 = isolateClassifiedBits(xTrack1->flagSet());
+  xAOD::TauTrack::TrackFlagType f2 = isolateClassifiedBits(xTrack2->flagSet());
+
+  if(f1==f2)
+    return xTrack1->pt()>xTrack2->pt();
+  return f1<f2;
+  
+  //this somehow causes a crash
+  /* static uint16_t flag1 = xTrack1->flagSet() >> (xAOD::TauJetParameters::classifiedCharged - 1); */
+  /* static uint16_t flag2 = xTrack2->flagSet() >> (uint16_t(xAOD::TauJetParameters::classifiedCharged) - 1); */
+  /* return (flag1<flag2) ||                            // sort by type, true tracks first */
+  /*   ((flag1==flag2) && (xTrack1->pt()>xTrack2->pt())); // sort by pt if equal types */
+}
+
+} // namespace tauRecTools
+
+#endif // not TAUTRACKCLASSIFIER
diff --git a/Reconstruction/tauRecTools/tauRecTools/TauTrackFilter.h b/Reconstruction/tauRecTools/tauRecTools/TauTrackFilter.h
index 907309a8e8f7..a7d39dda7ee7 100644
--- a/Reconstruction/tauRecTools/tauRecTools/TauTrackFilter.h
+++ b/Reconstruction/tauRecTools/tauRecTools/TauTrackFilter.h
@@ -40,6 +40,7 @@ public:
 private:
     std::string m_configPath;
     std::string m_trackContainerName;
+    std::string m_tauTrackConName;
     std::vector<bool> m_TrkPass;
     int m_nProng;
     int m_flag;
-- 
GitLab