Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.

Check failure on line 1 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/workflow-file]

Name of a workflow file must match the name of the main struct in it (without the PWG prefix). (Class implementation files should be in "Core" directories.)

Check failure on line 1 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/o2-task]

Specify task name only when it cannot be derived from the struct name. Only append to the default name.
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
// All rights not expressly granted are reserved.
//
Expand Down Expand Up @@ -51,6 +51,7 @@
#include <cmath>
#include <cstdint>
#include <map>
#include <set>
#include <string>
#include <string_view>
#include <unordered_map>
Expand Down Expand Up @@ -81,7 +82,7 @@
namespace pwgem::pm::recalculatedtofpid
{
DECLARE_SOA_COLUMN(BetaRecalculated, betaRecalculated, float);
DECLARE_SOA_COLUMN(TOFNSigmaElRecalculated, tofNSigmaElRecalculated, float);

Check failure on line 85 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/o2-column]

Use UpperCamelCase for names of O2 columns and matching lowerCamelCase names for their getters.
} // namespace pwgem::pm::recalculatedtofpid

DECLARE_SOA_TABLE(EMTOFNSigmas, "AOD", "EMTOFNSIGMA", // make std::map in your tasks later. // Don't store this table in the derived data.
Expand All @@ -103,8 +104,14 @@

Produces<aod::EMTOFNSigmas> emtofs;

enum class enumFillingMode {
SingleTrack = 1,
EpEmPairs = 2,
EpEmPairsAndPhoton = 3
};

// Configurables
Configurable<std::string> ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};

Check failure on line 114 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/configurable]

Use lowerCamelCase for names of configurables and use the same name for the struct member as for the JSON string. (Declare the type and names on the same line.)
Configurable<std::string> grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"};
Configurable<std::string> grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"};
Configurable<bool> skipGRPOquery{"skipGRPOquery", true, "skip grpo query"};
Expand Down Expand Up @@ -139,9 +146,13 @@
Configurable<bool> requireTOF{"requireTOF", false, "require TOF hit"};
Configurable<float> min_pin_for_pion_rejection{"min_pin_for_pion_rejection", 0.0, "pion rejection is applied above this pin"}; // this is used only in TOFreq
Configurable<float> max_pin_for_pion_rejection{"max_pin_for_pion_rejection", 0.5, "pion rejection is applied below this pin"};
Configurable<float> maxMee{"maxMee", 0.04, "max. mee to store dalitz ee pairs"};
Configurable<float> minMee{"minMee", 0., "min. mee to store dalitz ee pairs"};
Configurable<float> maxMee{"maxMee", 0.5, "max. mee to store dalitz ee pairs"};
Configurable<float> minMeegamma{"minMeegamma", 0.3, "min. mee to store eegamma candidates"};
Configurable<float> maxMeegamma{"maxMeegamma", 0.8, "max. mee to store eegamma candidates"};
Configurable<bool> fillLS{"fillLS", true, "flag to fill LS histograms for QA"};
Configurable<bool> fillWithPairs{"fillWithPairs", false, "flag to fill table based on pair information"};
Configurable<int> fillingMode{"fillingMode", 1, "Filling mode| 1: fill tracks without pair selection, 2: fill tracks from selected pairs, 3: fill tracks from selected pairs that can be combined with a photon"};
Configurable<bool> fillWithEtaMassCut{"fillWithEtaMassCut", true, "only valid for fillingmode 3; true: filling tabled based on eta candidate selection with minMeegamma < M < maxMeegamma, false: fill identical to fillingmode 2"};
Configurable<bool> includeITSsa{"includeITSsa", false, "Flag to include ITSsa tracks"};
Configurable<float> maxpt_itssa{"maxpt_itssa", 0.15, "max pt for ITSsa track"}; // o2-linter: disable=name/function-variable (renaming configs would mess up hyperloop)
Configurable<float> maxMeanITSClusterSize{"maxMeanITSClusterSize", 16, "max <ITS cluster size> x cos(lambda)"};
Expand Down Expand Up @@ -248,6 +259,8 @@
return;
}

o2::base::Propagator::initFieldFromGRP(&bc.grpMagField());

auto run3grpTimestamp = bc.timestamp();

