1616#include " Framework/runDataProcessing.h"
1717#include " Framework/AnalysisTask.h"
1818#include < TH2F.h>
19+ #include < TMap.h>
20+ #include < TObjString.h>
21+ #include < TString.h>
1922
2023using namespace o2 ;
2124using namespace o2 ::framework;
2225using namespace o2 ::framework::expressions;
2326
27+ // pT cut applied when producing the skimmed derived dataset; the same value is
28+ // published as run metadata so it lands in the derived AO2D's metaData object.
29+ static constexpr float kSkimPtCut = 1 .5f ;
30+
2431namespace o2 ::aod
2532{
2633O2ORIGIN (" EMB" );
@@ -38,8 +45,8 @@ DECLARE_SOA_TABLE(SkimmedExampleTrack, "AOD", "SKIMEXTRK", //!
3845struct EtaAndClsHistogramsSimple {
3946 OutputObj<TH2F > etaClsH{TH2F (" eta_vs_pt" , " #eta vs pT" , 102 , -2.01 , 2.01 , 100 , 0 , 10 )};
4047 Produces<o2::aod::SkimmedExampleTrack> skimEx;
41- Configurable<std::string> trackFilterString{" track-filter" , " o2::aod::track::pt < 10.f " , " Track filter string" };
42- Filter trackFilter = o2::aod::track::pt < 10 .f ;
48+ Configurable<std::string> trackFilterString{" track-filter" , " " , " Track filter string (overrides the pT cut when set) " };
49+ Filter trackFilter = o2::aod::track::pt < kSkimPtCut ;
4350
4451 HistogramRegistry registry{
4552 " registry" ,
@@ -88,8 +95,8 @@ struct EtaAndClsHistogramsSimple {
8895struct EtaAndClsHistogramsIUSimple {
8996 OutputObj<TH2F > etaClsH{TH2F (" eta_vs_pt" , " #eta vs pT" , 102 , -2.01 , 2.01 , 100 , 0 , 10 )};
9097 Produces<o2::aod::SkimmedExampleTrack> skimEx;
91- Configurable<std::string> trackFilterString{" track-filter" , " o2::aod::track::pt < 10.f " , " Track filter string" };
92- Filter trackFilter = o2::aod::track::pt < 10 .f ;
98+ Configurable<std::string> trackFilterString{" track-filter" , " " , " Track filter string (overrides the pT cut when set) " };
99+ Filter trackFilter = o2::aod::track::pt < kSkimPtCut ;
93100
94101 HistogramRegistry registry{
95102 " registry" ,
@@ -136,8 +143,8 @@ struct EtaAndClsHistogramsFull {
136143 } //
137144 };
138145
139- Configurable<std::string> trackFilterString{" track-filter" , " o2::aod::track::pt < 10.f " , " Track filter string" };
140- Filter trackFilter = o2::aod::track::pt < 10 .f ;
146+ Configurable<std::string> trackFilterString{" track-filter" , " " , " Track filter string (overrides the pT cut when set) " };
147+ Filter trackFilter = o2::aod::track::pt < kSkimPtCut ;
141148
142149 void init (InitContext&)
143150 {
@@ -183,25 +190,37 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
183190 LOGP (info, " - {} present." , table);
184191 }
185192 // Notice it's important for the tasks to use the same name, otherwise topology generation will be confused.
193+ WorkflowSpec specs;
186194 if (runType == " 2" || !hasTrackCov) {
187195 LOGP (info, " Using only tracks {}" , runType);
188196 if (hasTrackIU) {
189- return WorkflowSpec{
190- adaptAnalysisTask<EtaAndClsHistogramsIUSimple>(cfgc, TaskName{ " simple-histos " }),
191- };
197+ specs = WorkflowSpec{adaptAnalysisTask<EtaAndClsHistogramsIUSimple>(cfgc, TaskName{ " simple-histos " })};
198+ } else {
199+ specs = WorkflowSpec{adaptAnalysisTask<EtaAndClsHistogramsSimple>(cfgc, TaskName{ " simple-histos " }) };
192200 }
193- return WorkflowSpec{
194- adaptAnalysisTask<EtaAndClsHistogramsSimple>(cfgc, TaskName{" simple-histos" }),
195- };
196201 } else {
197202 LOGP (info, " Using tracks extra {}" , runType);
198203 if (hasTrackIU) {
199- return WorkflowSpec{
200- adaptAnalysisTask<EtaAndClsHistogramsIUSimple>(cfgc, TaskName{ " simple-histos " }),
201- };
204+ specs = WorkflowSpec{adaptAnalysisTask<EtaAndClsHistogramsIUSimple>(cfgc, TaskName{ " simple-histos " })};
205+ } else {
206+ specs = WorkflowSpec{adaptAnalysisTask<EtaAndClsHistogramsFull>(cfgc, TaskName{ " simple-histos " }) };
202207 }
203- return WorkflowSpec{
204- adaptAnalysisTask<EtaAndClsHistogramsFull>(cfgc, TaskName{" simple-histos" }),
205- };
206208 }
209+
210+ // Publish the skimming pT cut as run metadata, once per data frame so it is
211+ // aligned with the derived tables. The auto-injected metadata collector merges
212+ // all META messages (oldest-possible completion) and the AOD writer stores the
213+ // result as the metaData object of the derived AO2D file.
214+ specs.push_back (DataProcessorSpec{
215+ .name = " skim-metadata" ,
216+ .inputs = {InputSpec{" tfn" , " TFN" , " TFNumber" }},
217+ .outputs = {OutputSpec{{" meta" }, " META" , " SKIMINFO" , 0 , Lifetime::Sporadic}},
218+ .algorithm = adaptStateless ([](ProcessingContext& pc) {
219+ TMap m;
220+ m.SetOwnerKeyValue ();
221+ m.Add (new TObjString (" SkimTrackPtCut" ), new TObjString (TString::Format (" %g" , kSkimPtCut )));
222+ pc.outputs ().snapshot (Output{" META" , " SKIMINFO" , 0 }, m);
223+ }),
224+ });
225+ return specs;
207226}
0 commit comments