LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
detinfo::DetectorPropertiesStandard Class Referencefinal

#include "DetectorPropertiesStandard.h"

Inheritance diagram for detinfo::DetectorPropertiesStandard:
detinfo::DetectorProperties

Classes

struct  Configuration_t
 Structure for configuration parameters. More...
 
struct  SternheimerParameters_t
 Parameters for Sternheimer density effect corrections. More...
 

Public Types

using providers_type = lar::ProviderPack< geo::GeometryCore, geo::WireReadoutGeom, detinfo::LArProperties >
 List of service providers we depend on. More...
 

Public Member Functions

 DetectorPropertiesStandard (fhicl::ParameterSet const &pset, geo::GeometryCore const *geo, geo::WireReadoutGeom const *wireReadoutGeom, detinfo::LArProperties const *lp, std::set< std::string > const &ignore_params={})
 
 DetectorPropertiesStandard (DetectorPropertiesStandard const &)=delete
 
virtual ~DetectorPropertiesStandard ()=default
 
void SetNumberTimeSamples (unsigned int nsamp)
 
double Efield (unsigned int planegap=0) const override
 kV/cm More...
 
double DriftVelocity (double efield=0., double temperature=0.) const override
 cm/us More...
 
double BirksCorrection (double dQdX) const override
 dQ/dX in electrons/cm, returns dE/dX in MeV/cm. More...
 
double BirksCorrection (double dQdX, double EField) const override
 
double ModBoxCorrection (double dQdX) const override
 
double ModBoxCorrection (double dQdX, double EField) const override
 
double ElectronLifetime () const override
 Returns the attenuation constant for ionization electrons. More...
 
double Density (double temperature=0.) const override
 Returns argon density at a given temperature. More...
 
double Temperature () const override
 In kelvin. More...
 
double Eloss (double mom, double mass, double tcut) const override
 Restricted mean energy loss (dE/dx) More...
 
double ElossVar (double mom, double mass) const override
 Energy loss fluctuation ( $ \sigma_{E}^2 / x $) More...
 
double ElectronsToADC () const override
 
unsigned int NumberTimeSamples () const override
 
unsigned int ReadOutWindowSize () const override
 
double TimeOffsetU () const override
 
double TimeOffsetV () const override
 
double TimeOffsetZ () const override
 
double TimeOffsetY () const override
 
bool SimpleBoundary () const override
 
DetectorPropertiesData DataFor (detinfo::DetectorClocksData const &clock_data) const override
 
virtual double Density () const
 Returns argon density at the temperature from Temperature() More...
 

Private Member Functions

void ValidateAndConfigure (fhicl::ParameterSet const &p, std::set< std::string > const &ignore_params)
 Configures the provider, first validating the configuration. More...
 

Private Attributes

detinfo::LArProperties const * fLP
 
geo::GeometryCore const * fGeo
 
geo::WireReadoutGeom const * fChannelMap
 
std::vector< double > fEfield
 kV/cm (per inter-plane volume) ! More...
 
double fElectronlifetime
 microseconds More...
 
double fTemperature
 kelvin More...
 
double fElectronsToADC
 
unsigned int fNumberTimeSamples
 number of clock ticks per event More...
 
unsigned int fReadOutWindowSize
 number of clock ticks per readout window More...
 
double fTimeOffsetU
 
double fTimeOffsetV
 
double fTimeOffsetZ
 
double fTimeOffsetY
 
double fTimeOffsetX
 
double fDriftVelFudgeFactor
 
bool fUseIcarusMicrobooneDriftModel
 
bool fIncludeInterPlanePitchInXTickOffsets
 
SternheimerParameters_t fSternheimerParameters
 Sternheimer parameters. More...
 
std::vector< std::vector< double > > fDriftDirection
 
bool fSimpleBoundary
 
double fModBoxA
 
double fModBoxB
 

Detailed Description

Definition at line 36 of file DetectorPropertiesStandard.h.

Member Typedef Documentation

Constructor & Destructor Documentation

detinfo::DetectorPropertiesStandard::DetectorPropertiesStandard ( fhicl::ParameterSet const &  pset,
geo::GeometryCore const *  geo,
geo::WireReadoutGeom const *  wireReadoutGeom,
detinfo::LArProperties const *  lp,
std::set< std::string > const &  ignore_params = {} 
)

Definition at line 54 of file DetectorPropertiesStandard.cxx.

References ValidateAndConfigure().

60  : fLP(lp), fGeo(geo), fChannelMap(wireReadoutGeom)
61  {
62  ValidateAndConfigure(pset, ignore_params);
63  }
void ValidateAndConfigure(fhicl::ParameterSet const &p, std::set< std::string > const &ignore_params)
Configures the provider, first validating the configuration.
ROOT libraries.
detinfo::DetectorPropertiesStandard::DetectorPropertiesStandard ( DetectorPropertiesStandard const &  )
delete
virtual detinfo::DetectorPropertiesStandard::~DetectorPropertiesStandard ( )
virtualdefault

Member Function Documentation

double detinfo::DetectorPropertiesStandard::BirksCorrection ( double  dQdX) const
overridevirtual

dQ/dX in electrons/cm, returns dE/dX in MeV/cm.

Implements detinfo::DetectorProperties.

Definition at line 323 of file DetectorPropertiesStandard.cxx.