dBz = bc.grpMagField().getNominalL3Field();
Expand Down Expand Up @@ -337,7 +350,7 @@
}
if (storeOnlyTrueElectronMC) {
const auto& mcParticle = track.template mcParticle_as<aod::McParticles>();
if (std::abs(mcParticle.pdgCode()) != 11) {

Check failure on line 353 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[magic-number]

Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant.

Check failure on line 353 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[pdg/explicit-code]

Avoid hard-coded PDG codes. Use named values from PDG_t or o2::constants::physics::Pdg instead.
return false;
}
}
Expand Down Expand Up @@ -423,7 +436,7 @@
}

int total_cluster_size = 0, nl = 0;
for (unsigned int layer = 0; layer < 7; layer++) {

Check failure on line 439 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[magic-number]

Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant.
int cluster_size_per_layer = track.itsClsSizeInLayer(layer);
if (cluster_size_per_layer > 0) {
nl++;
Expand Down Expand Up @@ -451,7 +464,7 @@
{
if (includeITSsa && (track.hasITS() && !track.hasTPC() && !track.hasTRD() && !track.hasTOF())) [[unlikely]] {
int total_cluster_size = 0, nl = 0;
for (unsigned int layer = 0; layer < 7; layer++) {

Check failure on line 467 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[magic-number]

Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant.
int cluster_size_per_layer = track.itsClsSizeInLayer(layer);
if (cluster_size_per_layer > 0) {
nl++;
Expand Down Expand Up @@ -538,7 +551,8 @@
fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPt"), v12.M(), v12.Pt());
fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPhiV"), phiv, v12.M());

if (v12.M() > maxMee) { // don't store
// to do: test if minMee > Mpion show effect on S/B
if (v12.M() < minMee || v12.M() > maxMee) { // don't store //|| v12.M() > maxMee
continue;
}

Expand Down Expand Up @@ -577,7 +591,7 @@
}
} // end of ULS pairing
} else { // LS
for (auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(tracks1, tracks2))) {

Check failure on line 594 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[const-ref-in-for-loop]

Use constant references for non-modified iterators in range-based for loops.
if (!checkTrack<isMC>(collision, t1) || !checkTrack<isMC>(collision, t2)) {
continue;
}
Expand Down Expand Up @@ -713,32 +727,88 @@
continue;
}

auto varFillingMode = static_cast<enumFillingMode>(fillingMode.value);

const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex());
const auto& posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
const auto& negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
const auto& slicedTracks = tracks.sliceBy(perTracksCollision, collision.globalIndex());
acceptedPosTrackIds_per_collision.reserve(posTracks_per_coll.size());
acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size());

if (!fillWithPairs) {
fillTrackInfo<false>(collision, slicedTracks);
} else {
fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}

if ((v0photons_per_coll.size() >= 1 && !acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
const auto& pos = tracks.rawIteratorAt(posId);
fillTrackTable<false>(collision, pos);
auto iterEp = tracks.begin();
auto iterEm = tracks.begin();
auto iterTrack = tracks.begin();
auto iterPhoton = v0photons.begin();

switch (varFillingMode) {
case enumFillingMode::SingleTrack:
fillTrackInfo<false>(collision, slicedTracks);
break;
case enumFillingMode::EpEmPairs:
fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}
if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
fillTrackTable<false>(collision, iterEp);
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
fillTrackTable<false>(collision, iterEm);
}
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
const auto& ele = tracks.rawIteratorAt(eleId);
fillTrackTable<false>(collision, ele);
break;
case enumFillingMode::EpEmPairsAndPhoton:
std::set<int64_t> tracksToFill;

fillPairInfo<false, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<false, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<false, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}
}
if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) {
if (!fillWithEtaMassCut) {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
fillTrackTable<false>(collision, iterEp);
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
fillTrackTable<false>(collision, iterEm);
}
} else {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron);
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron);
for (const auto& photonId : v0photons_per_coll) {
iterPhoton.setCursor(photonId.globalIndex());
ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton);
ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton;

if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store
continue;
}
tracksToFill.insert(posId); // store independently
tracksToFill.insert(eleId);
}
}
}
}
}
if (fillWithEtaMassCut) {
for (const auto& trackId : tracksToFill) {
iterTrack.setCursor(trackId);
fillTrackTable<false>(collision, iterTrack);
}
}
break;
}

