15#include "GaudiKernel/ITHistSvc.h"
16#include "GaudiKernel/ConcurrencyFlags.h"
31 const std::string& name,
32 const IInterface* parent):
50 declareInterface< IVrtInclusive >(
this);
90 if (Gaudi::Concurrency::ConcurrencyFlags::numThreads() > 1) {
91 ATH_MSG_FATAL(
"Filling histograms not supported in MT jobs.");
92 return StatusCode::FAILURE;
95 SmartIF<ITHistSvc> hist_root{service(
"THistSvc")};
96 if( !hist_root )
ATH_MSG_DEBUG(
"Could not find THistSvc service");
97 else ATH_MSG_DEBUG(
"NewVrtSecInclusiveTool Histograms found");
101 m_h = std::make_unique<Hists>();
108 return StatusCode::SUCCESS;
114 const std::string& histDir)
116 m_hb_massPiPi =
new TH1D(
"massPiPi",
" mass PiPi",200,0., 4000.);
117 m_hb_massPiPi1 =
new TH1D(
"massPiPi1",
" mass PiPi",200,0., 4000.);
118 m_hb_massPPi =
new TH1D(
"massPPi",
" massPPi", 100,1000., 1250.);
119 m_hb_massEE =
new TH1D(
"massEE",
" massEE", 100,0., 200.);
120 m_hb_nvrt2 =
new TH1D(
"nvrt2",
" vertices2", 50,0., 50.);
121 m_hb_ratio =
new TH1D(
"ratio",
" ratio", 51,0., 1.02);
122 m_hb_totmass =
new TH1D(
"totmass",
" totmass", 250,0., 10000.);
123 m_hb_impact =
new TH1D(
"impact",
" impact", 100,0., 20.);
124 m_hb_impactR =
new TH1D(
"impactR",
" impactR", 400,-30., 70.);
125 m_hb_impactZ =
new TH1D(
"impactZ",
" impactZ", 100,-30., 70.);
126 m_hb_impactRZ =
new TH2D(
"impactRZ",
" impactRZ", 40,-10., 10., 60, -30.,30. );
127 m_hb_trkD0 =
new TH1D(
"trkD0",
" d0 of tracks", 100, 0., 10.);
128 m_hb_trkZ =
new TH1D(
"trkZ",
" Z of tracks", 120,-60., 60.);
129 m_hb_r2d =
new TH1D(
"r2interact",
"Interaction radius 2tr selected", 150,0., 150.);
130 m_hb_ntrksel =
new TH1F(
"NTrkSel",
"Number of selected tracks", 200,0., 200.);
131 m_hb_ntrkInput =
new TH1F(
"NTrkInput",
"Number of provided tracks", 200,0., 1000.);
132 m_hb_trkSelect =
new TH1F(
"TrkSelect",
"Track selection efficiency", 15,0., 15.);
133 m_hb_signif3D =
new TH1D(
"signif3D",
" Signif3D for initial 2tr vertex", 140,-20., 50.);
134 m_hb_sig3DTot =
new TH1D(
"sig3dcommon",
" Signif3D for common vertex", 140,-20., 50.);
135 m_hb_sig3D1tr =
new TH1D(
"sig3D1tr",
"Signif3D for 1tr vertices", 140,-20., 50.);
136 m_hb_sig3D2tr =
new TH1D(
"sig3D2tr",
"Signif3D for 2tr single vertex", 140,-20., 50.);
137 m_hb_sig3DNtr =
new TH1D(
"sig3DNtr",
"Signif3D for many-tr single vertex", 140,-20., 50.);
138 m_hb_goodvrtN =
new TH1F(
"goodvrtN",
"Number of good vertices", 20,0., 20.);
139 m_hb_goodvrt1N =
new TH1F(
"goodvrt1N",
"Number of good 1-track vertices", 20,0., 20.);
140 m_hb_distVV =
new TH1D(
"distvv",
"Vertex-Vertex dist", 100,0., 20.);
141 m_hb_diffPS =
new TH1D(
"diffPS",
"Primary-Secondary assoc", 200,-20., 20.);
142 m_hb_rawVrtN =
new TH1F(
"rawVrtN",
"Number of raw vertices multivertex case", 20, 0., 20.);
143 m_hb_cosSVMom =
new TH1F(
"cosSVMom",
"SV-PV vs SV momentum ", 100, 0., 1.);
144 m_hb_etaSV =
new TH1F(
"etaSV",
" Eta of SV-PV ", 100, -5., 5.);
145 m_hb_fakeSVBDT =
new TH1F(
"fakeSVBDT",
" BDT for fake SV rejection", 100, -1., 1.);
178 m_tuple =
new TTree(
"Vertices",
"Vertices");
189 m_tuple->Branch(
"displaced", &
m_curTup->displaced,
"displaced[ntrk]/I");
194 m_tuple->Branch(
"VrtDist2D", &
m_curTup->VrtDist2D,
"VrtDist2D[n2Vrt]/F");
203 m_tuple->Branch(
"VrtCosSPM", &
m_curTup->VrtCosSPM,
"VrtCosSPM[n2Vrt]/F");
213 m_tuple->Branch(
"VrtTrueBar", &
m_curTup->VrtTrueBar,
"VrtTrueBar[n2Vrt]/I");
214 m_tuple->Branch(
"VrtTrueNear",&
m_curTup->VrtTrueNear,
"VrtTrueNear[n2Vrt]/I");
222 m_tuple->Branch(
"NVrtTrkHF", &
m_curTup->NVrtTrkHF,
"NVrtTrkHF[nNVrt]/I");
225 m_tuple->Branch(
"NVrtDist2D", &
m_curTup->NVrtDist2D,
"NVrtDist2D[nNVrt]/F");
226 m_tuple->Branch(
"NVrtSig3D", &
m_curTup->NVrtSig3D,
"NVrtSig3D[nNVrt]/F");
227 m_tuple->Branch(
"NVrtSig2D", &
m_curTup->NVrtSig2D,
"NVrtSig2D[nNVrt]/F");
233 m_tuple->Branch(
"NVrtCosSPM", &
m_curTup->NVrtCosSPM,
"NVrtCosSPM[nNVrt]/F");
235 m_tuple->Branch(
"NVMinS3DT", &
m_curTup->NVMinS3DT,
"NVMinS3DT[nNVrt]/F");
241 return StatusCode::SUCCESS;
248 return StatusCode::SUCCESS;
254 const std::vector<const xAOD::TrackParticle*> & inpTrk,
257 std::vector<xAOD::Vertex*> listVrtSec(0);
267 tmpVectxAOD->
inpTrk.resize(inpTrk.size());
268 std::copy(inpTrk.begin(),inpTrk.end(), tmpVectxAOD->
inpTrk.begin());
270 tmpVectxAOD->
beamX=beamSpotHandle->beamPos().x();
271 tmpVectxAOD->
beamY=beamSpotHandle->beamPos().y();
272 tmpVectxAOD->
beamZ=beamSpotHandle->beamPos().z();
273 tmpVectxAOD->
tanBeamTiltX=tan(beamSpotHandle->beamTilt(0));
274 tmpVectxAOD->
tanBeamTiltY=tan(beamSpotHandle->beamTilt(1));
277 listVrtSec =
getVrtSecMulti(tmpVectxAOD,primVrt,compatibilityGraph);
286 for (
const auto &vrt : listVrtSec) {
287 for (
const auto &trk : vrt->trackParticleLinks()) {
293 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << (*trk)->index() <<
": Get the perigee of the track at the vertex." );
294 auto sv_perigee =
m_trackToVertexTool->perigeeAtVertex(Gaudi::Hive::currentContext(), **trk, vrt->position() );
296 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": > Track index " << (*trk)->index() <<
": Failed in obtaining the SV perigee!" );
299 float qOverP_wrtSV = sv_perigee ? sv_perigee->parameters() [
Trk::qOverP] : -FLT_MAX;
300 float theta_wrtSV = sv_perigee ? sv_perigee->parameters() [
Trk::theta] : -FLT_MAX;
301 float p_wrtSV = sv_perigee ? 1.0 / std::abs( qOverP_wrtSV ) : -FLT_MAX;
302 float pt_wrtSV = sv_perigee ? p_wrtSV * sin( theta_wrtSV ) : -FLT_MAX;
303 float eta_wrtSV = sv_perigee ? -log( tan( theta_wrtSV/2. ) ) : -FLT_MAX;
304 float phi_wrtSV = sv_perigee ? sv_perigee->parameters() [
Trk::phi] : -FLT_MAX;
305 float d0_wrtSV = sv_perigee ? sv_perigee->parameters() [
Trk::d0] : -FLT_MAX;
306 float z0_wrtSV = sv_perigee ? sv_perigee->parameters() [
Trk::z0] : -FLT_MAX;
307 float errd0_wrtSV = sv_perigee ? std::sqrt((*sv_perigee->covariance())(
Trk::d0,
Trk::d0 )) : -FLT_MAX;
308 float errz0_wrtSV = sv_perigee ? std::sqrt((*sv_perigee->covariance())(
Trk::z0,
Trk::z0 )) : -FLT_MAX;
309 float errP_wrtSV = sv_perigee ? std::sqrt((*sv_perigee->covariance())(
Trk::qOverP,
Trk::qOverP )) : -FLT_MAX;
322 std::unique_ptr<Trk::VxSecVertexInfo>
res = std::make_unique<Trk::VxSecVertexInfo>(
Trk::VxSecVertexInfo(listVrtSec));
340 std::vector<const SG::AuxVectorData*> containers;
341 containers.reserve (16);
345 if (c && std::find (containers.begin(), containers.end(), c) == containers.end())
347 containers.push_back (c);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
Header file for AthHistogramAlgorithm.
SG::Decorator< T, ALLOC > Decorator
Manage lookup of vectors of auxiliary data.
void lockDecoration(SG::auxid_t auxid)
Explicitly lock a decoration.
constexpr double lambdaMassInMeV
the mass of the lambda baryon (in MeV)
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
@ GaussianSumFilter
Tracks from Gaussian Sum Filter.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
std::vector< const xAOD::TrackParticle * > listSelTracks
std::vector< const xAOD::TrackParticle * > inpTrk