References Efield().

Referenced by SetNumberTimeSamples().

324  {
325  return BirksCorrection(dQdx, Efield());
326  }
double Efield(unsigned int planegap=0) const override
kV/cm
double BirksCorrection(double dQdX) const override
dQ/dX in electrons/cm, returns dE/dX in MeV/cm.
double detinfo::DetectorPropertiesStandard::BirksCorrection ( double  dQdX,
double  EField 
) const
overridevirtual

Implements detinfo::DetectorProperties.

Definition at line 327 of file DetectorPropertiesStandard.cxx.

References tca::dEdx(), detinfo::DetectorProperties::Density(), util::kGeVToElectrons, util::kRecombA, and util::kRecombk.

328  {
329  // Correction for charge quenching using parameterization from
330  // S.Amoruso et al., NIM A 523 (2004) 275
331 
332  constexpr double A3t = util::kRecombA;
333  double K3t = util::kRecombk; // in KV/cm*(g/cm^2)/MeV
334  double const rho = Density(); // LAr density in g/cm^3
335  constexpr double Wion = 1000. / util::kGeVToElectrons; // 23.6 eV = 1e, Wion in MeV/e
336  K3t /= rho; // KV/MeV
337  double const dEdx = dQdx / (A3t / Wion - K3t / E_field * dQdx); // MeV/cm
338 
339  return dEdx;
340  }
virtual double Density() const
Returns argon density at the temperature from Temperature()
constexpr double kGeVToElectrons
23.6eV per ion pair, 1e9 eV/GeV
float dEdx(detinfo::DetectorClocksData const &clockData, detinfo::DetectorPropertiesData const &detProp, const TCSlice &slc, TP3D &tp3d)
Definition: PFPUtils.cxx:2671
constexpr double kRecombk
constexpr double kRecombA
A constant.
DetectorPropertiesData detinfo::DetectorPropertiesStandard::DataFor ( detinfo::DetectorClocksData const &  clock_data) const
overridevirtual

< special case for ArgoNeuT

Implements detinfo::DetectorProperties.

Definition at line 371 of file DetectorPropertiesStandard.cxx.

References geo::GeometryCore::Cryostat(), dir, geo::TPCGeo::DriftSign(), DriftVelocity(), Efield(), fChannelMap, fGeo, fIncludeInterPlanePitchInXTickOffsets, fTimeOffsetU, fTimeOffsetV, fTimeOffsetX, fTimeOffsetY, fTimeOffsetZ, geo::TPCGeo::ID(), geo::PlaneGeo::ID(), geo::Iterable< IterationPolicy, Transform >::Iterate(), geo::kU, geo::kV, geo::kX, geo::kY, geo::kZ, geo::GeometryCore::Ncryostats(), geo::WireReadoutGeom::Nplanes(), geo::WireReadoutGeom::Plane(), geo::PlaneID::Plane, geo::WireReadoutGeom::PlanePitch(), detinfo::sampling_rate(), Temperature(), geo::to_int(), and detinfo::trigger_offset().

Referenced by detinfo::DetectorPropertiesServiceStandard::getDataFor(), detinfo::DetectorPropertiesServiceStandard::getDataForJob(), and SimpleBoundary().