acceptedPosTrackIds_per_collision.clear();
Expand Down Expand Up @@ -808,7 +878,7 @@
Partition<MyTracksMC> posTracksMC = o2::aod::track::signed1Pt > 0.f;
Partition<MyTracksMC> negTracksMC = o2::aod::track::signed1Pt < 0.f;
// ---------- for MC ----------
void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices)
void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices, aod::McParticles const&)
{
uint64_t nCollisSel = 0;
uint64_t nNoMcColl = 0;
Expand Down Expand Up @@ -836,6 +906,8 @@
}
nProcessedCollisions++;

auto varFillingMode = static_cast<enumFillingMode>(fillingMode.value);

const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex());
const auto& posTracks_per_coll = posTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
const auto& negTracks_per_coll = negTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache);
Expand All @@ -844,25 +916,80 @@
acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size());
acceptedTrackIds_per_collision.reserve(2 * (negTracks_per_coll.size()));

if (!fillWithPairs) {
fillTrackInfo<true>(collision, slicedTracks);
} else {
fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}
if ((acceptedPosTrackIds_per_collision.empty() && acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) { // v0photons_per_coll.size() >= 1 &&
for (const auto& posId : acceptedPosTrackIds_per_collision) {
const auto& pos = tracks.rawIteratorAt(posId);
fillTrackTable<true>(collision, pos);
auto iterEp = tracks.begin();
auto iterEm = tracks.begin();
auto iterTrack = tracks.begin();
auto iterPhoton = v0photons.begin();

switch (varFillingMode) {
case enumFillingMode::SingleTrack:
fillTrackInfo<true>(collision, slicedTracks);
break;
case enumFillingMode::EpEmPairs:
fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
const auto& ele = tracks.rawIteratorAt(eleId);
fillTrackTable<true>(collision, ele);
if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
fillTrackTable<true>(collision, iterEp);
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
fillTrackTable<true>(collision, iterEm);
}
}
}
} // end of fill loop
break;
case enumFillingMode::EpEmPairsAndPhoton:
std::set<int64_t> tracksToFill;

fillPairInfo<true, 0>(collision, posTracks_per_coll, negTracks_per_coll); // ULS
if (fillLS) {
fillPairInfo<true, 1>(collision, posTracks_per_coll, posTracks_per_coll); // LS++
fillPairInfo<true, 2>(collision, negTracks_per_coll, negTracks_per_coll); // LS--
}
if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) {
if (!fillWithEtaMassCut) {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
fillTrackTable<true>(collision, iterEp);
}
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
fillTrackTable<true>(collision, iterEm);
}
} else {
for (const auto& posId : acceptedPosTrackIds_per_collision) {
iterEp.setCursor(posId);
ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron);
for (const auto& eleId : acceptedNegTrackIds_per_collision) {
iterEm.setCursor(eleId);
ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron);
for (const auto& photonId : v0photons_per_coll) {
iterPhoton.setCursor(photonId.globalIndex());
ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton);
ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton;

if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store
continue;
}
tracksToFill.insert(posId); // store independently
tracksToFill.insert(eleId);
}
}
}
}
}
if (fillWithEtaMassCut) {
for (const auto& trackId : tracksToFill) {
iterTrack.setCursor(trackId);
fillTrackTable<true>(collision, iterTrack);
}
}
break;
}

acceptedPosTrackIds_per_collision.clear();
acceptedNegTrackIds_per_collision.clear();
Expand All @@ -878,14 +1005,10 @@
PROCESS_SWITCH(skimmerPrimaryElectronFromDalitzEE, processMC, "process reconstructed and MC info ", true);
};

// WorkflowSpec defineDataProcessing(ConfigContext const& context)
// {
// return WorkflowSpec{adaptAnalysisTask<skimmerPrimaryElectronFromDalitzEE>(context, TaskName{"skimmer-primary-electron-from-dalitzee"})};
// }
WorkflowSpec defineDataProcessing(ConfigContext const& context)
{
o2::pid::tof::TOFResponseImpl::metadataInfo.initMetadata(context);

return WorkflowSpec{
adaptAnalysisTask<skimmerPrimaryElectronFromDalitzEE>(context, TaskName{"skimmer-primary-electron-from-dalitzee"})};

Check failure on line 1013 in PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[name/o2-task]

Device names skimmer-primary-electron-from-dalitzee and skimmer-primary-electron-from-dalitz-e-e generated from the specified task name skimmer-primary-electron-from-dalitzee and from the struct name skimmerPrimaryElectronFromDalitzEE, respectively, differ in hyphenation. Consider fixing capitalisation of the struct name to SkimmerPrimaryElectronFromDalitzee and removing TaskName.
}
Loading