ATLAS Offline Software
Loading...
Searching...
No Matches
IDPerfMonKshort.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5// **********************************************************************
6// IDPerfMonKshort.cxx
7// AUTHORS: Jed Biesiada, Tobias Golling, Beate Heinemann
8// **********************************************************************
9
10#include <cmath>
11#include <vector>
12#include <algorithm>
13
14#include "TH1.h"
15#include "TProfile.h"
16#include "TGraphErrors.h"
17#include "TF1.h"
18#include "TMath.h"
19#include "TRandom.h"
20
21
22#include "GaudiKernel/SystemOfUnits.h"
23#include "GaudiKernel/PhysicalConstants.h"
24
27
28#include "xAODTracking/Vertex.h"
30
33
38#include "CLHEP/Vector/LorentzVector.h"
39// ATLAS headers
40#include "GaudiKernel/IInterface.h"
42
45
46
47namespace{ //utility functions
48 //fill a container with a sequence of values
49 template <typename ForwardIterator, typename T>
50 void
51 sequentialFill(ForwardIterator beg, const ForwardIterator stop, T value, const T inc){
52 while (beg!=stop){
53 *beg++ = value;
54 value +=inc;
55 };
56 return;
57 }
58
59 //find index in sorted array where the given value lies just above the indexed value
60 template <typename Iterator, typename T, typename Compare=std::less<T>>
61 long
62 findLevel(const Iterator beg, const Iterator stop, T value, Compare op=std::less<T>()){
63 auto place = std::lower_bound(beg, stop, value, op);
64 return std::distance(beg, place );
65 }
66 //in range?
67 template <typename T>
68 bool
69 inRange(const T &v, const T &lo, const T &hi){
70 return (v >= lo) and (v<=hi);
71 }
72
73}
74
75// *********************************************************************
76// Public Methods
77// *********************************************************************
78
79
80
81IDPerfMonKshort::IDPerfMonKshort( const std::string & type, const std::string & name, const IInterface* parent )
82 :ManagedMonitorToolBase( type, name, parent ),
83 m_triggerChainName("NoTriggerSelection")
84
85{
86 declareProperty("tracksName",m_tracksName);
87 declareProperty("CheckRate",m_checkrate=1000);
88 declareProperty("triggerChainName",m_triggerChainName);
89 declareProperty("VxContainerName",m_VxContainerName="V0UnconstrVertices");
90 declareProperty("VxPrimContainerName",m_VxPrimContainerName="PrimaryVertices");
91}
92
94
95
97{
98 ATH_MSG_DEBUG( "IDPerfMonKshort initialize() started");
100 if (m_tracksName.empty()) ATH_MSG_ERROR( " no track collection given");
101 StatusCode sc;
103 ATH_MSG_DEBUG( "IDPerfMonKshort initialize() finished");
104 return StatusCode::SUCCESS;
105}
106
107
109{
110 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "IDPerfMonKshort bookHistograms() started"<< endmsg;
111 MonGroup al_kshort_mon ( this, "IDPerfMon/Kshort/" + m_triggerChainName, run);
112
113
114 //ASK CONFIRMATION for ATTRIB_MANAGED
115 MonGroup al_kshort_mon_average(this, "IDPerfMon/Kshort/" + m_triggerChainName,run,ATTRIB_MANAGED,"","weightedAverage");
116
117
119 // book histograms that are only made in the online environment...
120 }
121
123 // book histograms that are only relevant for cosmics data...
124 }
125
126
127
128
129
130 if( newRunFlag() ) {
131
132 //if user environment specified we don't want to book new histograms at every run boundary
133 //we instead want one histogram per job
134 if(m_histosBooked!=0 && AthenaMonManager::environment()==AthenaMonManager::user) return StatusCode::SUCCESS;
135
136 Double_t ptBins[m_nFittedBinsPt] = {1.05,1.85,2.45,3.35,4.5};
137 Double_t radiusBins[m_nFittedBinsRadius] = {15.,35.,50.,70.,90.,120.,185.};
138 Double_t phiBins[10]{};
139 Double_t etaBins[10]{};
140 Double_t curvatureDiffBins[6]{};
141 sequentialFill(phiBins, std::end(phiBins), (-4.5*M_PI/5.), (M_PI/5.));
142 sequentialFill(etaBins, std::end(etaBins),-2.25, 0.5);
143 sequentialFill(curvatureDiffBins, std::end(curvatureDiffBins), -0.001,0.0004);
144 m_mass = new TH1F("ks_mass", "Invariant mass of K^{0}_{S} candidate", 60, 0.45, 0.55);
145 m_mass->SetYTitle("K^{0}_{S} Candidates");
146 m_mass->SetXTitle("Mass (Gev / c^{2})");
147 m_mass->SetMarkerStyle(20);
148 m_mass->SetMinimum(0.);
149 RegisterHisto(al_kshort_mon,m_mass) ;
150 m_mass_scaled = new TH1F("ks_mass_scaled", "Invariant mass of K^{0}_{S} candidate scaled to per event", 60, 0.45, 0.55);
151 m_mass_scaled->SetYTitle("K^{0}_{S} Candidates");
152 m_mass_scaled->SetXTitle("Mass (Gev / c^{2})");
153 m_mass_scaled->SetMarkerStyle(20);
154 m_mass_scaled->SetMinimum(0.);
155 RegisterHisto(al_kshort_mon,m_mass_scaled) ;
156
157 m_massVsPhi = new TH2F("ks_massVsPhi", "Invariant mass - world average of K^{0}_{S} candidate", 10, (-1.0* M_PI), M_PI, 50, -.5, .5);
158 m_massVsPhi->SetXTitle("#phi");
159 m_massVsPhi->SetYTitle("Mass (Gev / c^{2}) - World Average [MeV]");
160 RegisterHisto(al_kshort_mon,m_massVsPhi) ;
161
162 m_pt = new TH1F("ks_pt", "p_{T} of K^{0}_{S} candidate", 100, 0., 10.);
163 m_pt->SetYTitle("K^{0}_{S} Candidates");
164 m_pt->SetXTitle("p_{T} (Gev / c)");
165 m_pt->SetMarkerStyle(20);
166 RegisterHisto(al_kshort_mon,m_pt) ;
167
168 m_radiusVsZ_secVertex = new TH2F("secVertex_radiusVsZ", "all sec.vertices (reco);z [mm];Decay radius [mm]",180, -600., 600.,180.,0.,180.);
169 RegisterHisto(al_kshort_mon,m_radiusVsZ_secVertex) ;
170
171 m_YVsX_secVertex = new TH2F("secVertex_YVsX", "all sec. vertices (reco);x [mm];y [mm]",200, -150.,150., 200, -150., 150.);
172 RegisterHisto(al_kshort_mon,m_YVsX_secVertex) ;
173
174 m_radiusVsZ_secVertex_sel = new TH2F("secVertex_radiusVsZ_sel", "all sec.vertices (reco);z [mm];Decay radius [mm]",180, -600., 600.,180.,0.,180.);
176
177 m_YVsX_secVertex_sel = new TH2F("secVertex_YVsX_sel", "all sec. vertices (reco);x [mm];y [mm]",200, -150.,150., 200, -150., 150.);
178 RegisterHisto(al_kshort_mon,m_YVsX_secVertex_sel) ;
179
180 m_radiusVsZ_secVertex_Ks = new TH2F("secVertex_radiusVsZ_Ks", "sec.vertices (reco) of K^{0}_{S} candidates;z [mm];Decay radius [mm]",180, -600., 600.,180.,0.,180.);
182
183 m_YVsX_secVertex_Ks = new TH2F("secVertex_YVsX_Ks", "sec. vertices (reco) of K^{0}_{S} candidates;x [mm];y [mm]",200, -150.,150., 200, -150., 150.);
184 RegisterHisto(al_kshort_mon,m_YVsX_secVertex_Ks) ;
185
186 m_radius_secVertices = new TH1F("radius_secVertices", "Decay radius of secondary vertices", 600, 0., 300.);
187 RegisterHisto(al_kshort_mon,m_radius_secVertices) ;
188
189 m_radius_secVertices_sel = new TH1F("radius_secVertices_sel", "Decay radius of secondary vertices", 600, 0., 300.);
191
192 m_YVsX_primVertex = new TH2F("primVertex_YVsX", "all primary vertices (reco);PV x [mm];PV y [mm]",300, -1.5,1.5, 300, -1.5, 1.5);
193 RegisterHisto(al_kshort_mon,m_YVsX_primVertex) ;
194
195 m_XVsZ_primVertex = new TH2F("primVertex_XVsZ", "all primary vertices (reco);PV z [mm];PV x [mm]",200, -350.,350, 300, -1.5, 1.5);
196 RegisterHisto(al_kshort_mon,m_XVsZ_primVertex) ;
197
198 m_YVsZ_primVertex = new TH2F("primVertex_YVsZ", "all primary vertices (reco);PV z [mm];PV y [mm]",200, -350.,350., 100, -1.5, 1.5);
199 RegisterHisto(al_kshort_mon,m_YVsZ_primVertex) ;
200
201 m_YVsX_primVertex_Ks = new TH2F("primVertex_YVsX_Ks", "all primary vertices (reco);PV x [mm];PV y [mm]",300, -1.5,1.5, 300, -1.5, 1.5);
202 RegisterHisto(al_kshort_mon,m_YVsX_primVertex_Ks) ;
203
204 m_XVsZ_primVertex_Ks = new TH2F("primVertex_XVsZ_Ks", "all primary vertices (reco);PV z [mm];PV x [mm]",200, -350.,350, 300, -1.5, 1.5);
205 RegisterHisto(al_kshort_mon,m_XVsZ_primVertex_Ks) ;
206
207 m_YVsZ_primVertex_Ks = new TH2F("primVertex_YVsZ_Ks", "all primary vertices (reco);PV z [mm];PV y [mm]",200, -350.,350., 100, -1.5, 1.5);
208 RegisterHisto(al_kshort_mon,m_YVsZ_primVertex_Ks) ;
209
210 m_radius = new TH1F("ks_radius", "Decay radius of K^{0}_{S} candidate", 100, 0., 300.);
211 m_radius->SetYTitle("K^{0}_{S} Candidates");
212 m_radius->SetXTitle("Decay Radius (mm)");
213 m_radius->SetMarkerStyle(20);
214 RegisterHisto(al_kshort_mon,m_radius) ;
215
216
217 m_eta = new TH1F("ks_eta", "#eta of K^{0}_{S} candidate", 10, -2.5, 2.5);
218 m_eta->SetYTitle("K^{0}_{S} Candidates");
219 m_eta->SetXTitle("#eta");
220 m_eta->SetMarkerStyle(20);
221 RegisterHisto(al_kshort_mon,m_eta) ;
222 m_phi = new TH1F("ks_phi", "#phi of K^{0}_{S} candidate", 10, (-1.0* M_PI), M_PI);
223 m_phi->SetYTitle("K^{0}_{S} Candidates");
224 m_phi->SetXTitle("#phi");
225 m_phi->SetMarkerStyle(20);
226 RegisterHisto(al_kshort_mon,m_phi) ;
227 //
228 //lamda for use below
229 auto quickSet=[](TH1F * h){
230 h->SetXTitle("Mass (Gev / c^{2})");
231 h->SetYTitle("K^{0}_{S} Candidates");
232 h->SetMarkerStyle(20);
233 h->SetMinimum(0.);
234 };
235 //
236 for(int quickInit=0;quickInit<m_nBinsPt;quickInit++) {
237 TString tempName = "MassVptBin";
238 TString tempTitle = "Mass, p_{T} = ";
239 tempName += quickInit;
240 tempTitle += ((Double_t)((quickInit*100)+500))/1000;
241 tempTitle += " GeV";
242 m_massVPtBinHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
243 quickSet(m_massVPtBinHistos[quickInit]);
244
245 RegisterHisto(al_kshort_mon,m_massVPtBinHistos[quickInit]) ;
246 }
247 for(int quickInit=0;quickInit<m_nFittedBinsPt;quickInit++) {
248 TString tempName = "MassVptBinFitted";
249 TString tempTitle = "Fitted Mass, p_{T} = ";
250 tempName += quickInit;
251 tempTitle += ptBins[quickInit];
252 tempTitle += " GeV";
253 m_massVPtBinFittedHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
254 quickSet(m_massVPtBinFittedHistos[quickInit]);
255 RegisterHisto(al_kshort_mon,m_massVPtBinFittedHistos[quickInit]) ;
256 }
257 for(int quickInit=0;quickInit<m_nBinsRadius;quickInit++) {
258 TString tempName = "MassVradiusBin";
259 TString tempTitle = "Mass, Decay Radius = ";
260 tempName += quickInit;
261 tempTitle += quickInit*10;
262 tempTitle += " mm";
263 m_massVRadiusBinHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
264 quickSet(m_massVRadiusBinHistos[quickInit]);
265 RegisterHisto(al_kshort_mon,m_massVRadiusBinHistos[quickInit]) ;
266 }
267 for(int quickInit=0;quickInit<m_nFittedBinsRadius;quickInit++) {
268 TString tempName = "MassVradiusBinFitted";
269 TString tempTitle = "Fitted Mass, Decay Radius = ";
270 tempName += quickInit;
271 tempTitle += radiusBins[quickInit];
272 tempTitle += " mm";
273 m_massVRadiusBinFittedHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
274 quickSet(m_massVRadiusBinFittedHistos[quickInit]);
275 RegisterHisto(al_kshort_mon,m_massVRadiusBinFittedHistos[quickInit]) ;
276 }
277 for(int quickInit=0;quickInit<10;quickInit++) {
278 TString tempName = "MassVEtaBin";
279 TString tempTitle = "Mass, #eta = ";
280 tempName += quickInit;
281 tempTitle += etaBins[quickInit];
282 m_massVEtaBinHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
283 quickSet(m_massVEtaBinHistos[quickInit]) ;
284 RegisterHisto(al_kshort_mon,m_massVEtaBinHistos[quickInit]) ;
285
286 tempName = "MassVPhiBin";
287 tempTitle = "Mass, #phi = ";
288 tempName += quickInit;
289 tempTitle += ((Double_t)((Int_t)(phiBins[quickInit]*100)))/100;
290 m_massVPhiBinHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
291 quickSet(m_massVPhiBinHistos[quickInit]);
292 RegisterHisto(al_kshort_mon,m_massVPhiBinHistos[quickInit]) ;
293 }
294
295 for(int quickInit=0;quickInit<6;quickInit++) {
296 TString tempName = "MassVCurvatureDiffBin";
297 TString tempTitle = "Mass, CurvatureDiff = ";
298 tempName += quickInit;
299 tempTitle += curvatureDiffBins[quickInit];
300 m_massVCurvatureDiffBinHistos[quickInit] = new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
301 quickSet(m_massVCurvatureDiffBinHistos[quickInit]);
302 RegisterHisto(al_kshort_mon,m_massVCurvatureDiffBinHistos[quickInit]) ;
303 }
304
305 m_massVersusPt_merged = new TH1F("KsMassVersusPt_Merged","Dummy TH1F Before Merging",10,-1,1);
306 m_widthVersusPt_merged = new TH1F("KsWidthVersusPt_Merged","Dummy TH1F Before Merging",10,-1,1);
307 m_massVersusRadius_merged = new TH1F("KsMassVersusRadius_Merged","Dummy TH1F Before Merging",10,-1,1);
308 m_widthVersusRadius_merged = new TH1F("KsWidthVersusRadius_Merged","Dummy TH1F Before Merging",10,-1,1);
309 m_massVersusEta_merged = new TH1F("KsMassVersusEta_Merged","Dummy TH1F Before Merging",10,-1,1);
310 m_widthVersusEta_merged = new TH1F("KsWidthVersusEta_Merged","Dummy TH1F Before Merging",10,-1,1);
311 m_massVersusPhi_merged = new TH1F("KsMassVersusPhi_Merged","Dummy TH1F Before Merging",10,-1,1);
312 m_widthVersusPhi_merged = new TH1F("KsWidthVersusPhi_Merged","Dummy TH1F Before Merging",10,-1,1);
313 m_massVersusCurvatureDiff_merged = new TH1F("KsMassVersusCurvatureDiff_Merged","Dummy TH1F Before Merging",10,-1,1);
314 m_widthVersusCurvatureDiff_merged = new TH1F("KsWidthVersusCurvatureDiff_Merged","Dummy TH1F Before Merging",10,-1,1);
315
316 RegisterHisto(al_kshort_mon_average,m_massVersusPt_merged) ;
317 RegisterHisto(al_kshort_mon_average,m_widthVersusPt_merged) ;
318 RegisterHisto(al_kshort_mon_average,m_massVersusRadius_merged) ;
319 RegisterHisto(al_kshort_mon_average,m_widthVersusRadius_merged) ;
320 RegisterHisto(al_kshort_mon_average,m_massVersusEta_merged) ;
321 RegisterHisto(al_kshort_mon_average,m_widthVersusEta_merged) ;
322 RegisterHisto(al_kshort_mon_average,m_massVersusPhi_merged) ;
323 RegisterHisto(al_kshort_mon_average,m_widthVersusPhi_merged) ;
324 RegisterHisto(al_kshort_mon_average,m_massVersusCurvatureDiff_merged) ;
325 RegisterHisto(al_kshort_mon_average,m_widthVersusCurvatureDiff_merged) ;
326
327 m_Nevents = new TH1F("Nevents","Number of events processed",1,-.5,.5);
328 RegisterHisto(al_kshort_mon,m_Nevents);
329
330 ATH_MSG_DEBUG( "IDPerfMonKshort bookHistograms done");
331
333
334 }
335
336
337
338 return StatusCode::SUCCESS;
339}
340
342 ATH_MSG_VERBOSE( "IDPerfMonKshort RegisterHisto() started");
343 histo->Sumw2();
344 StatusCode sc = mon.regHist(histo);
345 if (sc.isFailure() ) {
346 ATH_MSG_ERROR( "Cannot book TH1 Histogram:" );
347 }
348}
349
350void IDPerfMonKshort::RegisterHisto(MonGroup& mon, TProfile* histo) {
351 ATH_MSG_VERBOSE( "IDPerfMonKshort RegisterHisto() started");
352 StatusCode sc = mon.regHist(histo);
353 if (sc.isFailure() ) {
354 ATH_MSG_ERROR( "Cannot book TProfile Histogram:" );
355 }
356}
357
358void IDPerfMonKshort::RegisterHisto(MonGroup& mon, TGraph* graph) {
359 ATH_MSG_VERBOSE( "IDPerfMonKshort RegisterHisto() started");
360 StatusCode sc = mon.regGraph(graph);
361 if (sc.isFailure() ) {
362 ATH_MSG_ERROR( "Cannot book TGraph:" );
363 }
364}
365
366
368{
369 ATH_MSG_VERBOSE( "IDPerfMonKshort fillHistogram() started");
370 const xAOD::TrackParticleContainer* tracks(nullptr);
371 StatusCode sc = evtStore()->retrieve(tracks,m_tracksName);
372 if (sc.isFailure()) {
373 ATH_MSG_DEBUG( "No Collection with name "<<m_tracksName<<" found in StoreGate" );
374 return StatusCode::SUCCESS;
375 } else {
376 ATH_MSG_DEBUG( "Collection with name "<<m_tracksName<<" found in StoreGate" );
377 }
378
379 const xAOD::VertexContainer* PrimVxContainer(nullptr);
381 if ( evtStore()->retrieve(PrimVxContainer,m_VxPrimContainerName).isFailure()) {
382 ATH_MSG_DEBUG("Could not retrieve collection with name "<<m_VxPrimContainerName<<" found in StoreGate");
383 return StatusCode::FAILURE;
384 }
385 else
386 ATH_MSG_DEBUG("Successfully retrieved collection with name "<<m_VxPrimContainerName);
387 }
388 else {
389 ATH_MSG_DEBUG("No collection with name "<<m_VxPrimContainerName<<" found in StoreGate");
390 return StatusCode::SUCCESS;
391 }
392 const xAOD::Vertex *primaryVertex= std::begin(*PrimVxContainer)[0];
393
394 const xAOD::VertexContainer* SecVxContainer(nullptr);
396 if (evtStore()->retrieve(SecVxContainer,m_VxContainerName).isFailure()) {
397 ATH_MSG_DEBUG("Could not retrieve collection with name "<<m_VxContainerName<<" found in StoreGate");
398 return StatusCode::FAILURE;
399 }
400 else
401 ATH_MSG_DEBUG("Successfully retrieved collection with name "<<m_VxContainerName);
402 }
403 else {
404 ATH_MSG_DEBUG("No collection with name "<<m_VxContainerName<<" found in StoreGate");
405 return StatusCode::SUCCESS;
406 }
407
408 m_Nevents->Fill(0.);
409 double ksMassPDG = ParticleConstants::KZeroMassInMeV;
410 ATH_MSG_DEBUG("@todo : masspdf" <<ksMassPDG );
411 ATH_MSG_DEBUG("@todo Looping over SecVxContainer name : "<< m_VxContainerName);
412 ATH_MSG_DEBUG("@todo >> V0UnconstrVerices container size >> " << SecVxContainer->size());
413 //bin curvature from -0.0008 to 0.0008 in bins of 0.0004
414 std::array<float, 5> curvatureBinning{};
415 sequentialFill(curvatureBinning.begin(), curvatureBinning.end(),-0.0008, 0.0004);
416 //bin phi from -pi to pi in bins of pi/5
417 std::array<double,10> ksPhiBinning{};
418 sequentialFill(ksPhiBinning.begin(), ksPhiBinning.end(), -M_PI, M_PI * 0.2);
419 //bin ksEta from -2.5 to 2.5 in bins of 0.5
420 std::array<double,10> ksEtaBinning{};
421 sequentialFill(ksEtaBinning.begin(), ksEtaBinning.end(),-2.5, 0.5);
422 //bin ksPt, variable bins
423 std::array<double,4> ksPtBinning{1600,2100, 2800,3900};
424 //bin radius, variable binning
425 std::array<double,6> radiusBinning{30,40, 60,80,100,140};
426 //
427 for (const auto* secVx_elem : *SecVxContainer) {
428 ATH_MSG_DEBUG("Looping over SecVxContainer name : "<< m_VxContainerName);
429 static const SG::ConstAccessor< float > Kshort_massAcc("Kshort_mass");
430 static const SG::ConstAccessor< float > pTAcc("pT");
431 static const SG::ConstAccessor< float > pxAcc("px");
432 static const SG::ConstAccessor< float > pyAcc("py");
433 static const SG::ConstAccessor< float > pzAcc("pz");
434 double ksMass = Kshort_massAcc(*secVx_elem);
435 double ksPt = pTAcc(*secVx_elem);
436 double ksPx = pxAcc(*secVx_elem);
437 double ksPy = pyAcc(*secVx_elem);
438 double ksPz = pzAcc(*secVx_elem);
439 ATH_MSG_DEBUG( " mass : "<<ksMass << " pt : "<< ksPt << " px : "<< ksPx << " py : "<< ksPy << " pz : "<< ksPz);
440 CLHEP::Hep3Vector ksMomentumVector = CLHEP::Hep3Vector(ksPx,ksPy,ksPz);
441 double ksMomentum = ksMomentumVector.mag();
442 double transverseFlightDistance, totalFlightDistance;
443 Amg::Vector3D flightVector;
444 const auto & secVxPosition(secVx_elem->position());
445 if(primaryVertex) {
446 if(primaryVertex->nTrackParticles() > 3){
447 ATH_MSG_DEBUG("NTrk of primary vertices : "<< primaryVertex->nTrackParticles());
448 const auto & position (primaryVertex->position());
449 m_YVsX_primVertex->Fill(position.x(),position.y());
450 m_XVsZ_primVertex->Fill(position.z(),position.x());
451 m_YVsZ_primVertex->Fill(position.z(),position.y());
452 }
453 auto vert = secVx_elem->position()-primaryVertex->position();
454 double dx = vert.x();
455 double dy = vert.y();
456 Amg::Vector3D mom(ksPx,ksPy,ksPz);
457 double dxy = (mom.x()*dx + mom.y()*dy)/mom.perp();
458 transverseFlightDistance =dxy;
459 Amg::Vector3D vertex(secVxPosition.x(),secVxPosition.y(),secVxPosition.z());
460 totalFlightDistance = (vertex-primaryVertex->position()).mag();
461 flightVector = vertex-primaryVertex->position();
462 ATH_MSG_DEBUG("dx : "<<dx<<" dy: "<<dy<<" dxy: "<<dxy<< "flight distance (total): "<<totalFlightDistance);
463 }
464 else {
465 transverseFlightDistance = secVxPosition.perp();
466 Amg::Vector3D vertex(secVxPosition.x(),secVxPosition.y(),secVxPosition.z());
467 totalFlightDistance = vertex.mag();
468 flightVector = vertex;
469 }
470 double properDecayTime = 1./Gaudi::Units::c_light*ksMassPDG/ksMomentum*totalFlightDistance;
471
472
473 double flightX = flightVector.x();
474 double flightY = flightVector.y();
475 double cosThetaPointing = (ksPx*flightX+ksPy*flightY)/std::sqrt(ksPx*ksPx+ksPy*ksPy)/std::sqrt(flightX*flightX+flightY*flightY);
476 int trackPos_nSVTHits = 0;
477 int trackNeg_nSVTHits = 0;
478 double trackPos_d0 = 0;
479 double trackPos_d0_wrtPV = 0;
480 double trackNeg_d0 = 0;
481 double trackNeg_d0_wrtPV = 0;
482 const xAOD::TrackParticle* trackPos(nullptr);
483 const xAOD::TrackParticle* trackNeg(nullptr);
484
485 int ntrk(-1);
486 ntrk = secVx_elem->nTrackParticles();
487 ATH_MSG_DEBUG("track particles associated to vertex : "<<ntrk );
488 if(ntrk>0){
489 auto tpLinks = secVx_elem->trackParticleLinks();
490 for (const auto& link: tpLinks){
491 Info("execute()", "V0: TP link = %d %s ", link.isValid(), link.dataID().c_str() );
492 if(ntrk == 2){
493 ATH_MSG_DEBUG("Exactly two track particles!");
494 if( (*link)->charge() > 0. ) {
495 trackPos = *link;
496 ATH_MSG_DEBUG("Track with positive charge!");
497 }
498 else if( (*link)->charge() < 0. ){
499 trackNeg = *link;
500 ATH_MSG_DEBUG("Track with negative charge!"); }
501 }
502 }//trackparticles
503 }//ntrk
504 if(trackPos!=nullptr) {
505 uint8_t dummy(-1);
506 trackPos_nSVTHits = trackPos->summaryValue( dummy , xAOD::numberOfSCTHits )? dummy :-1;
507 trackPos_d0 = trackPos->d0();
508 trackPos_d0_wrtPV = trackPos->d0() - (primaryVertex->position().y()*std::cos(trackPos->phi0()) - primaryVertex->position().x()*std::sin(trackPos->phi0()));
509
510 }
511 //std::cout <<"@todo : check (2) " << std::endl;
512
513 if(trackNeg!=nullptr) {
514 uint8_t dummy(-1);
515 trackNeg_nSVTHits = trackNeg->summaryValue( dummy , xAOD::numberOfSCTHits )? dummy :-1;
516 trackNeg_d0 = trackNeg->d0();
517 trackNeg_d0_wrtPV = trackNeg->d0() - (primaryVertex->position().y()*cos(trackNeg->phi0()) - primaryVertex->position().x()*sin(trackNeg->phi0()));
518 }
519 int selectorValue = 0;
520 ATH_MSG_DEBUG( "ksTau = " << properDecayTime << " Lxy = " <<transverseFlightDistance<< " cosTheta = " << cosThetaPointing );
521 ATH_MSG_DEBUG( "trackPos nSVThits = " << trackPos_nSVTHits << " trackNeg nSVThits = " << trackNeg_nSVTHits );
522 ATH_MSG_DEBUG( "ksPt = " << ksPt );
523 static const SG::ConstAccessor< float > RxyAcc("Rxy");
524 double secVertex_radius = RxyAcc(*secVx_elem);
525 ATH_MSG_DEBUG("secondary vertex radius : " << secVertex_radius);
526 m_radius_secVertices->Fill(secVertex_radius);
527 m_radiusVsZ_secVertex->Fill(secVxPosition.z(),secVertex_radius);
528 m_YVsX_secVertex->Fill(secVxPosition.x(),secVxPosition.y());
529 // }
530 ATH_MSG_DEBUG("trackneg d0 : " << trackNeg_d0 << " trackpos d0 : "<< trackPos_d0);
531 ATH_MSG_DEBUG("trackneg d0 (PV): " << trackNeg_d0_wrtPV << " trackpos d0 (PV) : "<< trackPos_d0_wrtPV);
532 if(secVx_elem->chiSquared()/secVx_elem->numberDoF() < 4.5
533 && ksPt > 300.
534 && abs(trackNeg_d0_wrtPV) > 5.
535 && abs(trackPos_d0_wrtPV) > 5.
536 && trackPos_nSVTHits > 2
537 && trackNeg_nSVTHits > 2
538 && secVertex_radius > 20.
539 ){
540 m_radius_secVertices_sel->Fill(secVertex_radius);
541 m_radiusVsZ_secVertex_sel->Fill(secVxPosition.z(),secVertex_radius);
542 m_YVsX_secVertex_sel->Fill(secVxPosition.x(),secVxPosition.y());
543 }
544
545
546
547 if( 1
548 && properDecayTime > 0.004
549 && transverseFlightDistance > 12.
550 && cosThetaPointing > 0.998
551 && ksMass>400.&&ksMass<600.
552 && trackPos_nSVTHits > 2 && trackNeg_nSVTHits > 2
553 ) selectorValue = 1;
554 if(selectorValue != 1) continue;
555 m_radiusVsZ_secVertex_Ks->Fill(secVxPosition.z(),secVertex_radius);
556 m_YVsX_secVertex_Ks->Fill(secVxPosition.x(),secVxPosition.y());
557 m_YVsX_primVertex_Ks->Fill(primaryVertex->position().x(),primaryVertex->position().y());
558 m_XVsZ_primVertex_Ks->Fill(primaryVertex->position().z(),primaryVertex->position().x());
559 m_YVsZ_primVertex_Ks->Fill(primaryVertex->position().z(),primaryVertex->position().y());
560 m_mass->Fill(ksMass*0.001);
561 double ksEta = ksMomentumVector.pseudoRapidity();
562 double ksPhi = ksMomentumVector.phi();
563 double piPlusPt = trackPos->p4().Perp();
564 double piMinusPt = trackNeg->p4().Perp();
565 m_massVsPhi->Fill(ksPhi,ksMass-ksMassPDG);
566 m_pt->Fill(ksPt*0.001);
567 m_eta->Fill(ksEta);
568 m_phi->Fill(ksPhi);
569 Float_t curvatureDiff = (1./(piPlusPt)) - (1./(piMinusPt));
570 const auto fillValue(ksMass*0.001);
571 auto curvatureIdx = findLevel(curvatureBinning.begin(), curvatureBinning.end(),curvatureDiff);
572 m_massVCurvatureDiffBinHistos[curvatureIdx]->Fill(fillValue);
573 if (ksPhi>=-M_PI and ksPhi<M_PI){
574 auto ksPhiIdx = findLevel(ksPhiBinning.begin(), ksPhiBinning.end(), ksPhi, std::less_equal<double>());
575 m_massVPhiBinHistos[ksPhiIdx]->Fill(fillValue);
576 }
577 if (ksEta>=-2.5 and ksEta<2.5){
578 auto ksEtaIdx = findLevel(ksEtaBinning.begin(), ksEtaBinning.end(), ksEta, std::less_equal<double>());
579 m_massVEtaBinHistos[ksEtaIdx]->Fill(fillValue);
580 }
581 if (ksPt>=0.){
582 auto ksPtIdx = findLevel(ksPtBinning.begin(), ksPtBinning.end(), ksPt, std::less_equal<double>());
583 m_massVPtBinFittedHistos[ksPtIdx]->Fill(fillValue);
584 }
585
586 if (ksPt<500) ksPt = 500;
587 if (ksPt>5000) ksPt=5000;
588 Int_t quickBin = (Int_t)ksPt;
589 quickBin -= quickBin%100;
590 quickBin -= 500;
591 quickBin /= 100;
592 m_massVPtBinHistos[quickBin]->Fill(fillValue);
593 double radius = RxyAcc(*secVx_elem);
594 m_radius->Fill(radius);
595 if (radius>=0.){
596 auto radiusIdx = findLevel(radiusBinning.begin(), radiusBinning.end(), radius, std::less_equal<double>());
597 m_massVRadiusBinFittedHistos[radiusIdx]->Fill(fillValue);
598 }
599 if(radius>700) radius = 700;
600 Int_t radiusTemp = (Int_t)radius;
601 radiusTemp -= radiusTemp%10;
602 m_massVRadiusBinHistos[(Int_t)radiusTemp/10]->Fill(ksMass/1000.);
603 }
604 return StatusCode::SUCCESS;
605}
606
607
609{
610 ATH_MSG_VERBOSE( "IDPerfMonKshort procHistograms() started");
611 if( endOfRunFlag() ) {
612 MonGroup al_kshort_mon ( this, "IDPerfMon/Kshort/" + m_triggerChainName, run);
613 //CHECK ATTRIB MANAGED
614 MonGroup al_kshort_mon_average ( this, "IDPerfMon/Kshort/" + m_triggerChainName, run, ATTRIB_MANAGED, "", "weightedAverage" );
615 TF1 *func = new TF1("func","gaus(0)+expo(3)",0.450,0.550);
616 func->SetLineColor(4);
617 func->SetParameters(10.,0.500,0.010,2.,-.001);
618 func->SetParLimits(0,0.,10000.);
619 func->SetParLimits(1,0.450,0.550);
620 func->SetParLimits(2,0.,0.100);
621 func->SetParLimits(3,0.,10000.);
622 func->SetParLimits(4,-1000.,0.);
623 func->SetParNames("Constant","Mean","Width","Constant","Slope");
624 Double_t massBins[m_nFittedBinsPt], massErrorBins[m_nFittedBinsPt], widthBins[m_nFittedBinsPt], widthErrorBins[m_nFittedBinsPt];
625 const Int_t nPtBinsHisto = m_nFittedBinsPt+1;
626 Double_t ptBins[nPtBinsHisto] = {0.5,1.6,2.1,2.8,3.9,5.1};
627 for(int binFill=0;binFill<m_nFittedBinsPt;binFill++) {
628 massBins[binFill] = func->GetParameter(1);
629 massErrorBins[binFill] = func->GetParError(1);
630 widthBins[binFill] = func->GetParameter(2);
631 widthErrorBins[binFill] = func->GetParError(2);
632 }
633 const Double_t* ptBinsFinal = ptBins;
634 const Double_t* massBinsFinal = massBins;
635 const Double_t* massErrorBinsFinal = massErrorBins;
636 const Double_t* widthBinsFinal = widthBins;
637 const Double_t* widthErrorBinsFinal = widthErrorBins;
638 //lamda utilities for repetitive code
639 auto setYTitleAndMarker =[](TH1F * theHist,const bool mass){
640 if (mass){
641 theHist->SetYTitle("Mass (Gev / c^{2})");
642 }else {
643 theHist->SetYTitle("Width (Gev / c^{2})");
644 };
645 theHist->SetMarkerStyle(20);
646 };
647 //
648 auto fillFromSource = [](const double * source, const double * uncertainty, TH1F * target, unsigned int nbins){
649 for(unsigned int bin=0;bin<nbins;bin++) {
650 double binContent = source[bin];
651 double binError = uncertainty[bin];
652 target->SetBinContent(bin+1, binContent);
653 target->SetBinError(bin+1,binError);
654 }
655 };
656 constexpr bool massTitle{true};
657 constexpr bool widthTitle{false};
658 if(m_nFittedBinsPt) {
659 m_massVersusPt = new TH1F("KsMassVersusPt","",m_nFittedBinsPt,ptBinsFinal);
660 RegisterHisto(al_kshort_mon_average,m_massVersusPt);
661 m_massVersusPt->SetXTitle("p_{T} (Gev / c)");
662 setYTitleAndMarker(m_massVersusPt, massTitle);
663 fillFromSource(massBinsFinal, massErrorBinsFinal, m_massVersusPt, m_nFittedBinsPt);
664 m_widthVersusPt = new TH1F("KsWidthVersusPt","",m_nFittedBinsPt,ptBinsFinal);
665 RegisterHisto(al_kshort_mon_average,m_widthVersusPt);
666 m_widthVersusPt->SetXTitle("p_{T} (Gev / c)");
667 setYTitleAndMarker(m_widthVersusPt, widthTitle);
668 fillFromSource(widthBinsFinal, widthErrorBinsFinal, m_widthVersusPt, m_nFittedBinsPt);
669 }
670
671 Double_t massVradiusBins[m_nFittedBinsRadius], massVradiusErrorBins[m_nFittedBinsRadius], widthVradiusBins[m_nFittedBinsRadius], widthVradiusErrorBins[m_nFittedBinsRadius];
672 const Int_t nRadiusBinsHisto = m_nFittedBinsRadius+1;
673 Double_t radiusBins[nRadiusBinsHisto] = {0.,30.,40.,60.,80.,100.,140.,230};
674 for(int binFill=0;binFill<m_nFittedBinsRadius;binFill++) {
675 massVradiusBins[binFill] = func->GetParameter(1);
676 massVradiusErrorBins[binFill] = func->GetParError(1);
677 widthVradiusBins[binFill] = func->GetParameter(2);
678 widthVradiusErrorBins[binFill] = func->GetParError(2);
679 }
680
681 const Double_t* radiusBinsFinal = radiusBins;
682 const Double_t* massVradiusBinsFinal = massVradiusBins;
683 const Double_t* massVradiusErrorBinsFinal = massVradiusErrorBins;
684 const Double_t* widthVradiusBinsFinal = widthVradiusBins;
685 const Double_t* widthVradiusErrorBinsFinal = widthVradiusErrorBins;
686
688 m_massVersusRadius = new TH1F("KsMassVersusRadius","",m_nFittedBinsRadius,radiusBinsFinal);
689 RegisterHisto(al_kshort_mon_average,m_massVersusRadius);
690 m_massVersusRadius->SetXTitle("Decay Radius (mm)");
691 setYTitleAndMarker(m_massVersusRadius, massTitle);
692 fillFromSource(massVradiusBinsFinal, massVradiusErrorBinsFinal, m_massVersusRadius, m_nFittedBinsRadius);
693 m_widthVersusRadius = new TH1F("KsWidthVersusRadius","",m_nFittedBinsRadius,radiusBinsFinal);
694 RegisterHisto(al_kshort_mon_average,m_widthVersusRadius);
695 m_widthVersusRadius->SetXTitle("Decay Radius (mm)");
696 setYTitleAndMarker(m_widthVersusRadius, widthTitle);
697 fillFromSource(widthVradiusBinsFinal, widthVradiusErrorBinsFinal, m_widthVersusRadius, m_nFittedBinsRadius);
698 }
699
700 Double_t etaBins[11] = {-2.5,-2.0,-1.5,-1.0,-0.5,0.0,0.5,1.0,1.5,2.0,2.5};
701 Double_t massVetaBins[10], massVetaErrorBins[10], widthVetaBins[10], widthVetaErrorBins[10];
702 for(int binFill=0;binFill<10;binFill++) {
703 massVetaBins[binFill] = func->GetParameter(1);
704 massVetaErrorBins[binFill] = func->GetParError(1);
705 widthVetaBins[binFill] = func->GetParameter(2);
706 widthVetaErrorBins[binFill] = func->GetParError(2);
707 }
708 m_massVersusEta = new TH1F("KsMassVersusEta","",10,etaBins);
709 RegisterHisto(al_kshort_mon_average,m_massVersusEta);
710 m_massVersusEta->SetXTitle("#eta");
711 setYTitleAndMarker(m_massVersusEta, massTitle);
712 fillFromSource(massVetaBins, massVetaErrorBins, m_massVersusEta, 10);
713 m_widthVersusEta = new TH1F("KsWidthVersusEta","",10,etaBins);
714 RegisterHisto(al_kshort_mon_average,m_widthVersusEta);
715 m_widthVersusEta->SetXTitle("#eta");
716 setYTitleAndMarker(m_massVersusEta, widthTitle);
717 fillFromSource(widthVetaBins, widthVetaErrorBins, m_widthVersusEta, 10);
718 Double_t phiBins[11]{};
719 sequentialFill(phiBins, phiBins+11, -M_PI, M_PI/5.);
720 Double_t massVphiBins[10], massVphiErrorBins[10], widthVphiBins[10], widthVphiErrorBins[10];
721 for(int binFill=0;binFill<10;binFill++) {
722 massVphiBins[binFill] = func->GetParameter(1);
723 massVphiErrorBins[binFill] = func->GetParError(1);
724 widthVphiBins[binFill] = func->GetParameter(2);
725 widthVphiErrorBins[binFill] = func->GetParError(2);
726 }
727 m_massVersusPhi = new TH1F("KsMassVersusPhi","",10,phiBins);
728 RegisterHisto(al_kshort_mon_average,m_massVersusPhi);
729 m_massVersusPhi->SetXTitle("#phi");
730 setYTitleAndMarker(m_massVersusPhi, massTitle);
731 fillFromSource(massVphiBins, massVphiErrorBins, m_massVersusPhi, 10);
732 m_widthVersusPhi = new TH1F("KsWidthVersusPhi","",10,phiBins);
733 RegisterHisto(al_kshort_mon_average,m_widthVersusPhi);
734 m_widthVersusPhi->SetXTitle("#phi");
735 setYTitleAndMarker(m_widthVersusPhi, widthTitle);
736 fillFromSource(widthVphiBins, widthVphiErrorBins, m_widthVersusPhi, 10);
737 Double_t curvatureDiffBins[7] = {-0.0012,-0.0008,-0.0004,0.0000,0.0004,0.0008,0.0012};
738 Double_t massVcurvatureDiffBins[6], massVcurvatureDiffErrorBins[6], widthVcurvatureDiffBins[6], widthVcurvatureDiffErrorBins[6];
739 for(int binFill=0;binFill<6;binFill++) {
740 massVcurvatureDiffBins[binFill] = func->GetParameter(1);
741 massVcurvatureDiffErrorBins[binFill] = func->GetParError(1);
742 widthVcurvatureDiffBins[binFill] = func->GetParameter(2);
743 widthVcurvatureDiffErrorBins[binFill] = func->GetParError(2);
744 }
745 m_massVersusCurvatureDiff = new TH1F("KsMassVersusCurvatureDiff","",6,curvatureDiffBins);
746 RegisterHisto(al_kshort_mon_average,m_massVersusCurvatureDiff);
747 m_massVersusCurvatureDiff->SetXTitle("1/p_{T}(#pi^{+}) - 1/p_{T}(#pi^{-}) [GeV^{-1}]");
748 setYTitleAndMarker(m_massVersusCurvatureDiff, massTitle);
749 fillFromSource(massVcurvatureDiffBins, massVcurvatureDiffErrorBins, m_massVersusCurvatureDiff, 6);
750 m_widthVersusCurvatureDiff = new TH1F("KsWidthVersusCurvatureDiff","",6,curvatureDiffBins);
751 RegisterHisto(al_kshort_mon_average,m_widthVersusCurvatureDiff);
752 m_widthVersusCurvatureDiff->SetXTitle("1/p_{T}(#pi^{+}) - 1/p_{T}(#pi^{-}) [GeV^{-1}]");
753 setYTitleAndMarker(m_widthVersusCurvatureDiff, widthTitle);
754 fillFromSource(widthVcurvatureDiffBins, widthVcurvatureDiffErrorBins, m_widthVersusCurvatureDiff, 6);
755 }
756
757 return StatusCode::SUCCESS;
758
759}
#define M_PI
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Helper class to provide constant type-safe access to aux data.
static Double_t sc
bool inRange(const double *boundaries, const double value, const double tolerance=0.02)
A number of constexpr particle constants to avoid hardcoding them directly in various places.
#define y
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
bool msgLvl(const MSG::Level lvl) const
Header file for AthHistogramAlgorithm.
static Environment_t environment()
Returns the running environment of the monitoring application to help ManagedMonitorToolBase objects ...
static DataType_t dataType()
Returns the data type that the monitoring application is running over to help ManagedMonitorToolBase ...
size_type size() const noexcept
Returns the number of elements in the collection.
virtual StatusCode initialize()
TH1F * m_widthVersusCurvatureDiff
virtual StatusCode bookHistograms()
An inheriting class should either override this function or bookHists().
TH1F * m_massVersusEta_merged
IDPerfMonKshort(const std::string &type, const std::string &name, const IInterface *parent)
TH1F * m_widthVersusPhi_merged
TH1F * m_widthVersusPt_merged
TH1F * m_massVersusCurvatureDiff_merged
TH2F * m_YVsX_primVertex_Ks
TH1F * m_massVRadiusBinHistos[m_nBinsRadius]
TH1F * m_massVEtaBinHistos[10]
TH2F * m_radiusVsZ_secVertex_Ks
TH2F * m_radiusVsZ_secVertex_sel
TH2F * m_XVsZ_primVertex_Ks
TH2F * m_YVsZ_primVertex_Ks
std::string m_VxPrimContainerName
TH1F * m_massVersusRadius_merged
TH1F * m_widthVersusRadius_merged
static const Int_t m_nFittedBinsRadius
TH2F * m_YVsX_secVertex_sel
TH2F * m_radiusVsZ_secVertex
TH1F * m_massVPtBinHistos[m_nBinsPt]
TH1F * m_widthVersusCurvatureDiff_merged
TH1F * m_radius_secVertices_sel
static const Int_t m_nFittedBinsPt
TH1F * m_massVPhiBinHistos[10]
TH1F * m_massVersusPhi_merged
static const Int_t m_nBinsRadius
TH1F * m_massVersusPt_merged
std::string m_triggerChainName
static const Int_t m_nBinsPt
std::string m_tracksName
virtual ~IDPerfMonKshort()
TH1F * m_massVersusCurvatureDiff
void RegisterHisto(MonGroup &mon, TH1 *histo)
TH1F * m_massVCurvatureDiffBinHistos[6]
TH1F * m_radius_secVertices
TH1F * m_massVPtBinFittedHistos[m_nFittedBinsPt]
virtual StatusCode fillHistograms()
An inheriting class should either override this function or fillHists().
TH1F * m_massVRadiusBinFittedHistos[m_nFittedBinsRadius]
std::string m_VxContainerName
TH1F * m_widthVersusEta_merged
virtual StatusCode procHistograms()
An inheriting class should either override this function or finalHists().
A container of information describing a monitoring object.
ManagedMonitorToolBase(const std::string &type, const std::string &name, const IInterface *parent)
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
float d0() const
Returns the parameter.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float phi0() const
Returns the parameter, which has range to .
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const Amg::Vector3D & position() const
Returns the 3-pos.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
Eigen::Matrix< double, 3, 1 > Vector3D
constexpr double KZeroMassInMeV
the mass of the neutral kaon (K0) (in MeV)
Definition run.py:1
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ numberOfSCTHits
number of hits in SCT [unit8_t].
MsgStream & msg
Definition testRead.cxx:32