LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
larg4::LArVoxelReadout Class Reference

Transports energy depositions from GEANT4 to TPC channels. More...

#include "LArVoxelReadout.h"

Inheritance diagram for larg4::LArVoxelReadout:

Classes

struct  Setup_t
 Collection of what it takes to set a LArVoxelReadout up. More...
 

Public Types

typedef std::map< unsigned int, sim::SimChannelChannelMap_t
 Type of map channel -> sim::SimChannel. More...
 

Public Member Functions

 LArVoxelReadout (std::string const &name, geo::GeometryCore const *geom, geo::WireReadoutGeom const *wireReadoutGeom, sim::LArG4Parameters const *lgp)
 Constructor. Can detect which TPC to cover by the name. More...
 
 LArVoxelReadout (std::string const &name, geo::GeometryCore const *geom, geo::WireReadoutGeom const *wireReadoutGeom, sim::LArG4Parameters const *lgp, unsigned int cryostat, unsigned int tpc)
 Constructor. Sets which TPC to work on. More...
 
void Setup (Setup_t const &setupData)
 Reads all the configuration elements from setupData More...
 
void SetSingleTPC (unsigned int cryostat, unsigned int tpc)
 Associates this readout to one specific TPC. More...
 
void SetDiscoverTPC ()
 Sets this readout to discover the TPC of each processed hit. More...
 
virtual void Initialize (G4HCofThisEvent *)
 
virtual void EndOfEvent (G4HCofThisEvent *)
 
virtual void clear ()
 
virtual G4bool ProcessHits (G4Step *, G4TouchableHistory *)
 
virtual void DrawAll ()
 
virtual void PrintAll ()
 
void ClearSimChannels ()
 
std::vector< sim::SimChannelGetSimChannels () const
 Creates a list with the accumulated information for the single TPC. More...
 
std::vector< sim::SimChannelGetSimChannels (unsigned short cryo, unsigned short tpc) const
 Creates a list with the accumulated information for specified TPC. More...
 
const ChannelMap_tGetSimChannelMap () const
 Returns the accumulated channel -> SimChannel map for the single TPC. More...
 
ChannelMap_tGetSimChannelMap ()
 Returns the accumulated channel -> SimChannel map for the single TPC. More...
 
const ChannelMap_tGetSimChannelMap (unsigned short cryo, unsigned short tpc) const
 Returns the accumulated channel -> SimChannel map for the specified TPC. More...
 
ChannelMap_tGetSimChannelMap (unsigned short cryo, unsigned short tpc)
 Returns the accumulated channel -> SimChannel map for the specified TPC. More...
 

Private Member Functions

void SetClockData (detinfo::DetectorClocksData const *const clockData) noexcept
 
void SetPropertiesData (detinfo::DetectorPropertiesData const *const detProp) noexcept
 
void SetOffPlaneChargeRecoveryMargin (double margin)
 Sets the margin for recovery of charge drifted off-plane. More...
 
void SetRandomEngines (CLHEP::HepRandomEngine *pPropGen)
 Sets the random generators to be used. More...
 
geo::Point_t RecoverOffPlaneDeposit (geo::Point_t const &pos, geo::PlaneGeo const &plane) const
 Returns the point on the specified plane closest to position. More...
 
void DriftIonizationElectrons (detinfo::DetectorClocksData const &clockData, G4ThreeVector stepMidPoint, const double simTime, int trackID, unsigned short int cryostat, unsigned short int tpc, int origTrackID)
 
bool Has (std::vector< unsigned short int > v, unsigned short int tpc) const
 
void ProcessStep (G4Step *)
 

Private Attributes

double fDriftVelocity [3]
 
double fLongitudinalDiffusion
 
double fTransverseDiffusion
 
double fElectronLifetime
 
double fElectronClusterSize
 
int fMinNumberOfElCluster
 
bool fDontDriftThem
 
std::vector< unsigned short int > fSkipWireSignalInTPCs
 
double fOffPlaneMargin = 0.0
 Charge deposited within this many [cm] from the plane is lead onto it. More...
 
std::vector< std::vector< ChannelMap_t > > fChannelMaps
 Maps of cryostat, tpc to channel data. More...
 
geo::GeometryCore const * fGeo
 
geo::WireReadoutGeom const * fWireReadoutGeom
 
sim::LArG4Parameters const * fLgp
 
unsigned int fTPC
 which TPC this LArVoxelReadout corresponds to More...
 
unsigned int fCstat
 and in which cryostat (if bSingleTPC is true) More...
 
bool bSingleTPC
 true if this readout is associated with a single TPC More...
 
CLHEP::HepRandomEngine * fPropGen = nullptr
 random engine for charge propagation More...
 
detinfo::DetectorClocksData const * fClockData {nullptr}
 
detinfo::DetectorPropertiesData const * fDetProp {nullptr}
 
G4ThreeVector fStepStart
 
G4ThreeVector fStepEnd
 
size_t fNSteps
 

Friends

class LArVoxelReadoutGeometry
 

Detailed Description

Transports energy depositions from GEANT4 to TPC channels.

This class acts on single energy depositions from GEANT4, simulating the transportation of the ensuing ionisation electrons to the readout channels:

  1. the number of ionisation electrons is read from the current larg4::IonizationAndScintillation instance
  2. space charge displacement is optionally applied
  3. lifetime correction is applied
  4. charge is split in small electron clusters
  5. each cluster is subject to longitudinal and transverse diffusion
  6. each cluster is assigned to one TPC channel for each wire plane
  7. optionally, charge is forced to stay on the planes; otherwise charge drifting outside the plane is lost

For each energy deposition, entries on the appropriate sim::SimChannel are added, with the information of the position where the energy deposit happened (in global coordinates, centimeters), the ID of the Geant4 track which produced the deposition, and the quantized time of arrival to the channel (in global TDC tick units).

At most one entry is added for each electron cluster, but entries from the same energy deposit can be compacted if falling on the same TDC tick.

The main entry point of this class is the method ProcessHits().

Options

A few optional behaviours are supported:

  • lead off-plane charge to the planes: regulated by RecoverOffPlaneDeposit(), if charge which reaches a wire plane is actually off it by less than the chosen margin, it's accounted for by that plane; by default the margin is 0 and all the charge off the plane is lost (with a warning)

