1818#ifndef PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_
1919#define PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_
2020
21+ #include " PWGMM/Mult/DataModel/bestCollisionTable.h"
22+
2123#include " Common/DataModel/Multiplicity.h"
24+ #include " Common/DataModel/TrackSelectionTables.h"
2225
26+ #include < CommonConstants/MathConstants.h>
2327#include < Framework/ASoA.h>
2428#include < Framework/AnalysisDataModel.h>
2529
@@ -138,19 +142,121 @@ using LRZdc = LRZdcs::iterator;
138142
139143namespace lrcorrtrktable
140144{
145+
146+ template <typename binningType>
147+ inline typename binningType::binned_t packInTable (const float & valueToBin)
148+ {
149+ if (valueToBin <= binningType::binned_min) {
150+ return binningType::underflowBin;
151+ } else if (valueToBin >= binningType::binned_max) {
152+ return binningType::overflowBin;
153+ } else {
154+ return static_cast <typename binningType::binned_t >((valueToBin - binningType::binned_min) / binningType::bin_width);
155+ }
156+ }
157+
158+ template <typename binningType>
159+ inline float unPack (const typename binningType::binned_t & b)
160+ {
161+ return binningType::bin_width * b + binningType::binned_min;
162+ }
163+
164+ template <typename binningType>
165+ inline typename binningType::binned_t packSymmetric (const float & valueToBin)
166+ {
167+ if (valueToBin <= binningType::binned_min) {
168+ return (binningType::underflowBin);
169+ } else if (valueToBin >= binningType::binned_max) {
170+ return (binningType::overflowBin);
171+ } else if (valueToBin >= 0 ) {
172+ return (static_cast <typename binningType::binned_t >((valueToBin * binningType::inv_bin_width) + 0 .5f ));
173+ } else {
174+ return (static_cast <typename binningType::binned_t >((valueToBin * binningType::inv_bin_width) - 0 .5f ));
175+ }
176+ }
177+
178+ template <typename binningType>
179+ inline float unPackSymmetric (const typename binningType::binned_t & b)
180+ {
181+ return binningType::bin_width * static_cast <float >(b);
182+ }
183+
184+ namespace binning
185+ {
186+
187+ template <std::pair<float , float > lim, typename binVariable = int8_t >
188+ struct binningParent {
189+ public:
190+ typedef binVariable binned_t ;
191+
192+ // Reserve two bins: one for overflow and one for underflow
193+ static constexpr int nbins = (1 << (8 * sizeof (binned_t ))) - 2 ;
194+ static constexpr binned_t overflowBin = nbins;
195+ static constexpr binned_t underflowBin = -1 ;
196+ static constexpr float binned_min = lim.first;
197+ static constexpr float binned_max = lim.second;
198+ static constexpr float binned_center = 0.5 * (binned_min + binned_max);
199+ static constexpr float bin_width = (binned_max - binned_min) / static_cast <float >(nbins);
200+ static constexpr float inv_bin_width = 1 . / bin_width;
201+ static_assert (binned_min < binned_max, " Invalid binning range" );
202+ static void print ()
203+ {
204+ LOG (info) << " Binning: " << binned_min << " - " << binned_max << " with " << nbins << " bins, width = "
205+ << bin_width << " . Overflow bin " << static_cast <int >(overflowBin) << " Underflow bin " << static_cast <int >(underflowBin);
206+ }
207+ };
208+
209+ using trkdca_v0 = binningParent<std::pair<float , float >(-2 .0f , 2 .0f ), int8_t >;
210+ using trkphi_v0 = binningParent<std::pair<float , float >(0 .0f , o2::constants::math::TwoPI), uint16_t >;
211+ using trkamp_v0 = binningParent<std::pair<float , float >(0 .0f , 5000 .0f ), uint16_t >;
212+ using trkpt_v0 = binningParent<std::pair<float , float >(0 .0f , 10 .0f ), uint8_t >;
213+ using trketa_v0 = binningParent<std::pair<float , float >(-5 .0f , 5 .0f ), int16_t >;
214+ using trkchi2_v0 = binningParent<std::pair<float , float >(0 .0f , 10 .0f ), int8_t >;
215+
216+ using trkdca = trkdca_v0;
217+ using trkchi2 = trkchi2_v0;
218+ using trkpt = trkpt_v0;
219+ using trketa = trketa_v0;
220+ using trkphi = trkphi_v0;
221+ using trkamp = trkamp_v0;
222+
223+ } // namespace binning
224+
141225DECLARE_SOA_INDEX_COLUMN (LRCollision, lrCollision);
142226DECLARE_SOA_INDEX_COLUMN (UpcLRCollision, upcLRCollision);
143- DECLARE_SOA_COLUMN (Pt, pt, float );
144- DECLARE_SOA_COLUMN (Eta, eta, float );
145- DECLARE_SOA_COLUMN (Phi, phi, float );
146- DECLARE_SOA_COLUMN (ChannelID, channelID, int );
147- DECLARE_SOA_COLUMN (Amplitude, amplitude, float );
148- DECLARE_SOA_COLUMN (GainAmplitude, gainAmplitude, float );
227+ DECLARE_SOA_COLUMN (ChannelID, channelID, uint8_t );
228+ DECLARE_SOA_COLUMN (AmplitudeStore, amplitudeStore, binning::trkamp::binned_t );
149229DECLARE_SOA_COLUMN (InvMass, invMass, float );
150230DECLARE_SOA_COLUMN (IdPos, idPos, int64_t );
151231DECLARE_SOA_COLUMN (IdNeg, idNeg, int64_t );
152232DECLARE_SOA_COLUMN (TrackType, trackType, uint8_t );
153233DECLARE_SOA_COLUMN (V0Type, v0Type, uint8_t );
234+ DECLARE_SOA_COLUMN (AmbDegree, ambDegree, uint8_t );
235+ DECLARE_SOA_COLUMN (TPCNClsFound, tpcNClsFound, uint8_t );
236+ DECLARE_SOA_COLUMN (TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t );
237+ DECLARE_SOA_COLUMN (TPCChi2NClStore, tpcChi2NClStore, binning::trkchi2::binned_t ); // ! Stored binned chi2
238+ DECLARE_SOA_COLUMN (DCAzStore, dcazStore, binning::trkdca::binned_t ); // ! Stored binned dcaz
239+ DECLARE_SOA_COLUMN (BestDCAxyStore, bestdcaxyStore, binning::trkdca::binned_t ); // ! Stored binned best dcaxy
240+ DECLARE_SOA_COLUMN (BestDCAzStore, bestdcazStore, binning::trkdca::binned_t ); // ! Stored binned best dcaz
241+ DECLARE_SOA_COLUMN (PtStore, ptStore, binning::trkpt::binned_t ); // ! Stored binned pt
242+ DECLARE_SOA_COLUMN (EtaStore, etaStore, binning::trketa::binned_t ); // ! Stored binned eta
243+ DECLARE_SOA_COLUMN (PhiStore, phiStore, binning::trkphi::binned_t ); // ! Stored binned phi
244+ DECLARE_SOA_DYNAMIC_COLUMN (TPCChi2NCl, tpcChi2NCl,
245+ [](binning::trkchi2::binned_t chi2_binned) -> float { return unPack<binning::trkchi2>(chi2_binned); });
246+ DECLARE_SOA_DYNAMIC_COLUMN (DCAz, dcaZ,
247+ [](binning::trkdca::binned_t dcaz_binned) -> float { return unPackSymmetric<binning::trkdca>(dcaz_binned); });
248+ DECLARE_SOA_DYNAMIC_COLUMN (Pt, pt,
249+ [](binning::trkpt::binned_t pt_binned) -> float { return unPack<binning::trkpt>(pt_binned); });
250+ DECLARE_SOA_DYNAMIC_COLUMN (Eta, eta,
251+ [](binning::trketa::binned_t eta_binned) -> float { return unPackSymmetric<binning::trketa>(eta_binned); });
252+ DECLARE_SOA_DYNAMIC_COLUMN (Phi, phi,
253+ [](binning::trkphi::binned_t phi_binned) -> float { return unPackSymmetric<binning::trkphi>(phi_binned); });
254+ DECLARE_SOA_DYNAMIC_COLUMN (BestDCAXY, bestDCAXY,
255+ [](binning::trkdca::binned_t bestdcaxy_binned) -> float { return unPackSymmetric<binning::trkdca>(bestdcaxy_binned); });
256+ DECLARE_SOA_DYNAMIC_COLUMN (BestDCAZ, bestDCAZ,
257+ [](binning::trkdca::binned_t bestdcaz_binned) -> float { return unPackSymmetric<binning::trkdca>(bestdcaz_binned); });
258+ DECLARE_SOA_DYNAMIC_COLUMN (Amplitude, amplitude,
259+ [](binning::trkamp::binned_t amp_binned) -> float { return unPack<binning::trkamp>(amp_binned); });
154260enum TrackPid {
155261 kSpCharge ,
156262 kSpPion ,
@@ -168,116 +274,150 @@ enum V0TrackPid {
168274DECLARE_SOA_TABLE (LRMidTracks, " AOD" , " LRMIDTRACK" ,
169275 o2::soa::Index<>,
170276 lrcorrtrktable::LRCollisionId,
171- lrcorrtrktable::Pt,
172- lrcorrtrktable::Eta,
173- lrcorrtrktable::Phi,
174- lrcorrtrktable::TrackType);
277+ lrcorrtrktable::TPCNClsFound,
278+ lrcorrtrktable::TPCNClsCrossedRows,
279+ lrcorrtrktable::TPCChi2NClStore,
280+ lrcorrtrktable::PtStore,
281+ lrcorrtrktable::EtaStore,
282+ lrcorrtrktable::PhiStore,
283+ lrcorrtrktable::DCAzStore,
284+ lrcorrtrktable::TrackType,
285+ lrcorrtrktable::TPCChi2NCl<lrcorrtrktable::TPCChi2NClStore>,
286+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
287+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
288+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>,
289+ lrcorrtrktable::DCAz<lrcorrtrktable::DCAzStore>);
175290using LRMidTrack = LRMidTracks::iterator;
176291
177292DECLARE_SOA_TABLE (LRFt0aTracks, " AOD" , " LRFT0ATRACK" ,
178293 o2::soa::Index<>,
179294 lrcorrtrktable::LRCollisionId,
180295 lrcorrtrktable::ChannelID,
181- lrcorrtrktable::Amplitude,
182- lrcorrtrktable::GainAmplitude,
183- lrcorrtrktable::Eta,
184- lrcorrtrktable::Phi);
296+ lrcorrtrktable::AmplitudeStore,
297+ lrcorrtrktable::EtaStore,
298+ lrcorrtrktable::PhiStore,
299+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
300+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
301+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
185302using LRFt0aTrack = LRFt0aTracks::iterator;
186303
187304DECLARE_SOA_TABLE (LRFt0cTracks, " AOD" , " LRFT0CTRACK" ,
188305 o2::soa::Index<>,
189306 lrcorrtrktable::LRCollisionId,
190307 lrcorrtrktable::ChannelID,
191- lrcorrtrktable::Amplitude,
192- lrcorrtrktable::GainAmplitude,
193- lrcorrtrktable::Eta,
194- lrcorrtrktable::Phi);
308+ lrcorrtrktable::AmplitudeStore,
309+ lrcorrtrktable::EtaStore,
310+ lrcorrtrktable::PhiStore,
311+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
312+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
313+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
195314using LRFt0cTrack = LRFt0cTracks::iterator;
196315
197316DECLARE_SOA_TABLE (LRV0Tracks, " AOD" , " LRV0TRACK" ,
198317 o2::soa::Index<>,
199318 lrcorrtrktable::LRCollisionId,
200319 lrcorrtrktable::IdPos,
201320 lrcorrtrktable::IdNeg,
202- lrcorrtrktable::Pt ,
203- lrcorrtrktable::Eta ,
204- lrcorrtrktable::Phi ,
321+ lrcorrtrktable::PtStore ,
322+ lrcorrtrktable::EtaStore ,
323+ lrcorrtrktable::PhiStore ,
205324 lrcorrtrktable::InvMass,
206- lrcorrtrktable::V0Type);
325+ lrcorrtrktable::V0Type,
326+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
327+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
328+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
207329using LRV0Track = LRV0Tracks::iterator;
208330
209331DECLARE_SOA_TABLE (LRMftTracks, " AOD" , " LRMFTTRACK" ,
210332 o2::soa::Index<>,
211333 lrcorrtrktable::LRCollisionId,
212- lrcorrtrktable::Pt,
213- lrcorrtrktable::Eta,
214- lrcorrtrktable::Phi);
334+ lrcorrtrktable::AmbDegree,
335+ lrcorrtrktable::PtStore,
336+ lrcorrtrktable::EtaStore,
337+ lrcorrtrktable::PhiStore,
338+ fwdtrack::NClusters,
339+ lrcorrtrktable::BestDCAxyStore,
340+ lrcorrtrktable::BestDCAzStore,
341+ lrcorrtrktable::BestDCAXY<lrcorrtrktable::BestDCAxyStore>,
342+ lrcorrtrktable::BestDCAZ<lrcorrtrktable::BestDCAzStore>,
343+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
344+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
345+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
215346using LRMftTrack = LRMftTracks::iterator;
216347
217- DECLARE_SOA_TABLE (LRMftBestTracks, " AOD" , " LRMFTBESTTRACK" ,
218- o2::soa::Index<>,
219- lrcorrtrktable::LRCollisionId,
220- lrcorrtrktable::Pt,
221- lrcorrtrktable::Eta,
222- lrcorrtrktable::Phi);
223- using LRMftBestTrack = LRMftBestTracks::iterator;
224-
225348DECLARE_SOA_TABLE (UpcLRMidTracks, " AOD" , " UPCLRMIDTRACK" ,
226349 o2::soa::Index<>,
227350 lrcorrtrktable::UpcLRCollisionId,
228- lrcorrtrktable::Pt,
229- lrcorrtrktable::Eta,
230- lrcorrtrktable::Phi,
231- lrcorrtrktable::TrackType);
351+ lrcorrtrktable::TPCNClsFound,
352+ lrcorrtrktable::TPCNClsCrossedRows,
353+ lrcorrtrktable::TPCChi2NClStore,
354+ lrcorrtrktable::PtStore,
355+ lrcorrtrktable::EtaStore,
356+ lrcorrtrktable::PhiStore,
357+ lrcorrtrktable::DCAzStore,
358+ lrcorrtrktable::TrackType,
359+ lrcorrtrktable::TPCChi2NCl<lrcorrtrktable::TPCChi2NClStore>,
360+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
361+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
362+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>,
363+ lrcorrtrktable::DCAz<lrcorrtrktable::DCAzStore>);
232364using UpcLRMidTrack = UpcLRMidTracks::iterator;
233365
234366DECLARE_SOA_TABLE (UpcLRFt0aTracks, " AOD" , " UPCLRFT0ATRACK" ,
235367 o2::soa::Index<>,
236368 lrcorrtrktable::UpcLRCollisionId,
237369 lrcorrtrktable::ChannelID,
238- lrcorrtrktable::Amplitude,
239- lrcorrtrktable::GainAmplitude,
240- lrcorrtrktable::Eta,
241- lrcorrtrktable::Phi);
370+ lrcorrtrktable::AmplitudeStore,
371+ lrcorrtrktable::EtaStore,
372+ lrcorrtrktable::PhiStore,
373+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
374+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
375+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
242376using UpcLRFt0aTrack = UpcLRFt0aTracks::iterator;
243377
244378DECLARE_SOA_TABLE (UpcLRFt0cTracks, " AOD" , " UPCLRFT0CTRACK" ,
245379 o2::soa::Index<>,
246380 lrcorrtrktable::UpcLRCollisionId,
247381 lrcorrtrktable::ChannelID,
248- lrcorrtrktable::Amplitude,
249- lrcorrtrktable::GainAmplitude,
250- lrcorrtrktable::Eta,
251- lrcorrtrktable::Phi);
382+ lrcorrtrktable::AmplitudeStore,
383+ lrcorrtrktable::EtaStore,
384+ lrcorrtrktable::PhiStore,
385+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
386+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
387+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
252388using UpcLRFt0cTrack = UpcLRFt0cTracks::iterator;
253389
254390DECLARE_SOA_TABLE (UpcLRV0Tracks, " AOD" , " UPCLRV0TRACK" ,
255391 o2::soa::Index<>,
256392 lrcorrtrktable::UpcLRCollisionId,
257393 lrcorrtrktable::IdPos,
258394 lrcorrtrktable::IdNeg,
259- lrcorrtrktable::Pt ,
260- lrcorrtrktable::Eta ,
261- lrcorrtrktable::Phi ,
395+ lrcorrtrktable::PtStore ,
396+ lrcorrtrktable::EtaStore ,
397+ lrcorrtrktable::PhiStore ,
262398 lrcorrtrktable::InvMass,
263- lrcorrtrktable::V0Type);
399+ lrcorrtrktable::V0Type,
400+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
401+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
402+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
264403using UpcLRV0Track = UpcLRV0Tracks::iterator;
265404
266405DECLARE_SOA_TABLE (UpcLRMftTracks, " AOD" , " UPCLRMFTTRACK" ,
267406 o2::soa::Index<>,
268407 lrcorrtrktable::UpcLRCollisionId,
269- lrcorrtrktable::Pt,
270- lrcorrtrktable::Eta,
271- lrcorrtrktable::Phi);
408+ lrcorrtrktable::AmbDegree,
409+ lrcorrtrktable::PtStore,
410+ lrcorrtrktable::EtaStore,
411+ lrcorrtrktable::PhiStore,
412+ fwdtrack::NClusters,
413+ lrcorrtrktable::BestDCAxyStore,
414+ lrcorrtrktable::BestDCAzStore,
415+ lrcorrtrktable::BestDCAXY<lrcorrtrktable::BestDCAxyStore>,
416+ lrcorrtrktable::BestDCAZ<lrcorrtrktable::BestDCAzStore>,
417+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
418+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
419+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
272420using UpcLRMftTrack = UpcLRMftTracks::iterator;
273-
274- DECLARE_SOA_TABLE (UpcLRMftBestTracks, " AOD" , " UPCLRMFTBESTTRACK" ,
275- o2::soa::Index<>,
276- lrcorrtrktable::UpcLRCollisionId,
277- lrcorrtrktable::Pt,
278- lrcorrtrktable::Eta,
279- lrcorrtrktable::Phi);
280- using UpcLRMftBestTrack = UpcLRMftBestTracks::iterator;
281421} // namespace o2::aod
282422
283423#endif // PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_
0 commit comments