5050#include " DataFormatsParameters/GRPObject.h"
5151#include " DataFormatsParameters/GRPMagField.h"
5252
53+ #include " CCDB/CcdbApi.h"
5354#include " CCDB/BasicCCDBManager.h"
5455
5556#include " PWGLF/DataModel/LFStrangenessTables.h"
@@ -72,6 +73,18 @@ struct lambdapolarization {
7273 {},
7374 OutputObjHandlingPolicy::AnalysisObject};
7475
76+ struct : ConfigurableGroup {
77+ Configurable<std::string> cfgURL{" cfgURL" ,
78+ " http://alice-ccdb.cern.ch" , " Address of the CCDB to browse" };
79+ Configurable<int64_t > nolaterthan{" ccdb-no-later-than" ,
80+ std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count (),
81+ " Latest acceptable timestamp of creation for the object" };
82+ } cfgCcdbParam;
83+ Service<o2::ccdb::BasicCCDBManager> ccdb;
84+ o2::ccdb::CcdbApi ccdbApi;
85+
86+ Configurable<float > cfgCentSel{" cfgCentSel" , 80 ., " Centrality selection" };
87+
7588 Configurable<float > cfgv0radiusMin{" cfgv0radiusMin" , 1.2 , " minimum decay radius" };
7689 Configurable<float > cfgDCAPosToPVMin{" cfgDCAPosToPVMin" , 0.05 , " minimum DCA to PV for positive track" };
7790 Configurable<float > cfgDCANegToPVMin{" cfgDCANegToPVMin" , 0.2 , " minimum DCA to PV for negative track" };
@@ -95,12 +108,20 @@ struct lambdapolarization {
95108
96109 Configurable<int > cfgnMods{" cfgnMods" , 1 , " The number of modulations of interest starting from 2" };
97110
111+ Configurable<bool > cfgShiftCorr{" cfgShiftCorr" , false , " additional shift correction" };
112+ Configurable<bool > cfgShiftCorrDef{" cfgShiftCorrDef" , false , " additional shift correction definition" };
113+ Configurable<std::string> cfgShiftPath{" cfgShiftPath" , " Users/j/junlee/Qvector/QvecCalib/ShiftCorr" , " Path for Shift" };
114+
98115 TF1 * fMultPVCutLow = nullptr ;
99116 TF1 * fMultPVCutHigh = nullptr ;
100117
101118 double angle;
102119 double relphi;
103120
121+ int currentRunNumber = -999 ;
122+ int lastRunNumber = -999 ;
123+ TProfile3D* shiftprofile;
124+
104125 void init (o2::framework::InitContext&)
105126 {
106127 if (cfgnMods > 1 )
@@ -111,8 +132,13 @@ struct lambdapolarization {
111132 AxisSpec cosAxis = {100 , -1.0 , 1.0 };
112133 AxisSpec centAxis = {80 , 0.0 , 80.0 };
113134 AxisSpec epAxis = {6 , 0.0 , 2.0 * constants::math::PI };
135+ AxisSpec epQaAxis = {100 , -1.0 * constants::math::PI , constants::math::PI };
114136
115137 AxisSpec pidAxis = {100 , -10 , 10 };
138+
139+ AxisSpec shiftAxis = {10 , 0 , 10 , " shift" };
140+ AxisSpec basisAxis = {6 , 0 , 6 , " basis" };
141+
116142 for (auto i = 2 ; i < cfgnMods + 2 ; i++) {
117143 histos.add (Form (" h_lambda_cos_psi%d" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, epAxis}});
118144 histos.add (Form (" h_alambda_cos_psi%d" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, epAxis}});
@@ -125,12 +151,30 @@ struct lambdapolarization {
125151 histos.add (" QA/nsigma_tpc_pt_ppi" , " " , {HistType::kTH2F , {ptAxis, pidAxis}});
126152 histos.add (" QA/nsigma_tpc_pt_mpr" , " " , {HistType::kTH2F , {ptAxis, pidAxis}});
127153 histos.add (" QA/nsigma_tpc_pt_mpi" , " " , {HistType::kTH2F , {ptAxis, pidAxis}});
154+
155+ histos.add (" QA/EP_FT0C" , " " , {HistType::kTH2F , {centAxis, epQaAxis}});
156+ histos.add (" QA/EP_FT0A" , " " , {HistType::kTH2F , {centAxis, epQaAxis}});
157+ histos.add (" QA/EP_FV0A" , " " , {HistType::kTH2F , {centAxis, epQaAxis}});
158+
159+ histos.add (" QA/EPRes_FT0C_FT0A" , " " , {HistType::kTH2F , {centAxis, cosAxis}});
160+ histos.add (" QA/EPRes_FT0C_FV0A" , " " , {HistType::kTH2F , {centAxis, cosAxis}});
161+ histos.add (" QA/EPRes_FT0A_FV0A" , " " , {HistType::kTH2F , {centAxis, cosAxis}});
162+ }
163+
164+ if (cfgShiftCorrDef) {
165+ histos.add (" ShiftFIT" , " ShiftFIT" , kTProfile3D , {centAxis, basisAxis, shiftAxis});
128166 }
129167
130168 fMultPVCutLow = new TF1 (" fMultPVCutLow" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)" , 0 , 100 );
131169 fMultPVCutLow ->SetParameters (2834.66 , -87.0127 , 0.915126 , -0.00330136 , 332.513 , -12.3476 , 0.251663 , -0.00272819 , 1.12242e-05 );
132170 fMultPVCutHigh = new TF1 (" fMultPVCutHigh" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)" , 0 , 100 );
133171 fMultPVCutHigh ->SetParameters (2834.66 , -87.0127 , 0.915126 , -0.00330136 , 332.513 , -12.3476 , 0.251663 , -0.00272819 , 1.12242e-05 );
172+
173+ ccdb->setURL (cfgCcdbParam.cfgURL );
174+ ccdbApi.init (" http://alice-ccdb.cern.ch" );
175+ ccdb->setCaching (true );
176+ ccdb->setLocalObjectValidityChecking ();
177+ ccdb->setCreatedNotAfter (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count ());
134178 }
135179
136180 double massLambda = o2::constants::physics::MassLambda;
@@ -148,15 +192,19 @@ struct lambdapolarization {
148192 auto centrality = collision.centFT0C ();
149193 auto multNTracksPV = collision.multNTracksPV ();
150194
195+ if (cfgCentSel > centrality) {
196+ return 0 ;
197+ }
151198 if (multNTracksPV < fMultPVCutLow ->Eval (centrality)) {
152199 return 0 ;
153200 }
154-
155201 if (multNTracksPV > fMultPVCutHigh ->Eval (centrality)) {
156202 return 0 ;
157203 }
158-
159- if ((!collision.selection_bit (aod::evsel::kNoTimeFrameBorder ) || !collision.selection_bit (aod::evsel::kNoITSROFrameBorder ))) {
204+ if (!collision.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) {
205+ return 0 ;
206+ }
207+ if (!collision.selection_bit (aod::evsel::kNoSameBunchPileup )) {
160208 return 0 ;
161209 }
162210
@@ -262,6 +310,37 @@ struct lambdapolarization {
262310 angle = ProtonBoostedVec.Pz () / ProtonBoostedVec.P ();
263311 relphi = TVector2::Phi_0_2pi (static_cast <float >(nmode) * (LambdaVec.Phi () - TMath::ATan2 (collision.qvecIm ()[3 + (nmode - 2 ) * 24 ], collision.qvecRe ()[3 + (nmode - 2 ) * 24 ])));
264312
313+ if (cfgShiftCorr) {
314+ auto deltapsiFT0C = 0.0 ;
315+ auto deltapsiFT0A = 0.0 ;
316+ auto deltapsiFV0A = 0.0 ;
317+
318+ auto psidefFT0C = TMath::ATan2 (collision.qvecIm ()[3 + (nmode - 2 ) * 24 ], collision.qvecRe ()[3 + (nmode - 2 ) * 24 ]);
319+ auto psidefFT0A = TMath::ATan2 (collision.qvecIm ()[3 + 4 + (nmode - 2 ) * 24 ], collision.qvecRe ()[3 + 4 + (nmode - 2 ) * 24 ]);
320+ auto psidefFV0A = TMath::ATan2 (collision.qvecIm ()[3 + 12 + (nmode - 2 ) * 24 ], collision.qvecRe ()[3 + 12 + (nmode - 2 ) * 24 ]);
321+ for (int ishift = 1 ; ishift <= 10 ; ishift++) {
322+ auto coeffshiftxFT0C = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 0.5 , ishift - 0.5 ));
323+ auto coeffshiftyFT0C = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 1.5 , ishift - 0.5 ));
324+ auto coeffshiftxFT0A = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 2.5 , ishift - 0.5 ));
325+ auto coeffshiftyFT0A = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 3.5 , ishift - 0.5 ));
326+ auto coeffshiftxFV0A = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 4.5 , ishift - 0.5 ));
327+ auto coeffshiftyFV0A = shiftprofile->GetBinContent (shiftprofile->FindBin (collision.centFT0C (), 5.5 , ishift - 0.5 ));
328+
329+ deltapsiFT0C += ((1 / (1.0 * ishift)) * (-coeffshiftxFT0C * TMath::Cos (ishift * 2.0 * psidefFT0C) + coeffshiftyFT0C * TMath::Sin (ishift * 2.0 * psidefFT0C)));
330+ deltapsiFT0A += ((1 / (1.0 * ishift)) * (-coeffshiftxFT0A * TMath::Cos (ishift * 2.0 * psidefFT0A) + coeffshiftyFT0A * TMath::Sin (ishift * 2.0 * psidefFT0A)));
331+ deltapsiFV0A += ((1 / (1.0 * ishift)) * (-coeffshiftxFV0A * TMath::Cos (ishift * 2.0 * psidefFV0A) + coeffshiftyFV0A * TMath::Sin (ishift * 2.0 * psidefFV0A)));
332+ }
333+ relphi = TVector2::Phi_0_2pi (static_cast <float >(nmode) * (LambdaVec.Phi () - psidefFT0C - deltapsiFT0C));
334+
335+ histos.fill (HIST (" QA/EP_FT0C" ), collision.centFT0C (), psidefFT0C + deltapsiFT0C);
336+ histos.fill (HIST (" QA/EP_FT0A" ), collision.centFT0C (), psidefFT0A + deltapsiFT0A);
337+ histos.fill (HIST (" QA/EP_FV0A" ), collision.centFT0C (), psidefFV0A + deltapsiFV0A);
338+
339+ histos.fill (HIST (" QA/EPRes_FT0C_FT0A" ), collision.centFT0C (), TMath::Cos (2.0 * (psidefFT0C + deltapsiFT0C - psidefFT0A - deltapsiFT0A)));
340+ histos.fill (HIST (" QA/EPRes_FT0C_FV0A" ), collision.centFT0C (), TMath::Cos (2.0 * (psidefFT0C + deltapsiFT0C - psidefFV0A - deltapsiFV0A)));
341+ histos.fill (HIST (" QA/EPRes_FT0A_FV0A" ), collision.centFT0C (), TMath::Cos (2.0 * (psidefFT0A + deltapsiFT0A - psidefFV0A - deltapsiFV0A)));
342+ }
343+
265344 if (nmode == 2 ) { // //////////
266345 if (LambdaTag) {
267346 histos.fill (HIST (" h_lambda_cos_psi2" ), v0.mLambda (), v0.pt (), angle, collision.centFT0C (), relphi);
@@ -291,6 +370,28 @@ struct lambdapolarization {
291370 if (!eventSelected (collision)) {
292371 return ;
293372 }
373+ if (cfgShiftCorrDef) {
374+ for (int ishift = 1 ; ishift <= 10 ; ishift++) {
375+ printf (" debug %.3lf, %.3lf, %.3lf, %.3lf" , collision.centFT0C (), 0.5 , ishift - 0.5 , TMath::Sin (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 ], collision.qvecRe ()[3 ])));
376+
377+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 0.5 , ishift - 0.5 , TMath::Sin (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 ], collision.qvecRe ()[3 ])));
378+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 1.5 , ishift - 0.5 , TMath::Cos (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 ], collision.qvecRe ()[3 ])));
379+
380+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 2.5 , ishift - 0.5 , TMath::Sin (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 + 4 ], collision.qvecRe ()[3 + 4 ])));
381+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 3.5 , ishift - 0.5 , TMath::Cos (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 + 4 ], collision.qvecRe ()[3 + 4 ])));
382+
383+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 4.5 , ishift - 0.5 , TMath::Sin (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 + 12 ], collision.qvecRe ()[3 + 12 ])));
384+ histos.fill (HIST (" ShiftFIT" ), collision.centFT0C (), 5.5 , ishift - 0.5 , TMath::Cos (ishift * 2.0 * TMath::ATan2 (collision.qvecIm ()[3 + 12 ], collision.qvecRe ()[3 + 12 ])));
385+ }
386+ }
387+ if (cfgShiftCorr) {
388+ auto bc = collision.bc_as <aod::BCsWithTimestamps>();
389+ currentRunNumber = collision.bc_as <aod::BCsWithTimestamps>().runNumber ();
390+ if (currentRunNumber != lastRunNumber) {
391+ shiftprofile = ccdb->getForTimeStamp <TProfile3D>(cfgShiftPath.value , bc.timestamp ());
392+ lastRunNumber = currentRunNumber;
393+ }
394+ }
294395 for (auto i = 2 ; i < cfgnMods + 2 ; i++) {
295396 FillHistograms (collision, V0s, i);
296397 }
0 commit comments