Definition at line 159 of file LArVoxelReadout.h.

Member Typedef Documentation

typedef std::map<unsigned int, sim::SimChannel> larg4::LArVoxelReadout::ChannelMap_t

Type of map channel -> sim::SimChannel.

Definition at line 162 of file LArVoxelReadout.h.

Constructor & Destructor Documentation

larg4::LArVoxelReadout::LArVoxelReadout ( std::string const &  name,
geo::GeometryCore const *  geom,
geo::WireReadoutGeom const *  wireReadoutGeom,
sim::LArG4Parameters const *  lgp 
)

Constructor. Can detect which TPC to cover by the name.

Definition at line 51 of file LArVoxelReadout.cxx.

References ClearSimChannels(), fLgp, fWireReadoutGeom, SetDiscoverTPC(), and SetSingleTPC().

55  : G4VSensitiveDetector(name), fGeo{geom}, fWireReadoutGeom{wireReadoutGeom}, fLgp{lgp}
56  {
57  // Initialize values for the electron-cluster calculation.
59 
60  // the standard name contains cryostat and TPC; if we don't find it, we will detect
61  // the TPC at each Geant hit
62  unsigned int cryostat, tpc;
63  if (std::sscanf(name.c_str(), "%*19s%1u%*4s%u", &cryostat, &tpc) == 2)
64  SetSingleTPC(cryostat, tpc);
65  else
67  }
geo::GeometryCore const * fGeo
void SetSingleTPC(unsigned int cryostat, unsigned int tpc)
Associates this readout to one specific TPC.
void SetDiscoverTPC()
Sets this readout to discover the TPC of each processed hit.
sim::LArG4Parameters const * fLgp
geo::WireReadoutGeom const * fWireReadoutGeom
larg4::LArVoxelReadout::LArVoxelReadout ( std::string const &  name,
geo::GeometryCore const *  geom,
geo::WireReadoutGeom const *  wireReadoutGeom,
sim::LArG4Parameters const *  lgp,
unsigned int  cryostat,
unsigned int  tpc 
)

Constructor. Sets which TPC to work on.

Definition at line 72 of file LArVoxelReadout.cxx.

References SetSingleTPC().

78  : LArVoxelReadout(name, geom, wireReadoutGeom, lgp)
79  {
80  SetSingleTPC(cryostat, tpc);
81  }
void SetSingleTPC(unsigned int cryostat, unsigned int tpc)
Associates this readout to one specific TPC.
LArVoxelReadout(std::string const &name, geo::GeometryCore const *geom, geo::WireReadoutGeom const *wireReadoutGeom, sim::LArG4Parameters const *lgp)
Constructor. Can detect which TPC to cover by the name.

Member Function Documentation

void larg4::LArVoxelReadout::clear ( )
virtual

Definition at line 150 of file LArVoxelReadout.cxx.

150 {}
void larg4::LArVoxelReadout::ClearSimChannels ( )

Definition at line 153 of file LArVoxelReadout.cxx.

References fChannelMaps, fGeo, geo::GeometryCore::Ncryostats(), and geo::GeometryCore::NTPC().

Referenced by LArVoxelReadout().

154  {
155  fChannelMaps.resize(fGeo->Ncryostats());
156  size_t cryo = 0;
157  for (auto& cryoData : fChannelMaps) { // each, a vector of maps
158  cryoData.resize(fGeo->NTPC(geo::CryostatID(cryo++)));
159  for (auto& channelsMap : cryoData)
160  channelsMap.clear(); // each, a map
161  } // for cryostats
162  }
unsigned int NTPC(CryostatID const &cryoid=details::cryostat_zero) const
Returns the total number of TPCs in the specified cryostat.
Definition: GeometryCore.h:416
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
Definition: GeometryCore.h:303
geo::GeometryCore const * fGeo
std::vector< std::vector< ChannelMap_t > > fChannelMaps
Maps of cryostat, tpc to channel data.
The data type to uniquely identify a cryostat.
Definition: geo_types.h:187
void larg4::LArVoxelReadout::DrawAll ( )
virtual

Definition at line 571 of file LArVoxelReadout.cxx.

571 {}
void larg4::LArVoxelReadout::DriftIonizationElectrons ( detinfo::DetectorClocksData const &  clockData,
G4ThreeVector  stepMidPoint,
const double  simTime,
int  trackID,
unsigned short int  cryostat,
unsigned short int  tpc,
int  origTrackID 
)
private
Todo:
think about effects of drift between planes
Todo:
think about effects of drift between planes
Todo:
check on what happens if we allow the tdc value to be
Todo:
beyond the end of the expected number of ticks

Definition at line 324 of file LArVoxelReadout.cxx.

References util::abs(), sim::SimChannel::AddIonizationElectrons(), geo::TPCGeo::DriftAxisWithSign(), e, energy, larg4::IonizationAndScintillation::EnergyDeposit(), fChannelMaps, fDriftVelocity, fElectronClusterSize, fElectronLifetime, fGeo, geo::WireReadoutGeom::FirstPlane(), fLongitudinalDiffusion, fMinNumberOfElCluster, fOffPlaneMargin, for(), fPropGen, fTransverseDiffusion, fWireReadoutGeom, detinfo::DetectorClocksData::G4ToElecTime(), geo::PlaneGeo::GetCenter(), larg4::IonizationAndScintillation::Instance(), geo::Iterable< IterationPolicy, Transform >::Iterate(), MF_LOG_DEBUG, geo::WireReadoutGeom::NearestChannel(), geo::Negative, geo::WireReadoutGeom::Nplanes(), larg4::IonizationAndScintillation::NumberIonizationElectrons(), larsim::Utils::SCE::out_of_bounds(), geo::WireReadoutGeom::Plane0Pitch(), geo::WireReadoutGeom::PlanePitch(), geo::Positive, RecoverOffPlaneDeposit(), geo::GeometryCore::TPC(), detinfo::DetectorClocksData::TPCClock(), and xx.

Referenced by ProcessHits().

