diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt index ee75547634cf5b348508c4beaf9b6aced0fa4655..68e6fe07465057b8dc9d4579b7a887f4f2765b51 100644 --- a/reco/L1/CMakeLists.txt +++ b/reco/L1/CMakeLists.txt @@ -269,6 +269,7 @@ Install(FILES CbmL1Counters.h L1Algo/L1MaterialInfo.h L1Algo/L1UMeasurementInfo.h L1Algo/L1XYMeasurementInfo.h + L1Algo/L1BaseStationInfo.h vectors/vec_arithmetic.h vectors/std_alloc.h DESTINATION include diff --git a/reco/L1/L1Algo/L1BaseStationInfo.h b/reco/L1/L1Algo/L1BaseStationInfo.h new file mode 100644 index 0000000000000000000000000000000000000000..d20e560c16c804a6c26a2c25b4a1b1bc41ec5560 --- /dev/null +++ b/reco/L1/L1Algo/L1BaseStationInfo.h @@ -0,0 +1,135 @@ +/* Copyright (C) 2016-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Sergey Gorbunov, Sergei Zharko [committer] */ + +/************************************************************************************************************** + * @file L1BaseStationInfo.h + * @bried A base class for a L1 station interface + * @since 18.12.2021 + * + * The class is implemented to connect concrete experimental setup (CBM or BMN in CbmL1 + * or BmnL1) with general L1Tracking algorithm. Each derived class must contain general + * algorithms sutable for the particular station type. + * + *************************************************************************************************************/ + +#ifndef L1BaseStationInfo_h +#define L1BaseStationInfo_h 1 + +// L1 core +#include "L1Station.h" +#include "L1Def.h" + +// C++ std +#include <string> +#include <bitset> +#include <iomanip> + +class L1BaseStationInfo { +private: + enum { // Here we list all the fields, which must be initialized by user + /// v Basic fields initialization + /// v L1Station initialization + kEz, + kERmin, + kERmax, + kEmaterialInfoThick, + kEmaterialInfoRL, + kEfieldSlice, + /// v The last item is equal to the number of bits in fInitFlags + kEND + }; + std::bitset<L1BaseStationInfo::kEND> fInitFlags; /// Set of + std::string fTypeName {"BASE"}; + L1Station fL1Station {}; + // TODO (!!!!) MUST THINK ABOUT THIS OBJECT LIFE TIME: will it be better to copy + // or to move it to the core? If the second, what should we do with + // getters? Do we need to lock them, when the fL1Station object will + // be transfered? + +public: + L1BaseStationInfo() { + std::cout << ">>>>>> L1BaseStationInfo: Constructor called\n"; // Temporary + } + virtual ~L1BaseStationInfo() { + std::cout << ">>>>>> L1BaseStationInfo: Destructor called\n"; // Temporary + } + + ///-------------------------------------------------------------------------------------------------------/// + /// Basic methods /// + ///-------------------------------------------------------------------------------------------------------/// + + std::string GetTypeName() const { return fTypeName; } + bool IsInitialized() const { return fInitFlags.size() == fInitFlags.count(); }; + + ///-------------------------------------------------------------------------------------------------------/// + /// Interface for L1Station object initialization /// + ///-------------------------------------------------------------------------------------------------------/// + + /// Setters + + void SetZ(fscal inZ) { fL1Station.z = inZ; fInitFlags[kEz] = true; } + void SetRmin(fscal inRmin) { fL1Station.Rmin = inRmin; fInitFlags[kERmin] = true; } + void SetRmax(fscal inRmax) { fL1Station.Rmax = inRmax; fInitFlags[kERmax] = true; } + + // Sets material thickness and radiational length, calculates their ratio ("RadThick") + // and its logarithm ("logRadThick") + void SetMaterial (fscal inThickness, fscal inRL) { +#ifndef L1_NO_ASSERT // check for zero denominator + L1_ASSERT(inRL, "Attempt of entering zero inRL (radiational length) value"); +#endif + fL1Station.materialInfo.thick = inThickness; + fL1Station.materialInfo.RL = inRL; + fL1Station.materialInfo.RadThick = fL1Station.materialInfo.thick / fL1Station.materialInfo.RL; + fL1Station.materialInfo.logRadThick = log(fL1Station.materialInfo.RadThick); + fInitFlags[kEmaterialInfoThick] = true; + fInitFlags[kEmaterialInfoRL] = true; + } + + // Sets coefficients of the magnetic field approximation + // TODO: Do something with N parameter + void SetFieldSlice (int N, const fscal * Cx, const fscal * Cy, const fscal * Cz) { + for (int idx = 0; idx < N; ++idx) { + fL1Station.fieldSlice.cx[idx] = Cx[idx]; + fL1Station.fieldSlice.cy[idx] = Cy[idx]; + fL1Station.fieldSlice.cz[idx] = Cz[idx]; + fInitFlags[kEfieldSlice] = true; + } + } + + /// Getters + fvec GetZ() const { return fL1Station.z; } + fvec GetRmin() const { return fL1Station.Rmin; } + fvec GetRmax() const { return fL1Station.Rmax; } + + fvec GetMaterialThick() const { return fL1Station.materialInfo.thick; } + // TODO: investigate if thick, RL and RadThick are useful, may be we should have only + // GetMateralLogRadThick? + fvec GetMaterialRL() const { return fL1Station.materialInfo.RL; } // TODO: -//- + fvec GetMaterialRadThick() const { return fL1Station.materialInfo.RadThick; } // TODO: -//- + fvec GetMaterialLogRadThick() const { return fL1Station.materialInfo.logRadThick; } + + // Methods to get particular element of Cx, Cy or Cz by its index + fvec GetFieldSliceCx(int idx) const { return fL1Station.fieldSlice.cx[idx]; } + fvec GetFieldSliceCy(int idx) const { return fL1Station.fieldSlice.cy[idx]; } + fvec GetFieldSliceCz(int idx) const { return fL1Station.fieldSlice.cz[idx]; } + + // Methods to get ptr to array of Cx, Cy or Cz + const fvec * GetFieldSliceCx() const { return fL1Station.fieldSlice.cx; } + const fvec * GetFieldSliceCy() const { return fL1Station.fieldSlice.cy; } + const fvec * GetFieldSliceCz() const { return fL1Station.fieldSlice.cz; } + + ///-------------------------------------------------------------------------------------------------------/// + /// Other methods /// + ///-------------------------------------------------------------------------------------------------------/// + + void Print() { // TODO: use here LOG() macro instead of std::cout + LOG(INFO) << "== L1Algo: station info ==========================================================="; + LOG(INFO) << ""; + LOG(INFO) << " L1Station fields:"; + LOG(INFO) << " z " << fL1Station.z ; + LOG(INFO) << "==================================================================================="; + } +}; + +#endif // L1BaseStationInfo_h