Skip to content

Commit 3780292

Browse files
authored
[PWGJE] modification for systematic uncertainty of b-jets and multiplicity analysis (#15830)
1 parent 2300513 commit 3780292

3 files changed

Lines changed: 107 additions & 26 deletions

File tree

PWGJE/TableProducer/secondaryVertexReconstruction.cxx

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@
2222
#include "Common/Core/trackUtilities.h"
2323
#include "Common/DataModel/TrackSelectionTables.h"
2424

25+
#include "CommonConstants/PhysicsConstants.h"
26+
#include "DCAFitter/DCAFitterN.h"
27+
#include "Framework/ASoA.h"
28+
#include "Framework/AnalysisDataModel.h"
29+
#include "Framework/AnalysisTask.h"
30+
#include "ReconstructionDataFormats/DCA.h"
2531
#include <CCDB/BasicCCDBManager.h>
26-
#include <CommonConstants/PhysicsConstants.h>
27-
#include <DCAFitter/DCAFitterN.h>
2832
#include <DetectorsBase/MatLayerCylSet.h>
2933
#include <DetectorsBase/Propagator.h>
30-
#include <Framework/ASoA.h>
31-
#include <Framework/AnalysisDataModel.h>
3234
#include <Framework/AnalysisHelpers.h>
33-
#include <Framework/AnalysisTask.h>
3435
#include <Framework/Configurable.h>
3536
#include <Framework/HistogramRegistry.h>
3637
#include <Framework/HistogramSpec.h>
3738
#include <Framework/InitContext.h>
3839
#include <Framework/Logger.h>
3940
#include <Framework/runDataProcessing.h>
40-
#include <ReconstructionDataFormats/DCA.h>
4141
#include <ReconstructionDataFormats/TrackParametrizationWithError.h>
4242
#include <ReconstructionDataFormats/Vertex.h>
4343

@@ -74,12 +74,12 @@ struct SecondaryVertexReconstruction {
7474
Configurable<bool> propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"};
7575
Configurable<bool> useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"};
7676
Configurable<bool> useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"};
77-
Configurable<double> maxR{"maxR", 200., "reject PCA's above this radius"};
78-
Configurable<double> maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"};
79-
Configurable<double> maxRsv{"maxRsv", 999., "max. radius of the reconstruced SV"};
80-
Configurable<double> maxZsv{"maxZsv", 999., "max. Z coordinates of the reconstruced SV"};
81-
Configurable<double> minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"};
82-
Configurable<double> minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"};
77+
Configurable<float> maxR{"maxR", 200., "reject PCA's above this radius"};
78+
Configurable<float> maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"};
79+
Configurable<float> maxRsv{"maxRsv", 999., "max. radius of the reconstruced SV"};
80+
Configurable<float> maxZsv{"maxZsv", 999., "max. Z coordinates of the reconstruced SV"};
81+
Configurable<float> minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"};
82+
Configurable<float> minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"};
8383
Configurable<float> ptMinTrack{"ptMinTrack", -1., "min. track pT"};
8484
Configurable<float> etaMinTrack{"etaMinTrack", -99999., "min. pseudorapidity"};
8585
Configurable<float> etaMaxTrack{"etaMaxTrack", 4., "max. pseudorapidity"};
@@ -94,13 +94,15 @@ struct SecondaryVertexReconstruction {
9494
o2::vertexing::DCAFitterN<2> df2; // 2-prong vertex fitter
9595
o2::vertexing::DCAFitterN<3> df3; // 3-prong vertex fitter
9696
Service<o2::ccdb::BasicCCDBManager> ccdb;
97-
o2::base::MatLayerCylSet* lut;
97+
o2::base::MatLayerCylSet* lut = nullptr;
9898

9999
HistogramRegistry registry{"registry"};
100100

101101
int runNumber{0};
102102
float toMicrometers = 10000.; // from cm to µm
103103
double bz{0.};
104+
static constexpr int TwoProngCount = 2;
105+
static constexpr int ThreeProngCount = 3;
104106

105107
void init(InitContext const&)
106108
{
@@ -216,7 +218,7 @@ struct SecondaryVertexReconstruction {
216218
auto covMatrixPV = primaryVertex.getCov();
217219

218220
// Get track momenta and impact parameters
219-
std::array<std::array<float, 3>, numProngs> arrayMomenta;
221+
std::array<std::array<float, 3>, numProngs> arrayMomenta{};
220222
std::array<o2::dataformats::DCA, numProngs> impactParameters;
221223
for (unsigned int inum = 0; inum < numProngs; ++inum) {
222224
trackParVars[inum].getPxPyPzGlo(arrayMomenta[inum]);
@@ -236,12 +238,12 @@ struct SecondaryVertexReconstruction {
236238
auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.));
237239

238240
// calculate invariant mass
239-
std::array<double, numProngs> massArray;
241+
std::array<double, numProngs> massArray{};
240242
std::fill(massArray.begin(), massArray.end(), o2::constants::physics::MassPiPlus);
241-
double massSV = RecoDecay::m(std::move(arrayMomenta), massArray);
243+
double massSV = RecoDecay::m(arrayMomenta, massArray);
242244

243245
// fill candidate table rows
244-
if ((doprocessData3Prongs || doprocessData3ProngsExternalMagneticField) && numProngs == 3) {
246+
if ((doprocessData3Prongs || doprocessData3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
245247
sv3prongTableData(analysisJet.globalIndex(),
246248
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
247249
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
@@ -250,7 +252,7 @@ struct SecondaryVertexReconstruction {
250252
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
251253
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
252254
svIndices.push_back(sv3prongTableData.lastIndex());
253-
} else if ((doprocessData2Prongs || doprocessData2ProngsExternalMagneticField) && numProngs == 2) {
255+
} else if ((doprocessData2Prongs || doprocessData2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
254256
sv2prongTableData(analysisJet.globalIndex(),
255257
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
256258
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
@@ -259,7 +261,7 @@ struct SecondaryVertexReconstruction {
259261
arrayMomenta[0][2] + arrayMomenta[1][2],
260262
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
261263
svIndices.push_back(sv2prongTableData.lastIndex());
262-
} else if ((doprocessMCD3Prongs || doprocessMCD3ProngsExternalMagneticField) && numProngs == 3) {
264+
} else if ((doprocessMCD3Prongs || doprocessMCD3ProngsExternalMagneticField) && numProngs == ThreeProngCount) {
263265
sv3prongTableMCD(analysisJet.globalIndex(),
264266
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
265267
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
@@ -268,7 +270,7 @@ struct SecondaryVertexReconstruction {
268270
arrayMomenta[0][2] + arrayMomenta[1][2] + arrayMomenta[2][2],
269271
energySV, massSV, chi2PCA, dispersion, errorDecayLength, errorDecayLengthXY);
270272
svIndices.push_back(sv3prongTableMCD.lastIndex());
271-
} else if ((doprocessMCD2Prongs || doprocessMCD2ProngsExternalMagneticField) && numProngs == 2) {
273+
} else if ((doprocessMCD2Prongs || doprocessMCD2ProngsExternalMagneticField) && numProngs == TwoProngCount) {
272274
sv2prongTableMCD(analysisJet.globalIndex(),
273275
primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(),
274276
secondaryVertex[0], secondaryVertex[1], secondaryVertex[2],
@@ -399,5 +401,5 @@ struct SecondaryVertexReconstruction {
399401

400402
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
401403
{
402-
return WorkflowSpec{adaptAnalysisTask<SecondaryVertexReconstruction>(cfgc, TaskName{"jet-sv-reconstruction-charged"})}; // o2-linter: disable=name/o2-task
404+
return WorkflowSpec{adaptAnalysisTask<SecondaryVertexReconstruction>(cfgc, TaskName{"jet-sv-reconstruction-charged"})}; // o2-linter: disable=name/o2-task (templated struct)
403405
}

PWGJE/Tasks/bjetCentMult.cxx

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,25 @@ struct BjetCentMultTask {
162162
registry.add("hn_taggedjet_3prong_Sxyz_N1_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisSxyz}, {axisMass}, {axisCentrality}}});
163163
}
164164
}
165+
if (doprocessRhoAreaSubSV3ProngData) {
166+
registry.add("h_event_centrality", "", {HistType::kTH1F, {{axisCentrality}}});
167+
registry.add("h2_jet_pt_rhoareasubtracted_centrality", "", {HistType::kTH2F, {{axisJetPt}, {axisCentrality}}});
168+
registry.add("h2_jet_eta_rhoareasubtracted_centrality", "", {HistType::kTH2F, {{axisEta}, {axisCentrality}}});
169+
registry.add("h2_jet_phi_rhoareasubtracted_centrality", "", {HistType::kTH2F, {{axisPhi}, {axisCentrality}}});
170+
if (fillGeneralSVQA) {
171+
registry.add("h2_3prong_nprongs_rhoareasubtracted_centrality", "", {HistType::kTH2F, {{axisNprongs}, {axisCentrality}}});
172+
registry.add("hn_jet_3prong_Sxy_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisLxy}, {axisSigmaLxy}, {axisSxy}, {axisCentrality}}});
173+
if (fillSVxyz) {
174+
registry.add("hn_jet_3prong_Sxyz_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisLxyz}, {axisSigmaLxyz}, {axisSxyz}, {axisCentrality}}});
175+
}
176+
}
177+
registry.add("hn_jet_3prong_Sxy_N1_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisSxy}, {axisMass}, {axisCentrality}}});
178+
registry.add("hn_taggedjet_3prong_Sxy_N1_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisSxy}, {axisMass}, {axisCentrality}}});
179+
if (fillSVxyz) {
180+
registry.add("hn_jet_3prong_Sxyz_N1_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisSxyz}, {axisMass}, {axisCentrality}}});
181+
registry.add("hn_taggedjet_3prong_Sxyz_N1_rhoareasubtracted_centrality", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisSxyz}, {axisMass}, {axisCentrality}}});
182+
}
183+
}
165184
if (doprocessSV3ProngMCD || doprocessSV3ProngMCPMCDMatched) {
166185
registry.add("h_event_centrality", "", {HistType::kTH1F, {{axisCentrality}}});
167186
registry.add("h3_jet_pt_centrality_flavour", "", {HistType::kTH3F, {{axisJetPt}, {axisCentrality}, {axisJetFlavour}}});
@@ -312,6 +331,47 @@ struct BjetCentMultTask {
312331
registry.fill(HIST("h2_jet_phi_part_flavour"), mcpjet.phi(), jetflavour, eventWeight);
313332
}
314333

334+
template <typename T, typename U>
335+
void fillRhoAreaSubtractedHistogramSV3ProngData(T const& jet, U const& /*prongs*/, float centrality, float rho)
336+
{
337+
if (jet.template secondaryVertices_as<U>().size() < 1)
338+
return;
339+
registry.fill(HIST("h2_jet_pt_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), centrality);
340+
registry.fill(HIST("h2_jet_eta_rhoareasubtracted_centrality"), jet.eta(), centrality);
341+
registry.fill(HIST("h2_jet_phi_rhoareasubtracted_centrality"), jet.phi(), centrality);
342+
if (fillGeneralSVQA) {
343+
registry.fill(HIST("h2_3prong_nprongs_rhoareasubtracted_centrality"), jet.template secondaryVertices_as<U>().size(), centrality);
344+
for (const auto& prong : jet.template secondaryVertices_as<U>()) {
345+
registry.fill(HIST("hn_jet_3prong_Sxy_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), prong.decayLengthXY(), prong.errorDecayLengthXY(), prong.decayLengthXY() / prong.errorDecayLengthXY(), centrality);
346+
if (fillSVxyz) {
347+
registry.fill(HIST("hn_jet_3prong_Sxyz_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), prong.decayLength(), prong.errorDecayLength(), prong.decayLength() / prong.errorDecayLength(), centrality);
348+
}
349+
}
350+
}
351+
bool checkSv = false;
352+
auto bjetCand = jettaggingutilities::jetFromProngMaxDecayLength<U>(jet, prongCuts->at(0), prongCuts->at(1), prongCuts->at(2), prongCuts->at(4), prongCuts->at(5), false, &checkSv);
353+
if (checkSv && jettaggingutilities::svAcceptance(bjetCand, svDispersionMax)) {
354+
auto maxSxy = bjetCand.decayLengthXY() / bjetCand.errorDecayLengthXY();
355+
auto massSV = bjetCand.m();
356+
registry.fill(HIST("hn_jet_3prong_Sxy_N1_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), maxSxy, massSV, centrality);
357+
if (jet.isTagged(BJetTaggingMethod::SV)) {
358+
registry.fill(HIST("hn_taggedjet_3prong_Sxy_N1_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), maxSxy, massSV, centrality);
359+
}
360+
}
361+
if (fillSVxyz) {
362+
checkSv = false;
363+
auto bjetCandXYZ = jettaggingutilities::jetFromProngMaxDecayLength<U>(jet, prongCuts->at(0), prongCuts->at(1), prongCuts->at(3), prongCuts->at(4), prongCuts->at(5), true, &checkSv);
364+
if (checkSv && jettaggingutilities::svAcceptance(bjetCandXYZ, svDispersionMax)) {
365+
auto maxSxyz = bjetCandXYZ.decayLength() / bjetCandXYZ.errorDecayLength();
366+
auto massSV = bjetCandXYZ.m();
367+
registry.fill(HIST("hn_jet_3prong_Sxyz_N1_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), maxSxyz, massSV, centrality);
368+
if (jet.isTagged(BJetTaggingMethod::SV3D)) {
369+
registry.fill(HIST("hn_taggedjet_3prong_Sxyz_N1_rhoareasubtracted_centrality"), jet.pt() - (rho * jet.area()), maxSxyz, massSV, centrality);
370+
}
371+
}
372+
}
373+
}
374+
315375
template <typename T, typename U>
316376
void fillHistogramSV3ProngData(T const& jet, U const& /*prongs*/, float centrality)
317377
{
@@ -513,6 +573,26 @@ struct BjetCentMultTask {
513573
}
514574
PROCESS_SWITCH(BjetCentMultTask, processSV3ProngData, "Fill 3prong imformation for data jets", false);
515575

576+
void processRhoAreaSubSV3ProngData(soa::Filtered<soa::Join<aod::JetCollisions, aod::BkgChargedRhos>>::iterator const& collision, soa::Join<JetTableData, TagTableData, aod::DataSecondaryVertex3ProngIndices> const& jets, aod::DataSecondaryVertex3Prongs const& prongs)
577+
{
578+
if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) {
579+
return;
580+
}
581+
float centrality = collision.centFT0M();
582+
float rho = collision.rho();
583+
registry.fill(HIST("h_event_centrality"), centrality);
584+
for (auto const& jet : jets) {
585+
if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaCuts->at(0), jetEtaCuts->at(1), trackCuts->at(2), trackCuts->at(3))) {
586+
continue;
587+
}
588+
if (!isAcceptedJet<aod::JetTracks>(jet)) {
589+
continue;
590+
}
591+
fillRhoAreaSubtractedHistogramSV3ProngData(jet, prongs, centrality, rho);
592+
}
593+
}
594+
PROCESS_SWITCH(BjetCentMultTask, processRhoAreaSubSV3ProngData, "Fill 3prong imformation for data jets with background subtraction", false);
595+
516596
void processSV3ProngMCD(soa::Filtered<soa::Join<aod::JetCollisionsMCD, aod::JCollisionOutliers>>::iterator const& collision, soa::Join<JetTableMCD, TagTableMCD, aod::MCDSecondaryVertex3ProngIndices> const& mcdjets, aod::MCDSecondaryVertex3Prongs const& prongs)
517597
{
518598
if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) {

PWGJE/Tasks/jetTaggerHFQA.cxx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ struct JetTaggerHFQA {
165165
}
166166
}
167167
if (doprocessTracksInJetsData) {
168-
registry.add("h2_track_pt_impact_parameter_xy", "", {HistType::kTH2F, {{axisTrackPt}, {axisImpactParameterXY}}});
168+
registry.add("h3_jet_pt_track_pt_impact_parameter_xy", "", {HistType::kTH3F, {{axisJetPt}, {axisTrackPt}, {axisImpactParameterXY}}});
169169
}
170170
if (doprocessSecondaryContaminationMCD) {
171171
registry.add("hn_jet_pt_track_pt_impact_parameter_xy_physical_primary_flavour", "", {HistType::kTHnSparseF, {{axisJetPt}, {axisTrackPt}, {axisImpactParameterXY}, {axisJetFlavour}}});
@@ -1158,7 +1158,7 @@ struct JetTaggerHFQA {
11581158
}
11591159
for (auto const& track : jet.template tracks_as<JetTagTracksData>()) {
11601160
float varImpXY = track.dcaXY() * jettaggingutilities::cmTomum;
1161-
registry.fill(HIST("h2_track_pt_impact_parameter_xy"), track.pt(), varImpXY);
1161+
registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_xy"), jet.pt(), track.pt(), varImpXY);
11621162
}
11631163
}
11641164
}
@@ -1179,7 +1179,7 @@ struct JetTaggerHFQA {
11791179
if (!isAcceptedJet<aod::JetTracks>(mcdjet)) {
11801180
continue;
11811181
}
1182-
auto eventWeight = collision.mcCollision_as<soa::Join<aod::JetMcCollisions, aod::JMcCollisionPIs>>().weight();
1182+
auto eventWeight = collision.weight();
11831183
float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent));
11841184
if (mcdjet.pt() > pTHatMaxMCD * pTHat) {
11851185
continue;
@@ -1224,8 +1224,7 @@ struct JetTaggerHFQA {
12241224
if (!isAcceptedJet<aod::JetTracks>(mcdjet)) {
12251225
continue;
12261226
}
1227-
auto eventWeight = collision.mcCollision_as<soa::Join<aod::JetMcCollisions, aod::JMcCollisionPIs>>().weight();
1228-
fillValidationFlavourDefMCD<soa::Join<JetTableMCP, JetTableMCPMCD>>(mcdjet, tracks, particles, particlesPerColl, eventWeight);
1227+
fillValidationFlavourDefMCD<soa::Join<JetTableMCP, JetTableMCPMCD>>(mcdjet, tracks, particles, particlesPerColl, collision.weight());
12291228
}
12301229
}
12311230
PROCESS_SWITCH(JetTaggerHFQA, processValFlavourDefMCD, "to check the validation of jet-flavour definition when compared to distance for mcd jets", false);

0 commit comments

Comments
 (0)