331  {
332  auto const tpcClock = clockData.TPCClock();
333 
334  // this must be always true, unless caller has been sloppy
335  assert(fPropGen); // No propagation random generator provided?!
336 
337  CLHEP::RandGauss PropRand(*fPropGen);
338 
339  // This routine gets called frequently, once per every particle traveling through
340  // every voxel. Use whatever tricks we can to increase its execution speed.
341 
342  static double LifetimeCorr_const = -1000. * fElectronLifetime;
343  static double LDiff_const = std::sqrt(2. * fLongitudinalDiffusion);
344  static double TDiff_const = std::sqrt(2. * fTransverseDiffusion);
345  static double RecipDriftVel[3] = {
346  1. / fDriftVelocity[0], 1. / fDriftVelocity[1], 1. / fDriftVelocity[2]};
347 
348  struct Deposit_t {
349  double energy = 0.;
350  double electrons = 0.;
351 
352  void add(double more_energy, double more_electrons)
353  {
354  energy += more_energy;
355  electrons += more_electrons;
356  }
357  }; // Deposit_t
358 
359  // Map of electrons to store - catalogued by map[channel][tdc]
360  std::map<raw::ChannelID_t, std::map<unsigned int, Deposit_t>> DepositsToStore;
361 
362  geo::Point_t xyz1;
363 
364  double const xyz[3] = {
365  stepMidPoint.x() / CLHEP::cm, stepMidPoint.y() / CLHEP::cm, stepMidPoint.z() / CLHEP::cm};
366 
367  // Already know which TPC we're in because we have been told
368 
369  try {
370  geo::TPCID const tpcid{cryostat, tpc};
371  geo::TPCGeo const& tpcg = fGeo->TPC(tpcid);
372 
373  // X drift distance - the drift direction can be either in the positive or negative
374  // direction, so use std::abs
375 
377  auto const& plane_center = fWireReadoutGeom->FirstPlane(tpcid).GetCenter();
378  double XDrift = std::abs(stepMidPoint.x() / CLHEP::cm - plane_center.X());
379  auto const [_, driftSign] = tpcg.DriftAxisWithSign();
380  if (driftSign == geo::DriftSign::Negative)
381  XDrift = stepMidPoint.x() / CLHEP::cm - plane_center.X();
382  else if (driftSign == geo::DriftSign::Positive)
383  XDrift = plane_center.X() - stepMidPoint.x() / CLHEP::cm;
384 
385  if (XDrift < 0.) return;
386 
387  // Get SCE {x,y,z} offsets for particular location in TPC
388  geo::Vector_t posOffsets;
389  auto const* SCE = lar::providerFrom<spacecharge::SpaceChargeService>();
390  if (SCE->EnableSimSpatialSCE() == true) {
391  posOffsets = SCE->GetPosOffsets({xyz[0], xyz[1], xyz[2]});
392  if (larsim::Utils::SCE::out_of_bounds(posOffsets)) { return; }
393  }
394  posOffsets.SetX(-posOffsets.X());
395 
396  // Drift time (nano-sec)
397  double TDrift;
398  XDrift += posOffsets.X();
399 
400  // Space charge distortion could push the energy deposit beyond the wire plane (see
401  // issue #15131). Given that we don't have any subtlety in the simulation of this
402  // region, bringing the deposit exactly on the plane should be enough for the time
403  // being.
404  if (XDrift < 0.) XDrift = 0.;
405 
406  TDrift = XDrift * RecipDriftVel[0];
407  unsigned int const nplanes = fWireReadoutGeom->Nplanes(tpcid);
408  if (nplanes == 2) { // special case for ArgoNeuT (plane 0 is the second wire plane)
409  double const pitch = fWireReadoutGeom->PlanePitch(tpcid);
410  TDrift = ((XDrift - pitch) * RecipDriftVel[0] + pitch * RecipDriftVel[1]);
411  }
412 
413  const double lifetimecorrection = TMath::Exp(TDrift / LifetimeCorr_const);
414  const int nIonizedElectrons =
417 
418  // if we have no electrons (too small energy or too large recombination) we are done
419  // already here
420  if (nIonizedElectrons <= 0) {
421  MF_LOG_DEBUG("LArVoxelReadout")
422  << "No electrons drifted to readout, " << energy << " MeV lost.";
423  return;
424  }
425  // includes the effect of lifetime
426  const double nElectrons = nIonizedElectrons * lifetimecorrection;
427 
428  // Longitudinal & transverse diffusion sigma (cm)
429  double SqrtT = std::sqrt(TDrift);
430  double LDiffSig = SqrtT * LDiff_const;
431  double TDiffSig = SqrtT * TDiff_const;
432  double electronclsize = fElectronClusterSize;
433 
434  int nClus = (int)std::ceil(nElectrons / electronclsize);
435  if (nClus < fMinNumberOfElCluster) {
436  electronclsize = nElectrons / fMinNumberOfElCluster;
437  if (electronclsize < 1.0) { electronclsize = 1.0; }
438  nClus = (int)std::ceil(nElectrons / electronclsize);
439  }
440 
441  // Compute arrays of values as quickly as possible.
442  std::vector<double> XDiff(nClus);
443  std::vector<double> YDiff(nClus);
444  std::vector<double> ZDiff(nClus);
445  std::vector<double> nElDiff(nClus, electronclsize);
446  std::vector<double> nEnDiff(nClus);
447 
448  // fix the number of electrons in the last cluster, that has smaller size
449  nElDiff.back() = nElectrons - (nClus - 1) * electronclsize;
450 
451  for (size_t xx = 0; xx < nElDiff.size(); ++xx) {
452  if (nElectrons > 0)
453  nEnDiff[xx] = energy / nElectrons * nElDiff[xx];
454  else
455  nEnDiff[xx] = 0.;
456  }
457 
458  double const averageYtransversePos = (stepMidPoint.y() / CLHEP::cm) + posOffsets.Y();
459  double const averageZtransversePos = (stepMidPoint.z() / CLHEP::cm) + posOffsets.Z();
460 
461  // Smear drift times by x position and drift time
462  if (LDiffSig > 0.0)
463  PropRand.fireArray(nClus, &XDiff[0], 0., LDiffSig);
464  else
465  XDiff.assign(nClus, 0.0);
466 
467  if (TDiffSig > 0.0) {
468  // Smear the Y,Z position by the transverse diffusion
469  PropRand.fireArray(nClus, &YDiff[0], averageYtransversePos, TDiffSig);
470  PropRand.fireArray(nClus, &ZDiff[0], averageZtransversePos, TDiffSig);
471  }
472  else {
473  YDiff.assign(nClus, averageYtransversePos);
474  ZDiff.assign(nClus, averageZtransversePos);
475  }
476 
477  // make a collection of electrons for each plane
478  double const plane_0_center_x = fWireReadoutGeom->FirstPlane(tpcid).GetCenter().X();
479  for (auto const& plane : fWireReadoutGeom->Iterate<geo::PlaneGeo>(tpcid)) {
480 
481  double Plane0Pitch = fWireReadoutGeom->Plane0Pitch(tpcid, plane.ID().Plane);
482 
483  // "-" sign is because Plane0Pitch output is positive. Andrzej
484  xyz1.SetX(plane_0_center_x - Plane0Pitch);
485 
486  // Drift nClus electron clusters to the induction plane
487  for (int k = 0; k < nClus; ++k) {
488  // Correct drift time for longitudinal diffusion and plane
489  double TDiff = TDrift + XDiff[k] * RecipDriftVel[0];
490  // Take into account different Efields between planes. Also take into account
491  // special case for ArgoNeuT where Nplanes = 2.
492  for (unsigned int ip = 0; ip < plane.ID().Plane; ++ip) {
493  TDiff += fWireReadoutGeom->PlanePitch(tpcid, ip, ip + 1) *
494  RecipDriftVel[nplanes == 3 ? ip + 1 : ip + 2];
495  }
496  xyz1.SetY(YDiff[k]);
497  xyz1.SetZ(ZDiff[k]);
498 
500 
501  // grab the nearest channel to the xyz1 position
502  try {
503  if (fOffPlaneMargin != 0) {
504  // get the effective position where to consider the charge landed;
505  //
506  // Some optimisations are possible; in particular, this method could be
507  // extended to inform us if the point was too far. Currently, if that is
508  // the case the code will proceed, find the point is off plane, emit a
509  // warning and skip the deposition.
510  xyz1 = RecoverOffPlaneDeposit(xyz1, plane);
511  } // if charge lands off plane
512  uint32_t channel = fWireReadoutGeom->NearestChannel(xyz1, plane.ID());
513 
516  // Add potential decay/capture/etc delay effect, simTime.
517  unsigned int tdc = tpcClock.Ticks(clockData.G4ToElecTime(TDiff + simTime));
518 
519  // Add electrons produced by each cluster to the map
520  DepositsToStore[channel][tdc].add(nEnDiff[k], nElDiff[k]);
521  }
522  catch (cet::exception& e) {
523  MF_LOG_DEBUG("LArVoxelReadout")
524  << "unable to drift electrons from point (" << xyz[0] << "," << xyz[1] << ","
525  << xyz[2] << ") with exception " << e;
526  }
527  } // end loop over clusters
528  } // end loop over planes
529 
530  // Now store them in SimChannels
531  ChannelMap_t& ChannelDataMap = fChannelMaps[cryostat][tpc];
532 
533  // browse deposited data on each channel: (channel; deposit data in time)
534  for (auto const& deposit_per_channel : DepositsToStore) {
535 
536  raw::ChannelID_t channel = deposit_per_channel.first;
537 
538  // find whether we already have this channel
539  auto iChannelData = ChannelDataMap.find(channel);
540 
541  // channelData is the SimChannel these deposits are going to be added to. If
542  // there is such a channel already, use it (first beanch). If it's a new channel,
543  // the inner assignment creates a new SimChannel in the map, and we save its
544  // reference in channelData
545  sim::SimChannel& channelData = (iChannelData == ChannelDataMap.end()) ?
546  (ChannelDataMap[channel] = sim::SimChannel(channel)) :
547  iChannelData->second;
548 
549  // go through all deposits, one for each TDC: (TDC, deposit data)
550  for (auto const& deposit_per_tdc : deposit_per_channel.second) {
551  channelData.AddIonizationElectrons(trackID,
552  deposit_per_tdc.first,
553  deposit_per_tdc.second.electrons,
554  xyz,
555  deposit_per_tdc.second.energy,
556  origTrackID);
557 
558  } // for deposit on TDCs
559  } // for deposit on channels
560 
561  } // end try intended to catch points where TPC can't be found
562  catch (cet::exception& e) {
563  MF_LOG_DEBUG("LArVoxelReadout") << "step cannot be found in a TPC\n" << e;
564  }
565 
566  return;
567  }
Double_t xx
Definition: macro.C:12
Energy deposited on a readout channel by simulated tracks.
Definition: SimChannel.h:136
double Plane0Pitch(TPCID const &tpcid, unsigned int p1) const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space.
Definition: geo_vectors.h:160
Point_t const & GetCenter() const
Returns the centre of the wire plane in world coordinates [cm].
Definition: PlaneGeo.h:366
bool out_of_bounds(geo::Vector_t const &offset)
Geometry information for a single TPC.
Definition: TPCGeo.h:33
constexpr auto abs(T v)
Returns the absolute value of the argument.
for(Int_t i=0;i< nentries;i++)
Definition: comparison.C:30
double PlanePitch(TPCID const &tpcid, unsigned int p1=0, unsigned int p2=1) const
DriftAxis DriftAxisWithSign() const
Returns the expected drift direction based on geometry.
Definition: TPCGeo.h:78
geo::Point_t RecoverOffPlaneDeposit(geo::Point_t const &pos, geo::PlaneGeo const &plane) const
Returns the point on the specified plane closest to position.
geo::GeometryCore const * fGeo
std::map< unsigned int, sim::SimChannel > ChannelMap_t
Type of map channel -> sim::SimChannel.
Drift towards negative values.
Geometry information for a single wire plane.The plane is represented in the geometry by a solid whic...
Definition: PlaneGeo.h:67
double energy
Definition: plottest35.C:25
static IonizationAndScintillation * Instance()
The data type to uniquely identify a TPC.
Definition: geo_types.h:306
std::vector< std::vector< ChannelMap_t > > fChannelMaps
Maps of cryostat, tpc to channel data.
double fOffPlaneMargin
Charge deposited within this many [cm] from the plane is lead onto it.
raw::ChannelID_t NearestChannel(Point_t const &worldLoc, PlaneID const &planeid) const
Returns the ID of the channel nearest to the specified position.
unsigned int Nplanes(TPCID const &tpcid=details::tpc_zero) const
Returns the total number of planes in the specified TPC.
Drift towards positive values.
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
Definition: geo_vectors.h:180
PlaneGeo const & FirstPlane(TPCID const &tpcid) const
Returns the first plane of the specified TPC.
range_type< T > Iterate() const
Definition: Iterable.h:121
CLHEP::HepRandomEngine * fPropGen
random engine for charge propagation
#define MF_LOG_DEBUG(id)
void AddIonizationElectrons(TrackID_t trackID, TDC_t tdc, double numberElectrons, double const *xyz, double energy, TrackID_t origTrackID=util::kBogusI)
Add ionization electrons and energy to this channel.
Definition: SimChannel.cxx:49
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
TPCGeo const & TPC(TPCID const &tpcid=details::tpc_zero) const
Returns the specified TPC.
Definition: GeometryCore.h:448
geo::WireReadoutGeom const * fWireReadoutGeom
Float_t e
Definition: plot.C:35
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void larg4::LArVoxelReadout::EndOfEvent ( G4HCofThisEvent )
virtual

