106 if(
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"IDPerfMonKshort bookHistograms() started"<<
endmsg;
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);
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);
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);
155 m_massVsPhi->SetYTitle(
"Mass (Gev / c^{2}) - World Average [MeV]");
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);
164 m_radiusVsZ_secVertex =
new TH2F(
"secVertex_radiusVsZ",
"all sec.vertices (reco);z [mm];Decay radius [mm]",180, -600., 600.,180.,0.,180.);
167 m_YVsX_secVertex =
new TH2F(
"secVertex_YVsX",
"all sec. vertices (reco);x [mm];y [mm]",200, -150.,150., 200, -150., 150.);
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.);
173 m_YVsX_secVertex_sel =
new TH2F(
"secVertex_YVsX_sel",
"all sec. vertices (reco);x [mm];y [mm]",200, -150.,150., 200, -150., 150.);
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.);
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.);
182 m_radius_secVertices =
new TH1F(
"radius_secVertices",
"Decay radius of secondary vertices", 600, 0., 300.);
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);
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);
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);
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);
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);
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);
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)");
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);
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);
225 auto quickSet=[](TH1F *
h){
226 h->SetXTitle(
"Mass (Gev / c^{2})");
227 h->SetYTitle(
"K^{0}_{S} Candidates");
228 h->SetMarkerStyle(20);
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;
238 m_massVPtBinHistos[quickInit] =
new TH1F(tempName.Data(),tempTitle.Data(),50,0.445,0.555);
244 TString tempName =
"MassVptBinFitted";
245 TString tempTitle =
"Fitted Mass, p_{T} = ";
246 tempName += quickInit;
247 tempTitle += ptBins[quickInit];
254 TString tempName =
"MassVradiusBin";
255 TString tempTitle =
"Mass, Decay Radius = ";
256 tempName += quickInit;
257 tempTitle += quickInit*10;
264 TString tempName =
"MassVradiusBinFitted";
265 TString tempTitle =
"Fitted Mass, Decay Radius = ";
266 tempName += quickInit;
267 tempTitle += radiusBins[quickInit];
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);
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);
291 for(
int quickInit=0;quickInit<6;quickInit++) {
292 TString tempName =
"MassVCurvatureDiffBin";
293 TString tempTitle =
"Mass, CurvatureDiff = ";
294 tempName += quickInit;
295 tempTitle += curvatureDiffBins[quickInit];
323 m_Nevents =
new TH1F(
"Nevents",
"Number of events processed",1,-.5,.5);
334 return StatusCode::SUCCESS;
368 if (
sc.isFailure()) {
370 return StatusCode::SUCCESS;
379 return StatusCode::FAILURE;
386 return StatusCode::SUCCESS;
388 const xAOD::Vertex *primaryVertex= std::begin(*PrimVxContainer)[0];
394 return StatusCode::FAILURE;
401 return StatusCode::SUCCESS;
408 ATH_MSG_DEBUG(
"@todo >> V0UnconstrVerices container size >> " << SecVxContainer->
size());
410 std::array<float, 5> curvatureBinning{};
411 sequentialFill(curvatureBinning.begin(), curvatureBinning.end(),-0.0008, 0.0004);
413 std::array<double,10> ksPhiBinning{};
414 sequentialFill(ksPhiBinning.begin(), ksPhiBinning.end(), -
M_PI,
M_PI * 0.2);
416 std::array<double,10> ksEtaBinning{};
417 sequentialFill(ksEtaBinning.begin(), ksEtaBinning.end(),-2.5, 0.5);
419 std::array<double,4> ksPtBinning{1600,2100, 2800,3900};
421 std::array<double,6> radiusBinning{30,40, 60,80,100,140};
423 for (
const auto* secVx_elem : *SecVxContainer) {
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;
440 const auto & secVxPosition(secVx_elem->position());
444 const auto & position (primaryVertex->
position());
449 auto vert = secVx_elem->position()-primaryVertex->
position();
450 double dx = vert.x();
451 double dy = vert.y();
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);
461 transverseFlightDistance = secVxPosition.perp();
462 Amg::Vector3D vertex(secVxPosition.x(),secVxPosition.y(),secVxPosition.z());
463 totalFlightDistance = vertex.mag();
464 flightVector = vertex;
466 double properDecayTime = 1./Gaudi::Units::c_light*ksMassPDG/ksMomentum*totalFlightDistance;
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;
482 ntrk = secVx_elem->nTrackParticles();
483 ATH_MSG_DEBUG(
"track particles associated to vertex : "<<ntrk );
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() );
490 if( (*link)->charge() > 0. ) {
494 else if( (*link)->charge() < 0. ){
500 if(trackPos!=
nullptr) {
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()));
509 if(trackNeg!=
nullptr) {
512 trackNeg_d0 = trackNeg->
d0();
513 trackNeg_d0_wrtPV = trackNeg->
d0() - (primaryVertex->
position().
y()*cos(trackNeg->
phi0()) - primaryVertex->
position().x()*sin(trackNeg->
phi0()));
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 );
520 double secVertex_radius = RxyAcc(*secVx_elem);
521 ATH_MSG_DEBUG(
"secondary vertex radius : " << secVertex_radius);
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
530 && abs(trackNeg_d0_wrtPV) > 5.
531 && abs(trackPos_d0_wrtPV) > 5.
532 && trackPos_nSVTHits > 2
533 && trackNeg_nSVTHits > 2
534 && secVertex_radius > 20.
544 && properDecayTime > 0.004
545 && transverseFlightDistance > 12.
546 && cosThetaPointing > 0.998
547 && ksMass>400.&&ksMass<600.
548 && trackPos_nSVTHits > 2 && trackNeg_nSVTHits > 2
550 if(selectorValue != 1)
continue;
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();
562 m_pt->Fill(ksPt*0.001);
565 Float_t curvatureDiff = (1./(piPlusPt)) - (1./(piMinusPt));
566 const auto fillValue(ksMass*0.001);
567 auto curvatureIdx = findLevel(curvatureBinning.begin(), curvatureBinning.end(),curvatureDiff);
570 auto ksPhiIdx = findLevel(ksPhiBinning.begin(), ksPhiBinning.end(), ksPhi, std::less_equal<double>());
573 if (ksEta>=-2.5 and ksEta<2.5){
574 auto ksEtaIdx = findLevel(ksEtaBinning.begin(), ksEtaBinning.end(), ksEta, std::less_equal<double>());
578 auto ksPtIdx = findLevel(ksPtBinning.begin(), ksPtBinning.end(), ksPt, std::less_equal<double>());
582 if (ksPt<500) ksPt = 500;
583 if (ksPt>5000) ksPt=5000;
584 Int_t quickBin = (Int_t)ksPt;
585 quickBin -= quickBin%100;
589 double radius = RxyAcc(*secVx_elem);
592 auto radiusIdx = findLevel(radiusBinning.begin(), radiusBinning.end(), radius, std::less_equal<double>());
595 if(radius>700) radius = 700;
596 Int_t radiusTemp = (Int_t)radius;
597 radiusTemp -= radiusTemp%10;
600 return StatusCode::SUCCESS;
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");
622 Double_t ptBins[nPtBinsHisto] = {0.5,1.6,2.1,2.8,3.9,5.1};
624 massBins[binFill] = func->GetParameter(1);
625 massErrorBins[binFill] = func->GetParError(1);
626 widthBins[binFill] = func->GetParameter(2);
627 widthErrorBins[binFill] = func->GetParError(2);
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;
635 auto setYTitleAndMarker =[](TH1F * theHist,
const bool mass){
637 theHist->SetYTitle(
"Mass (Gev / c^{2})");
639 theHist->SetYTitle(
"Width (Gev / c^{2})");
641 theHist->SetMarkerStyle(20);
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);
652 constexpr bool massTitle{
true};
653 constexpr bool widthTitle{
false};
669 Double_t radiusBins[nRadiusBinsHisto] = {0.,30.,40.,60.,80.,100.,140.,230};
671 massVradiusBins[binFill] = func->GetParameter(1);
672 massVradiusErrorBins[binFill] = func->GetParError(1);
673 widthVradiusBins[binFill] = func->GetParameter(2);
674 widthVradiusErrorBins[binFill] = func->GetParError(2);
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;
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);
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);
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);
753 return StatusCode::SUCCESS;
A number of constexpr particle constants to avoid hardcoding them directly in various places.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.