373  {
374  double const samplingRate = sampling_rate(clock_data);
375  double const efield = Efield();
376  double const temperature = Temperature();
377  double const driftVelocity = DriftVelocity(efield, temperature);
378  double const x_ticks_coefficient = 0.001 * driftVelocity * samplingRate;
379 
380  double const triggerOffset = trigger_offset(clock_data);
381 
382  std::vector<std::vector<std::vector<double>>> x_ticks_offsets(fGeo->Ncryostats());
383  std::vector<std::vector<double>> drift_direction(fGeo->Ncryostats());
384 
385  for (size_t cstat = 0; cstat < fGeo->Ncryostats(); ++cstat) {
386  auto const& cryostat = fGeo->Cryostat(geo::CryostatID(cstat));
387  x_ticks_offsets[cstat].resize(cryostat.NTPC());
388  drift_direction[cstat].resize(cryostat.NTPC());
389 
390  for (size_t tpc = 0; tpc < cryostat.NTPC(); ++tpc) {
391  const geo::TPCGeo& tpcgeom = cryostat.TPC(tpc);
392  auto const& tpcid = tpcgeom.ID();
393 
394  const double dir = -to_int(tpcgeom.DriftSign());
395  drift_direction[cstat][tpc] = dir;
396 
397  unsigned int nplane = fChannelMap->Nplanes(tpcid);
398  x_ticks_offsets[cstat][tpc].resize(nplane, 0.);
399 
400  // Choose which plane to propagate to. If accounting for the drift time between
401  // planes, start with the first plane, and iteratively add distances between
402  // planes Otherwise propagate straight to the last plane and assume a standard
403  // drift velocity (for wirecell recob::Wires)
404  unsigned int planeToPropagateTo = fIncludeInterPlanePitchInXTickOffsets ? 0 : nplane - 1;
405 
406  // Calculate geometric time offset (only works if xyz.X() <=0 )
407  auto const xyz = fChannelMap->Plane({tpcid, planeToPropagateTo}).GetCenter();
408  for (geo::PlaneGeo const& pgeom : fChannelMap->Iterate<geo::PlaneGeo>(tpcid)) {
409  unsigned int const plane = pgeom.ID().Plane;
410  x_ticks_offsets[cstat][tpc][plane] =
411  -xyz.X() / (dir * x_ticks_coefficient) + triggerOffset;
412 
414  // Get field in gap between planes
415  double efieldgap[3];
416  double driftVelocitygap[3];
417  double x_ticks_coefficient_gap[3];
418  for (int igap = 0; igap < 3; ++igap) {
419  efieldgap[igap] = Efield(igap);
420  driftVelocitygap[igap] = DriftVelocity(efieldgap[igap], temperature);
421  x_ticks_coefficient_gap[igap] = 0.001 * driftVelocitygap[igap] * samplingRate;
422  }
423 
424  if (nplane == 3) {
425  /*
426  | ---------- plane = 2 (collection)
427  | Coeff[2]
428  | ---------- plane = 1 (2nd induction)
429  | Coeff[1]
430  | ---------- plane = 0 (1st induction) x = xyz[0]
431  | Coeff[0]
432  | ---------- x = 0
433  V For plane = 0, t offset is -xyz[0]/Coeff[0]
434  x */
435  for (unsigned int ip = 0; ip < plane; ++ip) {
436  x_ticks_offsets[cstat][tpc][plane] +=
437  fChannelMap->PlanePitch(tpcid, ip, ip + 1) / x_ticks_coefficient_gap[ip + 1];
438  }
439  }
440  else if (nplane == 2) {
441  /*
442  | ---------- plane = 1 (collection)
443  | Coeff[2]
444  | ---------- plane = 0 (2nd induction) x = xyz[0]
445  | ---------- x = 0, Coeff[1]
446  V ---------- first induction plane
447  x Coeff[0]
448  For plane = 0, t offset is pitch/Coeff[1] -
449  (pitch+xyz[0])/Coeff[0] = -xyz[0]/Coeff[0] -
450  pitch*(1/Coeff[0]-1/Coeff[1])
451  */
452  for (unsigned int ip = 0; ip < plane; ++ip) {
453  x_ticks_offsets[cstat][tpc][plane] +=
454  fChannelMap->PlanePitch(tpcid, ip, ip + 1) / x_ticks_coefficient_gap[ip + 2];
455  }
456  x_ticks_offsets[cstat][tpc][plane] -=
457  fChannelMap->PlanePitch(tpcid) *
458  (1 / x_ticks_coefficient - 1 / x_ticks_coefficient_gap[1]);
459  }
460 
461  } // end if fIncludeInterPlanePitchInXTickOffsets
462 
463  // Add view dependent offset
464  // FIXME the offset should be plane-dependent
465  geo::View_t view = pgeom.View();
466  switch (view) {
467  case geo::kU: x_ticks_offsets[cstat][tpc][plane] += fTimeOffsetU; break;
468  case geo::kV: x_ticks_offsets[cstat][tpc][plane] += fTimeOffsetV; break;
469  case geo::kZ: x_ticks_offsets[cstat][tpc][plane] += fTimeOffsetZ; break;
470  case geo::kY: x_ticks_offsets[cstat][tpc][plane] += fTimeOffsetY; break;
471  case geo::kX: x_ticks_offsets[cstat][tpc][plane] += fTimeOffsetX; break;
472  default: throw cet::exception(__FUNCTION__) << "Bad view = " << view << "\n";
473  } // switch
474  }
475  }
476  }
477 
478  return DetectorPropertiesData{
479  *this, x_ticks_coefficient, move(x_ticks_offsets), move(drift_direction)};
480  }
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
double Efield(unsigned int planegap=0) const override
kV/cm
Planes which measure V.
Definition: geo_types.h:132
Planes which measure X direction.
Definition: geo_types.h:136
Geometry information for a single TPC.
Definition: TPCGeo.h:33
double Temperature() const override
In kelvin.
double PlanePitch(TPCID const &tpcid, unsigned int p1=0, unsigned int p2=1) const
Planes which measure Z direction.
Definition: geo_types.h:134
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
Definition: GeometryCore.h:303
Planes which measure Y direction.
Definition: geo_types.h:135
Planes which measure U.
Definition: geo_types.h:131
Geometry information for a single wire plane.The plane is represented in the geometry by a solid whic...
Definition: PlaneGeo.h:67
constexpr int to_int(Coordinate const coord) noexcept
Enumerate the possible plane projections.
Definition: geo_types.h:124
geo::DriftSign DriftSign() const
Returns the expected drift direction based on geometry.
Definition: TPCGeo.h:79
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:373
CryostatGeo const & Cryostat(CryostatID const &cryoid=details::cryostat_zero) const
Returns the specified cryostat.
unsigned int Nplanes(TPCID const &tpcid=details::tpc_zero) const
Returns the total number of planes in the specified TPC.
TDirectory * dir
Definition: macro.C:5
range_type< T > Iterate() const
Definition: Iterable.h:121
int trigger_offset(DetectorClocksData const &data)
PlaneGeo const & Plane(TPCID const &tpcid, View_t view) const
Returns the specified wire.
double DriftVelocity(double efield=0., double temperature=0.) const override
cm/us
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
TPCID const & ID() const
Returns the identifier of this TPC.
Definition: TPCGeo.h:147
PlaneID const & ID() const
Returns the identifier of this plane.
Definition: PlaneGeo.h:173
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
The data type to uniquely identify a cryostat.
Definition: geo_types.h:187
double detinfo::DetectorPropertiesStandard::Density ( double  temperature = 0.) const
overridevirtual

