54 const std::vector<std::string>& inFiles,
const std::string& inTree,
56 const std::string& outConfig =
"",
unsigned long nEntries = 0,
57 unsigned int nPeakEntries = 0,
float pullRange = 6.,
58 unsigned int nHistBins = 61,
unsigned int nPhiBins = 10,
59 const std::array<float, 2>& phiRange = {-M_PI, M_PI},
60 unsigned int nEtaBins = 10,
const std::array<float, 2>& etaRange = {-3, 3},
61 const std::vector<double>& ptBorders =
62 {0., std::numeric_limits<double>::infinity()},
63 const std::bitset<7>& residualPulls = std::bitset<7>{
"1111111"},
64 const std::bitset<5>& auxiliary = std::bitset<5>{
"11111"}) {
66 TChain* treeChain =
new TChain(inTree.c_str());
67 for (
const auto& inFile : inFiles) {
68 treeChain->Add(inFile.c_str());
70 std::cout <<
"*** Adding file: " << inFile << std::endl;
73 if (treeChain->GetEntries() == 0) {
74 std::cout <<
"xxx No entries found ... bailing out." << std::endl;
78 TCanvas* rangeCanvas =
79 new TCanvas(
"rangeCanvas",
"Range Estimation", 100, 100, 620, 400);
88 unsigned int histBarcode = 0;
91 unsigned int nPtBins = ptBorders.size() - 1;
94 using ResidualPulls = std::vector<ResidualPullHandle>;
95 ResidualPulls baseResidualPulls = {};
97 if (residualPulls.test(0)) {
101 d0Handle.
residualStr =
"d_{0}^{rec} - d_{0}^{true}";
103 d0Handle.
errorStr =
"#sigma(d_{0})";
110 baseResidualPulls.push_back(d0Handle);
113 if (residualPulls.test(1)) {
117 z0Handle.
residualStr =
"z_{0}^{rec} - z_{0}^{true}";
119 z0Handle.
errorStr =
"#sigma(z_{0})";
126 baseResidualPulls.push_back(z0Handle);
129 if (residualPulls.test(2)) {
132 phi0Handle.
tag =
"phi0";
133 phi0Handle.
residualStr =
"#phi_{0}^{rec} - #phi_{0}^{true}";
134 phi0Handle.
errorStr =
"#sigma(phi_{0})";
141 baseResidualPulls.push_back(phi0Handle);
144 if (residualPulls.test(3)) {
147 theta0Handle.
tag =
"theta0";
148 theta0Handle.
residualStr =
"#theta_{0}^{rec} - #theta_{0}^{true}";
149 theta0Handle.
errorStr =
"#sigma(theta_{0})";
156 baseResidualPulls.push_back(theta0Handle);
159 if (residualPulls.test(4)) {
162 qopHandle.
tag =
"qop";
173 baseResidualPulls.push_back(qopHandle);
176 if (residualPulls.test(5)) {
189 baseResidualPulls.push_back(tHandle);
192 if (residualPulls.test(6)) {
196 ptHandle.
residualStr =
"p_{T}^{rec} - p_{T}^{true}";
198 ptHandle.
errorStr =
"#sigma(p_{T})";
199 ptHandle.
rangeDrawStr =
"1./abs(eQOP_fit) * sin(eTHETA_fit) - (1./t_pT)";
207 baseResidualPulls.push_back(ptHandle);
210 using Auxiliaries = std::vector<SingleHandle>;
211 Auxiliaries baseAuxilaries;
213 if (auxiliary.test(0)) {
216 chi2ndf.
tag =
"chi2ndf";
217 chi2ndf.
label =
"#Chi^{2}/ndf";
218 chi2ndf.
bins = nHistBins;
219 chi2ndf.
range = {0., 5.};
224 baseAuxilaries.push_back(chi2ndf);
227 if (auxiliary.test(1)) {
230 measurements.
tag =
"measurements";
231 measurements.
label =
"#(measurements)";
236 250, 5, ++histBarcode);
238 baseAuxilaries.push_back(measurements);
241 if (auxiliary.test(2)) {
245 holes.
label =
"#(holes)";
252 baseAuxilaries.push_back(holes);
255 if (auxiliary.test(3)) {
258 outliers.
tag =
"outliers";
259 outliers.
label =
"#(outliers)";
266 baseAuxilaries.push_back(outliers);
269 if (auxiliary.test(4)) {
272 shared.
tag =
"shared";
273 shared.
label =
"#(shared)";
280 baseAuxilaries.push_back(shared);
284 #ifdef NLOHMANN_AVAILABLE
285 nlohmann::json handle_configs;
286 if (not inConfig.empty()) {
287 std::ifstream ifs(inConfig.c_str());
299 auto handleRange = [&](
ResidualPullHandle& handle,
const TString& handleTag,
unsigned int peakE) ->
void {
300 bool rangeDetermined =
false;
301 if (not inConfig.empty()) {
302 if (handle_configs.contains((handleTag).Data())) {
303 auto handle_config = handle_configs[(handleTag).
Data()];
304 handle.
range = handle_config[
"range"].get<std::array<float, 2>>();
305 rangeDetermined =
true;
308 if (not rangeDetermined) {
313 if (not outConfig.empty()) {
314 nlohmann::json range_config;
315 range_config[
"range"] = handle.
range;
316 handle_configs[(handleTag).
Data()] = range_config;
326 unsigned long peakEntries) ->
void {
333 ResidualPulls fullResidualPulls = baseResidualPulls;
335 for (
auto& fHandle : fullResidualPulls) {
337 TString handleTag(fHandle.tag +
std::string(
"_all"));
338 handleRange(fHandle, handleTag, peakEntries);
342 TString residualN = TString(
"res_") + handleTag;
343 TString pullN = TString(
"pull_") + handleTag;
346 fHandle.residualHist->SetName(residualN);
348 fHandle.pullHist->SetName(pullN);
352 using ResidualPullsVector = std::vector<ResidualPulls>;
353 using ResidualPullsMatrix = std::vector<ResidualPullsVector>;
356 ResidualPullsVector ptResidualPulls =
357 ResidualPullsVector(nPtBins, baseResidualPulls);
358 ResidualPullsMatrix etaPtResidualPulls =
359 ResidualPullsMatrix(
nEtaBins, ptResidualPulls);
362 ResidualPullsVector phiResidualPulls =
363 ResidualPullsVector(nPhiBins, baseResidualPulls);
364 ResidualPullsMatrix etaPhiResidualPulls =
365 ResidualPullsMatrix(
nEtaBins, phiResidualPulls);
367 Auxiliaries fullAuxiliaries = baseAuxilaries;
370 for (
auto& fAuxiliary : fullAuxiliaries) {
372 new TH1F(fAuxiliary.tag.c_str(), fAuxiliary.tag.c_str(),
373 fAuxiliary.bins, fAuxiliary.range[0], fAuxiliary.range[1]);
374 fAuxiliary.hist->GetXaxis()->SetTitle(fAuxiliary.label.c_str());
375 fAuxiliary.hist->GetYaxis()->SetTitle(
"Entries");
379 using AuxiliariesVector = std::vector<Auxiliaries>;
380 using AuxiliariesMatrix = std::vector<AuxiliariesVector>;
383 AuxiliariesVector ptAuxiliaries = AuxiliariesVector(nPtBins, baseAuxilaries);
384 AuxiliariesMatrix etaPtAuxiliaries =
385 AuxiliariesMatrix(
nEtaBins, ptAuxiliaries);
388 AuxiliariesVector phiAuxiliaries =
389 AuxiliariesVector(nPhiBins, baseAuxilaries);
390 AuxiliariesMatrix etaPhiAuxiliaries =
391 AuxiliariesMatrix(
nEtaBins, phiAuxiliaries);
394 float phiStep = (phiRange[1] - phiRange[0]) / nPhiBins;
395 float etaStep = (etaRange[1] - etaRange[0]) /
nEtaBins;
397 TVectorF phiVals(nPhiBins + 1);
399 TVectorF ptVals(nPtBins + 1);
401 phiVals[0] = phiRange[0];
402 etaVals[0] = etaRange[0];
403 ptVals[0] = ptBorders[0];
405 #ifdef BOOST_AVAILABLE
406 std::cout <<
"*** Handle Preparation: " << std::endl;
408 nPhiBins *
nEtaBins * nPtBins * baseResidualPulls.size());
414 for (
unsigned int iphi = 0; iphi < nPhiBins; ++iphi) {
416 float phiMin = phiRange[0] + iphi * phiStep;
417 float phiMax = phiRange[0] + (iphi + 1) * phiStep;
418 phiVals[iphi + 1] = phiMax;
423 TString phiTag =
"_phi";
432 for (
unsigned int ieta = 0; ieta <
nEtaBins; ++ieta) {
434 float etaMin = etaRange[0] + ieta * etaStep;
435 float etaMax = etaRange[0] + (ieta + 1) * etaStep;
436 etaVals[ieta + 1] = etaMax;
440 TString etaTag =
"_eta";
451 TString etaPhiTag = etaTag + phiTag;
453 for (
unsigned int ipt = 0; ipt < nPtBins; ++ipt) {
455 float ptMin =
static_cast<float>(ptBorders[ipt]);
456 float ptMax =
static_cast<float>(ptBorders[ipt + 1]);
459 float upperPtBorder =
460 ptBorders[ipt + 1] == std::numeric_limits<double>::infinity()
462 : ptBorders[ipt + 1];
463 ptVals[ipt + 1] = upperPtBorder;
465 TString ptTag =
"_pt";
478 for (
unsigned int iresp = 0; iresp < baseResidualPulls.size();
482 auto& etaPtHandle = etaPtResidualPulls[ieta][ipt][iresp];
484 TString handleTag(etaPtHandle.tag + etaTag + ptTag);
486 etaPtHandle.accept = etaPtBin;
487 etaPtHandle.rangeCutStr = ptCut + land + etaCut;
488 handleRange(etaPtHandle, handleTag, peakEntries);
492 TString residualN = TString(
"res_") + handleTag;
493 TString pullN = TString(
"pull_") + handleTag;
495 if (etaPtHandle.rangeHist !=
nullptr) {
496 TString rangeN = TString(
"range_") + handleTag;
498 etaPtHandle.rangeHist->SetName(rangeN);
501 etaPtHandle.residualHist->SetName(residualN);
503 etaPtHandle.pullHist->SetName(pullN);
507 auto& etaPhiHandle = etaPhiResidualPulls[ieta][iphi][iresp];
509 TString handleTag(etaPhiHandle.tag + etaTag + phiTag);
510 etaPhiHandle.accept = etaPhiBin;
511 handleRange(etaPhiHandle, handleTag, peakEntries);
512 bookHistograms(etaPhiHandle, pullRange, nHistBins, ++histBarcode);
515 TString residualN = TString(
"res_") + handleTag;
516 TString pullN = TString(
"pull_") + handleTag;
519 if (etaPhiHandle.rangeHist !=
nullptr) {
520 TString rangeN = TString(
"range_") + handleTag;
522 etaPhiHandle.rangeHist->SetName(rangeN);
525 etaPhiHandle.residualHist->SetName(residualN);
527 etaPhiHandle.pullHist->SetName(pullN);
530 #ifdef BOOST_AVAILABLE
531 ++handle_preparation_progress;
536 for (
unsigned int iaux = 0; iaux < baseAuxilaries.size(); ++iaux) {
539 auto& etaPtAux = etaPtAuxiliaries[ieta][ipt][iaux];
540 etaPtAux.accept = etaPtBin;
541 TString handleTag(etaPtAux.tag + etaTag + ptTag);
543 new TH1F(handleTag.Data(), etaPtAux.tag.c_str(), etaPtAux.bins,
544 etaPtAux.range[0], etaPtAux.range[1]);
545 etaPtAux.hist->GetXaxis()->SetTitle(etaPtAux.label.c_str());
546 etaPtAux.hist->GetYaxis()->SetTitle(
"Entries");
552 auto& etaPhiAux = etaPhiAuxiliaries[ieta][iphi][iaux];
553 etaPhiAux.accept = etaPhiBin;
554 TString handleTag(etaPhiAux.tag + etaTag + phiTag);
555 etaPhiAux.hist =
new TH1F(handleTag.Data(), etaPhiAux.tag.c_str(),
556 etaPhiAux.bins, etaPhiAux.range[0],
558 etaPhiAux.hist->GetXaxis()->SetTitle(etaPhiAux.label.c_str());
559 etaPhiAux.hist->GetYaxis()->SetTitle(
"Entries");
567 #ifdef NLOHMANN_AVAILABLE
568 if (not outConfig.empty()) {
569 std::ofstream config_out;
570 config_out.open(outConfig.c_str());
571 config_out << handle_configs.dump(4);
575 #ifdef BOOST_AVAILABLE
576 std::cout <<
"*** Event Loop: " << std::endl;
580 for (
unsigned long ie = 0; ie < entries; ++ie) {
581 #ifdef BOOST_AVAILABLE
582 ++event_loop_progress;
586 tracks.tree->GetEntry(ie);
587 size_t nTracks =
tracks.hasFittedParams->size();
588 for (
size_t it = 0;
it < nTracks; ++
it) {
589 if (
tracks.hasFittedParams->at(
it)) {
592 for (
auto& fHandle : fullResidualPulls) {
597 for (
auto& etaBatch : etaPtResidualPulls) {
598 for (
auto& ptBatch : etaBatch) {
599 for (
auto& bHandle : ptBatch) {
606 for (
auto& etaBatch : etaPhiResidualPulls) {
607 for (
auto& phiBatch : etaBatch) {
608 for (
auto& bHandle : phiBatch) {
617 for (
auto& fAuxiliary : fullAuxiliaries) {
622 for (
auto& etaBatch : etaPtAuxiliaries) {
623 for (
auto& ptBatch : etaBatch) {
624 for (
auto& bHandle : ptBatch) {
631 for (
auto& etaBatch : etaPhiAuxiliaries) {
632 for (
auto& phiBatch : etaBatch) {
633 for (
auto& bHandle : phiBatch) {
642 auto output = TFile::Open(outFile.c_str(),
"recreate");
646 for (
auto& fHandle : fullResidualPulls) {
647 if (fHandle.rangeHist !=
nullptr) {
648 fHandle.rangeHist->Write();
650 fHandle.residualHist->Write();
651 fHandle.pullHist->Write();
655 for (
auto& fAuxiliary : fullAuxiliaries) {
656 fAuxiliary.hist->SetName(fAuxiliary.hist->GetName() + TString(
"_all"));
657 fAuxiliary.hist->Write();
660 struct SummaryHistograms {
661 TH2F* fillStats =
nullptr;
663 std::vector<TH2F*> residualRMS;
664 std::vector<TH2F*> residualMean;
665 std::vector<TH2F*> pullSigma;
666 std::vector<TH2F*> pullMean;
668 std::vector<TH2F*> auxiliaries;
681 auto analyseBins = [&](ResidualPullsMatrix& residualPullsMatrix,
682 AuxiliariesMatrix& auxiliaryMatrix,
683 const TString& matrixTag,
const TVectorF& outerBorders,
684 const TVectorF& innerBorders,
685 const TString& fXTitle =
"#eta",
686 const TString& sXTitle =
"#phi") ->
void {
691 unsigned int nOuterBins = outerBorders.GetNrows() - 1;
692 auto outerValues = outerBorders.GetMatrixArray();
693 unsigned int nInnerBins = innerBorders.GetNrows() - 1;
694 auto innerValues = innerBorders.GetMatrixArray();
696 TString statN = TString(
"entries") + matrixTag;
698 new TH2F(statN,
"", nOuterBins, outerValues, nInnerBins, innerValues);
700 #ifdef BOOST_AVAILABLE
705 for (
auto& bHandle : baseResidualPulls) {
707 TString handleTag = TString(bHandle.tag) + matrixTag;
709 TString residualRMSN = TString(
"res_rms_") + handleTag;
710 TString residualMeanN = TString(
"res_mean_") + handleTag;
711 TString pullSigmaN = TString(
"pull_sigma_") + handleTag;
712 TString pullMeanN = TString(
"pull_mean_") + handleTag;
714 TH2F* residualRMS =
new TH2F(residualRMSN,
"", nOuterBins, outerValues,
715 nInnerBins, innerValues);
716 TH2F* residualMean =
new TH2F(residualMeanN,
"", nOuterBins, outerValues,
717 nInnerBins, innerValues);
718 TH2F* pullSigma =
new TH2F(pullSigmaN,
"", nOuterBins, outerValues,
719 nInnerBins, innerValues);
720 TH2F* pullMean =
new TH2F(pullMeanN,
"", nOuterBins, outerValues,
721 nInnerBins, innerValues);
723 summary.residualRMS.push_back(residualRMS);
724 summary.residualMean.push_back(residualMean);
725 summary.pullSigma.push_back(pullSigma);
726 summary.pullMean.push_back(pullMean);
730 for (
auto& aHandle : baseAuxilaries) {
732 TString auxiliaryTag = TString(aHandle.tag) + matrixTag;
733 TH2F* auxHist =
new TH2F(auxiliaryTag, auxiliaryTag, nOuterBins,
734 outerValues, nInnerBins, innerValues);
735 summary.auxiliaries.push_back(auxHist);
739 for (
auto& outerBatch : residualPullsMatrix) {
741 for (
auto& innerBatch : outerBatch) {
743 unsigned int iresp = 0;
744 for (
auto& bHandle : innerBatch) {
746 if (bHandle.rangeHist !=
nullptr) {
747 bHandle.rangeHist->Write();
751 summary.fillStats->SetBinContent(io + 1, ii + 1, bHandle.accepted);
756 float rrms = bHandle.residualHist->GetRMS();
757 float rrerr = bHandle.residualHist->GetRMSError();
758 float rmean = bHandle.residualHist->GetMean();
759 float rmerr = bHandle.residualHist->GetMeanError();
760 summary.residualRMS[iresp]->SetBinContent(io + 1, ii + 1, rrms);
761 summary.residualRMS[iresp]->SetBinError(io + 1, ii + 1, rrerr);
762 summary.residualMean[iresp]->SetBinContent(io + 1, ii + 1, rmean);
763 summary.residualMean[iresp]->SetBinError(io + 1, ii + 1, rmerr);
764 bHandle.residualHist->Write();
766 bHandle.pullHist->Fit(
"gaus",
"q");
767 TF1*
gauss = bHandle.pullHist->GetFunction(
"gaus");
768 if (gauss !=
nullptr) {
769 float pmu = gauss->GetParameter(1);
770 float pmerr = gauss->GetParError(1);
771 float psigma = gauss->GetParameter(2);
772 float pserr = gauss->GetParError(2);
773 summary.pullSigma[iresp]->SetBinContent(io + 1, ii + 1, psigma);
774 summary.pullSigma[iresp]->SetBinError(io + 1, ii + 1, pserr);
775 summary.pullMean[iresp]->SetBinContent(io + 1, ii + 1, pmu);
776 summary.pullMean[iresp]->SetBinError(io + 1, ii + 1, pmerr);
778 bHandle.pullHist->Write();
783 auto auxiliaryBatch = auxiliaryMatrix[io][ii];
784 unsigned int iaux = 0;
785 for (
auto& aHandle : auxiliaryBatch) {
786 float value = aHandle.hist->GetMean();
787 float error = aHandle.hist->GetMeanError();
788 summary.auxiliaries[iaux]->SetBinContent(io + 1, ii + 1, value);
789 summary.auxiliaries[iaux]->SetBinError(io + 1, ii + 1, error);
790 aHandle.hist->Write();
794 #ifdef BOOST_AVAILABLE
809 auto writeProjections = [](
const TH2F&
h2,
const TString& fXTitleP =
"#eta",
810 const TString& fYTitleP =
"sigma",
811 const TString& sXTitleP =
"#phi",
812 const TString& sYTitleP =
"sigma") ->
void {
813 const TString& fTag =
"_pX";
814 const TString& sTag =
"_pY";
816 unsigned int nBinsX = h2.GetXaxis()->GetNbins();
817 unsigned int nBinsY = h2.GetYaxis()->GetNbins();
820 dynamic_cast<TH1D*
>(h2.ProjectionX((h2.GetName() + fTag).
Data()));
823 pX->GetXaxis()->SetTitle(fXTitleP.Data());
824 pX->GetYaxis()->SetTitle(fYTitleP.Data());
828 for (
unsigned int iy = 1; iy <= nBinsY; ++iy) {
829 pX =
dynamic_cast<TH1D*
>(h2.ProjectionX(
830 (h2.GetName() + fTag + sTag + (iy - 1)).Data(), iy, iy));
833 pX->GetXaxis()->SetTitle(fXTitleP.Data());
834 pX->GetYaxis()->SetTitle(fYTitleP.Data());
841 dynamic_cast<TH1D*
>(h2.ProjectionY((h2.GetName() + sTag).
Data()));
844 pY->GetXaxis()->SetTitle(sXTitleP.Data());
845 pY->GetYaxis()->SetTitle(sYTitleP.Data());
849 for (
unsigned int ix = 1; ix <= nBinsX; ++ix) {
850 pY =
dynamic_cast<TH1D*
>(h2.ProjectionY(
851 (h2.GetName() + sTag + fTag + (ix - 1)).Data(), ix, ix));
854 pY->GetXaxis()->SetTitle(sXTitleP.Data());
855 pY->GetYaxis()->SetTitle(sYTitleP.Data());
863 summary.fillStats->Write();
866 for (
unsigned int iresp = 0; iresp < baseResidualPulls.size(); ++iresp) {
868 auto bHandle = baseResidualPulls[iresp];
870 TString rrms = TString(
"RMS[") + bHandle.residualStr + TString(
"] ") +
871 bHandle.residualUnit;
872 TString rmu = TString(
"#mu[") + bHandle.residualStr + TString(
"] ") +
873 bHandle.residualUnit;
875 TString psigma = TString(
"#sigma[(") + bHandle.residualStr +
876 TString(
")/") + bHandle.errorStr + TString(
"]");
877 TString pmu = TString(
"#mu[(") + bHandle.residualStr + TString(
")/") +
878 bHandle.errorStr + TString(
"]");
882 summary.residualRMS[iresp]->GetXaxis()->SetTitle(fXTitle);
883 summary.residualRMS[iresp]->GetYaxis()->SetTitle(sXTitle);
884 summary.residualRMS[iresp]->GetZaxis()->SetTitle(rrms);
885 summary.residualRMS[iresp]->Write();
888 summary.residualMean[iresp]->GetXaxis()->SetTitle(fXTitle);
889 summary.residualMean[iresp]->GetYaxis()->SetTitle(sXTitle);
890 summary.residualMean[iresp]->GetZaxis()->SetTitle(rmu);
891 summary.residualMean[iresp]->Write();
895 summary.pullSigma[iresp]->GetXaxis()->SetTitle(fXTitle);
896 summary.pullSigma[iresp]->GetYaxis()->SetTitle(sXTitle);
897 summary.pullSigma[iresp]->GetZaxis()->SetRangeUser(0., 4.);
898 summary.pullSigma[iresp]->GetZaxis()->SetTitle(psigma);
899 summary.pullSigma[iresp]->Write();
903 summary.pullMean[iresp]->GetXaxis()->SetTitle(fXTitle);
904 summary.pullMean[iresp]->GetYaxis()->SetTitle(sXTitle);
905 summary.pullMean[iresp]->GetZaxis()->SetRangeUser(-1., 1.);
906 summary.pullMean[iresp]->GetZaxis()->SetTitle(pmu);
907 summary.pullMean[iresp]->Write();
910 writeProjections(*summary.residualRMS[iresp], fXTitle, rrms, sXTitle,
912 writeProjections(*summary.residualMean[iresp], fXTitle, rmu, sXTitle,
914 writeProjections(*summary.pullSigma[iresp], fXTitle, psigma, sXTitle,
916 writeProjections(*summary.pullMean[iresp], fXTitle, pmu, sXTitle, pmu);
920 for (
unsigned int iaux = 0; iaux < baseAuxilaries.size(); ++iaux) {
922 summary.auxiliaries[iaux]->GetXaxis()->SetTitle(fXTitle);
923 summary.auxiliaries[iaux]->GetYaxis()->SetTitle(sXTitle);
924 summary.auxiliaries[iaux]->GetZaxis()->SetTitle(
925 baseAuxilaries[iaux].
label.c_str());
926 summary.auxiliaries[iaux]->Write();
928 writeProjections(*summary.auxiliaries[iaux], fXTitle,
929 baseAuxilaries[iaux].label, sXTitle,
930 baseAuxilaries[iaux].label);
937 #ifdef BOOST_AVAILABLE
938 std::cout <<
"*** Bin/Projection Analysis: " << std::endl;
940 analyseBins(etaPtResidualPulls, etaPtAuxiliaries, TString(
"_eta_pt"), etaVals,
941 ptVals,
"#eta",
"p_{T} [GeV]");
942 analyseBins(etaPhiResidualPulls, etaPhiAuxiliaries, TString(
"_eta_phi"),
943 etaVals, phiVals,
"#eta",
"#phi");