1 #ifndef _CachedShowerRegeneratorOG_StationPositionMatrix_h_
2 #define _CachedShowerRegeneratorOG_StationPositionMatrix_h_
4 #include <utl/MathConstants.h>
5 #include <sdet/Station.h>
6 #include <sevt/Station.h>
24 const double phi,
const double dphi,
25 const double r,
const double lnSqrR1,
const double lnSqrR2,
41 IsInScaledArea(
const double scale,
const double phi,
const double lnSqrR)
82 static constexpr
bool IsInInterval(
const double x,
const double a,
const double b)
83 {
return a <= x && x <=
b; }
88 static constexpr
double AbsShift(
const double eps,
const double a,
const double b)
89 {
return 0.5*((1 -
eps)*a + (1 + eps)*
b); }
112 std::pair<double, double>
115 const double ea = std::exp(0.5*a);
116 const double eb = std::exp(0.5*b);
117 const double em = 0.5*(1 -
eps);
118 const double ep = 0.5*(1 +
eps);
119 return std::make_pair(2*std::log(ep*ea + em*eb), 2*std::log(em*ea + ep*eb));
123 IsLnSqrRInScaledRange(
const double scale,
const double lnSqrR)
162 fPhiGranularity(phiGranularity),
163 fLnSqrRGranularity(lnSqrRGranularity)
167 const double phi,
const double dphi,
168 const double r,
const double lnSqrR1,
const double lnSqrR2,
170 { fStations.emplace_back(dStation, eStation, phi, dphi, r, lnSqrR1, lnSqrR2, area); }
172 void CreateMatrix(
const bool useSpatialStationMatrix =
true);
175 {
return fStations; }
179 const StationInfoPtrList&
180 GetInjectionCandidates(
const double phi,
const double lnSqrR)
183 const int iR = GetLnSqrRIndex(lnSqrR);
184 if (iR < 0 || iR >= fNR)
186 const int iPhi = GetPhiIndex(phi);
187 return fStationMatrix[iPhi][iR];
191 GetInjectionStations(
const double phi,
const double lnSqrR)
195 for (
const auto candidate : GetInjectionCandidates(phi, lnSqrR))
196 if (candidate->IsInArea(phi, lnSqrR))
197 stations.push_back(candidate);
203 void DumpStats()
const;
207 GetPhiIndex(
const double phi)
210 const int i = int((phi +
utl::kPi) / fPhiStep);
211 return (i < fNPhi) ? i : fNPhi - 1;
214 int GetLnSqrRIndex(
const double lnSqrR)
const
215 {
return int((lnSqrR - fLnSqrR1) / fLnSqrRStep); }
217 void Resize(
const int nPhi,
const int nR);
226 double fLnSqrRStep = 0;
double GetMinLnSqrR() const
Detector description interface for Station-related data.
double GetLnSqrR2() const
const sdet::Station & GetDetStation() const
void SetPhiRange(const double phi, const double dphi)
const StationInfoList & GetStationList() const
sevt::Station *const fEvtStation
double GetLnSqrR1() const
sevt::Station & GetEvtStation() const
const double fPhiGranularity
bool IsInArea(const double phi, const double lnSqrR) const
class to hold data at Station level
StationInfoPtrList fEmptyStationInfoPtrList
vector< StationInfo > StationInfoList
vector< vector< StationInfoPtrList > > StationMatrix
const sdet::Station *const fDetStation
return IsPhiInScaledRange(s, phi)&&IsLnSqrRInScaledRange(s
bool IsLnSqrRInRange(const double lnSqrR) const
vector< const StationInfo * > StationInfoPtrList
StationPositionMatrix(const double phiGranularity, const double lnSqrRGranularity)
return fEmptyStationInfoPtrList
static constexpr double AbsShift(const double eps, const double a, const double b)
Regenerate thinned MC showers.
bool IsPhiInRange(const double phi) const
static std::pair< double, double > RelShift(const double eps, const double a, const double b)
StationInfoList fStations
StationMatrix fStationMatrix
double GetResamplingArea() const
const double fLnSqrRGranularity
StationInfo(const sdet::Station &dStation, sevt::Station &eStation, const double phi, const double dphi, const double r, const double lnSqrR1, const double lnSqrR2, const double area)
void PushBack(const sdet::Station &dStation, sevt::Station &eStation, const double phi, const double dphi, const double r, const double lnSqrR1, const double lnSqrR2, const double area)
static constexpr bool IsInInterval(const double x, const double a, const double b)