@@ -84,8 +84,12 @@ struct FlowEventPlane {
8484 Configurable<float > cTrackDcaXYCut{" cTrackDcaXYCut" , 0.1 , " DcaXY Cut" };
8585 Configurable<float > cTrackDcaZCut{" cTrackDcaZCut" , 1 ., " DcaXY Cut" };
8686
87+ // Gain calibration
88+ Configurable<bool > cDoGainCalib{" cDoGainCalib" , false , " Gain Calib Flag" };
89+ Configurable<bool > cUseAlphaZDC{" cUseAlphaZDC" , true , " Use Alpha ZDC" };
90+
8791 // Coarse binning factor
88- Configurable<int > cAxisCBF{" cAxisCBF" , 1 , " Coarse Bin Factor" };
92+ Configurable<int > cAxisCBF{" cAxisCBF" , 5 , " Coarse Bin Factor" };
8993
9094 // Cent Vx Vy Vz Bins
9195 Configurable<int > cAxisCentBins{" cAxisCentBins" , 20 , " NBins Centrality" };
@@ -97,6 +101,7 @@ struct FlowEventPlane {
97101 Configurable<float > cAxisVyMax{" cAxisVyMax" , 0.006 , " Vy Max" };
98102
99103 // Corrections
104+ Configurable<bool > cApplyRecentCorr{" cApplyRecentCorr" , false , " Apply recentering" };
100105 Configurable<std::vector<int >> cCorrFlagVector{" cCorrFlagVector" , {0 , 0 , 0 , 0 , 0 , 0 }, " Correction Flag" };
101106
102107 // CCDB
@@ -110,14 +115,9 @@ struct FlowEventPlane {
110115 HistogramRegistry histos{" histos" , {}, OutputObjHandlingPolicy::AnalysisObject};
111116
112117 // Global objects
118+ const float zdcDenThrs = 1e-4 ;
113119 float cent = 0 ., mult = 0 .;
114120 float posX = 0 ., posY = 0 ., posZ = 0 .;
115-
116- std::array<float , 4 > znaXWeigthEnergy = {1 ., 1 ., 1 ., 1 .};
117- std::array<float , 4 > znaYWeigthEnergy = {1 ., 1 ., 1 ., 1 .};
118- std::array<float , 4 > zncXWeigthEnergy = {1 ., 1 ., 1 ., 1 .};
119- std::array<float , 4 > zncYWeigthEnergy = {1 ., 1 ., 1 ., 1 .};
120-
121121 std::vector<std::vector<std::string>> vCoarseCorrHistNames = {
122122 {" hXZNAVsCentVxVyVz" },
123123 {" hYZNAVsCentVxVyVz" },
@@ -128,18 +128,8 @@ struct FlowEventPlane {
128128 {" hYZNAVsCent" , " hYZNAVsVx" , " hYZNAVsVy" , " hYZNAVsVz" },
129129 {" hXZNCVsCent" , " hXZNCVsVx" , " hXZNCVsVy" , " hXZNCVsVz" },
130130 {" hYZNCVsCent" , " hYZNCVsVx" , " hYZNCVsVy" , " hYZNCVsVz" }};
131-
132- // Map for Correction Type and Histogram Names
133131 std::map<CorrectionType, std::vector<std::vector<std::string>>> corrTypeHistNameMap = {{kFineCorr , vFineCorrHistNames}, {kCoarseCorr , vCoarseCorrHistNames}};
134132
135- // Structure to hold CCDB objects
136- struct CcdbObjects {
137- TList* ccdbList;
138- TObject* obj;
139- TProfile* hp;
140- THnSparseF* hn;
141- } ccdbObjects;
142-
143133 void init (InitContext const &)
144134 {
145135 // Set CCDB url
@@ -185,14 +175,12 @@ struct FlowEventPlane {
185175 histos.add (" Event/hVx" , " V_{x}" , kTH1F , {axisVx});
186176 histos.add (" Event/hVy" , " V_{y}" , kTH1F , {axisVy});
187177 histos.add (" Event/hVz" , " V_{z}" , kTH1F , {axisVz});
188- histos.add (" QA/hZNASignalSector1" , " ZNA Signal Sector 1" , kTH1F , {axisZDCEnergy});
189- histos.add (" QA/hZNASignalSector2" , " ZNA Signal Sector 2" , kTH1F , {axisZDCEnergy});
190- histos.add (" QA/hZNASignalSector3" , " ZNA Signal Sector 3" , kTH1F , {axisZDCEnergy});
191- histos.add (" QA/hZNASignalSector4" , " ZNA Signal Sector 4" , kTH1F , {axisZDCEnergy});
192- histos.add (" QA/hZNCSignalSector1" , " ZNC Signal Sector 1" , kTH1F , {axisZDCEnergy});
193- histos.add (" QA/hZNCSignalSector2" , " ZNC Signal Sector 2" , kTH1F , {axisZDCEnergy});
194- histos.add (" QA/hZNCSignalSector3" , " ZNC Signal Sector 3" , kTH1F , {axisZDCEnergy});
195- histos.add (" QA/hZNCSignalSector4" , " ZNC Signal Sector 4" , kTH1F , {axisZDCEnergy});
178+ histos.add (" QA/GainCalib/hZNASignal" , " ZNA Signal" , kTH2F , {{4 , 0 , 4 }, {axisZDCEnergy}});
179+ histos.add (" QA/GainCalib/hZNCSignal" , " ZNC Signal" , kTH2F , {{4 , 0 , 4 }, {axisZDCEnergy}});
180+ histos.add (" QA/hZNASignal" , " ZNA Signal" , kTProfile2D , {{4 , 0 , 4 }, {axisVz}});
181+ histos.add (" QA/hZNCSignal" , " ZNC Signal" , kTProfile2D , {{4 , 0 , 4 }, {axisVz}});
182+ histos.add (" QA/hZNAEnergyCommon" , " ZNA Energy Common" , kTProfile , {axisVz});
183+ histos.add (" QA/hZNCEnergyCommon" , " ZNC Energy Common" , kTProfile , {axisVz});
196184 histos.add (" CorrHist/hWtXZNA" , " X^{ZNA}_{1}" , kTHnSparseF , {axisCoarseCent, axisCoarseVx, axisCoarseVy, axisCoarseVz});
197185 histos.add (" CorrHist/hWtYZNA" , " Y^{ZNA}_{1}" , kTHnSparseF , {axisCoarseCent, axisCoarseVx, axisCoarseVy, axisCoarseVz});
198186 histos.add (" CorrHist/hWtXZNC" , " X^{ZNC}_{1}" , kTHnSparseF , {axisCoarseCent, axisCoarseVx, axisCoarseVy, axisCoarseVz});
@@ -221,17 +209,19 @@ struct FlowEventPlane {
221209 histos.add (" Checks/hPsiSPC" , " #Psi_{SP}^{C} distribution" , kTH2F , {axisCent, axisPsi});
222210 histos.add (" Checks/hCosPsiSPAC" , " Cos(#Psi_{SP}^{A} #minus #Psi_{SP}^{C}) distribution" , kTProfile , {axisCent});
223211 histos.add (" Checks/hSinPsiSPAC" , " Sin(#Psi_{SP}^{A} #minus #Psi_{SP}^{C}) distribution" , kTProfile , {axisCent});
224- histos.add (" Checks/hXaXc" , " X^{ZNC}_{1} Vs X^{ZNA}_{1}" , kTProfile , {axisCent});
225- histos.add (" Checks/hYaYc" , " Y^{ZNC}_{1} Vs Y^{ZNA}_{1}" , kTProfile , {axisCent});
212+ histos.add (" Checks/hXaXc" , " X^{A}_{1}X^{C}_{1}" , kTProfile , {axisCent});
213+ histos.add (" Checks/hYaYc" , " Y^{A}_{1}Y^{C}_{1}" , kTProfile , {axisCent});
214+ histos.add (" Checks/hXaYc" , " X^{A}_{1}Y^{C}_{1}" , kTProfile , {axisCent});
215+ histos.add (" Checks/hYaXc" , " Y^{A}_{1}X^{C}_{1}" , kTProfile , {axisCent});
226216 histos.add (" TrackQA/hPtDcaXY" , " DCA_{XY} vs p_{T}" , kTH2F , {axisTrackPt, axisTrackDcaXY});
227217 histos.add (" TrackQA/hPtDcaZ" , " DCA_{Z} vs p_{T}" , kTH2F , {axisTrackPt, axisTrackDcaZ});
228218 histos.add (" DF/hQaQc" , " X^{A}_{1}X^{C}_{1} + Y^{A}_{1}Y^{C}_{1}" , kTProfile , {axisCent});
229- histos.add (" DF/hAQu" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
230- histos.add (" DF/hCQu" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
231- histos.add (" DF/hAQuPos" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
232- histos.add (" DF/hCQuPos" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
233- histos.add (" DF/hAQuNeg" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
234- histos.add (" DF/hCQuNeg" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTH3F , {axisCent, axisV1 , axisTrackEta});
219+ histos.add (" DF/hAQu" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
220+ histos.add (" DF/hCQu" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
221+ histos.add (" DF/hAQuPos" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
222+ histos.add (" DF/hCQuPos" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
223+ histos.add (" DF/hAQuNeg" , " u_{x}X^{A}_{1} + u_{y}Y^{A}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
224+ histos.add (" DF/hCQuNeg" , " u_{x}X^{C}_{1} + u_{y}Y^{C}_{1}" , kTProfile2D , {axisCent, axisTrackEta});
235225 }
236226
237227 template <typename C>
@@ -307,6 +297,23 @@ struct FlowEventPlane {
307297 return true ;
308298 }
309299
300+ void gainCalib (float const & vz, int const & runNumber, std::array<float , 4 >& energy, const char * histName = " hZNAEnergy" )
301+ {
302+ // Set CCDB path
303+ std::string ccdbPath = static_cast <std::string>(cCcdbPath) + " /GainCalib" + " /Run" + std::to_string (runNumber);
304+
305+ // Get object from CCDB
306+ auto ccdbObj = ccdbService->getForTimeStamp <TList>(ccdbPath, -1 );
307+
308+ // Get gain calibration
309+ TH2F* h = reinterpret_cast <TH2F*>(ccdbObj->FindObject (histName));
310+ float v = 0 .;
311+ for (int i = 0 ; i < static_cast <int >(energy.size ()); ++i) {
312+ v = h->GetBinContent (h->FindBin (i + 0.5 , vz + 0.00001 ));
313+ energy[i] *= v;
314+ }
315+ }
316+
310317 template <typename C, typename F>
311318 std::vector<float > getAvgCorrFactors (const C& ccdbObject, const F& corrType, const std::vector<float >& vCollParam)
312319 {
@@ -317,18 +324,15 @@ struct FlowEventPlane {
317324 for (auto const & x : vHistNames) {
318325 int cntry = 0 ;
319326 for (auto const & y : x) {
320- ccdbObjects.obj = reinterpret_cast <TObject*>(ccdbObject->FindObject (y.c_str ()));
321327 if (corrType == kFineCorr ) {
322- ccdbObjects.hp = reinterpret_cast <TProfile*>(ccdbObjects.obj ->Clone ());
323- vAvgOutput[cntrx] += ccdbObjects.hp ->GetBinContent (ccdbObjects.hp ->GetXaxis ()->FindBin (vCollParam[cntry]));
324- delete ccdbObjects.hp ;
328+ TProfile* hp = reinterpret_cast <TProfile*>(ccdbObject->FindObject (y.c_str ()));
329+ vAvgOutput[cntrx] += hp->GetBinContent (hp->GetXaxis ()->FindBin (vCollParam[cntry]));
325330 } else {
326- ccdbObjects. hn = reinterpret_cast <THnSparseF*>(ccdbObjects. obj -> Clone ( ));
331+ THnSparseF* hn = reinterpret_cast <THnSparseF*>(ccdbObject-> FindObject (y. c_str () ));
327332 for (int i = 0 ; i < static_cast <int >(vHistNames.size ()); ++i) {
328- binarray[i] = ccdbObjects. hn ->GetAxis (i)->FindBin (vCollParam[i]);
333+ binarray[i] = hn->GetAxis (i)->FindBin (vCollParam[i]);
329334 }
330- vAvgOutput[cntrx] += ccdbObjects.hn ->GetBinContent (ccdbObjects.hn ->GetBin (binarray));
331- delete ccdbObjects.hn ;
335+ vAvgOutput[cntrx] += hn->GetBinContent (hn->GetBin (binarray));
332336 }
333337 ++cntry;
334338 }
@@ -337,7 +341,7 @@ struct FlowEventPlane {
337341 return vAvgOutput;
338342 }
339343
340- void applyCorrection (const std::vector<float > inputParam, const int & runNumber, std::vector<float >& outputParam)
344+ void applyCorrection (const std::vector<float >& inputParam, const int & runNumber, std::vector<float >& outputParam)
341345 {
342346 std::vector<int > vCorrFlags = static_cast <std::vector<int >>(cCorrFlagVector);
343347 int nitr = vCorrFlags.size ();
@@ -361,16 +365,16 @@ struct FlowEventPlane {
361365 ccdbPath = static_cast <std::string>(cCcdbPath) + " /CorrItr_" + std::to_string (i + 1 ) + " /Run" + std::to_string (runNumber);
362366
363367 // Get object from CCDB
364- ccdbObjects. ccdbList = ccdbService->getForTimeStamp <TList>(ccdbPath, -1 );
368+ auto ccdbObj = ccdbService->getForTimeStamp <TList>(ccdbPath, -1 );
365369
366370 // Check CCDB Object
367- if (!ccdbObjects. ccdbList ) {
371+ if (!ccdbObj ) {
368372 LOGF (warning, " CCDB OBJECT NOT FOUND" );
369373 return ;
370374 }
371375
372376 // Get averages
373- std::vector<float > vAvg = getAvgCorrFactors (ccdbObjects. ccdbList , corrType, inputParam);
377+ std::vector<float > vAvg = getAvgCorrFactors (ccdbObj , corrType, inputParam);
374378
375379 // Apply correction
376380 outputParam[kXa ] -= vAvg[kXa ];
@@ -437,6 +441,7 @@ struct FlowEventPlane {
437441
438442 // Get bunch crossing
439443 auto bc = collision.foundBC_as <BCsRun3>();
444+ int runNumber = collision.foundBC_as <BCsRun3>().runNumber ();
440445
441446 // check zdc
442447 if (!bc.has_zdc ()) {
@@ -454,59 +459,82 @@ struct FlowEventPlane {
454459 return ;
455460 }
456461
457- // Fill QA histograms
458- histos.fill (HIST (" QA/hZNASignalSector1" ), znaEnergy[0 ]);
459- histos.fill (HIST (" QA/hZNASignalSector2" ), znaEnergy[1 ]);
460- histos.fill (HIST (" QA/hZNASignalSector3" ), znaEnergy[2 ]);
461- histos.fill (HIST (" QA/hZNASignalSector4" ), znaEnergy[3 ]);
462- histos.fill (HIST (" QA/hZNCSignalSector1" ), zncEnergy[0 ]);
463- histos.fill (HIST (" QA/hZNCSignalSector2" ), zncEnergy[1 ]);
464- histos.fill (HIST (" QA/hZNCSignalSector3" ), zncEnergy[2 ]);
465- histos.fill (HIST (" QA/hZNCSignalSector4" ), zncEnergy[3 ]);
466-
467- /* auto alphaZDC = 0.395;*/
462+ // Fill gain calib histograms
463+ for (int iCh = 0 ; iCh < kXYAC ; ++iCh) {
464+ histos.fill (HIST (" QA/hZNASignal" ), iCh + 0.5 , vCollParam[kVz ], znaEnergy[iCh]);
465+ histos.fill (HIST (" QA/hZNCSignal" ), iCh + 0.5 , vCollParam[kVz ], zncEnergy[iCh]);
466+ histos.fill (HIST (" QA/hZNAEnergyCommon" ), vCollParam[kVz ], znaEnergyCommon);
467+ histos.fill (HIST (" QA/hZNCEnergyCommon" ), vCollParam[kVz ], zncEnergyCommon);
468+ }
469+
470+ // Do gain calibration
471+ if (cDoGainCalib) {
472+ gainCalib (vCollParam[kVz ], runNumber, znaEnergy, " hZNASignal" );
473+ gainCalib (vCollParam[kVz ], runNumber, zncEnergy, " hZNCSignal" );
474+ }
475+
476+ // Fill zdc signal
477+ for (int iCh = 0 ; iCh < kXYAC ; ++iCh) {
478+ histos.fill (HIST (" QA/GainCalib/hZNASignal" ), iCh + 0.5 , znaEnergy[iCh]);
479+ histos.fill (HIST (" QA/GainCalib/hZNCSignal" ), iCh + 0.5 , zncEnergy[iCh]);
480+ }
481+
482+ auto alphaZDC = 0.395 ;
468483 const double x[4 ] = {-1.75 , 1.75 , -1.75 , 1.75 };
469484 const double y[4 ] = {-1.75 , -1.75 , 1.75 , 1.75 };
470485
471486 // Calculate X and Y
472- float znaXSumNum = 0 ., znaXSumDnm = 0 .;
473- float znaYSumNum = 0 ., znaYSumDnm = 0 .;
474- float zncXSumNum = 0 ., zncXSumDnm = 0 .;
475- float zncYSumNum = 0 ., zncYSumDnm = 0 .;
487+ float znaXNum = 0 ., znaYNum = 0 ., zncXNum = 0 ., zncYNum = 0 .;
488+ float znaDen = 0 ., zncDen = 0 .;
489+ float znaWt = 0 ., zncWt = 0 .;
476490
477491 // Loop over zdc sectors
478492 for (int i = 0 ; i < kXYAC ; ++i) {
479- znaXSumNum += znaXWeigthEnergy[i] * znaEnergy[i] * x[i];
480- znaYSumNum += znaYWeigthEnergy[i] * znaEnergy[i] * y[i];
481- znaXSumDnm += znaXWeigthEnergy[i] * znaEnergy[i];
482- znaYSumDnm += znaYWeigthEnergy[i] * znaEnergy[i];
483- zncXSumNum += zncXWeigthEnergy[i] * zncEnergy[i] * x[i];
484- zncYSumNum += zncYWeigthEnergy[i] * zncEnergy[i] * y[i];
485- zncXSumDnm += zncXWeigthEnergy[i] * zncEnergy[i];
486- zncYSumDnm += zncYWeigthEnergy[i] * zncEnergy[i];
493+ if (cUseAlphaZDC) {
494+ znaWt = std::pow (znaEnergy[i], alphaZDC);
495+ zncWt = std::pow (zncEnergy[i], alphaZDC);
496+ } else {
497+ znaWt = znaEnergy[i];
498+ zncWt = zncEnergy[i];
499+ }
500+ znaXNum -= znaWt * x[i];
501+ znaYNum += znaWt * y[i];
502+ zncXNum += zncWt * x[i];
503+ zncYNum += zncWt * y[i];
504+ znaDen += znaWt;
505+ zncDen += zncWt;
506+ }
507+
508+ if (znaDen < zdcDenThrs || zncDen < zdcDenThrs) {
509+ return ;
487510 }
488511
489512 // Get X and Y for A and C side ZNA
490513 std::vector<float > vSP = {0 , 0 , 0 , 0 };
491- vSP[kXa ] = znaXSumNum / znaXSumDnm ;
492- vSP[kYa ] = znaYSumNum / znaYSumDnm ;
493- vSP[kXc ] = zncXSumNum / zncXSumDnm ;
494- vSP[kYc ] = zncYSumNum / zncYSumDnm ;
514+ vSP[kXa ] = znaXNum / znaDen ;
515+ vSP[kYa ] = znaYNum / znaDen ;
516+ vSP[kXc ] = zncXNum / zncDen ;
517+ vSP[kYc ] = zncYNum / zncDen ;
495518
496519 // Do corrections
497- int runNumber = collision.foundBC_as <BCsRun3>().runNumber ();
498- applyCorrection (vCollParam, runNumber, vSP);
520+ if (cApplyRecentCorr) {
521+ applyCorrection (vCollParam, runNumber, vSP);
522+ }
499523
500- // Fill X and Y histograms
524+ // Fill X and Y histograms for corrections after each iteration
501525 fillCorrHist (vCollParam, vSP);
526+
527+ // Evaluate spectator plane angle and [X,Y] correlations
502528 float psiA = std::atan2 (vSP[kYa ], vSP[kXa ]);
503- float psiC = std::atan2 (vSP[kYa ], vSP[kXa ]);
504- histos.fill (HIST (" Checks/hXaXc" ), cent, (vSP[kXa ] * vSP[kXc ]));
505- histos.fill (HIST (" Checks/hYaYc" ), cent, (vSP[kYa ] * vSP[kYc ]));
529+ float psiC = std::atan2 (vSP[kYc ], vSP[kXc ]);
506530 histos.fill (HIST (" Checks/hPsiSPA" ), cent, psiA);
507531 histos.fill (HIST (" Checks/hPsiSPC" ), cent, psiC);
508532 histos.fill (HIST (" Checks/hCosPsiSPAC" ), cent, std::cos (psiA - psiC));
509533 histos.fill (HIST (" Checks/hSinPsiSPAC" ), cent, std::sin (psiA - psiC));
534+ histos.fill (HIST (" Checks/hXaXc" ), cent, (vSP[kXa ] * vSP[kXc ]));
535+ histos.fill (HIST (" Checks/hYaYc" ), cent, (vSP[kYa ] * vSP[kYc ]));
536+ histos.fill (HIST (" Checks/hXaYc" ), cent, (vSP[kXa ] * vSP[kYc ]));
537+ histos.fill (HIST (" Checks/hYaXc" ), cent, (vSP[kYa ] * vSP[kXc ]));
510538
511539 // Directed flow
512540 float qac = (vSP[kXa ] * vSP[kXc ]) + (vSP[kYa ] * vSP[kYc ]);
@@ -530,14 +558,14 @@ struct FlowEventPlane {
530558 v1c = ux * vSP[kXc ] + uy * vSP[kYc ];
531559
532560 // Fill histogram
533- histos.fill (HIST (" DF/hAQu" ), cent, v1a, track.eta ());
534- histos.fill (HIST (" DF/hCQu" ), cent, v1c, track.eta ());
561+ histos.fill (HIST (" DF/hAQu" ), cent, track.eta (), v1a );
562+ histos.fill (HIST (" DF/hCQu" ), cent, track.eta (), v1c );
535563 if (track.sign () > 0 ) {
536- histos.fill (HIST (" DF/hAQuPos" ), cent, v1a, track.eta ());
537- histos.fill (HIST (" DF/hCQuPos" ), cent, v1c, track.eta ());
564+ histos.fill (HIST (" DF/hAQuPos" ), cent, track.eta (), v1a );
565+ histos.fill (HIST (" DF/hCQuPos" ), cent, track.eta (), v1c );
538566 } else {
539- histos.fill (HIST (" DF/hAQuNeg" ), cent, v1a, track.eta ());
540- histos.fill (HIST (" DF/hCQuNeg" ), cent, v1c, track.eta ());
567+ histos.fill (HIST (" DF/hAQuNeg" ), cent, track.eta (), v1a );
568+ histos.fill (HIST (" DF/hCQuNeg" ), cent, track.eta (), v1c );
541569 }
542570 }
543571 }
0 commit comments