Returns argon density at a given temperature.

Parameters
temperaturethe temperature in kelvin
Returns
argon density in g/cm^3

Density is nearly a linear function of temperature. See the NIST tables for details Slope is between -6.2 and -6.1, intercept is 1928 kg/m^3. This parameterization will be good to better than 0.5%.g/cm^3

Implements detinfo::DetectorProperties.

Definition at line 132 of file DetectorPropertiesStandard.cxx.

References Temperature().

133  {
134  // Default temperature use internal value.
135  if (temperature == 0.) temperature = Temperature();
136 
137  return -0.00615 * temperature + 1.928;
138  }
double Temperature() const override
In kelvin.
double detinfo::DetectorPropertiesStandard::DriftVelocity ( double  efield = 0.,
double  temperature = 0. 
) const
overridevirtual

cm/us

Implements detinfo::DetectorProperties.

Definition at line 212 of file DetectorPropertiesStandard.cxx.

References Efield(), fDriftVelFudgeFactor, fUseIcarusMicrobooneDriftModel, and Temperature().

Referenced by DataFor(), and SetNumberTimeSamples().

213  {
214  // Drift Velocity as a function of Electric Field and LAr Temperature from:
215  // W. Walkowiak, NIM A 449 (2000) 288-294
216  //
217  // Option to use MicroBooNE+ICARUS model (as in arXiv:2008.09765) provided as well,
218  // with temperature depenence as prescribed by Mike Mooney based on looking at the
219  // Walkowiak data.
220  //
221  // Efield should have units of kV/cm
222  // Temperature should have units of Kelvin
223 
224  // Default Efield, use internal value.
225  if (efield == 0.) efield = Efield();
226 
227  if (efield > 4.0)
228  mf::LogWarning("DetectorPropertiesStandard")
229  << "DriftVelocity Warning! : E-field value of " << efield
230  << " kV/cm is outside of range covered by drift velocity parameterization. Returned value "
231  "may not be correct";
232 
233  // Default temperature use internal value.
234  if (temperature == 0.) temperature = Temperature();
235 
236  if (temperature < 87.0 || temperature > 94.0)
237  mf::LogWarning("DetectorPropertiesStandard")
238  << "DriftVelocity Warning! : Temperature value of " << temperature
239  << " K is outside of range covered by drift velocity parameterization. Returned value may "
240  "not be correct";
241 
242  double vd;
243 
245  double const tshift = -87.203 + temperature;
246  double const xFit = 0.0938163 - 0.0052563 * tshift - 0.0001470 * tshift * tshift;
247  double const uFit = 5.18406 + 0.01448 * tshift - 0.003497 * tshift * tshift -
248  0.000516 * tshift * tshift * tshift;
249 
250  // Icarus Parameter Set, use as default
251  constexpr double P1 = -0.04640; // K^-1
252  constexpr double P2 = 0.01712; // K^-1
253  constexpr double P3 = 1.88125; // (kV/cm)^-1
254  constexpr double P4 = 0.99408; // kV/cm
255  constexpr double P5 = 0.01172; // (kV/cm)^-P6
256  constexpr double P6 = 4.20214;
257  constexpr double T0 = 105.749; // K
258 
259  // Walkowiak Parameter Set
260  constexpr double P1W = -0.01481; // K^-1
261  constexpr double P2W = -0.0075; // K^-1
262  constexpr double P3W = 0.141; // (kV/cm)^-1
263  constexpr double P4W = 12.4; // kV/cm
264  constexpr double P5W = 1.627; // (kV/cm)^-P6
265  constexpr double P6W = 0.317;
266  constexpr double T0W = 90.371; // K
267 
268  // From Craig Thorne . . . currently not documented
269  // smooth transition from linear at small fields to
270  // icarus fit at most fields to Walkowiak at very high fields
271  if (efield < xFit)
272  vd = efield * uFit;
273  else if (efield < 0.619) {
274  vd = ((P1 * (temperature - T0) + 1) *
275  (P3 * efield * std::log(1 + P4 / efield) + P5 * std::pow(efield, P6)) +
276  P2 * (temperature - T0));
277  }
278  else if (efield < 0.699) {
279  vd = 12.5 * (efield - 0.619) *
280  ((P1W * (temperature - T0W) + 1) *
281  (P3W * efield * std::log(1 + P4W / efield) + P5W * std::pow(efield, P6W)) +
282  P2W * (temperature - T0W)) +
283  12.5 * (0.699 - efield) *
284  ((P1 * (temperature - T0) + 1) *
285  (P3 * efield * std::log(1 + P4 / efield) + P5 * std::pow(efield, P6)) +
286  P2 * (temperature - T0));
287  }
288  else {
289  vd = ((P1W * (temperature - T0W) + 1) *
290  (P3W * efield * std::log(1 + P4W / efield) + P5W * std::pow(efield, P6W)) +
291  P2W * (temperature - T0W));
292  }
293  }
294 
295  // MicroBooNE+ICARUS model (arXiv:2008.09765) with temperature dependence given by
296  // Mike Mooney based on looking at Walkowiak data (NIM A 449 (2000) 288-294)
298  constexpr double P0 = 0.;
299  constexpr double P1 = 5.53416;
300  constexpr double P2 = -6.53093;
301  constexpr double P3 = 3.20752;
302  constexpr double P4 = 0.389696;
303  constexpr double P5 = -0.556184;
304  vd = (1.0 - 0.0184 * (temperature - 89.0)) *
305  (P0 + P1 * cet::pow<1>(efield) + P2 * cet::pow<2>(efield) + P3 * cet::pow<3>(efield) +
306  P4 * cet::pow<4>(efield) + P5 * cet::pow<5>(efield));
307  }
308 
309  vd *= fDriftVelFudgeFactor / 10.;
310 
311  return vd; // in cm/us
312  }
double Efield(unsigned int planegap=0) const override
kV/cm
double Temperature() const override
In kelvin.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
double detinfo::DetectorPropertiesStandard::Efield ( unsigned int  planegap = 0) const
overridevirtual