Definition at line 144 of file LArVoxelReadout.cxx.

References fNSteps, and MF_LOG_DEBUG.

145  {
146  MF_LOG_DEBUG("LArVoxelReadout") << "Total number of steps was " << fNSteps << std::endl;
147  }
#define MF_LOG_DEBUG(id)
const LArVoxelReadout::ChannelMap_t & larg4::LArVoxelReadout::GetSimChannelMap ( ) const

Returns the accumulated channel -> SimChannel map for the single TPC.

Definition at line 164 of file LArVoxelReadout.cxx.

References bSingleTPC, fCstat, and fTPC.

Referenced by GetSimChannelMap().

165  {
166  if (bSingleTPC) return GetSimChannelMap(fCstat, fTPC);
167  throw cet::exception("LArVoxelReadout") << "TPC not specified";
168  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
const ChannelMap_t & GetSimChannelMap() const
Returns the accumulated channel -> SimChannel map for the single TPC.
bool bSingleTPC
true if this readout is associated with a single TPC
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
LArVoxelReadout::ChannelMap_t & larg4::LArVoxelReadout::GetSimChannelMap ( )

Returns the accumulated channel -> SimChannel map for the single TPC.

Definition at line 170 of file LArVoxelReadout.cxx.

References bSingleTPC, fCstat, fTPC, and GetSimChannelMap().

171  {
172  if (bSingleTPC) return GetSimChannelMap(fCstat, fTPC);
173  throw cet::exception("LArVoxelReadout") << "TPC not specified";
174  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
const ChannelMap_t & GetSimChannelMap() const
Returns the accumulated channel -> SimChannel map for the single TPC.
bool bSingleTPC
true if this readout is associated with a single TPC
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
const LArVoxelReadout::ChannelMap_t & larg4::LArVoxelReadout::GetSimChannelMap ( unsigned short  cryo,
unsigned short  tpc 
) const

Returns the accumulated channel -> SimChannel map for the specified TPC.

Definition at line 176 of file LArVoxelReadout.cxx.

References fChannelMaps.

178  {
179  return fChannelMaps.at(cryo).at(tpc);
180  }
std::vector< std::vector< ChannelMap_t > > fChannelMaps
Maps of cryostat, tpc to channel data.
LArVoxelReadout::ChannelMap_t & larg4::LArVoxelReadout::GetSimChannelMap ( unsigned short  cryo,
unsigned short  tpc 
)

Returns the accumulated channel -> SimChannel map for the specified TPC.

Definition at line 182 of file LArVoxelReadout.cxx.

References fChannelMaps.

184  {
185  return fChannelMaps.at(cryo).at(tpc);
186  }
std::vector< std::vector< ChannelMap_t > > fChannelMaps
Maps of cryostat, tpc to channel data.
std::vector< sim::SimChannel > larg4::LArVoxelReadout::GetSimChannels ( ) const

Creates a list with the accumulated information for the single TPC.

Definition at line 188 of file LArVoxelReadout.cxx.

References bSingleTPC, fCstat, and fTPC.

189  {
190  if (bSingleTPC) return GetSimChannels(fCstat, fTPC);
191  throw cet::exception("LArVoxelReadout") << "TPC not specified";
192  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
bool bSingleTPC
true if this readout is associated with a single TPC
std::vector< sim::SimChannel > GetSimChannels() const
Creates a list with the accumulated information for the single TPC.
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
std::vector< sim::SimChannel > larg4::LArVoxelReadout::GetSimChannels ( unsigned short  cryo,
unsigned short  tpc 
) const

Creates a list with the accumulated information for specified TPC.

Definition at line 194 of file LArVoxelReadout.cxx.

References fChannelMaps.

196  {
197  std::vector<sim::SimChannel> channels;
198  const ChannelMap_t& chmap = fChannelMaps.at(cryo).at(tpc);
199  channels.reserve(chmap.size());
200  for (const auto& chpair : chmap)
201  channels.push_back(chpair.second);
202  return channels;
203  }
std::map< unsigned int, sim::SimChannel > ChannelMap_t
Type of map channel -> sim::SimChannel.
std::vector< std::vector< ChannelMap_t > > fChannelMaps
Maps of cryostat, tpc to channel data.
bool larg4::LArVoxelReadout::Has ( std::vector< unsigned short int >  v,
unsigned short int  tpc 
) const
inlineprivate

Definition at line 319 of file LArVoxelReadout.h.

Referenced by ProcessHits().

320  {
321  for (auto c : v)
322  if (c == tpc) return true;
323  return false;
324  }
void larg4::LArVoxelReadout::Initialize ( G4HCofThisEvent )
virtual

Definition at line 109 of file LArVoxelReadout.cxx.

References sim::LArG4Parameters::DisableWireplanes(), detinfo::DetectorPropertiesData::DriftVelocity(), detinfo::DetectorPropertiesData::Efield(), sim::LArG4Parameters::ElectronClusterSize(), detinfo::DetectorPropertiesData::ElectronLifetime(), fClockData, fDetProp, fDontDriftThem, fDriftVelocity, fElectronClusterSize, fElectronLifetime, fLgp, fLongitudinalDiffusion, fMinNumberOfElCluster, fNSteps, fSkipWireSignalInTPCs, fTransverseDiffusion, sim::LArG4Parameters::LongitudinalDiffusion(), MF_LOG_DEBUG, sim::LArG4Parameters::MinNumberOfElCluster(), sim::LArG4Parameters::NoElectronPropagation(), sim::LArG4Parameters::SkipWireSignalInTPCs(), detinfo::DetectorPropertiesData::Temperature(), and sim::LArG4Parameters::TransverseDiffusion().

110  {
111  assert(fClockData != nullptr &&
112  "You must use set the clock data pointer at the beginning "
113  "of each module's event-level call. This might be done through the "
114  "LArVoxelReadoutGeometry::Sentry class.");
115  assert(fDetProp != nullptr &&
116  "You must use set the detector-properties data pointer at the beginning "
117  "of each module's event-level call. This might be done through the "
118  "LArVoxelReadoutGeometry::Sentry class.");
119 
121  for (int i = 0; i < 3; ++i)
122  fDriftVelocity[i] =
124 
131 
132  MF_LOG_DEBUG("LArVoxelReadout")
133  << " e lifetime: " << fElectronLifetime << "\n Temperature: " << fDetProp->Temperature()
134  << "\n Drift velocity: " << fDriftVelocity[0] << " " << fDriftVelocity[1] << " "
135  << fDriftVelocity[2];
136 
138 
139  fNSteps = 0;
140  }
double Temperature() const
In kelvin.
detinfo::DetectorClocksData const * fClockData
double Efield(unsigned int planegap=0) const
kV/cm
double TransverseDiffusion() const
bool NoElectronPropagation() const
std::vector< unsigned short int > fSkipWireSignalInTPCs
const std::vector< unsigned short int > & SkipWireSignalInTPCs() const
double ElectronClusterSize() const
detinfo::DetectorPropertiesData const * fDetProp
double DriftVelocity(double efield=0., double temperature=0.) const
cm/us
int MinNumberOfElCluster() const
#define MF_LOG_DEBUG(id)
sim::LArG4Parameters const * fLgp
double LongitudinalDiffusion() const
bool DisableWireplanes() const
void larg4::LArVoxelReadout::PrintAll ( )
virtual

Definition at line 572 of file LArVoxelReadout.cxx.

572 {}
G4bool larg4::LArVoxelReadout::ProcessHits ( G4Step *  step,
G4TouchableHistory *  pHistory 
)
virtual

Definition at line 207 of file LArVoxelReadout.cxx.

References bSingleTPC, DriftIonizationElectrons(), fClockData, fCstat, fDontDriftThem, fNSteps, fSkipWireSignalInTPCs, fTPC, larg4::ParticleListAction::GetCurrentOrigTrackID(), larg4::ParticleListAction::GetCurrentTrackID(), Has(), larg4::G4PVPlacementWithID< IDTYPE >::ID, larg4::IonizationAndScintillation::Instance(), MF_LOG_DEBUG, and larg4::IonizationAndScintillation::Reset().

208  {
209  // All work done for the "parallel world" "box of voxels" in LArVoxelReadoutGeometry
210  // makes this a fairly simple routine. First, the usual check for non-zero energy:
211 
212  // Only process the hit if the step is inside the active volume and it has deposited
213  // energy. The hit being inside the active volume is virtually sure to happen because
214  // the LArVoxelReadoutGeometry that this class makes use of only has voxels for inside
215  // the TPC.
216 
217  // The step can be no bigger than the size of the voxel, because of the geometry set
218  // up in LArVoxelGeometry and the transportation set up in PhysicsList. Find the
219  // mid-point of the step.
220 
221  if (step->GetTotalEnergyDeposit() > 0) {
222 
223  // Make sure we have the IonizationAndScintillation singleton reset to this step
225  fNSteps++;
226  if (!fDontDriftThem) {
227 
228  G4ThreeVector midPoint =
229  0.5 * (step->GetPreStepPoint()->GetPosition() + step->GetPostStepPoint()->GetPosition());
230  double g4time = step->GetPreStepPoint()->GetGlobalTime();
231 
232  // Find the Geant4 track ID for the particle responsible for depositing the
233  // energy. If we are only storing primary EM shower particles, and this energy is
234  // from a secondary etc EM shower particle, the ID returned is the primary
235  const int trackID = ParticleListAction::GetCurrentTrackID();
236  // For all particles but shower daughters, origTrackID is the same as trackID.
237  // For shower daughters it contains their original trackID instead of the shower
238  // primary's trackID.
239  const int origTrackID = ParticleListAction::GetCurrentOrigTrackID();
240 
241  // Find out which TPC we are in. If this readout object covers just one, we
242  // already know it. Otherwise, we have to ask Geant where we are.
243  unsigned short int cryostat = 0, tpc = 0;
244  if (bSingleTPC) {
245  cryostat = fCstat;
246  tpc = fTPC;
247  }
248  else {
249  // detect the TPC we are in
250  const G4VTouchable* pTouchable = step->GetPreStepPoint()->GetTouchable();
251  if (!pTouchable) {
252  throw cet::exception("LArG4") << "Untouchable step in LArVoxelReadout::ProcessHits()";
253  }
254 
255  // one of the ancestors of the touched volume is supposed to be actually a
256  // G4PVPlacementInTPC that knows which TPC it covers; currently, it's the 4th in
257  // the ladder:
258  // [0] voxel [1] voxel tower [2] voxel plane [3] the full box;
259  G4int depth = 0;
260  while (depth < pTouchable->GetHistoryDepth()) {
261  const G4PVPlacementInTPC* pPVinTPC =
262  dynamic_cast<const G4PVPlacementInTPC*>(pTouchable->GetVolume(depth++));
263  if (!pPVinTPC) continue;
264  cryostat = pPVinTPC->ID.Cryostat;
265  tpc = pPVinTPC->ID.TPC;
266  if (Has(fSkipWireSignalInTPCs, tpc)) { return true; }
267  break;
268  } // while
269  if (depth < pTouchable->GetHistoryDepth()) {
270  // this is a fundamental error where the step does not happen in any TPC; this
271  // should not happen in the readout geometry!
272  throw cet::exception("LArG4") << "No TPC ID found in LArVoxelReadout::ProcessHits()";
273  } // if
274  MF_LOG_DEBUG("LArVoxelReadoutHit") << " hit in C=" << cryostat << " T=" << tpc;
275  } // if more than one TPC
276 
277  // Note that if there is no particle ID for this energy deposit, the trackID will
278  // be sim::NoParticleId.
279 
281  *fClockData, midPoint, g4time, trackID, cryostat, tpc, origTrackID);
282  } // end we are drifting
283  } // end there is non-zero energy deposition
284 
285  return true;
286  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
detinfo::DetectorClocksData const * fClockData
bool bSingleTPC
true if this readout is associated with a single TPC
std::vector< unsigned short int > fSkipWireSignalInTPCs
void DriftIonizationElectrons(detinfo::DetectorClocksData const &clockData, G4ThreeVector stepMidPoint, const double simTime, int trackID, unsigned short int cryostat, unsigned short int tpc, int origTrackID)
static IonizationAndScintillation * Instance()
G4PVPlacementWithID< TPCID_t > G4PVPlacementInTPC
A physical volume with a TPC ID.
bool Has(std::vector< unsigned short int > v, unsigned short int tpc) const
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
#define MF_LOG_DEBUG(id)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void larg4::LArVoxelReadout::ProcessStep ( G4Step *  )
private
geo::Point_t larg4::LArVoxelReadout::RecoverOffPlaneDeposit ( geo::Point_t const &  pos,
geo::PlaneGeo const &  plane 
) const
private

Returns the point on the specified plane closest to position.

Parameters
posthe position to be tested (global coordinates, centimeters)
planethe plane to test the position against
Returns
a position on plane, unless pos is too far from it

This method considers the distance of the position pos from the active part of the plane (see geo::Plane::DeltaFromActivePlane()). If the position is less than a configurable margin far from the plane, the closest point on the plane to that position is returned. Otherwise, the position itself is returned.

Ionization charge may be drifted so that when it arrives to the plane, it actually does not hit the area covered by wires. This can happen for many reasons:

  • space charge distortion led the point outside the fiducial volume (this may be prevented by specific code)
  • diffusion pushes the charge outside the instrumented region
  • the geometry of the wire planes is such that planes have different coverage and what one plane can cover, the next can't

The "recovery" consists in forcing the charge to the instrumented area covered by the plane wires. The distance of the drifted charge from each plane border is computed and compared to the margin. If that distance is smaller than the margin, it is neglected and the charge is assigned a new position on that border.

This method provides the position that should be used for the charge deposition.

This is a simplistic approach to the simulation of border effects, assuming that in fact the electric field, which is continuous and pointing to the collection wires, will drive the charge to the wires even when they are "off track". No correction is applied for the additional time that such deviation would take.

Definition at line 296 of file LArVoxelReadout.cxx.

References util::abs(), geo::PlaneGeo::ComposePoint(), geo::PlaneGeo::DeltaFromActivePlane(), geo::PlaneGeo::DistanceFromPlane(), fOffPlaneMargin, and geo::PlaneGeo::PointWidthDepthProjection().

Referenced by DriftIonizationElectrons().

298  {
299  // translate the landing position on the two frame coordinates ("width" and "depth")
300  auto const landingPos = plane.PointWidthDepthProjection(pos);
301 
302  // compute the distance of the landing position on the two frame coordinates ("width"
303  // and "depth"); keep the point within 10 micrometers (0.001 cm) from the border
304  auto const offPlane = plane.DeltaFromActivePlane(landingPos, 0.001);
305 
306  // if both the distances are below the margin, move the point to the border
307 
308  // nothing to recover: landing is inside
309  if ((offPlane.X() == 0.0) && (offPlane.Y() == 0.0)) return pos;
310 
311  // won't recover: too far
312  if ((std::abs(offPlane.X()) > fOffPlaneMargin) || (std::abs(offPlane.Y()) > fOffPlaneMargin))
313  return pos;
314 
315  // we didn't fully decompose because it might be unnecessary; now we need the full
316  // thing
317  auto const distance = plane.DistanceFromPlane(pos);
318 
319  return plane.ComposePoint(distance, landingPos + offPlane);
320  }
constexpr auto abs(T v)
Returns the absolute value of the argument.
double fOffPlaneMargin
Charge deposited within this many [cm] from the plane is lead onto it.
void larg4::LArVoxelReadout::SetClockData ( detinfo::DetectorClocksData const *const  clockData)
inlineprivatenoexcept

Definition at line 247 of file LArVoxelReadout.h.

248  {
249  fClockData = clockData;
250  }
detinfo::DetectorClocksData const * fClockData
void larg4::LArVoxelReadout::SetDiscoverTPC ( )

Sets this readout to discover the TPC of each processed hit.

Definition at line 99 of file LArVoxelReadout.cxx.

References bSingleTPC, fCstat, fTPC, and MF_LOG_DEBUG.

Referenced by LArVoxelReadout().

100  {
101  bSingleTPC = false;
102  fCstat = 0;
103  fTPC = 0;
104  MF_LOG_DEBUG("LArVoxelReadout") << GetName() << " autodetects TPC";
105  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
bool bSingleTPC
true if this readout is associated with a single TPC
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
#define MF_LOG_DEBUG(id)
void larg4::LArVoxelReadout::SetOffPlaneChargeRecoveryMargin ( double  margin)
inlineprivate

Sets the margin for recovery of charge drifted off-plane.

Parameters
marginthe extent of the margin on each frame coordinate [cm]

This method sets the margin for the recovery of off-plane ionization charge. See RecoverOffPlaneDeposit() for a description of that feature.

This method is used by LArVoxelReadout::Setup().

Definition at line 266 of file LArVoxelReadout.h.

Referenced by Setup().

266 { fOffPlaneMargin = std::max(margin, 0.0); }
double fOffPlaneMargin
Charge deposited within this many [cm] from the plane is lead onto it.
void larg4::LArVoxelReadout::SetPropertiesData ( detinfo::DetectorPropertiesData const *const  detProp)
inlineprivatenoexcept

Definition at line 252 of file LArVoxelReadout.h.

253  {
254  fDetProp = detProp;
255  }
detinfo::DetectorPropertiesData const * fDetProp
void larg4::LArVoxelReadout::SetRandomEngines ( CLHEP::HepRandomEngine *  pPropGen)
private

Sets the random generators to be used.

Definition at line 289 of file LArVoxelReadout.cxx.

References fPropGen.

Referenced by Setup().

290  {
291  assert(pPropGen); // random engine must be present
292  fPropGen = pPropGen;
293  }
CLHEP::HepRandomEngine * fPropGen
random engine for charge propagation
void larg4::LArVoxelReadout::SetSingleTPC ( unsigned int  cryostat,
unsigned int  tpc 
)

Associates this readout to one specific TPC.

Definition at line 91 of file LArVoxelReadout.cxx.

References bSingleTPC, fCstat, fTPC, and MF_LOG_DEBUG.

Referenced by larg4::LArVoxelReadoutGeometry::Construct(), and LArVoxelReadout().

92  {
93  bSingleTPC = true;
94  fCstat = cryostat;
95  fTPC = tpc;
96  MF_LOG_DEBUG("LArVoxelReadout") << GetName() << "covers C=" << fCstat << " T=" << fTPC;
97  }
unsigned int fTPC
which TPC this LArVoxelReadout corresponds to
bool bSingleTPC
true if this readout is associated with a single TPC
unsigned int fCstat
and in which cryostat (if bSingleTPC is true)
#define MF_LOG_DEBUG(id)
void larg4::LArVoxelReadout::Setup ( Setup_t const &  setupData)

Reads all the configuration elements from setupData

Definition at line 84 of file LArVoxelReadout.cxx.

References larg4::LArVoxelReadout::Setup_t::offPlaneMargin, larg4::LArVoxelReadout::Setup_t::propGen, SetOffPlaneChargeRecoveryMargin(), and SetRandomEngines().

Referenced by larg4::LArVoxelReadoutGeometry::Construct().

85  {
86  SetOffPlaneChargeRecoveryMargin(setupData.offPlaneMargin);
87  SetRandomEngines(setupData.propGen);
88  }
void SetRandomEngines(CLHEP::HepRandomEngine *pPropGen)
Sets the random generators to be used.
void SetOffPlaneChargeRecoveryMargin(double margin)
Sets the margin for recovery of charge drifted off-plane.

Friends And Related Function Documentation

friend class LArVoxelReadoutGeometry
friend

Definition at line 245 of file LArVoxelReadout.h.

Member Data Documentation

bool larg4::LArVoxelReadout::bSingleTPC
private

true if this readout is associated with a single TPC

Definition at line 346 of file LArVoxelReadout.h.

Referenced by GetSimChannelMap(), GetSimChannels(), ProcessHits(), SetDiscoverTPC(), and SetSingleTPC().

std::vector<std::vector<ChannelMap_t> > larg4::LArVoxelReadout::fChannelMaps
private

Maps of cryostat, tpc to channel data.

Definition at line 340 of file LArVoxelReadout.h.

Referenced by ClearSimChannels(), DriftIonizationElectrons(), GetSimChannelMap(), and GetSimChannels().

detinfo::DetectorClocksData const* larg4::LArVoxelReadout::fClockData {nullptr}
private

Definition at line 350 of file LArVoxelReadout.h.

Referenced by Initialize(), and ProcessHits().

unsigned int larg4::LArVoxelReadout::fCstat
private

and in which cryostat (if bSingleTPC is true)

Definition at line 345 of file LArVoxelReadout.h.

Referenced by GetSimChannelMap(), GetSimChannels(), ProcessHits(), SetDiscoverTPC(), and SetSingleTPC().

detinfo::DetectorPropertiesData const* larg4::LArVoxelReadout::fDetProp {nullptr}
private

Definition at line 351 of file LArVoxelReadout.h.

Referenced by Initialize().

bool larg4::LArVoxelReadout::fDontDriftThem
private

Definition at line 335 of file LArVoxelReadout.h.

Referenced by Initialize(), and ProcessHits().

double larg4::LArVoxelReadout::fDriftVelocity[3]
private

Definition at line 329 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

double larg4::LArVoxelReadout::fElectronClusterSize
private

Definition at line 333 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

double larg4::LArVoxelReadout::fElectronLifetime
private

Definition at line 332 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

geo::GeometryCore const* larg4::LArVoxelReadout::fGeo
private

Definition at line 341 of file LArVoxelReadout.h.

Referenced by ClearSimChannels(), and DriftIonizationElectrons().

sim::LArG4Parameters const* larg4::LArVoxelReadout::fLgp
private

Definition at line 343 of file LArVoxelReadout.h.

Referenced by Initialize(), and LArVoxelReadout().

double larg4::LArVoxelReadout::fLongitudinalDiffusion
private

Definition at line 330 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

int larg4::LArVoxelReadout::fMinNumberOfElCluster
private

Definition at line 334 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

size_t larg4::LArVoxelReadout::fNSteps
private

Definition at line 358 of file LArVoxelReadout.h.

Referenced by EndOfEvent(), Initialize(), and ProcessHits().

double larg4::LArVoxelReadout::fOffPlaneMargin = 0.0
private

Charge deposited within this many [cm] from the plane is lead onto it.

Definition at line 338 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and RecoverOffPlaneDeposit().

CLHEP::HepRandomEngine* larg4::LArVoxelReadout::fPropGen = nullptr
private

random engine for charge propagation

Definition at line 348 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and SetRandomEngines().

std::vector<unsigned short int> larg4::LArVoxelReadout::fSkipWireSignalInTPCs
private

Definition at line 336 of file LArVoxelReadout.h.

Referenced by Initialize(), and ProcessHits().

G4ThreeVector larg4::LArVoxelReadout::fStepEnd
private

Definition at line 357 of file LArVoxelReadout.h.

G4ThreeVector larg4::LArVoxelReadout::fStepStart
private

Definition at line 356 of file LArVoxelReadout.h.

unsigned int larg4::LArVoxelReadout::fTPC
private

which TPC this LArVoxelReadout corresponds to

Definition at line 344 of file LArVoxelReadout.h.

Referenced by GetSimChannelMap(), GetSimChannels(), ProcessHits(), SetDiscoverTPC(), and SetSingleTPC().

double larg4::LArVoxelReadout::fTransverseDiffusion
private

Definition at line 331 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and Initialize().

geo::WireReadoutGeom const* larg4::LArVoxelReadout::fWireReadoutGeom
private

Definition at line 342 of file LArVoxelReadout.h.

Referenced by DriftIonizationElectrons(), and LArVoxelReadout().


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