3636#include " GFW.h"
3737#include " GFWCumulant.h"
3838#include " GFWWeights.h"
39+ #include " FlowContainer.h"
3940#include " TList.h"
4041#include < TProfile.h>
4142#include < TRandom3.h>
@@ -60,6 +61,8 @@ struct FlowRunbyRun {
6061 O2_DEFINE_CONFIGURABLE (cfgCutDCAz, float , 2 .0f , " max DCA to vertex z" )
6162 O2_DEFINE_CONFIGURABLE (cfgUseNch, bool , false , " Use Nch for flow observables" )
6263 Configurable<std::vector<int >> cfgRunNumbers{" cfgRunNumbers" , std::vector<int >{544095 , 544098 , 544116 , 544121 , 544122 , 544123 , 544124 }, " Preconfigured run numbers" };
64+ Configurable<std::vector<std::string>> cfgUserDefineGFWCorr{" cfgUserDefineGFWCorr" , std::vector<std::string>{" refN10 {2} refP10 {-2}" }, " User defined GFW CorrelatorConfig" };
65+ Configurable<std::vector<std::string>> cfgUserDefineGFWName{" cfgUserDefineGFWName" , std::vector<std::string>{" Ch10Gap22" }, " User defined GFW Name" };
6366
6467 ConfigurableAxis axisVertex{" axisVertex" , {20 , -10 , 10 }, " vertex axis for histograms" };
6568 ConfigurableAxis axisPhi{" axisPhi" , {60 , 0.0 , constants::math::TwoPI}, " phi axis for histograms" };
@@ -76,11 +79,15 @@ struct FlowRunbyRun {
7679 Configurable<std::string> url{" ccdb-url" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
7780
7881 // Define output
82+ OutputObj<FlowContainer> fFC {FlowContainer (" FlowContainer" )};
7983 HistogramRegistry registry{" registry" };
8084
8185 // define global variables
8286 GFW* fGFW = new GFW();
8387 std::vector<GFW::CorrConfig> corrconfigs;
88+ std::vector<GFW::CorrConfig> corrconfigsFC;
89+ TAxis* fPtAxis ;
90+ TRandom3* fRndm = new TRandom3(0 );
8491 std::vector<int > RunNumbers; // vector of run numbers
8592 std::map<int , std::vector<std::shared_ptr<TH1>>> TH1sList; // map of histograms for all runs
8693 std::map<int , std::vector<std::shared_ptr<TProfile>>> ProfilesList; // map of profiles for all runs
@@ -114,12 +121,43 @@ struct FlowRunbyRun {
114121 CreateOutputObjectsForRun (runNumber);
115122 }
116123
124+ o2::framework::AxisSpec axis = axisPt;
125+ int nPtBins = axis.binEdges .size () - 1 ;
126+ double * PtBins = &(axis.binEdges )[0 ];
127+ fPtAxis = new TAxis (nPtBins, PtBins);
128+
129+ // Create FlowContainer
130+ TObjArray* oba = new TObjArray ();
131+ std::vector<std::string> UserDefineGFWCorr = cfgUserDefineGFWCorr;
132+ std::vector<std::string> UserDefineGFWName = cfgUserDefineGFWName;
133+ if (!UserDefineGFWCorr.empty () && !UserDefineGFWName.empty ()) {
134+ for (uint i = 0 ; i < UserDefineGFWName.size (); i++) {
135+ oba->Add (new TNamed (UserDefineGFWName.at (i).c_str (), UserDefineGFWName.at (i).c_str ()));
136+ }
137+ }
138+ fFC ->SetName (" FlowContainer" );
139+ fFC ->SetXAxis (fPtAxis );
140+ fFC ->Initialize (oba, axisIndependent, 1 );
141+ delete oba;
142+
117143 fGFW ->AddRegion (" full" , -0.8 , 0.8 , 1 , 1 );
118144 fGFW ->AddRegion (" refN10" , -0.8 , -0.5 , 1 , 1 );
119145 fGFW ->AddRegion (" refP10" , 0.5 , 0.8 , 1 , 1 );
120146 corrconfigs.resize (kCount_TProfileNames );
121147 corrconfigs[c22] = fGFW ->GetCorrelatorConfig (" full {2 -2}" , " ChFull22" , kFALSE );
122148 corrconfigs[c22_gap10] = fGFW ->GetCorrelatorConfig (" refN10 {2} refP10 {-2}" , " Ch10Gap22" , kFALSE );
149+ if (!UserDefineGFWCorr.empty () && !UserDefineGFWName.empty ()) {
150+ LOGF (info, " User adding GFW CorrelatorConfig:" );
151+ // attentaion: here we follow the index of cfgUserDefineGFWCorr
152+ for (uint i = 0 ; i < UserDefineGFWCorr.size (); i++) {
153+ if (i >= UserDefineGFWName.size ()) {
154+ LOGF (fatal, " The names you provided are more than configurations. UserDefineGFWName.size(): %d > UserDefineGFWCorr.size(): %d" , UserDefineGFWName.size (), UserDefineGFWCorr.size ());
155+ break ;
156+ }
157+ LOGF (info, " %d: %s %s" , i, UserDefineGFWCorr.at (i).c_str (), UserDefineGFWName.at (i).c_str ());
158+ corrconfigsFC.push_back (fGFW ->GetCorrelatorConfig (UserDefineGFWCorr.at (i).c_str (), UserDefineGFWName.at (i).c_str (), kFALSE ));
159+ }
160+ }
123161 fGFW ->CreateRegions ();
124162 }
125163
@@ -139,6 +177,29 @@ struct FlowRunbyRun {
139177 return ;
140178 }
141179
180+ void FillFC (const GFW::CorrConfig& corrconf, const double & cent, const double & rndm)
181+ {
182+ double dnx, val;
183+ dnx = fGFW ->Calculate (corrconf, 0 , kTRUE ).real ();
184+ if (dnx == 0 )
185+ return ;
186+ if (!corrconf.pTDif ) {
187+ val = fGFW ->Calculate (corrconf, 0 , kFALSE ).real () / dnx;
188+ if (TMath::Abs (val) < 1 )
189+ fFC ->FillProfile (corrconf.Head .c_str (), cent, val, dnx, rndm);
190+ return ;
191+ }
192+ for (Int_t i = 1 ; i <= fPtAxis ->GetNbins (); i++) {
193+ dnx = fGFW ->Calculate (corrconf, i - 1 , kTRUE ).real ();
194+ if (dnx == 0 )
195+ continue ;
196+ val = fGFW ->Calculate (corrconf, i - 1 , kFALSE ).real () / dnx;
197+ if (TMath::Abs (val) < 1 )
198+ fFC ->FillProfile (Form (" %s_pt_%i" , corrconf.Head .c_str (), i), cent, val, dnx, rndm);
199+ }
200+ return ;
201+ }
202+
142203 void CreateOutputObjectsForRun (int runNumber)
143204 {
144205 std::vector<std::shared_ptr<TH1>> histos (kCount_TH1Names );
@@ -164,6 +225,7 @@ struct FlowRunbyRun {
164225 // detect run number
165226 auto bc = collision.bc_as <aod::BCsWithTimestamps>();
166227 int runNumber = bc.runNumber ();
228+ float l_Random = fRndm ->Rndm ();
167229 if (std::find (RunNumbers.begin (), RunNumbers.end (), runNumber) == RunNumbers.end ()) {
168230 // if run number is not in the preconfigured list, create new output histograms for this run
169231 CreateOutputObjectsForRun (runNumber);
@@ -195,6 +257,10 @@ struct FlowRunbyRun {
195257 for (uint i = 0 ; i < kCount_TProfileNames ; ++i) {
196258 FillProfile (corrconfigs[i], ProfilesList[runNumber][i], cent);
197259 }
260+ // Filling Flow Container
261+ for (uint l_ind = 0 ; l_ind < corrconfigsFC.size (); l_ind++) {
262+ FillFC (corrconfigsFC.at (l_ind), cent, l_Random);
263+ }
198264 }
199265};
200266
0 commit comments