kV/cm

Implements detinfo::DetectorProperties.

Definition at line 122 of file DetectorPropertiesStandard.cxx.

References fEfield.

Referenced by BirksCorrection(), DataFor(), DriftVelocity(), and ModBoxCorrection().

123  {
124  if (planegap >= fEfield.size())
125  throw cet::exception("DetectorPropertiesStandard")
126  << "requesting Electric field in a plane gap that is not defined\n";
127 
128  return fEfield[planegap];
129  }
std::vector< double > fEfield
kV/cm (per inter-plane volume) !
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
double detinfo::DetectorPropertiesStandard::ElectronLifetime ( ) const
inlineoverridevirtual

Returns the attenuation constant for ionization electrons.

Returns
the attenuation constant [µs]

The returned constant τ can be used to know the attenuation the ionization charge undergoes after drifting for a certain time t: $ A(t) = e^{-t/\tau} $ (t is measured in microseconds).

This is a uniform, constant value for the detector.

Implements detinfo::DetectorProperties.

Definition at line 168 of file DetectorPropertiesStandard.h.

References detinfo::DetectorProperties::Density(), and fElectronlifetime.

169  {
170  return fElectronlifetime; //< microseconds
171  }
double detinfo::DetectorPropertiesStandard::ElectronsToADC ( ) const
inlineoverridevirtual
double detinfo::DetectorPropertiesStandard::Eloss ( double  mom,
double  mass,
double  tcut 
) const
overridevirtual

Restricted mean energy loss (dE/dx)

Parameters
mommomentum of incident particle [GeV/c]
massmass of incident particle [GeV/c^2]
tcutmaximum kinetic energy of delta rays [MeV]; 0 for unlimited
Returns
the restricted mean energy loss (dE/dx) in units of MeV/cm

Returned value is always positive. For unrestricted mean energy loss, set tcut = 0 (special case), or tcut large.

Based on Bethe-Bloch formula as contained in particle data book. Material parameters are from the configuration.

Implements detinfo::DetectorProperties.

Definition at line 157 of file DetectorPropertiesStandard.cxx.

References detinfo::DetectorPropertiesStandard::SternheimerParameters_t::a, detinfo::LArProperties::AtomicMass(), detinfo::LArProperties::AtomicNumber(), detinfo::DetectorPropertiesStandard::SternheimerParameters_t::cbar, detinfo::DetectorProperties::Density(), e, detinfo::LArProperties::ExcitationEnergy(), fLP, fSternheimerParameters, detinfo::DetectorPropertiesStandard::SternheimerParameters_t::k, x, detinfo::DetectorPropertiesStandard::SternheimerParameters_t::x0, and detinfo::DetectorPropertiesStandard::SternheimerParameters_t::x1.

Referenced by Temperature().

158  {
159  // Some constants.
160  constexpr double K = 0.307075; // 4 pi N_A r_e^2 m_e c^2 (MeV cm^2/mol).
161  constexpr double me = 0.510998918; // Electron mass (MeV/c^2).
162 
163  // Calculate kinematic quantities.
164  double const bg = mom / mass; // beta*gamma.
165  double const gamma = sqrt(1. + bg * bg); // gamma.
166  double const beta = bg / gamma; // beta (velocity).
167  double const mer = 0.001 * me / mass; // electron mass / mass of incident particle.
168  double const tmax =
169  2. * me * bg * bg / (1. + 2. * gamma * mer + mer * mer); // Maximum delta ray energy (MeV).
170 
171  // Make sure tcut does not exceed tmax.
172  if (tcut == 0. || tcut > tmax) tcut = tmax;
173 
174  // Calculate density effect correction (delta).
175  double const x = std::log10(bg);
176  double delta = 0.;
177  if (x >= fSternheimerParameters.x0) {
178  delta = 2. * std::log(10.) * x - fSternheimerParameters.cbar;
179  if (x < fSternheimerParameters.x1)
180  delta += fSternheimerParameters.a *
182  }
183 
184  // Calculate stopping number.
185  double B =
186  0.5 * std::log(2. * me * bg * bg * tcut / (1.e-12 * cet::square(fLP->ExcitationEnergy()))) -
187  0.5 * beta * beta * (1. + tcut / tmax) - 0.5 * delta;
188 
189  // Don't let the stopping number become negative.
190  if (B < 1.) B = 1.;
191 
192  // Calculate dE/dx.
193  return Density() * K * fLP->AtomicNumber() * B / (fLP->AtomicMass() * beta * beta);
194  }
Float_t x
Definition: compare.C:6
virtual double Density() const
Returns argon density at the temperature from Temperature()
virtual double ExcitationEnergy() const =0
Mean excitation energy of the liquid (eV)
virtual double AtomicMass() const =0
Atomic mass of the liquid (g/mol)
SternheimerParameters_t fSternheimerParameters
Sternheimer parameters.
virtual double AtomicNumber() const =0
Atomic number of the liquid.
Float_t e
Definition: plot.C:35
double detinfo::DetectorPropertiesStandard::ElossVar ( double  mom,
double  mass 
) const
overridevirtual

