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,120 @@ 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 <typename T, float Min, float Max>
188+ struct binningParent {
189+ public:
190+ using binned_t = 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 = static_cast <float >(Min);
197+ static constexpr float binned_max = static_cast <float >(Max);
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 void print ()
202+ {
203+ LOG (info) << " Binning: " << binned_min << " - " << binned_max << " with " << nbins << " bins, width = "
204+ << bin_width << " . Overflow bin " << static_cast <int >(overflowBin) << " Underflow bin " << static_cast <int >(underflowBin);
205+ }
206+ };
207+
208+ using trkdca_v0 = binningParent<int8_t , -2 .0f , 2 .0f >;
209+ using trkphi_v0 = binningParent<uint16_t , 0 .0f , o2::constants::math::TwoPI>;
210+ using trkamp_v0 = binningParent<uint16_t , 0 .0f , 5000 .0f >;
211+ using trkpt_v0 = binningParent<uint16_t , 0 .0f , 20 .0f >;
212+ using trketa_v0 = binningParent<int16_t , -5 .0f , 5 .0f >;
213+ using trkchi2_v0 = binningParent<int8_t , 0 .0f , 10 .0f >;
214+
215+ using trkdca = trkdca_v0;
216+ using trkchi2 = trkchi2_v0;
217+ using trkpt = trkpt_v0;
218+ using trketa = trketa_v0;
219+ using trkphi = trkphi_v0;
220+ using trkamp = trkamp_v0;
221+
222+ } // namespace binning
223+
141224DECLARE_SOA_INDEX_COLUMN (LRCollision, lrCollision);
142225DECLARE_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 );
226+ DECLARE_SOA_COLUMN (ChannelID, channelID, uint8_t );
227+ DECLARE_SOA_COLUMN (AmplitudeStore, amplitudeStore, binning::trkamp::binned_t );
149228DECLARE_SOA_COLUMN (InvMass, invMass, float );
150229DECLARE_SOA_COLUMN (IdPos, idPos, int64_t );
151230DECLARE_SOA_COLUMN (IdNeg, idNeg, int64_t );
152231DECLARE_SOA_COLUMN (TrackType, trackType, uint8_t );
153232DECLARE_SOA_COLUMN (V0Type, v0Type, uint8_t );
233+ DECLARE_SOA_COLUMN (AmbDegree, ambDegree, uint8_t );
234+ DECLARE_SOA_COLUMN (TPCNClsFound, tpcNClsFound, uint8_t );
235+ DECLARE_SOA_COLUMN (TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t );
236+ DECLARE_SOA_COLUMN (TPCChi2NClStore, tpcChi2NClStore, binning::trkchi2::binned_t ); // ! Stored binned chi2
237+ DECLARE_SOA_COLUMN (DCAzStore, dcazStore, binning::trkdca::binned_t ); // ! Stored binned dcaz
238+ DECLARE_SOA_COLUMN (BestDCAxyStore, bestdcaxyStore, binning::trkdca::binned_t ); // ! Stored binned best dcaxy
239+ DECLARE_SOA_COLUMN (BestDCAzStore, bestdcazStore, binning::trkdca::binned_t ); // ! Stored binned best dcaz
240+ DECLARE_SOA_COLUMN (PtStore, ptStore, binning::trkpt::binned_t ); // ! Stored binned pt
241+ DECLARE_SOA_COLUMN (EtaStore, etaStore, binning::trketa::binned_t ); // ! Stored binned eta
242+ DECLARE_SOA_COLUMN (PhiStore, phiStore, binning::trkphi::binned_t ); // ! Stored binned phi
243+ DECLARE_SOA_DYNAMIC_COLUMN (TPCChi2NCl, tpcChi2NCl,
244+ [](binning::trkchi2::binned_t chi2_binned) -> float { return unPack<binning::trkchi2>(chi2_binned); });
245+ DECLARE_SOA_DYNAMIC_COLUMN (DCAz, dcaZ,
246+ [](binning::trkdca::binned_t dcaz_binned) -> float { return unPackSymmetric<binning::trkdca>(dcaz_binned); });
247+ DECLARE_SOA_DYNAMIC_COLUMN (Pt, pt,
248+ [](binning::trkpt::binned_t pt_binned) -> float { return unPack<binning::trkpt>(pt_binned); });
249+ DECLARE_SOA_DYNAMIC_COLUMN (Eta, eta,
250+ [](binning::trketa::binned_t eta_binned) -> float { return unPackSymmetric<binning::trketa>(eta_binned); });
251+ DECLARE_SOA_DYNAMIC_COLUMN (Phi, phi,
252+ [](binning::trkphi::binned_t phi_binned) -> float { return unPackSymmetric<binning::trkphi>(phi_binned); });
253+ DECLARE_SOA_DYNAMIC_COLUMN (BestDCAXY, bestDCAXY,
254+ [](binning::trkdca::binned_t bestdcaxy_binned) -> float { return unPackSymmetric<binning::trkdca>(bestdcaxy_binned); });
255+ DECLARE_SOA_DYNAMIC_COLUMN (BestDCAZ, bestDCAZ,
256+ [](binning::trkdca::binned_t bestdcaz_binned) -> float { return unPackSymmetric<binning::trkdca>(bestdcaz_binned); });
257+ DECLARE_SOA_DYNAMIC_COLUMN (Amplitude, amplitude,
258+ [](binning::trkamp::binned_t amp_binned) -> float { return unPack<binning::trkamp>(amp_binned); });
154259enum TrackPid {
155260 kSpCharge ,
156261 kSpPion ,
@@ -168,116 +273,150 @@ enum V0TrackPid {
168273DECLARE_SOA_TABLE (LRMidTracks, " AOD" , " LRMIDTRACK" ,
169274 o2::soa::Index<>,
170275 lrcorrtrktable::LRCollisionId,
171- lrcorrtrktable::Pt,
172- lrcorrtrktable::Eta,
173- lrcorrtrktable::Phi,
174- lrcorrtrktable::TrackType);
276+ lrcorrtrktable::TPCNClsFound,
277+ lrcorrtrktable::TPCNClsCrossedRows,
278+ lrcorrtrktable::TPCChi2NClStore,
279+ lrcorrtrktable::PtStore,
280+ lrcorrtrktable::EtaStore,
281+ lrcorrtrktable::PhiStore,
282+ lrcorrtrktable::DCAzStore,
283+ lrcorrtrktable::TrackType,
284+ lrcorrtrktable::TPCChi2NCl<lrcorrtrktable::TPCChi2NClStore>,
285+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
286+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
287+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>,
288+ lrcorrtrktable::DCAz<lrcorrtrktable::DCAzStore>);
175289using LRMidTrack = LRMidTracks::iterator;
176290
177291DECLARE_SOA_TABLE (LRFt0aTracks, " AOD" , " LRFT0ATRACK" ,
178292 o2::soa::Index<>,
179293 lrcorrtrktable::LRCollisionId,
180294 lrcorrtrktable::ChannelID,
181- lrcorrtrktable::Amplitude,
182- lrcorrtrktable::GainAmplitude,
183- lrcorrtrktable::Eta,
184- lrcorrtrktable::Phi);
295+ lrcorrtrktable::AmplitudeStore,
296+ lrcorrtrktable::EtaStore,
297+ lrcorrtrktable::PhiStore,
298+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
299+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
300+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
185301using LRFt0aTrack = LRFt0aTracks::iterator;
186302
187303DECLARE_SOA_TABLE (LRFt0cTracks, " AOD" , " LRFT0CTRACK" ,
188304 o2::soa::Index<>,
189305 lrcorrtrktable::LRCollisionId,
190306 lrcorrtrktable::ChannelID,
191- lrcorrtrktable::Amplitude,
192- lrcorrtrktable::GainAmplitude,
193- lrcorrtrktable::Eta,
194- lrcorrtrktable::Phi);
307+ lrcorrtrktable::AmplitudeStore,
308+ lrcorrtrktable::EtaStore,
309+ lrcorrtrktable::PhiStore,
310+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
311+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
312+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
195313using LRFt0cTrack = LRFt0cTracks::iterator;
196314
197315DECLARE_SOA_TABLE (LRV0Tracks, " AOD" , " LRV0TRACK" ,
198316 o2::soa::Index<>,
199317 lrcorrtrktable::LRCollisionId,
200318 lrcorrtrktable::IdPos,
201319 lrcorrtrktable::IdNeg,
202- lrcorrtrktable::Pt ,
203- lrcorrtrktable::Eta ,
204- lrcorrtrktable::Phi ,
320+ lrcorrtrktable::PtStore ,
321+ lrcorrtrktable::EtaStore ,
322+ lrcorrtrktable::PhiStore ,
205323 lrcorrtrktable::InvMass,
206- lrcorrtrktable::V0Type);
324+ lrcorrtrktable::V0Type,
325+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
326+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
327+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
207328using LRV0Track = LRV0Tracks::iterator;
208329
209330DECLARE_SOA_TABLE (LRMftTracks, " AOD" , " LRMFTTRACK" ,
210331 o2::soa::Index<>,
211332 lrcorrtrktable::LRCollisionId,
212- lrcorrtrktable::Pt,
213- lrcorrtrktable::Eta,
214- lrcorrtrktable::Phi);
333+ lrcorrtrktable::AmbDegree,
334+ lrcorrtrktable::PtStore,
335+ lrcorrtrktable::EtaStore,
336+ lrcorrtrktable::PhiStore,
337+ fwdtrack::NClusters,
338+ lrcorrtrktable::BestDCAxyStore,
339+ lrcorrtrktable::BestDCAzStore,
340+ lrcorrtrktable::BestDCAXY<lrcorrtrktable::BestDCAxyStore>,
341+ lrcorrtrktable::BestDCAZ<lrcorrtrktable::BestDCAzStore>,
342+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
343+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
344+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
215345using LRMftTrack = LRMftTracks::iterator;
216346
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-
225347DECLARE_SOA_TABLE (UpcLRMidTracks, " AOD" , " UPCLRMIDTRACK" ,
226348 o2::soa::Index<>,
227349 lrcorrtrktable::UpcLRCollisionId,
228- lrcorrtrktable::Pt,
229- lrcorrtrktable::Eta,
230- lrcorrtrktable::Phi,
231- lrcorrtrktable::TrackType);
350+ lrcorrtrktable::TPCNClsFound,
351+ lrcorrtrktable::TPCNClsCrossedRows,
352+ lrcorrtrktable::TPCChi2NClStore,
353+ lrcorrtrktable::PtStore,
354+ lrcorrtrktable::EtaStore,
355+ lrcorrtrktable::PhiStore,
356+ lrcorrtrktable::DCAzStore,
357+ lrcorrtrktable::TrackType,
358+ lrcorrtrktable::TPCChi2NCl<lrcorrtrktable::TPCChi2NClStore>,
359+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
360+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
361+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>,
362+ lrcorrtrktable::DCAz<lrcorrtrktable::DCAzStore>);
232363using UpcLRMidTrack = UpcLRMidTracks::iterator;
233364
234365DECLARE_SOA_TABLE (UpcLRFt0aTracks, " AOD" , " UPCLRFT0ATRACK" ,
235366 o2::soa::Index<>,
236367 lrcorrtrktable::UpcLRCollisionId,
237368 lrcorrtrktable::ChannelID,
238- lrcorrtrktable::Amplitude,
239- lrcorrtrktable::GainAmplitude,
240- lrcorrtrktable::Eta,
241- lrcorrtrktable::Phi);
369+ lrcorrtrktable::AmplitudeStore,
370+ lrcorrtrktable::EtaStore,
371+ lrcorrtrktable::PhiStore,
372+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
373+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
374+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
242375using UpcLRFt0aTrack = UpcLRFt0aTracks::iterator;
243376
244377DECLARE_SOA_TABLE (UpcLRFt0cTracks, " AOD" , " UPCLRFT0CTRACK" ,
245378 o2::soa::Index<>,
246379 lrcorrtrktable::UpcLRCollisionId,
247380 lrcorrtrktable::ChannelID,
248- lrcorrtrktable::Amplitude,
249- lrcorrtrktable::GainAmplitude,
250- lrcorrtrktable::Eta,
251- lrcorrtrktable::Phi);
381+ lrcorrtrktable::AmplitudeStore,
382+ lrcorrtrktable::EtaStore,
383+ lrcorrtrktable::PhiStore,
384+ lrcorrtrktable::Amplitude<lrcorrtrktable::AmplitudeStore>,
385+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
386+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
252387using UpcLRFt0cTrack = UpcLRFt0cTracks::iterator;
253388
254389DECLARE_SOA_TABLE (UpcLRV0Tracks, " AOD" , " UPCLRV0TRACK" ,
255390 o2::soa::Index<>,
256391 lrcorrtrktable::UpcLRCollisionId,
257392 lrcorrtrktable::IdPos,
258393 lrcorrtrktable::IdNeg,
259- lrcorrtrktable::Pt ,
260- lrcorrtrktable::Eta ,
261- lrcorrtrktable::Phi ,
394+ lrcorrtrktable::PtStore ,
395+ lrcorrtrktable::EtaStore ,
396+ lrcorrtrktable::PhiStore ,
262397 lrcorrtrktable::InvMass,
263- lrcorrtrktable::V0Type);
398+ lrcorrtrktable::V0Type,
399+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
400+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
401+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
264402using UpcLRV0Track = UpcLRV0Tracks::iterator;
265403
266404DECLARE_SOA_TABLE (UpcLRMftTracks, " AOD" , " UPCLRMFTTRACK" ,
267405 o2::soa::Index<>,
268406 lrcorrtrktable::UpcLRCollisionId,
269- lrcorrtrktable::Pt,
270- lrcorrtrktable::Eta,
271- lrcorrtrktable::Phi);
407+ lrcorrtrktable::AmbDegree,
408+ lrcorrtrktable::PtStore,
409+ lrcorrtrktable::EtaStore,
410+ lrcorrtrktable::PhiStore,
411+ fwdtrack::NClusters,
412+ lrcorrtrktable::BestDCAxyStore,
413+ lrcorrtrktable::BestDCAzStore,
414+ lrcorrtrktable::BestDCAXY<lrcorrtrktable::BestDCAxyStore>,
415+ lrcorrtrktable::BestDCAZ<lrcorrtrktable::BestDCAzStore>,
416+ lrcorrtrktable::Pt<lrcorrtrktable::PtStore>,
417+ lrcorrtrktable::Eta<lrcorrtrktable::EtaStore>,
418+ lrcorrtrktable::Phi<lrcorrtrktable::PhiStore>);
272419using 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;
281420} // namespace o2::aod
282421
283422#endif // PWGCF_TWOPARTICLECORRELATIONS_DATAMODEL_LONGRANGEDERIVED_H_
0 commit comments