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