Skip to content

Commit 3cee692

Browse files
rolavickalibuild
andauthored
[PWGUD] TauTable producer preparation for MC (#10905)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent db49f47 commit 3cee692

File tree

5 files changed

+215
-4
lines changed

5 files changed

+215
-4
lines changed

PWGUD/DataModel/UDIndex.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
///
13+
/// \file UDIndex.h
14+
/// \author Roman Lavička
15+
/// \since 2025-04-15
16+
/// \brief A table to store indices for association of MC truth to MC reco
17+
///
18+
19+
#ifndef PWGUD_DATAMODEL_UDINDEX_H_
20+
#define PWGUD_DATAMODEL_UDINDEX_H_
21+
22+
#include "Framework/AnalysisDataModel.h"
23+
namespace o2::aod
24+
{
25+
namespace udidx
26+
{
27+
DECLARE_SOA_ARRAY_INDEX_COLUMN(UDTrack, udtracks);
28+
DECLARE_SOA_ARRAY_INDEX_COLUMN(UDCollision, udcollisions);
29+
} // namespace udidx
30+
DECLARE_SOA_TABLE(UDMcParticlesToUDTracks, "AOD", "UDP2UDT", udidx::UDTrackIds);
31+
DECLARE_SOA_TABLE(UDMcCollisionsToUDCollisions, "AOD", "UDMCC2UDC", udidx::UDCollisionIds);
32+
} // namespace o2::aod
33+
#endif // PWGUD_DATAMODEL_UDINDEX_H_

PWGUD/TableProducer/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,13 @@ o2physics_add_dpl_workflow(fwdtrack-propagation
4040
SOURCES fwdTrackPropagation.cxx
4141
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking
4242
COMPONENT_NAME Analysis)
43+
44+
o2physics_add_dpl_workflow(udmcparticles-to-udtracks
45+
SOURCES udMcParticles2udTracks.cxx
46+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
47+
COMPONENT_NAME Analysis)
48+
49+
o2physics_add_dpl_workflow(udmccollisions-to-udcollisions
50+
SOURCES udMcCollisions2udCollisions.cxx
51+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
52+
COMPONENT_NAME Analysis)

PWGUD/TableProducer/tauEventTableProducer.cxx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "Common/DataModel/TrackSelectionTables.h"
4141
#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h"
4242
#include "PWGUD/DataModel/UDTables.h"
43+
#include "PWGUD/DataModel/UDIndex.h" // for UDMcParticles2UDTracks table
4344
#include "PWGUD/Core/SGSelector.h"
4445

4546
// ROOT headers
@@ -144,7 +145,7 @@ struct TauEventTableProducer {
144145
Configurable<bool> useNumContribs{"useNumContribs", false, {"Use coll.numContribs as event cut"}};
145146
Configurable<int> cutRecoFlag{"cutRecoFlag", 1, {"0 = std mode, 1 = upc mode"}};
146147
Configurable<bool> useRecoFlag{"useRecoFlag", false, {"Use coll.flags as event cut"}};
147-
Configurable<float> cutTrueGapSideFV0{"cutTrueGapSideFV0", -1, "FV0A threshold for SG selector"};
148+
Configurable<float> cutTrueGapSideFV0{"cutTrueGapSideFV0", 180000, "FV0A threshold for SG selector"};
148149
Configurable<float> cutTrueGapSideFT0A{"cutTrueGapSideFT0A", 150., "FT0A threshold for SG selector"};
149150
Configurable<float> cutTrueGapSideFT0C{"cutTrueGapSideFT0C", 50., "FT0C threshold for SG selector"};
150151
Configurable<float> cutTrueGapSideZDC{"cutTrueGapSideZDC", 10000., "ZDC threshold for SG selector. 0 is <1n, 4.2 is <2n, 6.7 is <3n, 9.5 is <4n, 12.5 is <5n"};
@@ -193,6 +194,12 @@ struct TauEventTableProducer {
193194
using FullUDTracks = soa::Join<aod::UDTracks, aod::UDTracksExtra, aod::UDTracksDCA, aod::UDTracksPID, aod::UDTracksFlags>;
194195
using FullSGUDCollisions = soa::Join<aod::UDCollisions, aod::UDCollisionsSels, aod::UDCollisionSelExtras, aod::SGCollisions, aod::UDZdcsReduced>;
195196
using FullSGUDCollision = FullSGUDCollisions::iterator;
197+
using FullMCUDTracks = soa::Join<aod::UDTracks, aod::UDTracksExtra, aod::UDTracksDCA, aod::UDTracksPID, aod::UDTracksFlags, aod::UDMcTrackLabels>;
198+
using FullMCSGUDCollisions = soa::Join<aod::UDCollisions, aod::UDCollisionsSels, aod::UDCollisionSelExtras, aod::SGCollisions, aod::UDMcCollsLabels>;
199+
using FullMCSGUDCollision = FullMCSGUDCollisions::iterator;
200+
using UDMcParticlesWithUDTracks = soa::Join<aod::UDMcParticles, aod::UDMcParticlesToUDTracks>;
201+
using UDMcCollisionsWithUDCollisions = soa::Join<aod::UDMcCollisions, aod::UDMcCollisionsToUDCollisions>;
202+
using UDMcCollisionsWithUDCollision = UDMcCollisionsWithUDCollisions::iterator;
196203

197204
// init
198205
void init(InitContext&)
@@ -470,10 +477,21 @@ struct TauEventTableProducer {
470477
tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP,
471478
tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP);
472479
}
473-
474-
} // end processDataSG
475-
480+
}
476481
PROCESS_SWITCH(TauEventTableProducer, processDataSG, "Iterate UD tables with measured data created by SG-Candidate-Producer.", false);
482+
483+
void processMonteCarlo(UDMcCollisionsWithUDCollision const& mccollision,
484+
FullMCSGUDCollisions const&,
485+
FullUDTracks const&,
486+
UDMcParticlesWithUDTracks const&)
487+
{
488+
LOGF(info, "mccollision idx %i", mccollision.globalIndex());
489+
if (mccollision.has_udcollisions()) {
490+
auto const& collFromMcColl = mccollision.udcollisions_as<FullMCSGUDCollisions>();
491+
LOGF(info, "collision size %i ", collFromMcColl.size());
492+
}
493+
}
494+
PROCESS_SWITCH(TauEventTableProducer, processMonteCarlo, "Iterate UD tables with simulated data created by SG-Candidate-Producer.", false);
477495
};
478496

