1717
1818#include " treeCreatorPidTpcQa.h"
1919
20+ #include " Common/CCDB/ctpRateFetcher.h"
2021#include " Common/DataModel/EventSelection.h"
2122#include " Common/DataModel/Multiplicity.h"
2223#include " Common/DataModel/PIDResponseTOF.h"
2324#include " Common/DataModel/PIDResponseTPC.h"
2425#include " Common/DataModel/TrackSelectionTables.h"
2526#include " DPG/Tasks/TPC/tpcSkimsTableCreator.h"
27+ #include " DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h"
2628
29+ #include < CCDB/BasicCCDBManager.h>
2730#include < Framework/ASoA.h>
2831#include < Framework/AnalysisHelpers.h>
2932#include < Framework/AnalysisTask.h>
3538#include < ReconstructionDataFormats/PID.h>
3639
3740#include < cmath>
41+ #include < string>
3842
3943using namespace o2 ;
4044using namespace o2 ::framework;
4145using namespace o2 ::track;
42- using namespace o2 ::dpg_pidtpcqa ;
46+ using namespace o2 ::dpg_tpcskimstablecreator ;
4347
4448struct treeCreatorPidTpcQa {
4549 Produces<o2::aod::QaPidTpc> rowPidTpcQa;
@@ -52,6 +56,12 @@ struct treeCreatorPidTpcQa {
5256 Configurable<int16_t > cutMinTPCNcls{" cutMinTPCNcls" , 0 , " Minimum number or TPC Clusters for tracks" };
5357 Configurable<float > cutRapidity{" cutRapidity" , 0.5 , " Rapidity cut. Set negative value to switch this cut off" };
5458 Configurable<float > nClNorm{" nClNorm" , 152 ., " Number of cluster normalization. Run 2: 159, Run 3 152" };
59+ // Configurable for the path of CCDB General Run Parameters LHC Interface information
60+ Configurable<std::string> ccdbPathGrpLhcIf{" ccdbPathGrpLhcIf" , " GLO/Config/GRPLHCIF" , " Path on the CCDB for the GRPLHCIF object" };
61+
62+ Service<o2::ccdb::BasicCCDBManager> ccdb{};
63+
64+ ctpRateFetcher mRateFetcher {};
5565
5666 using CollisionsExtra = soa::Join<aod::Collisions, aod::Mults, aod::EvSels>;
5767 using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection>;
@@ -60,25 +70,6 @@ struct treeCreatorPidTpcQa {
6070
6171 int mEnabledParticles {0 };
6272
63- // Track selection
64- template <typename TrackType>
65- bool isTrackSelected (const TrackType& track)
66- {
67- bool isSelected{false };
68- isSelected |= trackSelection == TrackSelectionNoCut;
69- isSelected |= (trackSelection == TrackSelectionGlobalTrack) && track.isGlobalTrack ();
70- isSelected |= (trackSelection == TrackSelectionTrackWoPtEta) && track.isGlobalTrackWoPtEta ();
71- isSelected |= (trackSelection == TrackSelectionGlobalTrackWoDCA) && track.isGlobalTrackWoDCA ();
72- isSelected |= (trackSelection == TrackSelectionQualityTracks) && track.isQualityTrack ();
73- isSelected |= (trackSelection == TrackSelectionInAcceptanceTracks) && track.isInAcceptanceTrack ();
74- isSelected &= (!requireGlobalTrack || track.isGlobalTrack ());
75- isSelected &= (!requireIts || track.hasITS ());
76- isSelected &= track.hasTPC ();
77- isSelected &= (track.tpcNClsFound () >= cutMinTPCNcls);
78-
79- return isSelected;
80- }
81-
8273 template <o2::track::PID ::ID Id>
8374 bool initPerParticle ()
8475 {
@@ -125,6 +116,10 @@ struct treeCreatorPidTpcQa {
125116 static_for<0 , PID ::Alpha>([&](auto Id) {
126117 mEnabledParticles += static_cast <int >(initPerParticle<Id>());
127118 });
119+
120+ ccdb->setURL (" http://alice-ccdb.cern.ch" );
121+ ccdb->setCaching (true );
122+ ccdb->setFatalWhenNull (false );
128123 }
129124
130125 template <o2::track::PID ::ID Id, typename TrackType>
@@ -133,20 +128,35 @@ struct treeCreatorPidTpcQa {
133128 {
134129 rowPidTpcQa.reserve (tracks.size () * mEnabledParticles );
135130
131+ std::string irSource{};
132+ float sqrtSNN{}; // placeholder to satisfy evaluateIrSourceAndSqrtSnn's signature
133+ bool isFirstCollision{true };
136134 for (const auto & collision : collisions) {
137135 if (!isEventSelected (collision, applyEvSel) || ((cutVtxZ > 0 .f ) && std::abs (collision.posZ ()) > cutVtxZ)) {
138136 continue ;
139137 }
140138
139+ const auto bc = collision.bc_as <aod::BCsWithTimestamps>();
140+ if (isFirstCollision) {
141+ evaluateIrSourceAndSqrtSnn (ccdb, ccdbPathGrpLhcIf, bc.timestamp (), irSource, sqrtSNN);
142+ }
143+ isFirstCollision = false ;
141144 const float ft0Occ = collision.ft0cOccupancyInTimeRange ();
142- const float multTPC = collision.multTPC () / dpg_tpcskimstablecreator::MultiplicityNorm;
145+ const float multTPC = collision.multTPC () / MultiplicityNorm;
146+ const auto hadronicRate = !irSource.empty () ? mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource) * OneToKilo : 0 .;
143147
144148 const auto tracksFromCollision = tracks.sliceBy (perCollisionTracks, static_cast <int >(collision.globalIndex ()));
145149
146150 for (const auto & track : tracksFromCollision) {
147- if (!isTrackSelected (track)) {
151+ bool isGoodTrack = isTrackSelected (track, trackSelection);
152+ isGoodTrack &= (!requireGlobalTrack || track.isGlobalTrack ());
153+ isGoodTrack &= (!requireIts || track.hasITS ());
154+ isGoodTrack &= track.hasTPC ();
155+ isGoodTrack &= (track.tpcNClsFound () >= cutMinTPCNcls);
156+ if (!isGoodTrack) {
148157 continue ;
149158 }
159+
150160 const float rapidity = track.rapidity (PID::getMass (Id));
151161 if (cutRapidity > 0 .f && std::fabs (rapidity) > cutRapidity) {
152162 continue ;
@@ -157,15 +167,16 @@ struct treeCreatorPidTpcQa {
157167 const float tgl = track.tgl ();
158168 const float tpcInnerParam = track.tpcInnerParam ();
159169
160- rowPidTpcQa (Id, ft0Occ, multTPC, nClNormalized, phi, tgl, tpcInnerParam, rapidity);
161- } // tracks
170+ rowPidTpcQa (Id, ft0Occ, hadronicRate, multTPC, nClNormalized, phi, tgl, tpcInnerParam, rapidity);
171+ } // tracksFromCollision
162172 } // collisions
163173 }
164174
165175 // QA of nsigma only tables
166176#define MAKE_PROCESS_FUNCTION (PidTableTPC, ParticleId ) \
167177 void process##ParticleId(CollisionsExtra const & collisions, \
168- soa::Join<TrackCandidates, PidTableTPC> const & tracks) \
178+ soa::Join<TrackCandidates, PidTableTPC> const & tracks, \
179+ aod::BCsWithTimestamps const &) \
169180 { \
170181 processSingleParticle<PID ::ParticleId>(collisions, tracks); \
171182 } \
@@ -185,7 +196,8 @@ struct treeCreatorPidTpcQa {
185196// QA of full tables
186197#define MAKE_PROCESS_FUNCTION (PidTableTPC, ParticleId ) \
187198 void processFull##ParticleId(CollisionsExtra const & collisions, \
188- soa::Join<TrackCandidates, PidTableTPC> const & tracks) \
199+ soa::Join<TrackCandidates, PidTableTPC> const & tracks, \
200+ aod::BCsWithTimestamps const &) \
189201 { \
190202 processSingleParticle<PID ::ParticleId>(collisions, tracks); \
191203 } \
@@ -205,7 +217,8 @@ struct treeCreatorPidTpcQa {
205217 // QA of full tables with TOF information
206218#define MAKE_PROCESS_FUNCTION (PidTableTPC, PidTableTOF, ParticleId ) \
207219 void processFullWithTOF##ParticleId(CollisionsExtra const & collisions, \
208- soa::Join<TrackCandidates, PidTableTPC, PidTableTOF> const & tracks) \
220+ soa::Join<TrackCandidates, PidTableTPC, PidTableTOF> const & tracks, \
221+ aod::BCsWithTimestamps const &) \
209222 { \
210223 processSingleParticle<PID ::ParticleId>(collisions, tracks); \
211224 } \
0 commit comments