Energy loss fluctuation ( $ \sigma_{E}^2 / x $)

Parameters
mommomentum of incident particle in [GeV/c]
massmass of incident particle [GeV/c^2]
Returns
energy loss fluctuation in MeV^2/cm

Based on Bichsel formula referred to but not given in PDG.

Implements detinfo::DetectorProperties.

Definition at line 197 of file DetectorPropertiesStandard.cxx.

References detinfo::LArProperties::AtomicMass(), detinfo::LArProperties::AtomicNumber(), detinfo::DetectorProperties::Density(), and fLP.

Referenced by Temperature().

198  {
199  // Some constants.
200  constexpr double K = 0.307075; // 4 pi N_A r_e^2 m_e c^2 (MeV cm^2/mol).
201  constexpr double me = 0.510998918; // Electron mass (MeV/c^2).
202 
203  // Calculate kinematic quantities.
204  double const bg = mom / mass; // beta*gamma.
205  double const gamma2 = 1. + bg * bg; // gamma^2.
206  double const beta2 = bg * bg / gamma2; // beta^2.
207  return gamma2 * (1. - 0.5 * beta2) * me * (fLP->AtomicNumber() / fLP->AtomicMass()) * K *
208  Density();
209  }
virtual double Density() const
Returns argon density at the temperature from Temperature()
virtual double AtomicMass() const =0
Atomic mass of the liquid (g/mol)
virtual double AtomicNumber() const =0
Atomic number of the liquid.
double detinfo::DetectorPropertiesStandard::ModBoxCorrection ( double  dQdX) const
overridevirtual

Implements detinfo::DetectorProperties.

Definition at line 344 of file DetectorPropertiesStandard.cxx.

References Efield().

Referenced by SetNumberTimeSamples().

345  {
346  return ModBoxCorrection(dQdx, Efield());
347  }
double Efield(unsigned int planegap=0) const override
kV/cm
double ModBoxCorrection(double dQdX) const override
double detinfo::DetectorPropertiesStandard::ModBoxCorrection ( double  dQdX,
double  EField 
) const
overridevirtual

Implements detinfo::DetectorProperties.

Definition at line 348 of file DetectorPropertiesStandard.cxx.

References tca::dEdx(), detinfo::DetectorProperties::Density(), fModBoxA, fModBoxB, and util::kGeVToElectrons.

349  {
350  // Modified Box model correction has better behavior than the Birks
351  // correction at high values of dQ/dx.
352  double const rho = Density(); // LAr density in g/cm^3
353  constexpr double Wion = 1000. / util::kGeVToElectrons; // 23.6 eV = 1e, Wion in MeV/e
354  double const Beta = fModBoxB / (rho * E_field);
355  double const Alpha = fModBoxA;
356  double const dEdx = (exp(Beta * Wion * dQdx) - Alpha) / Beta;
357 
358  return dEdx;
359  }
virtual double Density() const
Returns argon density at the temperature from Temperature()
constexpr double kGeVToElectrons
23.6eV per ion pair, 1e9 eV/GeV
float dEdx(detinfo::DetectorClocksData const &clockData, detinfo::DetectorPropertiesData const &detProp, const TCSlice &slc, TP3D &tp3d)
Definition: PFPUtils.cxx:2671
unsigned int detinfo::DetectorPropertiesStandard::NumberTimeSamples ( ) const
inlineoverridevirtual

Implements detinfo::DetectorProperties.

Definition at line 215 of file DetectorPropertiesStandard.h.

References fNumberTimeSamples.

Referenced by detinfo::DetectorPropertiesServiceStandard::postOpenFile().

215 { return fNumberTimeSamples; }
unsigned int fNumberTimeSamples
number of clock ticks per event
unsigned int detinfo::DetectorPropertiesStandard::ReadOutWindowSize ( ) const
inlineoverridevirtual

Implements detinfo::DetectorProperties.

Definition at line 216 of file DetectorPropertiesStandard.h.

References fReadOutWindowSize.

216 { return fReadOutWindowSize; }
unsigned int fReadOutWindowSize
number of clock ticks per readout window
void detinfo::DetectorPropertiesStandard::SetNumberTimeSamples ( unsigned int  nsamp)
inline
bool detinfo::DetectorPropertiesStandard::SimpleBoundary ( ) const
inlineoverridevirtual
double detinfo::DetectorPropertiesStandard::Temperature ( ) const
inlineoverridevirtual