479497
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+
///
13+
/// \file udMcCollisions2udCollisions.cxx
14+
/// \author Roman Lavička
15+
/// \since 2025-04-15
16+
/// \brief A task to create a reverse index from UDMcCollisions to UDCollisions
17+
///
18+
19+
#include <vector>
20+
21+
#include "Framework/runDataProcessing.h"
22+
#include "Framework/AnalysisDataModel.h"
23+
#include "Framework/AnalysisTask.h"
24+
#include "PWGUD/DataModel/UDTables.h"
25+
#include "PWGUD/DataModel/UDIndex.h"
26+
27+
using namespace o2;
28+
using namespace o2::framework;
29+
30+
struct UDMcCollisions2UDCollisions {
31+
using LabeledCollisions = soa::Join<aod::UDCollisions, aod::UDMcCollsLabels>;
32+
Produces<aod::UDMcCollisionsToUDCollisions> udmcc2udc;
33+
34+
std::vector<int> collisionIds;
35+
36+
void init(InitContext&)
37+
{
38+
}
39+
40+
void process(aod::UDMcCollisions const& mcCollisions)
41+
{
42+
if (doprocessIndexingCentral || doprocessIndexingCentralFast) {
43+
udmcc2udc.reserve(mcCollisions.size());
44+
}
45+
}
46+
47+
void processIndexingCentralFast(aod::UDMcCollisions const& mcCollisions, LabeledCollisions const& collisions)
48+
{
49+
// faster version, but will use more memory due to pre-allocation
50+
std::vector<std::vector<int>> mccoll2coll(mcCollisions.size());
51+
for (const auto& collision : collisions) {
52+
if (collision.has_udMcCollision())
53+
mccoll2coll[collision.udMcCollisionId()].push_back(collision.globalIndex());
54+
}
55+
for (const auto& mcCollision : mcCollisions) {
56+
udmcc2udc(mccoll2coll[mcCollision.globalIndex()]);
57+
}
58+
}
59+
PROCESS_SWITCH(UDMcCollisions2UDCollisions, processIndexingCentralFast, "Create reverse index from mccollisions to collision: more memory use but potentially faster", true);
60+
61+
void processIndexingCentral(aod::UDMcCollisions const&, soa::SmallGroups<LabeledCollisions> const& collisions)
62+
{
63+
collisionIds.clear();
64+
for (const auto& collision : collisions) {
65+
collisionIds.push_back(collision.globalIndex());
66+
}
67+
udmcc2udc(collisionIds);
68+
}
69+
PROCESS_SWITCH(UDMcCollisions2UDCollisions, processIndexingCentral, "Create reverse index from mccollisions to collision", false);
70+
};
71+
72+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
73+
{
74+
return WorkflowSpec{adaptAnalysisTask<UDMcCollisions2UDCollisions>(cfgc)};
75+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+
///
13+
/// \file udMcParticles2udTracks.cxx
14+
/// \author Roman Lavička
15+
/// \since 2025-04-15
16+
/// \brief A task to create a reverse index from UDMcParticles to UDTracks
17+
///
18+
19+
#include <vector>
20+
21+
#include "Framework/runDataProcessing.h"
22+
#include "Framework/AnalysisDataModel.h"
23+
#include "Framework/AnalysisTask.h"
24+
#include "PWGUD/DataModel/UDTables.h"
25+
#include "PWGUD/DataModel/UDIndex.h"
26+
27+
using namespace o2;
28+
using namespace o2::framework;
29+
30+
struct UDMcParticlesToUDTracks {
31+
using LabeledTracks = soa::Join<aod::UDTracks, aod::UDMcTrackLabels>;
32+
Produces<aod::UDMcParticlesToUDTracks> udp2udt;
33+
34+
std::vector<int> trackIds;
35+
36+
void init(InitContext&)
37+
{
38+
}
39+
40+
void process(aod::UDMcParticles const& particles)
41+
{
42+
if (doprocessIndexingCentral || doprocessIndexingCentralFast) {
43+
udp2udt.reserve(particles.size());
44+
}
45+
}
46+
47+
void processIndexingCentralFast(aod::UDMcParticles const& mcParticles, LabeledTracks const& tracks)
48+
{
49+
// faster version, but will use more memory due to pre-allocation
50+
std::vector<std::vector<int>> part2track(mcParticles.size());
51+
for (const auto& track : tracks) {
52+
if (track.has_udMcParticle())
53+
part2track[track.udMcParticleId()].push_back(track.globalIndex());
54+
}
55+
for (const auto& mcParticle : mcParticles) {
56+
udp2udt(part2track[mcParticle.globalIndex()]);
57+
}
58+
}
59+
PROCESS_SWITCH(UDMcParticlesToUDTracks, processIndexingCentralFast, "Create reverse index from particles to tracks: more memory use but potentially faster", true);
60+
61+
void processIndexingCentral(aod::UDMcParticles const&, soa::SmallGroups<LabeledTracks> const& tracks)
62+
{
63+
trackIds.clear();
64+
for (const auto& track : tracks) {
65+
trackIds.push_back(track.globalIndex());
66+
}
67+
udp2udt(trackIds);
68+
}
69+
PROCESS_SWITCH(UDMcParticlesToUDTracks, processIndexingCentral, "Create reverse index from particles to tracks", false);
70+
};
71+
72+
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
73+
{
74+
return WorkflowSpec{adaptAnalysisTask<UDMcParticlesToUDTracks>(cfgc)};
75+
}

0 commit comments

Comments
 (0)