Skip to content

Commit a56bec6

Browse files
nstrangmNicolas Strangmann
andauthored
[PWGMM/LumiStability] Separate ZDC QA into dedicated task (#15625)
Co-authored-by: Nicolas Strangmann <nicolas.strangmann@.cern.ch>
1 parent 2a7f691 commit a56bec6

File tree

3 files changed

+177
-115
lines changed

3 files changed

+177
-115
lines changed

PWGMM/Lumi/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,8 @@ o2physics_add_dpl_workflow(lumi-stability-p-p
5050
SOURCES lumiStabilityPP.cxx
5151
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCCDB O2Physics::AnalysisCore
5252
COMPONENT_NAME Analysis)
53+
54+
o2physics_add_dpl_workflow(lumi-zdc-qa
55+
SOURCES lumiZdcQa.cxx
56+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCCDB O2Physics::AnalysisCore
57+
COMPONENT_NAME Analysis)

PWGMM/Lumi/Tasks/lumiStabilityLightIons.cxx

Lines changed: 7 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -56,30 +56,9 @@ using namespace o2::framework::expressions;
5656

5757
o2::common::core::MetadataHelper metadataInfo;
5858

59-
namespace o2::aod
60-
{
61-
namespace myBc_aod
62-
{
63-
DECLARE_SOA_COLUMN(Timestamp, timestamp, uint64_t);
64-
DECLARE_SOA_COLUMN(BCid, bcId, int);
65-
DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float);
66-
DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float);
67-
DECLARE_SOA_COLUMN(AmplitudeZNA, amplitudeZNA, float);
68-
DECLARE_SOA_COLUMN(AmplitudeZNC, amplitudeZNC, float);
69-
} // namespace myBc_aod
70-
DECLARE_SOA_TABLE(MyBCaod, "AOD", "MYBCAOD",
71-
myBc_aod::Timestamp,
72-
myBc_aod::BCid,
73-
myBc_aod::TimeZNA,
74-
myBc_aod::TimeZNC,
75-
myBc_aod::AmplitudeZNA,
76-
myBc_aod::AmplitudeZNC);
77-
} // namespace o2::aod
78-
7959
using MyBCs = soa::Join<aod::BCs, aod::BcSels, aod::Timestamps, aod::Run3MatchedToBCSparse>;
8060

