/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Sergey Gorbunov, Sergei Zharko [committer] */

#include "CaSearchWindow.h"

#include <cassert>
#include <iomanip>
#include <sstream>

using cbm::algo::ca::SearchWindow;

// ---------------------------------------------------------------------------------------------------------------------
//
SearchWindow::SearchWindow(int stationID, int trackGrID) : fStationID(stationID), fTrackGroupID(trackGrID)
{
  assert(stationID > -1);
  assert(trackGrID > -1);

  // Case for constant windows (TEMPORARY: we should add selection of different windows):
  static_assert(kNpars == 1);
}

// TODO: SZh 08.11.2022: Probably, we should have the assertions in the InitManager and remove them from here, since
//                       this class is supposed to be used inside the algorithm core
// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDxMaxVsX0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDxMaxVsX0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDxMinVsX0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDxMinVsX0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDxMaxVsY0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDxMaxVsY0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDxMinVsY0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDxMinVsY0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDyMaxVsX0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDyMaxVsX0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDyMinVsX0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDyMinVsX0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDyMaxVsY0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDyMaxVsY0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
void SearchWindow::SetParamDyMinVsY0(int id, float val)
{
  assert(id > -1 && id < kNpars);
  fvParams[kDyMinVsY0 * kNpars + id] = val;
}

// ---------------------------------------------------------------------------------------------------------------------
//
std::string SearchWindow::ToString() const
{
  using std::setw;
  std::stringstream msg;
  msg << "----- CA hits search window: \n";
  msg << "\tstation ID:      " << fStationID << '\n';
  msg << "\ttracks group ID: " << fTrackGroupID << '\n';
  msg << "\tparameters:\n";
  msg << "\t\t" << setw(6) << "No." << ' ';
  msg << setw(12) << "dx_max(x0)" << ' ';
  msg << setw(12) << "dx_min(x0)" << ' ';
  msg << setw(12) << "dx_max(y0)" << ' ';
  msg << setw(12) << "dx_min(y0)" << ' ';
  msg << setw(12) << "dy_max(x0)" << ' ';
  msg << setw(12) << "dy_min(x0)" << ' ';
  msg << setw(12) << "dy_max(y0)" << ' ';
  msg << setw(12) << "dy_min(y0)" << '\n';
  for (int iPar = 0; iPar < kNpars; ++iPar) {
    msg << "\t\t" << setw(6) << iPar << ' ';
    for (int iDep = 0; iDep < kNdeps; ++iDep) {
      msg << setw(12) << fvParams[iDep * kNpars + iPar] << ' ';
    }
  }
  return msg.str();
}