In kelvin.

Implements detinfo::DetectorProperties.

Definition at line 186 of file DetectorPropertiesStandard.h.

References Eloss(), ElossVar(), and fTemperature.

Referenced by DataFor(), Density(), and DriftVelocity().

double detinfo::DetectorPropertiesStandard::TimeOffsetU ( ) const
inlineoverridevirtual
double detinfo::DetectorPropertiesStandard::TimeOffsetV ( ) const
inlineoverridevirtual
double detinfo::DetectorPropertiesStandard::TimeOffsetY ( ) const
inlineoverridevirtual

Reimplemented from detinfo::DetectorProperties.

Definition at line 220 of file DetectorPropertiesStandard.h.

References fTimeOffsetY.

Referenced by ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::TimeOffsetZ ( ) const
inlineoverridevirtual
void detinfo::DetectorPropertiesStandard::ValidateAndConfigure ( fhicl::ParameterSet const &  p,
std::set< std::string > const &  ignore_params 
)
private

Configures the provider, first validating the configuration.

Parameters
pconfiguration parameter set
ignore_paramsparameters to be ignored (optional)

This method will validate the parameter set (except for the parameters it's explicitly told to ignore) and extract the useful information out of it.

Definition at line 66 of file DetectorPropertiesStandard.cxx.

References detinfo::DetectorPropertiesStandard::SternheimerParameters_t::a, detinfo::DetectorPropertiesStandard::SternheimerParameters_t::cbar, tca::debug, fChannelMap, fDriftVelFudgeFactor, fEfield, fElectronlifetime, fElectronsToADC, fIncludeInterPlanePitchInXTickOffsets, fModBoxA, fModBoxB, fNumberTimeSamples, fReadOutWindowSize, fSimpleBoundary, fSternheimerParameters, fTemperature, fTimeOffsetU, fTimeOffsetV, fTimeOffsetX, fTimeOffsetY, fTimeOffsetZ, fUseIcarusMicrobooneDriftModel, lar::IgnorableProviderConfigKeys(), detinfo::DetectorPropertiesStandard::SternheimerParameters_t::k, geo::kU, geo::kV, geo::kX, geo::kY, geo::kZ, TimeOffsetU(), TimeOffsetV(), TimeOffsetY(), TimeOffsetZ(), detinfo::DetectorPropertiesStandard::SternheimerParameters_t::x0, and detinfo::DetectorPropertiesStandard::SternheimerParameters_t::x1.

Referenced by DetectorPropertiesStandard(), and SimpleBoundary().

68  {
69  {
70  mf::LogInfo debug("setupProvider<DetectorPropertiesStandard>");
71 
72  debug << "Asked to ignore " << ignore_params.size() << " keys:";
73  for (auto const& key : ignore_params)
74  debug << " '" << key << "'";
75  }
76 
77  std::set<std::string> ignorable_keys = lar::IgnorableProviderConfigKeys();
78  ignorable_keys.insert(ignore_params.begin(), ignore_params.end());
79 
80  // parses and validates the parameter set:
81  fhicl::Table<Configuration_t> const config{p, ignorable_keys};
82 
83  fEfield = config().Efield();
84  fElectronlifetime = config().Electronlifetime();
85  fTemperature = config().Temperature();
86  fElectronsToADC = config().ElectronsToADC();
87  fNumberTimeSamples = config().NumberTimeSamples();
88  fReadOutWindowSize = config().ReadOutWindowSize();
89 
90  std::set<geo::View_t> present_views;
91  if (config().TimeOffsetU(fTimeOffsetU)) present_views.insert(geo::kU);
92  if (config().TimeOffsetV(fTimeOffsetV)) present_views.insert(geo::kV);
93  if (config().TimeOffsetZ(fTimeOffsetZ)) present_views.insert(geo::kZ);
94  if (config().TimeOffsetY(fTimeOffsetY)) present_views.insert(geo::kY);
95  if (config().TimeOffsetX(fTimeOffsetX)) present_views.insert(geo::kX);
96 
97  std::string const errors = CheckTimeOffsets(present_views, *fChannelMap);
98  if (!errors.empty()) {
99  throw cet::exception("DetectorPropertiesStandard") << "Detected configuration errors: \n"
100  << errors;
101  }
102 
103  fSternheimerParameters.a = config().SternheimerA();
104  fSternheimerParameters.k = config().SternheimerK();
105  fSternheimerParameters.x0 = config().SternheimerX0();
106  fSternheimerParameters.x1 = config().SternheimerX1();
107  fSternheimerParameters.cbar = config().SternheimerCbar();
108 
109  fDriftVelFudgeFactor = config().DriftVelFudgeFactor();
110 
111  fUseIcarusMicrobooneDriftModel = config().UseIcarusMicrobooneDriftModel();
112 
113  fIncludeInterPlanePitchInXTickOffsets = config().IncludeInterPlanePitchInXTickOffsets();
114 
115  fSimpleBoundary = config().SimpleBoundary();
116 
117  fModBoxA = config().ModBoxAlpha();
118  fModBoxB = config().ModBoxBeta();
119  }
Planes which measure V.
Definition: geo_types.h:132
Planes which measure X direction.
Definition: geo_types.h:136
unsigned int fNumberTimeSamples
number of clock ticks per event
Planes which measure Z direction.
Definition: geo_types.h:134
Planes which measure Y direction.
Definition: geo_types.h:135
Planes which measure U.
Definition: geo_types.h:131
DebugStuff debug
Definition: DebugStruct.cxx:4
SternheimerParameters_t fSternheimerParameters
Sternheimer parameters.
std::set< std::string > const & IgnorableProviderConfigKeys()
Returns a list of configuration keys that providers should ignore.
Definition: ProviderUtil.h:34
unsigned int fReadOutWindowSize
number of clock ticks per readout window
std::vector< double > fEfield
kV/cm (per inter-plane volume) !
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33

Member Data Documentation

geo::WireReadoutGeom const* detinfo::DetectorPropertiesStandard::fChannelMap
private

Definition at line 252 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), and ValidateAndConfigure().