8161
struct LumiStabilityLightIons {
82-
Produces<aod::MyBCaod> BCaod;
8362

8463
Configurable<bool> cfgDoFT0Vtx{"cfgDoFT0Vtx", true, "Create and fill histograms for the FT0 vertex trigger"};
8564
Configurable<bool> cfgDoFT0CE{"cfgDoFT0CE", true, "Create and fill histograms for the FT0 centrality trigger"};
@@ -99,20 +78,12 @@ struct LumiStabilityLightIons {
9978
Configurable<bool> cfgDoBCNSLFDD{"cfgDoBCNSLFDD", true, "Create and fill histograms for non-super-leading BCs w.r.t. FDD activity"};
10079
Configurable<bool> cfgDoBCNSLFT0{"cfgDoBCNSLFT0", true, "Create and fill histograms for non-super-leading BCs w.r.t. FT0 activity"};
10180

102-
Configurable<bool> cfgRequireZDCTriggerForZDCQA{"cfgRequireZDCTriggerForZDCQA", true, "Require ZDC trigger (1ZNC) for filling QA histograms"};
103-
Configurable<bool> cfgRequireTVXTriggerForZDCQA{"cfgRequireTVXTriggerForZDCQA", true, "Require FT0 vertex trigger (MTVX) for filling ZDC QA histograms"};
104-
Configurable<bool> cfgRequireZEDTriggerForZDCQA{"cfgRequireZEDTriggerForZDCQA", true, "Require ZED trigger (1ZNC||1ZNA) for filling QA histograms"};
105-
10681
Configurable<bool> cfgRequireNoT0ForSLBC{"cfgRequireNoT0ForSLBC", false, "Require no T0 signal for definition of super leading BC (otherwise only no FDD)"};
10782

10883
Configurable<int> cfgEmptyBCsBeforeLeadingBC{"cfgEmptyBCsBeforeLeadingBC", 5, "Minimum number of non-B BCs before a BCL leading BC"};
10984
Configurable<int> cfgEmptyBCsBeforeLeadingBCLE{"cfgEmptyBCsBeforeLeadingBCLE", 5, "Minimum number of strictly empty (E-type) BCs before a BCLE leading BC"};
11085
Configurable<int> cfgBCsBeforeSuperLeading{"cfgBCsBeforeSuperLeading", 5, "Minimum number of BCs without FDD/FT0 activity before a super-leading BC"};
11186

112-
Configurable<bool> cfgFillBCao2d{"cfgFillBCao2d", false, "Fill BC ao2d with timestamps and ZDC times"};
113-
Configurable<uint64_t> cfgTstampStartFillingBCao2d{"cfgTstampStartFillingBCao2d", 0, "Minimum value of timestamp for output bc ao2d to be filled"};
114-
Configurable<uint64_t> cfgTstampEndFillingBCao2d{"cfgTstampEndFillingBCao2d", 0, "Maximum value of timestamp for output bc ao2d to be filled"};
115-
11687
Configurable<int> cfgBcShiftFDDForData2023{"cfgBcShiftFDDForData2023", 7, "Number of BCs to shift FDD, applied for 2023 data only"};
11788

11889
std::bitset<o2::constants::lhc::LHCMaxBunches> beamPatternA, beamPatternC;
@@ -156,7 +127,7 @@ struct LumiStabilityLightIons {
156127
kBCNSLFT0 = 11
157128
};
158129

159-
static constexpr std::string_view NBCsVsTimeHistNames[6][12] = {
130+
static constexpr std::string_view NBCsVsTimeHistNames[5][12] = {
160131
{"AllBCs/BC_A/nBCsVsTime", "AllBCs/BC_B/nBCsVsTime", "AllBCs/BC_C/nBCsVsTime", "AllBCs/BC_E/nBCsVsTime", "AllBCs/BC_L/nBCsVsTime", "AllBCs/BC_LE/nBCsVsTime", "AllBCs/BC_NL/nBCsVsTime", "AllBCs/BC_NLE/nBCsVsTime", "AllBCs/BC_SL_FDD/nBCsVsTime", "AllBCs/BC_SL_FT0/nBCsVsTime", "AllBCs/BC_NSL_FDD/nBCsVsTime", "AllBCs/BC_NSL_FT0/nBCsVsTime"},
161132
{"FT0VTx/BC_A/nBCsVsTime", "FT0VTx/BC_B/nBCsVsTime", "FT0VTx/BC_C/nBCsVsTime", "FT0VTx/BC_E/nBCsVsTime", "FT0VTx/BC_L/nBCsVsTime", "FT0VTx/BC_LE/nBCsVsTime", "FT0VTx/BC_NL/nBCsVsTime", "FT0VTx/BC_NLE/nBCsVsTime", "FT0VTx/BC_SL_FDD/nBCsVsTime", "FT0VTx/BC_SL_FT0/nBCsVsTime", "FT0VTx/BC_NSL_FDD/nBCsVsTime", "FT0VTx/BC_NSL_FT0/nBCsVsTime"},
162133
{"FT0CE/BC_A/nBCsVsTime", "FT0CE/BC_B/nBCsVsTime", "FT0CE/BC_C/nBCsVsTime", "FT0CE/BC_E/nBCsVsTime", "FT0CE/BC_L/nBCsVsTime", "FT0CE/BC_LE/nBCsVsTime", "FT0CE/BC_NL/nBCsVsTime", "FT0CE/BC_NLE/nBCsVsTime", "FT0CE/BC_SL_FDD/nBCsVsTime", "FT0CE/BC_SL_FT0/nBCsVsTime", "FT0CE/BC_NSL_FDD/nBCsVsTime", "FT0CE/BC_NSL_FT0/nBCsVsTime"},
@@ -220,10 +191,7 @@ struct LumiStabilityLightIons {
220191
(iBCCategory == kBCNSLFDD && cfgDoBCNSLFDD) || (iBCCategory == kBCNSLFT0 && cfgDoBCNSLFT0)) {
221192
mHistManager.add(Form("%s", std::string(NBCsVsTimeHistNames[iTrigger][iBCCategory]).c_str()), "Time of triggered BCs since the start of fill;#bf{t-t_{SOF} (min)};#bf{#it{N}_{BC}}", HistType::kTH1D, {timeAxis});
222193
mHistManager.add(Form("%s", std::string(NBCsVsBCIDHistNames[iTrigger][iBCCategory]).c_str()), "BC ID of triggered BCs;#bf{BC ID in orbit};#bf{#it{N}_{BC}}", HistType::kTH1D, {bcIDAxis});
223-
mInspectedHistos[iTrigger][iBCCategory] = mHistManager.add<TH1>(
224-
Form("%s", std::string(NBCsInspectedVsBCIDHistNames[iTrigger][iBCCategory]).c_str()),
225-
"Inspected BC ID (denominator for mu);#bf{BC ID in orbit};#bf{#it{N}_{BC}}",
226-
HistType::kTH1D, {bcIDAxis});
194+
mInspectedHistos[iTrigger][iBCCategory] = mHistManager.add<TH1>(Form("%s", std::string(NBCsInspectedVsBCIDHistNames[iTrigger][iBCCategory]).c_str()), "Inspected BC ID (denominator for mu);#bf{BC ID in orbit};#bf{#it{N}_{BC}}", HistType::kTH1D, {bcIDAxis});
227195
}
228196
}
229197
}
@@ -246,19 +214,6 @@ struct LumiStabilityLightIons {
246214
mHistManager.add("FT0Vtx_EvSel/nBCsVsTime", "Time of TVX triggered BCs since the start of fill;;#bf{#it{N}_{BC}}", HistType::kTH1D, {timeAxis});
247215
mHistManager.add("nBCsVsBCID", "Time of TVX triggered BCs since the start of fill;#bf{t-t_{SOF} (min)};#bf{#it{N}_{BC}}", HistType::kTH1D, {bcIDAxis});
248216
mHistManager.add("TFsPerMinute", "TFs seen in this minute (to account for failed jobs);#bf{t-t_{SOF} (min)};#bf{#it{N}_{TFs}}", HistType::kTH1D, {timeAxis});
249-
250-
if (cfgDo1ZNC) {
251-
AxisSpec zdcTimeAxis{200, -50., 50.};
252-
mHistManager.add("ZDCQA/BCHasZDC", "Does the BC have ZDC?;BC has ZDC;Has ZNC according to CTP;#bf{#it{N}_{BC}}", HistType::kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}});
253-
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetYaxis()->SetBinLabel(1, "No CTP trigger");
254-
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetYaxis()->SetBinLabel(2, "CTP triggered");
255-
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetXaxis()->SetBinLabel(1, "No found ZDC");
256-
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetXaxis()->SetBinLabel(2, "Good ZDC");
257-
mHistManager.add("ZDCQA/ZNCTimeVsEnergy", "ZDC properties in BCs with found ZDC;Energy;#bf{ZNC arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH2D, {{1501, -10, 1.5E4}, zdcTimeAxis});
258-
mHistManager.add("ZDCQA/ZDCTimes", "Correlation between ZNA and ZNC timing;#bf{ZNC arrival time (ns)};#bf{ZNA arrival time (ns)}", HistType::kTH2D, {zdcTimeAxis, zdcTimeAxis});
259-
mHistManager.add("ZDCQA/ZNATime", "Time of the ZNA signal;#bf{ZNA arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH1D, {zdcTimeAxis});
260-
mHistManager.add("ZDCQA/ZNCTime", "Time of the ZNC signal;#bf{ZNC arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH1D, {zdcTimeAxis});
261-
}
262217
}
263218

264219
void setLHCIFData(const auto& bc)
@@ -431,64 +386,6 @@ struct LumiStabilityLightIons {
431386
}
432387
}
433388

434-
void processZDCQA(MyBCs const& bcs, aod::Zdcs const&)
435-
{
436-
const int maxTimeZDC = 50;
437-
const float dummyZDCTime = 42.f;
438-
439-
for (const auto& bc : bcs) {
440-
std::bitset<64> ctpInputMask(bc.inputMask());
441-
442-
if (cfgRequireTVXTriggerForZDCQA && !(ctpInputMask.test(2))) {
443-
continue;
444-
}
445-
if (cfgRequireZDCTriggerForZDCQA && !(ctpInputMask.test(25))) {
446-
continue;
447-
}
448-
if (cfgRequireZEDTriggerForZDCQA && !(ctpInputMask.test(24))) {
449-
continue;
450-
}
451-
452-
bool zdcHit = !bc.has_zdc() ? 0 : ((bc.zdc().energyCommonZNC() > -1 && std::abs(bc.zdc().timeZNC()) < 1E5) ? 1 : 0);
453-
mHistManager.fill(HIST("ZDCQA/BCHasZDC"), zdcHit, ctpInputMask.test(25) ? 1 : 0);
454-
455-
if (!bc.has_zdc()) {
456-
continue;
457-
}
458-
459-
mHistManager.fill(HIST("ZDCQA/ZNCTimeVsEnergy"),
460-
bc.zdc().energyCommonZNC() > -1 ? bc.zdc().energyCommonZNC() : -1,
461-
std::abs(bc.zdc().timeZNC()) < maxTimeZDC ? bc.zdc().timeZNC() : dummyZDCTime);
462-
463-
float timeZNA = bc.zdc().timeZNA();
464-
float timeZNC = bc.zdc().timeZNC();
465-
466-
if (std::abs(timeZNA) > maxTimeZDC) {
467-
timeZNA = dummyZDCTime;
468-
mHistManager.fill(HIST("ZDCQA/ZNCTime"), timeZNC);
469-
}
470-
if (std::abs(timeZNC) > maxTimeZDC) {
471-
timeZNC = dummyZDCTime;
472-
if (timeZNA != dummyZDCTime) {
473-
mHistManager.fill(HIST("ZDCQA/ZNATime"), timeZNA);
474-
}
475-
}
476-
477-
mHistManager.fill(HIST("ZDCQA/ZDCTimes"), timeZNA, timeZNC);
478-
479-
uint64_t timestamp = bc.timestamp();
480-
int64_t globalBC = bc.globalBC();
481-
int localBC = globalBC % nBCsPerOrbit;
482-
float amplitudeZNA = bc.zdc().amplitudeZNA();
483-
float amplitudeZNC = bc.zdc().amplitudeZNC();
484-
485-
if (cfgFillBCao2d && timestamp >= cfgTstampStartFillingBCao2d && timestamp <= cfgTstampEndFillingBCao2d) {
486-
BCaod(timestamp, localBC, timeZNA, timeZNC, amplitudeZNA, amplitudeZNC);
487-
}
488-
}
489-
}
490-
PROCESS_SWITCH(LumiStabilityLightIons, processZDCQA, "process QA for the ZDC triggers (light ions and PbPb)", false);
491-
492389
void process(MyBCs const& bcs, aod::FT0s const&, aod::FDDs const&)
493390
{
494391
DenomCounter nBCsPerBcId(nBCsPerOrbit);
@@ -499,17 +396,15 @@ struct LumiStabilityLightIons {
499396
}
500397

501398
for (const auto& bc : bcs) {
502-
if (bc.timestamp() == 0) {
399+
if (bc.timestamp() == 0)
503400
continue;
504-
}
505401

506402
setLHCIFData(bc);
507403

508404
float timeSinceSOF = getTimeSinceSOF(bc);
509405

510-
if (bc.selection_bit(aod::evsel::kIsTriggerTVX)) {
406+
if (bc.selection_bit(aod::evsel::kIsTriggerTVX))
511407
mHistManager.fill(HIST("FT0Vtx_EvSel/nBCsVsTime"), timeSinceSOF);
512-
}
513408

514409
int64_t globalBC = bc.globalBC();
515410
int localBC = static_cast<int>(globalBC % nBCsPerOrbit);
@@ -541,9 +436,8 @@ struct LumiStabilityLightIons {
541436

542437
int64_t globalBCStart = (globalBCLastInspectedBC >= 0 && globalBCLastInspectedBC < globalBC) ? globalBCLastInspectedBC + 1 : globalBC;
543438
const int64_t maxBcGap = 2LL * nBCsPerOrbit;
544-
if (globalBC - globalBCStart > maxBcGap) {
439+
if (globalBC - globalBCStart > maxBcGap)
545440
globalBCStart = globalBC;
546-
}
547441

548442
for (int64_t iGBC = globalBCStart; iGBC <= globalBC; ++iGBC) {
549443
const int iLBC = static_cast<int>((iGBC % nBCsPerOrbit + nBCsPerOrbit) % nBCsPerOrbit);
@@ -578,12 +472,10 @@ struct LumiStabilityLightIons {
578472
}
579473
}
580474

581-
if (anyFDDTrigger) {
475+
if (anyFDDTrigger)
582476
globalBCIdOfLastBCWithActivityFDD = globalBCFDD;
583-
}
584-
if (anyFT0Trigger) {
477+
if (anyFT0Trigger)
585478
globalBCIdOfLastBCWithActivityFT0 = globalBC;
586-
}
587479

588480
globalBCLastInspectedBC = globalBC;
589481

PWGMM/Lumi/Tasks/lumiZdcQa.cxx

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
//
12+
/// \file lumiStabilityLightIons.cxx
13+
/// \brief Analysis over BCs to study the luminosity stability along time
14+
///
15+
/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt
16+
/// \author Stefanie Mrozinski (stefanie.mrozinski@cern.ch) - Goethe University Frankfurt
17+
/// \author Lorenzo Mattei (lorenzo.mattei@cern.ch) - Turin University
18+
19+
#include "Common/CCDB/EventSelectionParams.h"
20+
#include "Common/Core/MetadataHelper.h"
21+
#include "Common/DataModel/EventSelection.h"
22+
23+
#include <CCDB/BasicCCDBManager.h>
24+
#include <CommonConstants/LHCConstants.h>
25+
#include <DataFormatsParameters/AggregatedRunInfo.h>
26+
#include <DataFormatsParameters/GRPLHCIFData.h>
27+
#include <Framework/ASoA.h>
28+
#include <Framework/AnalysisDataModel.h>
29+
#include <Framework/AnalysisHelpers.h>
30+
#include <Framework/AnalysisTask.h>
31+
#include <Framework/Configurable.h>
32+
#include <Framework/HistogramRegistry.h>
33+
#include <Framework/HistogramSpec.h>
34+
#include <Framework/InitContext.h>
35+
#include <Framework/OutputObjHeader.h>
36+
#include <Framework/runDataProcessing.h>
37+
38+
#include <TH1.h>
39+
#include <TH2.h>
40+
41+
#include <array>
42+
#include <bitset>
43+
#include <cstdint>
44+
#include <cstdlib>
45+
46+
using namespace o2;
47+
using namespace o2::framework;
48+
using namespace o2::framework::expressions;
49+
50+
o2::common::core::MetadataHelper metadataInfo;
51+
52+
namespace o2::aod
53+
{
54+
namespace myBc_aod
55+
{
56+
DECLARE_SOA_COLUMN(Timestamp, timestamp, uint64_t);
57+
DECLARE_SOA_COLUMN(BCid, bcId, int);
58+
DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float);
59+
DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float);
60+
DECLARE_SOA_COLUMN(AmplitudeZNA, amplitudeZNA, float);
61+
DECLARE_SOA_COLUMN(AmplitudeZNC, amplitudeZNC, float);
62+
} // namespace myBc_aod
63+
DECLARE_SOA_TABLE(MyBCaod, "AOD", "MYBCAOD",
64+
myBc_aod::Timestamp,
65+
myBc_aod::BCid,
66+
myBc_aod::TimeZNA,
67+
myBc_aod::TimeZNC,
68+
myBc_aod::AmplitudeZNA,
69+
myBc_aod::AmplitudeZNC);
70+
} // namespace o2::aod
71+
72+
using MyBCs = soa::Join<aod::BCs, aod::BcSels, aod::Timestamps, aod::Run3MatchedToBCSparse>;
73+
74+
struct LumiZdcQa {
75+
Produces<aod::MyBCaod> BCaod;
76+
77+
Configurable<bool> cfgRequireZDCTriggerForZDCQA{"cfgRequireZDCTriggerForZDCQA", true, "Require ZDC trigger (1ZNC) for filling QA histograms"};
78+
Configurable<bool> cfgRequireTVXTriggerForZDCQA{"cfgRequireTVXTriggerForZDCQA", true, "Require FT0 vertex trigger (MTVX) for filling ZDC QA histograms"};
79+
Configurable<bool> cfgRequireZEDTriggerForZDCQA{"cfgRequireZEDTriggerForZDCQA", true, "Require ZED trigger (1ZNC||1ZNA) for filling QA histograms"};
80+
81+
Configurable<bool> cfgFillBCao2d{"cfgFillBCao2d", false, "Fill BC ao2d with timestamps and ZDC times"};
82+
Configurable<uint64_t> cfgTstampStartFillingBCao2d{"cfgTstampStartFillingBCao2d", 0, "Minimum value of timestamp for output bc ao2d to be filled"};
83+
Configurable<uint64_t> cfgTstampEndFillingBCao2d{"cfgTstampEndFillingBCao2d", 0, "Maximum value of timestamp for output bc ao2d to be filled"};
84+
85+
const int nBCsPerOrbit = 3564;
86+
87+
HistogramRegistry mHistManager{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false};
88+
89+
void init(InitContext&)
90+
{
91+
AxisSpec zdcTimeAxis{200, -50., 50.};
92+
mHistManager.add("ZDCQA/BCHasZDC", "Does the BC have ZDC?;BC has ZDC;Has ZNC according to CTP;#bf{#it{N}_{BC}}", HistType::kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}});
93+
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetYaxis()->SetBinLabel(1, "No CTP trigger");
94+
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetYaxis()->SetBinLabel(2, "CTP triggered");
95+
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetXaxis()->SetBinLabel(1, "No found ZDC");
96+
mHistManager.get<TH2>(HIST("ZDCQA/BCHasZDC")).get()->GetXaxis()->SetBinLabel(2, "Good ZDC");
97+
mHistManager.add("ZDCQA/ZNCTimeVsEnergy", "ZDC properties in BCs with found ZDC;Energy;#bf{ZNC arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH2D, {{1501, -10, 1.5E4}, zdcTimeAxis});
98+
mHistManager.add("ZDCQA/ZDCTimes", "Correlation between ZNA and ZNC timing;#bf{ZNC arrival time (ns)};#bf{ZNA arrival time (ns)}", HistType::kTH2D, {zdcTimeAxis, zdcTimeAxis});
99+
mHistManager.add("ZDCQA/ZNATime", "Time of the ZNA signal;#bf{ZNA arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH1D, {zdcTimeAxis});
100+
mHistManager.add("ZDCQA/ZNCTime", "Time of the ZNC signal;#bf{ZNC arrival time (ns)};#bf{#it{N}_{BC}}", HistType::kTH1D, {zdcTimeAxis});
101+
}
102+
103+
void process(MyBCs const& bcs, aod::Zdcs const&)
104+
{
105+
const int maxTimeZDC = 50;
106+
const float dummyZDCTime = 42.f;
107+
108+
for (const auto& bc : bcs) {
109+
std::bitset<64> ctpInputMask(bc.inputMask());
110+
111+
if (cfgRequireTVXTriggerForZDCQA && !(ctpInputMask.test(2))) {
112+
continue;
113+
}
114+
if (cfgRequireZDCTriggerForZDCQA && !(ctpInputMask.test(25))) {
115+
continue;
116+
}
117+
if (cfgRequireZEDTriggerForZDCQA && !(ctpInputMask.test(24))) {
118+
continue;
119+
}
120+
121+
bool zdcHit = !bc.has_zdc() ? 0 : ((bc.zdc().energyCommonZNC() > -1 && std::abs(bc.zdc().timeZNC()) < 1E5) ? 1 : 0);
122+
mHistManager.fill(HIST("ZDCQA/BCHasZDC"), zdcHit, ctpInputMask.test(25) ? 1 : 0);
123+
124+
if (!bc.has_zdc()) {
125+
continue;
126+
}
127+
128+
mHistManager.fill(HIST("ZDCQA/ZNCTimeVsEnergy"),
129+
bc.zdc().energyCommonZNC() > -1 ? bc.zdc().energyCommonZNC() : -1,
130+
std::abs(bc.zdc().timeZNC()) < maxTimeZDC ? bc.zdc().timeZNC() : dummyZDCTime);
131+
132+
float timeZNA = bc.zdc().timeZNA();
133+
float timeZNC = bc.zdc().timeZNC();
134+
135+
if (std::abs(timeZNA) > maxTimeZDC) {
136+
timeZNA = dummyZDCTime;
137+
mHistManager.fill(HIST("ZDCQA/ZNCTime"), timeZNC);
138+
}
139+
if (std::abs(timeZNC) > maxTimeZDC) {
140+
timeZNC = dummyZDCTime;
141+
if (timeZNA != dummyZDCTime) {
142+
mHistManager.fill(HIST("ZDCQA/ZNATime"), timeZNA);
143+
}
144+
}
145+
146+
mHistManager.fill(HIST("ZDCQA/ZDCTimes"), timeZNA, timeZNC);
147+
148+
uint64_t timestamp = bc.timestamp();
149+
int64_t globalBC = bc.globalBC();
150+
int localBC = globalBC % nBCsPerOrbit;
151+
float amplitudeZNA = bc.zdc().amplitudeZNA();
152+
float amplitudeZNC = bc.zdc().amplitudeZNC();
153+
154+
if (cfgFillBCao2d && timestamp >= cfgTstampStartFillingBCao2d && timestamp <= cfgTstampEndFillingBCao2d) {
155+
BCaod(timestamp, localBC, timeZNA, timeZNC, amplitudeZNA, amplitudeZNC);
156+
}
157+
}
158+
}
159+
};
160+
161+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
162+
{
163+
metadataInfo.initMetadata(cfgc);
164+
return WorkflowSpec{adaptAnalysisTask<LumiZdcQa>(cfgc)};
165+
}

0 commit comments

Comments
 (0)