Skip to content
Merged
Show file tree
Hide file tree
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
94 changes: 94 additions & 0 deletions Common/Core/fwdtrackUtilities.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
// All rights not expressly granted are reserved.
//
// This software is distributed under the terms of the GNU General Public
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
//
// In applying this license CERN does not waive the privileges and immunities
// granted to it by virtue of its status as an Intergovernmental Organization
// or submit itself to any jurisdiction.

/// \file fwdtrackUtilities.h
/// \brief Utilities for manipulating parameters of fwdtracks
/// \author Maurice Coquet <maurice.louis.coquet@cern.ch>
/// \author Luca Micheletti <luca.micheletti@cern.ch>
/// \author Daiki Sekihata <daiki.sekihata@cern.ch>

#ifndef COMMON_CORE_FWDTRACKUTILITIES_H_
#define COMMON_CORE_FWDTRACKUTILITIES_H_

#include <vector>
#include <utility>
#include "Math/SMatrix.h"
#include "TGeoGlobalMagField.h"

namespace o2::aod
{
namespace fwdtrackutils
{
// Index used to set different options for muon propagation
enum class propagationPoint : int {
kToVertex = 0,
kToDCA = 1,
kToRabs = 2,
};
using SMatrix55 = ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>>;
using SMatrix5 = ROOT::Math::SVector<double, 5>;

/// propagate fwdtrack to a certain point.
template <typename TFwdTrack, typename TCollision>
o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision const& collision, const propagationPoint endPoint)
{
double chi2 = muon.chi2();
SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt());
std::vector<double> v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(),
muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(),
muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()};
SMatrix55 tcovs(v1.begin(), v1.end());
o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2};
o2::dataformats::GlobalFwdTrack propmuon;
o2::globaltracking::MatchGlobalFwd mMatching;

if (static_cast<int>(muon.trackType()) > 2) { // MCH-MID or MCH standalone
o2::dataformats::GlobalFwdTrack track;
track.setParameters(tpars);
track.setZ(fwdtrack.getZ());
track.setCovariances(tcovs);
auto mchTrack = mMatching.FwdtoMCH(track);

if (endPoint == propagationPoint::kToVertex) {
o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY());
}
if (endPoint == propagationPoint::kToDCA) {
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ());
}
if (endPoint == propagationPoint::kToRabs) {
o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.);
}

auto proptrack = mMatching.MCHtoFwd(mchTrack);
propmuon.setParameters(proptrack.getParameters());
propmuon.setZ(proptrack.getZ());
propmuon.setCovariances(proptrack.getCovariances());
} else if (static_cast<int>(muon.trackType()) < 2) { // MFT-MCH-MID
const double centerMFT[3] = {0, 0, -61.4};
o2::field::MagneticField* field = static_cast<o2::field::MagneticField*>(TGeoGlobalMagField::Instance()->GetField());
auto Bz = field->getBz(centerMFT); // Get field at centre of MFT
auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ());
auto x2x0 = static_cast<float>(geoMan.meanX2X0);
fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0);
propmuon.setParameters(fwdtrack.getParameters());
propmuon.setZ(fwdtrack.getZ());
propmuon.setCovariances(fwdtrack.getCovariances());
}

v1.clear();
v1.shrink_to_fit();

return propmuon;
}
} // namespace fwdtrackutils
} // namespace o2::aod

#endif // COMMON_CORE_FWDTRACKUTILITIES_H_
3 changes: 2 additions & 1 deletion Common/DataModel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ o2physics_add_header_only_library(DataModel
MftmchMatchingML.h
ZDCInterCalib.h
EseTable.h
FwdTrackReAlignTables.h)
FwdTrackReAlignTables.h
PropagatedFwdTrackTables.h)
83 changes: 83 additions & 0 deletions Common/DataModel/PropagatedFwdTrackTables.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
// All rights not expressly granted are reserved.
//
// This software is distributed under the terms of the GNU General Public
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
//
// In applying this license CERN does not waive the privileges and immunities
// granted to it by virtue of its status as an Intergovernmental Organization
// or submit itself to any jurisdiction.

/// \file PropagatedFwdTrackTables.h
/// \brief Table definitions for propagated forward tracks
/// \author Maurice Coquet <maurice.louis.coquet@cern.ch>
/// \author Luca Micheletti <luca.micheletti@cern.ch>
/// \author Daiki Sekihata <daiki.sekihata@cern.ch>

#ifndef COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_
#define COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_

#include "Framework/AnalysisDataModel.h"

namespace o2::aod
{
namespace propfwdtrack
{
DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index
DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA
DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA
DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA
DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV
DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV
DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA)
DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA)
} // namespace propfwdtrack

DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", "PROPFWDTRACK",
o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType,
fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl,
fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd,
fwdtrack::Px<fwdtrack::Pt, fwdtrack::Phi>,
fwdtrack::Py<fwdtrack::Pt, fwdtrack::Phi>,
fwdtrack::Pz<fwdtrack::Pt, fwdtrack::Tgl>,
fwdtrack::Sign<fwdtrack::Signed1Pt>,
fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT,
fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId,
fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards,
fwdtrack::TrackTime, fwdtrack::TrackTimeRes,
propfwdtrack::CXXatDCA, propfwdtrack::CYYatDCA, propfwdtrack::CXYatDCA,
propfwdtrack::EtaMatchedMCHMID, propfwdtrack::PhiMatchedMCHMID,
propfwdtrack::IsAssociatedToMPC, propfwdtrack::IsAmbiguous, o2::soa::Marker<1>);

DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracksCov, "PropagatedFwdTracksCov", "AOD", "PROPFWDTRACKCOV", //!
fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt,
fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY,
fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl, o2::soa::Marker<1>);

// extended table with expression columns that can be used as arguments of dynamic columns
DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracks, StoredPropagatedFwdTracks, "PROPFWDTRACKEXT", //!
fwdtrack::Pt,
fwdtrack::Eta,
fwdtrack::P);

// extended table with expression columns that can be used as arguments of dynamic columns
DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracksCov, StoredPropagatedFwdTracksCov, "PROPFWDTRACKCOVEXT", //!
fwdtrack::CXX,
fwdtrack::CXY,
fwdtrack::CYY,
fwdtrack::CPhiX,
fwdtrack::CPhiY,
fwdtrack::CPhiPhi,
fwdtrack::CTglX,
fwdtrack::CTglY,
fwdtrack::CTglPhi,
fwdtrack::CTglTgl,
fwdtrack::C1PtX,
fwdtrack::C1PtY,
fwdtrack::C1PtPhi,
fwdtrack::C1PtTgl,
fwdtrack::C1Pt21Pt2);
} // namespace o2::aod

#endif // COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_
8 changes: 7 additions & 1 deletion Common/TableProducer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,10 @@ o2physics_add_dpl_workflow(mftmch-matching-data-mc
o2physics_add_dpl_workflow(muon-realignment
SOURCES muonRealignment.cxx
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsCommonDataFormats O2::MathUtils O2::MCHTracking O2::DataFormatsMCH O2::GlobalTracking O2::MCHBase O2::MCHGeometryTransformer O2::CommonUtils
COMPONENT_NAME Analysis)
COMPONENT_NAME Analysis)

o2physics_add_dpl_workflow(fwdtrack-propagation
SOURCES fwdtrackPropagation.cxx
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::GlobalTracking
COMPONENT_NAME Analysis)

Loading