std::vector<std::vector<double> > detinfo::DetectorPropertiesStandard::fDriftDirection
private

Definition at line 285 of file DetectorPropertiesStandard.h.

double detinfo::DetectorPropertiesStandard::fDriftVelFudgeFactor
private

Scaling factor to allow "fudging" of drift velocity

Definition at line 271 of file DetectorPropertiesStandard.h.

Referenced by DriftVelocity(), and ValidateAndConfigure().

std::vector<double> detinfo::DetectorPropertiesStandard::fEfield
private

kV/cm (per inter-plane volume) !

Definition at line 254 of file DetectorPropertiesStandard.h.

Referenced by Efield(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fElectronlifetime
private

microseconds

Definition at line 255 of file DetectorPropertiesStandard.h.

Referenced by ElectronLifetime(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fElectronsToADC
private

conversion factor for # of ionization electrons to 1 ADC count

Definition at line 257 of file DetectorPropertiesStandard.h.

Referenced by ElectronsToADC(), and ValidateAndConfigure().

geo::GeometryCore const* detinfo::DetectorPropertiesStandard::fGeo
private

Definition at line 251 of file DetectorPropertiesStandard.h.

Referenced by DataFor().

bool detinfo::DetectorPropertiesStandard::fIncludeInterPlanePitchInXTickOffsets
private

Historically, ConvertTicksToX has allowed for the drift time between the wire planes. This is appropriate for recob::RawDigits, and recob::Wires from the 1D unfolding, but is not appropriate for recob::Wires from WireCell.

Definition at line 281 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), and ValidateAndConfigure().

detinfo::LArProperties const* detinfo::DetectorPropertiesStandard::fLP
private

Definition at line 250 of file DetectorPropertiesStandard.h.

Referenced by Eloss(), and ElossVar().

double detinfo::DetectorPropertiesStandard::fModBoxA
private

Definition at line 289 of file DetectorPropertiesStandard.h.

Referenced by ModBoxCorrection(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fModBoxB
private

Definition at line 290 of file DetectorPropertiesStandard.h.

Referenced by ModBoxCorrection(), and ValidateAndConfigure().

unsigned int detinfo::DetectorPropertiesStandard::fNumberTimeSamples
private

number of clock ticks per event

Definition at line 259 of file DetectorPropertiesStandard.h.

Referenced by NumberTimeSamples(), SetNumberTimeSamples(), and ValidateAndConfigure().

unsigned int detinfo::DetectorPropertiesStandard::fReadOutWindowSize
private

number of clock ticks per readout window

Definition at line 260 of file DetectorPropertiesStandard.h.

Referenced by ReadOutWindowSize(), and ValidateAndConfigure().

bool detinfo::DetectorPropertiesStandard::fSimpleBoundary
private

Definition at line 287 of file DetectorPropertiesStandard.h.

Referenced by SimpleBoundary(), and ValidateAndConfigure().

SternheimerParameters_t detinfo::DetectorPropertiesStandard::fSternheimerParameters
private

Sternheimer parameters.

Definition at line 283 of file DetectorPropertiesStandard.h.

Referenced by Eloss(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTemperature
private

kelvin

Definition at line 256 of file DetectorPropertiesStandard.h.

Referenced by Temperature(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTimeOffsetU
private

time offset to convert spacepoint coordinates to hit times on view U

Definition at line 261 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), TimeOffsetU(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTimeOffsetV
private

time offset to convert spacepoint coordinates to hit times on view V

Definition at line 263 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), TimeOffsetV(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTimeOffsetX
private

time offset to convert spacepoint coordinates to hit times on view X

Definition at line 269 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTimeOffsetY
private

time offset to convert spacepoint coordinates to hit times on view Y

Definition at line 267 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), TimeOffsetY(), and ValidateAndConfigure().

double detinfo::DetectorPropertiesStandard::fTimeOffsetZ
private

time offset to convert spacepoint coordinates to hit times on view Z

Definition at line 265 of file DetectorPropertiesStandard.h.

Referenced by DataFor(), TimeOffsetZ(), and ValidateAndConfigure().

bool detinfo::DetectorPropertiesStandard::fUseIcarusMicrobooneDriftModel
private

if true, use alternative ICARUS-MicroBooNE drift model instead of Walkowiak-based one

Definition at line 274 of file DetectorPropertiesStandard.h.

Referenced by DriftVelocity(), and ValidateAndConfigure().


The documentation for this class was generated from the following files: