LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
detsim::SimDriftElectrons Class Reference
Inheritance diagram for detsim::SimDriftElectrons:
art::EDProducer art::ProducerBase art::Consumer art::EngineCreator art::ProductRegistryHelper

Classes

struct  ChannelBookKeeping_t
 

Public Types

using ModuleType = EDProducer
 
using WorkerType = WorkerT< EDProducer >
 
template<typename UserConfig , typename KeysToIgnore = void>
using Table = ProducerBase::Table< UserConfig, KeysToIgnore >
 

Public Member Functions

 SimDriftElectrons (fhicl::ParameterSet const &pset)
 
virtual ~SimDriftElectrons ()
 
void produce (art::Event &evt)
 
void beginJob ()
 
void endJob ()
 
void reconfigure (fhicl::ParameterSet const &p)
 
template<typename PROD , BranchType B = InEvent>
ProductID getProductID (std::string const &instanceName={}) const
 
template<typename PROD , BranchType B>
ProductID getProductID (ModuleDescription const &moduleDescription, std::string const &instanceName) const
 
bool modifiesEvent () const
 
template<typename T , BranchType = InEvent>
ProductToken< T > consumes (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ProductToken< T > consumes (InputTag const &it)
 
template<typename T , BranchType = InEvent>
void consumesMany ()
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > consumesView (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ViewToken< T > consumesView (InputTag const &it)
 
template<typename T , BranchType = InEvent>
ProductToken< T > mayConsume (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ProductToken< T > mayConsume (InputTag const &it)
 
template<typename T , BranchType = InEvent>
void mayConsumeMany ()
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > mayConsumeView (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ViewToken< T > mayConsumeView (InputTag const &it)
 
base_engine_tcreateEngine (seed_t seed)
 
base_engine_tcreateEngine (seed_t seed, std::string const &kind_of_engine_to_make)
 
base_engine_tcreateEngine (seed_t seed, std::string const &kind_of_engine_to_make, label_t const &engine_label)
 
seed_t get_seed_value (fhicl::ParameterSet const &pset, char const key[]="seed", seed_t const implicit_seed=-1)
 

Static Public Member Functions

static cet::exempt_ptr< Consumernon_module_context ()
 

Protected Member Functions

CurrentProcessingContext const * currentContext () const
 
void validateConsumedProduct (BranchType const bt, ProductInfo const &pi)
 
void prepareForJob (fhicl::ParameterSet const &pset)
 
void showMissingConsumes () const
 

Private Types

typedef std::map< raw::ChannelID_t, ChannelBookKeeping_tChannelMap_t
 

Private Attributes

art::InputTag fSimModuleLabel
 
const detinfo::DetectorClocksfTimeService
 
std::unique_ptr< CLHEP::RandGauss > fRandGauss
 
double fElectronLifetime
 
double fElectronClusterSize
 
int fMinNumberOfElCluster
 
double fLongitudinalDiffusion
 
double fTransverseDiffusion
 
double fLifetimeCorr_const
 
double fLDiff_const
 
double fTDiff_const
 
double fRecipDriftVel [3]
 
bool fStoreDriftedElectronClusters
 
std::vector< std::vector< ChannelMap_t > > fChannelMaps
 
size_t fNCryostats
 
std::vector< size_t > fNTPCs
 
std::vector< double > fLongDiff
 
std::vector< double > fTransDiff1
 
std::vector< double > fTransDiff2
 
std::vector< double > fnElDiff
 
std::vector< double > fnEnDiff
 
double fDriftClusterPos [3]
 
art::ServiceHandle< geo::GeometryfGeometry
 Handle to the Geometry service. More...
 
::detinfo::ElecClock fClock
 TPC electronics clock. More...
 
larg4::ISCalcSeparate fISAlg
 

Detailed Description

Definition at line 98 of file SimDriftElectrons_module.cc.

Member Typedef Documentation

using art::EDProducer::ModuleType = EDProducer
inherited

Definition at line 34 of file EDProducer.h.

template<typename UserConfig , typename KeysToIgnore = void>
using art::EDProducer::Table = ProducerBase::Table<UserConfig, KeysToIgnore>
inherited

Definition at line 43 of file EDProducer.h.

using art::EDProducer::WorkerType = WorkerT<EDProducer>
inherited

Definition at line 35 of file EDProducer.h.

Constructor & Destructor Documentation

detsim::SimDriftElectrons::SimDriftElectrons ( fhicl::ParameterSet const &  pset)
explicit

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.

Definition at line 182 of file SimDriftElectrons_module.cc.

References art::EngineCreator::createEngine(), fStoreDriftedElectronClusters, and reconfigure().

183  {
184  this->reconfigure(pset);
185 
186  produces< std::vector<sim::SimChannel> >();
187  if(fStoreDriftedElectronClusters)produces< std::vector<sim::SimDriftedElectronCluster> >();
188  //produces< art::Assns<sim::SimChannel, sim::SimEnergyDeposit> >();
189 
190  // create a default random engine; obtain the random seed from
191  // NuRandomService, unless overridden in configuration with key
192  // "Seed"
194  ->createEngine(*this, pset, "Seed");
195 
204  //fOffPlaneMargin = pset.get< double >("ChargeRecoveryMargin",0.0);
205  // Protection against a silly value.
206  //fOffPlaneMargin = std::max(fOffPlaneMargin,0.0);
207  }
base_engine_t & createEngine(seed_t seed)
void reconfigure(fhicl::ParameterSet const &p)
virtual detsim::SimDriftElectrons::~SimDriftElectrons ( )
inlinevirtual

Definition at line 103 of file SimDriftElectrons_module.cc.

References beginJob(), endJob(), tca::evt, produce(), and reconfigure().

103 {};

Member Function Documentation

void detsim::SimDriftElectrons::beginJob ( )
virtual

Reimplemented from art::EDProducer.

Definition at line 222 of file SimDriftElectrons_module.cc.

References e, sim::LArG4Parameters::ElectronClusterSize(), fClock, fElectronClusterSize, fElectronLifetime, fGeometry, fISAlg, fLDiff_const, fLifetimeCorr_const, fLongitudinalDiffusion, fMinNumberOfElCluster, fNCryostats, fNTPCs, fRandGauss, fRecipDriftVel, fTDiff_const, fTimeService, fTransverseDiffusion, art::RandomNumberGenerator::getEngine(), larg4::ISCalcSeparate::Initialize(), LOG_DEBUG, sim::LArG4Parameters::LongitudinalDiffusion(), sim::LArG4Parameters::MinNumberOfElCluster(), n, geo::GeometryCore::Ncryostats(), geo::GeometryCore::NTPC(), art::EngineCreator::rng(), detinfo::DetectorClocks::TPCClock(), and sim::LArG4Parameters::TransverseDiffusion().

Referenced by ~SimDriftElectrons().

223  {
224  fTimeService = lar::providerFrom<detinfo::DetectorClocksService>();
226 
227  // Set up the gaussian generator.
229  CLHEP::HepRandomEngine& engine = rng->getEngine();
230  fRandGauss = std::unique_ptr<CLHEP::RandGauss>(new CLHEP::RandGauss(engine));
231 
232  // Define the physical constants we'll use.
233 
234  auto const * detprop = lar::providerFrom<detinfo::DetectorPropertiesService>();
235  fElectronLifetime = detprop->ElectronLifetime(); // Electron lifetime as returned by the DetectorProperties service assumed to be in us;
236  for (int i = 0; i<3; ++i) {
237  double driftVelocity = detprop->DriftVelocity(detprop->Efield(i),
238  detprop->Temperature())*1.e-3; // Drift velocity as returned by the DetectorProperties service assumed to be in cm/us. Multiply by 1.e-3 to convert into LArSoft standard velocity units, cm/ns;
239 
240  fRecipDriftVel[i] = 1./driftVelocity;
241  }
242 
243  // To-do: Move the parameters we fetch from "LArG4" to detector
244  // properties.
246  fElectronClusterSize = paramHandle->ElectronClusterSize();
248  fLongitudinalDiffusion = paramHandle->LongitudinalDiffusion(); // cm^2/ns units
249  fTransverseDiffusion = paramHandle->TransverseDiffusion(); // cm^2/ns units
250 
251  LOG_DEBUG("SimDriftElectrons") << " e lifetime (ns): " << fElectronLifetime
252  << "\n Temperature (K): " << detprop->Temperature()
253  << "\n Drift velocity (cm/ns): " << 1./fRecipDriftVel[0]
254  <<" "<<1./fRecipDriftVel[1]<<" "<<1./fRecipDriftVel[2];
255 
256  // Opposite of lifetime. Convert from us to standard LArSoft time units, ns;
258  fLDiff_const = std::sqrt(2.*fLongitudinalDiffusion);
259  fTDiff_const = std::sqrt(2.*fTransverseDiffusion);
260 
261  // For this detector's geometry, save the number of cryostats and
262  // the number of TPCs within each cryostat.
264  fNTPCs.resize(fNCryostats);
265  for ( size_t n = 0; n < fNCryostats; ++n )
266  fNTPCs[n] = fGeometry->NTPC(n);
267 
268 
269  fISAlg.Initialize(lar::providerFrom<detinfo::LArPropertiesService>(),
270  detprop,
271  &(*paramHandle),
272  lar::providerFrom<spacecharge::SpaceChargeService>());
273 
274 
275  return;
276  }
void Initialize(const detinfo::LArProperties *larp, const detinfo::DetectorProperties *detp, const sim::LArG4Parameters *lgp, const spacecharge::SpaceCharge *sce)
virtual const ::detinfo::ElecClock & TPCClock() const =0
Lends a constant TPC clock with time set to trigger time.
art::ServiceHandle< geo::Geometry > fGeometry
Handle to the Geometry service.
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
base_engine_t & getEngine() const
double TransverseDiffusion() const
double ElectronClusterSize() const
const detinfo::DetectorClocks * fTimeService
unsigned int NTPC(unsigned int cstat=0) const
Returns the total number of TPCs in the specified cryostat.
static art::ServiceHandle< art::RandomNumberGenerator > & rng()
int MinNumberOfElCluster() const
::detinfo::ElecClock fClock
TPC electronics clock.
#define LOG_DEBUG(id)
Char_t n[5]
std::unique_ptr< CLHEP::RandGauss > fRandGauss
double LongitudinalDiffusion() const
Float_t e
Definition: plot.C:34
template<typename T , BranchType = InEvent>
ProductToken<T> art::Consumer::consumes ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ProductToken<T> art::Consumer::consumes ( InputTag const &  it)
inherited

Definition at line 147 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

148 {
149  if (!moduleContext_)
150  return ProductToken<T>::invalid();
151 
152  consumables_[BT].emplace_back(ConsumableType::Product,
153  TypeID{typeid(T)},
154  it.label(),
155  it.instance(),
156  it.process());
157  return ProductToken<T>{it};
158 }
static ProductToken< T > invalid()
Definition: ProductToken.h:47
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename T , art::BranchType BT>
void art::Consumer::consumesMany ( )
inherited

Definition at line 162 of file Consumer.h.

163 {
164  if (!moduleContext_)
165  return;
166 
167  consumables_[BT].emplace_back(ConsumableType::Many, TypeID{typeid(T)});
168 }
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::Consumer::consumesView ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ViewToken<T> art::Consumer::consumesView ( InputTag const &  it)
inherited

Definition at line 172 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

173 {
174  if (!moduleContext_)
175  return ViewToken<T>::invalid();
176 
177  consumables_[BT].emplace_back(ConsumableType::ViewElement,
178  TypeID{typeid(T)},
179  it.label(),
180  it.instance(),
181  it.process());
182  return ViewToken<T>{it};
183 }
static ViewToken< Element > invalid()
Definition: ProductToken.h:75
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
EngineCreator::base_engine_t & EngineCreator::createEngine ( seed_t  seed,
std::string const &  kind_of_engine_to_make 
)
inherited

Definition at line 32 of file EngineCreator.cc.

References art::EngineCreator::rng().

34 {
35  return rng()->createEngine(
36  placeholder_schedule_id(), seed, kind_of_engine_to_make);
37 }
long seed
Definition: chem4.cc:68
static art::ServiceHandle< art::RandomNumberGenerator > & rng()
EngineCreator::base_engine_t & EngineCreator::createEngine ( seed_t  seed,
std::string const &  kind_of_engine_to_make,
label_t const &  engine_label 
)
inherited

Definition at line 40 of file EngineCreator.cc.

References art::EngineCreator::rng().

43 {
44  return rng()->createEngine(
45  placeholder_schedule_id(), seed, kind_of_engine_to_make, engine_label);
46 }
long seed
Definition: chem4.cc:68
static art::ServiceHandle< art::RandomNumberGenerator > & rng()
CurrentProcessingContext const * art::EDProducer::currentContext ( ) const
protectedinherited

Definition at line 120 of file EDProducer.cc.

References art::EDProducer::current_context_.

121  {
122  return current_context_.get();
123  }
CPC_exempt_ptr current_context_
Definition: EDProducer.h:116
void detsim::SimDriftElectrons::endJob ( )
virtual

Reimplemented from art::EDProducer.

Definition at line 279 of file SimDriftElectrons_module.cc.

Referenced by ~SimDriftElectrons().

280  {
281  }
EngineCreator::seed_t EngineCreator::get_seed_value ( fhicl::ParameterSet const &  pset,
char const  key[] = "seed",
seed_t const  implicit_seed = -1 
)
inherited

Definition at line 49 of file EngineCreator.cc.

References fhicl::ParameterSet::get().

Referenced by art::MixFilter< T >::initEngine_().

52 {
53  auto const& explicit_seeds = pset.get<std::vector<int>>(key, {});
54  return explicit_seeds.empty() ? implicit_seed : explicit_seeds.front();
55 }
template<typename PROD , BranchType B>
ProductID art::EDProducer::getProductID ( std::string const &  instanceName = {}) const
inlineinherited

Definition at line 123 of file EDProducer.h.

References art::EDProducer::moduleDescription_.

124  {
125  return ProducerBase::getProductID<PROD, B>(moduleDescription_,
126  instanceName);
127  }
ModuleDescription moduleDescription_
Definition: EDProducer.h:115
template<typename PROD , BranchType B>
ProductID art::ProducerBase::getProductID ( ModuleDescription const &  moduleDescription,
std::string const &  instanceName 
) const
inherited

Definition at line 56 of file ProducerBase.h.

References B, and art::ModuleDescription::moduleLabel().

Referenced by art::ProducerBase::modifiesEvent().

58  {
59  auto const& pd =
60  get_ProductDescription<PROD>(B, md.moduleLabel(), instanceName);
61  return pd.productID();
62  }
Int_t B
Definition: plot.C:25
template<typename T , BranchType = InEvent>
ProductToken<T> art::Consumer::mayConsume ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ProductToken<T> art::Consumer::mayConsume ( InputTag const &  it)
inherited

Definition at line 190 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

191 {
192  if (!moduleContext_)
193  return ProductToken<T>::invalid();
194 
195  consumables_[BT].emplace_back(ConsumableType::Product,
196  TypeID{typeid(T)},
197  it.label(),
198  it.instance(),
199  it.process());
200  return ProductToken<T>{it};
201 }
static ProductToken< T > invalid()
Definition: ProductToken.h:47
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename T , art::BranchType BT>
void art::Consumer::mayConsumeMany ( )
inherited

Definition at line 205 of file Consumer.h.

206 {
207  if (!moduleContext_)
208  return;
209 
210  consumables_[BT].emplace_back(ConsumableType::Many, TypeID{typeid(T)});
211 }
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::Consumer::mayConsumeView ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ViewToken<T> art::Consumer::mayConsumeView ( InputTag const &  it)
inherited

Definition at line 215 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

216 {
217  if (!moduleContext_)
218  return ViewToken<T>::invalid();
219 
220  consumables_[BT].emplace_back(ConsumableType::ViewElement,
221  TypeID{typeid(T)},
222  it.label(),
223  it.instance(),
224  it.process());
225  return ViewToken<T>{it};
226 }
static ViewToken< Element > invalid()
Definition: ProductToken.h:75
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
bool art::ProducerBase::modifiesEvent ( ) const
inlineinherited

Definition at line 40 of file ProducerBase.h.

References art::ProducerBase::getProductID().

41  {
42  return true;
43  }
void art::Consumer::prepareForJob ( fhicl::ParameterSet const &  pset)
protectedinherited

Definition at line 89 of file Consumer.cc.

References fhicl::ParameterSet::get_if_present().

Referenced by art::EDProducer::doBeginJob(), art::EDFilter::doBeginJob(), and art::EDAnalyzer::doBeginJob().

90 {
91  if (!moduleContext_)
92  return;
93 
94  pset.get_if_present("errorOnMissingConsumes", requireConsumes_);
95  for (auto& consumablesPerBranch : consumables_) {
96  cet::sort_all(consumablesPerBranch);
97  }
98 }
bool requireConsumes_
Definition: Consumer.h:137
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
void detsim::SimDriftElectrons::produce ( art::Event evt)
virtual
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

Implements art::EDProducer.

Definition at line 284 of file SimDriftElectrons_module.cc.

References sim::SimChannel::AddIonizationElectrons(), larg4::ISCalcSeparate::CalculateIonizationAndScintillation(), detsim::SimDriftElectrons::ChannelBookKeeping_t::channelIndex, DEFINE_ART_MODULE, geo::TPCGeo::DetectDriftDirection(), e, energy, fChannelMaps, fClock, fDriftClusterPos, fElectronClusterSize, fGeometry, fISAlg, fLDiff_const, fLifetimeCorr_const, fLongDiff, fMinNumberOfElCluster, fNCryostats, fnElDiff, fnEnDiff, fNTPCs, fRandGauss, fRecipDriftVel, fSimModuleLabel, fStoreDriftedElectronClusters, fTDiff_const, fTimeService, fTransDiff1, fTransDiff2, detinfo::DetectorClocks::G4ToElecTime(), art::DataViewImpl::getByLabel(), LOG_DEBUG, geo::GeometryCore::NearestChannel(), geo::TPCGeo::Nplanes(), larg4::ISCalcSeparate::NumberIonizationElectrons(), geo::TPCGeo::PlaneLocation(), geo::TPCGeo::PlanePitch(), geo::GeometryCore::PositionToCryostat(), geo::GeometryCore::PositionToTPC(), larg4::ISCalcSeparate::Reset(), detsim::SimDriftElectrons::ChannelBookKeeping_t::stepList, detinfo::ElecClock::Ticks(), geo::GeometryCore::TPC(), and xx.

Referenced by ~SimDriftElectrons().

285  {
286  // Fetch the SimEnergyDeposit objects for this event.
287  typedef art::Handle< std::vector<sim::SimEnergyDeposit> > energyDepositHandle_t;
288  energyDepositHandle_t energyDepositHandle;
289  // If there aren't any energy deposits for this event, don't
290  // panic. It's possible someone is doing a study with events
291  // outside the TPC, or where there are only non-ionizing
292  // particles, or something like that.
293  if (!event.getByLabel(fSimModuleLabel, energyDepositHandle))
294  return;
295 
296  // Define the container for the SimChannel objects that will be
297  // transferred to the art::Event after the put statement below.
298  std::unique_ptr< std::vector<sim::SimChannel> > channels(new std::vector<sim::SimChannel>);
299  // Container for the SimDriftedElectronCluster objects
300  std::unique_ptr< std::vector<sim::SimDriftedElectronCluster> > SimDriftedElectronClusterCollection( new std::vector<sim::SimDriftedElectronCluster>);
301 
302  // Clear the channel maps from the last event. Remember,
303  // fChannelMaps is an array[cryo][tpc] of maps.
304  size_t cryo = 0;
305  fChannelMaps.resize(fNCryostats);
306  for (auto& cryoData: fChannelMaps) { // each, a vector of maps
307  cryoData.resize(fNTPCs[cryo++]);
308  for (auto& channelsMap: cryoData) channelsMap.clear(); // each, a map
309  }
310 
311  // We're going through the input vector by index, rather than by
312  // iterator, because we need the index number to compute the
313  // associations near the end of this method.
314  auto const& energyDeposits = *energyDepositHandle;
315  auto energyDepositsSize = energyDeposits.size();
316 
317  // For each energy deposit in this event
318  for ( size_t edIndex = 0; edIndex < energyDepositsSize; ++edIndex )
319  {
320  auto const& energyDeposit = energyDeposits[edIndex];
321 
322  // "xyz" is the position of the energy deposit in world
323  // coordinates. Note that the units of distance in
324  // sim::SimEnergyDeposit are supposed to be cm.
325  auto const mp = energyDeposit.MidPoint();
326  double const xyz[3] = { mp.X(), mp.Y(), mp.Z() };
327 
328  // From the position in world coordinates, determine the
329  // cryostat and tpc. If somehow the step is outside a tpc
330  // (e.g., cosmic rays in rock) just move on to the next one.
331  unsigned int cryostat = 0;
332  try {
333  fGeometry->PositionToCryostat(xyz, cryostat);
334  }
335  catch(cet::exception &e){
336  mf::LogWarning("SimDriftElectrons") << "step "// << energyDeposit << "\n"
337  << "cannot be found in a cryostat\n"
338  << e;
339  continue;
340  }
341 
342  unsigned int tpc = 0;
343  try {
344  fGeometry->PositionToTPC(xyz, tpc, cryostat);
345  }
346  catch(cet::exception &e){
347  mf::LogWarning("SimDriftElectrons") << "step "// << energyDeposit << "\n"
348  << "cannot be found in a TPC\n"
349  << e;
350  continue;
351  }
352 
353  const geo::TPCGeo& tpcGeo = fGeometry->TPC(tpc, cryostat);
354 
355  // The drift direction can be either in the positive
356  // or negative direction in any coordinate x, y or z.
357  // Charge drift in ...
358  // +x: tpcGeo.DetectDriftDirection()==1
359  // -x: tpcGeo.DetectDriftDirection()==-1
360  // +y: tpcGeo.DetectDriftDirection()==2
361  // -y tpcGeo.DetectDriftDirection()==-2
362  // +z: tpcGeo.DetectDriftDirection()==3
363  // -z: tpcGeo.DetectDriftDirection()==-3
364 
365 
366  //Define charge drift direction: driftcoordinate (x, y or z) and driftsign (positive or negative). Also define coordinates perpendicular to drift direction.
367  int driftcoordinate = std::abs(tpcGeo.DetectDriftDirection())-1; //x:0, y:1, z:2
368 
369  int transversecoordinate1 = 0;
370  int transversecoordinate2 = 0;
371  if(driftcoordinate == 0)
372  {
373  transversecoordinate1 = 1;
374  transversecoordinate2 = 2;
375  }
376  else if(driftcoordinate == 1)
377  {
378  transversecoordinate1 = 0;
379  transversecoordinate2 = 2;
380  }
381  else if(driftcoordinate == 2)
382  {
383  transversecoordinate1 = 0;
384  transversecoordinate2 = 1;
385  }
386 
387  if(transversecoordinate1 == transversecoordinate2) continue; //this is the case when driftcoordinate != 0, 1 or 2
388 
389  int driftsign = 0; //1: +x, +y or +z, -1: -x, -y or -z
390  if(tpcGeo.DetectDriftDirection() > 0) driftsign = 1;
391  else driftsign = -1;
392 
393  //Check for charge deposits behind charge readout planes
394  if(driftsign == 1 && tpcGeo.PlaneLocation(0)[driftcoordinate] < xyz[driftcoordinate] )
395  continue;
396  if(driftsign == -1 && tpcGeo.PlaneLocation(0)[driftcoordinate] > xyz[driftcoordinate] )
397  continue;
398 
399 
400 
402  // Center of plane is also returned in cm units
403  double DriftDistance = std::abs(xyz[driftcoordinate] - tpcGeo.PlaneLocation(0)[driftcoordinate]);
404 
405  // Space-charge effect (SCE): Get SCE {x,y,z} offsets for
406  // particular location in TPC
407  geo::Vector_t posOffsets{0.0,0.0,0.0};
408  double posOffsetxyz[3] = {0.0,0.0,0.0}; //need this array for the driftcoordinate and transversecoordinates
409  auto const* SCE = lar::providerFrom<spacecharge::SpaceChargeService>();
410  if (SCE->EnableSimSpatialSCE() == true)
411  {
412  posOffsets = SCE->GetPosOffsets(mp);
413  posOffsetxyz[0] = posOffsets.X();
414  posOffsetxyz[1] = posOffsets.Y();
415  posOffsetxyz[2] = posOffsets.Z();
416  }
417 
418  double avegagetransversePos1 = 0.;
419  double avegagetransversePos2 = 0.;
420 
421  DriftDistance += -1.*posOffsetxyz[driftcoordinate];
422  avegagetransversePos1 = xyz[transversecoordinate1] + posOffsetxyz[transversecoordinate1];
423  avegagetransversePos2 = xyz[transversecoordinate2] + posOffsetxyz[transversecoordinate2];
424 
425 
426  // Space charge distortion could push the energy deposit beyond the wire
427  // plane (see issue #15131). Given that we don't have any subtlety in the
428  // simulation of this region, bringing the deposit exactly on the plane
429  // should be enough for the time being.
430  if (DriftDistance < 0.) DriftDistance = 0.;
431 
432  // Drift time in ns
433  double TDrift = DriftDistance * fRecipDriftVel[0];
434 
435  if (tpcGeo.Nplanes() == 2 && driftcoordinate == 0){// special case for ArgoNeuT (Nplanes = 2 and drift direction = x): plane 0 is the second wire plane
436  TDrift = ((DriftDistance - tpcGeo.PlanePitch(0,1)) * fRecipDriftVel[0]
437  + tpcGeo.PlanePitch(0,1) * fRecipDriftVel[1]);
438  }
439 
440  fISAlg.Reset();
442  //std::cout << "Got " << fISAlg.NumberIonizationElectrons() << "." << std::endl;
443 
444  const double lifetimecorrection = TMath::Exp(TDrift / fLifetimeCorr_const);
445  const int nIonizedElectrons = fISAlg.NumberIonizationElectrons();
446  const double energy = energyDeposit.Energy();
447 
448  // if we have no electrons (too small energy or too large recombination)
449  // we are done already here
450  if (nIonizedElectrons <= 0) {
451  LOG_DEBUG("SimDriftElectrons")
452  << "step "// << energyDeposit << "\n"
453  << "No electrons drifted to readout, " << energy << " MeV lost.";
454  continue;
455  }
456 
457  // includes the effect of lifetime: lifetimecorrection = exp[-tdrift/tau]
458  const double nElectrons = nIonizedElectrons * lifetimecorrection;
459  //std::cout << "After lifetime, " << nElectrons << " electrons." << std::endl;
460 
461  // Longitudinal & transverse diffusion sigma (cm)
462  double SqrtT = std::sqrt(TDrift);
463  double LDiffSig = SqrtT * fLDiff_const;
464  double TDiffSig = SqrtT * fTDiff_const;
465  double electronclsize = fElectronClusterSize;
466 
467  // Number of electron clusters.
468  int nClus = (int) std::ceil(nElectrons / electronclsize);
469  if (nClus < fMinNumberOfElCluster)
470  {
471  electronclsize = nElectrons / fMinNumberOfElCluster;
472  if (electronclsize < 1.0)
473  {
474  electronclsize = 1.0;
475  }
476  nClus = (int) std::ceil(nElectrons / electronclsize);
477  }
478 
479  // Empty and resize the electron-cluster vectors.
480  fLongDiff.clear();
481  fTransDiff1.clear();
482  fTransDiff2.clear();
483  fnElDiff.clear();
484  fnEnDiff.clear();
485  fLongDiff.resize(nClus);
486  fTransDiff1.resize(nClus);
487  fTransDiff2.resize(nClus);
488  fnElDiff.resize(nClus, electronclsize);
489  fnEnDiff.resize(nClus);
490 
491  // fix the number of electrons in the last cluster, that has a smaller size
492  fnElDiff.back() = nElectrons - (nClus-1)*electronclsize;
493 
494  for(size_t xx = 0; xx < fnElDiff.size(); ++xx){
495  if(nElectrons > 0) fnEnDiff[xx] = energy/nElectrons*fnElDiff[xx];
496  else fnEnDiff[xx] = 0.;
497  }
498 
499  //std::cout << "Split into, " << nClus << " clusters." << std::endl;
500 
501  // Smear drift times by longitudinal diffusion
502  if (LDiffSig > 0.0)
503  fRandGauss->fireArray( nClus, &fLongDiff[0], 0., LDiffSig);
504  else
505  fLongDiff.assign(nClus, 0.0);
506 
507  if (TDiffSig > 0.0) {
508  // Smear the coordinates in plane perpendicular to drift direction by the transverse diffusion
509  fRandGauss->fireArray( nClus, &fTransDiff1[0], avegagetransversePos1, TDiffSig);
510  fRandGauss->fireArray( nClus, &fTransDiff2[0], avegagetransversePos2, TDiffSig);
511  }
512  else {
513  fTransDiff1.assign(nClus, avegagetransversePos1);
514  fTransDiff2.assign(nClus, avegagetransversePos2);
515  }
516 
517  //std::cout << "Smeared the " << nClus << " clusters." << std::endl;
518 
519  // make a collection of electrons for each plane
520  for(size_t p = 0; p < tpcGeo.Nplanes(); ++p){
521 
522  fDriftClusterPos[driftcoordinate] = tpcGeo.PlaneLocation(p)[driftcoordinate];
523 
524  // Drift nClus electron clusters to the induction plane
525  for(int k = 0; k < nClus; ++k){
526 
527  //std::cout << "\tCluster " << k << " diffs are "
528  // << fLongDiff[k] << " " << fTransDiff1[k] << " " << fTransDiff2[k]
529  // << std::endl;
530 
531 
532  // Correct drift time for longitudinal diffusion and plane
533  double TDiff = TDrift + fLongDiff[k] * fRecipDriftVel[0];
534 
535  // Take into account different Efields between planes
536  // Also take into account special case for ArgoNeuT (Nplanes = 2 and drift direction = x): plane 0 is the second wire plane
537  for (size_t ip = 0; ip<p; ++ip){
538  TDiff += (tpcGeo.PlaneLocation(ip+1)[driftcoordinate] - tpcGeo.PlaneLocation(ip)[driftcoordinate]) * fRecipDriftVel[(tpcGeo.Nplanes() == 2 && driftcoordinate == 0)?ip+2:ip+1];
539  }
540 
541  fDriftClusterPos[transversecoordinate1] = fTransDiff1[k];
542  fDriftClusterPos[transversecoordinate2] = fTransDiff2[k];
543 
545 
546  // grab the nearest channel to the fDriftClusterPos position
547  try{
548  /*
549  if (fOffPlaneMargin != 0) {
550  // get the effective position where to consider the charge landed;
551  //
552  // Some optimisations are possible; in particular, this method
553  // could be extended to inform us if the point was too far.
554  // Currently, if that is the case the code will proceed, find the
555  // point is off plane, emit a warning and skip the deposition.
556  //
557  auto const landingPos
558  = RecoverOffPlaneDeposit({ fDriftClusterPos[0], fDriftClusterPos[1], fDriftClusterPos[2] }, plane);
559  fDriftClusterPos[0] = landingPos.X();
560  fDriftClusterPos[1] = landingPos.Y();
561  fDriftClusterPos[2] = landingPos.Z();
562 
563  } // if charge lands off plane
564  */
565  raw::ChannelID_t channel = fGeometry->NearestChannel(fDriftClusterPos, p, tpc, cryostat);
566 
567 // std::cout << "fDriftClusterPos[0]: " << fDriftClusterPos[0] << "\t fDriftClusterPos[1]: " << fDriftClusterPos[1] << "\t fDriftClusterPos[2]: " << fDriftClusterPos[2] << std::endl;
568 // std::cout << "channel: " << channel << std::endl;
569 
570  //std::cout << "\tgot channel " << channel << " for cluster " << k << std::endl;
571 
574  // Add potential decay/capture/etc delay effect, simTime.
575  auto const simTime = energyDeposit.Time();
576  unsigned int tdc = fClock.Ticks(fTimeService->G4ToElecTime(TDiff + simTime));
577 
578  // Find whether we already have this channel in our map.
579  ChannelMap_t& channelDataMap = fChannelMaps[cryostat][tpc];
580  auto search = channelDataMap.find(channel);
581 
582  // We will find (or create) the pointer to a
583  // sim::SimChannel.
584  //sim::SimChannel* channelPtr = NULL;
585  size_t channelIndex=0;
586 
587  // Have we created the sim::SimChannel corresponding to
588  // channel ID?
589  if (search == channelDataMap.end())
590  {
591  //std::cout << "\tHaven't done this channel before." << std::endl;
592 
593  // We haven't. Initialize the bookkeeping information
594  // for this channel.
595  ChannelBookKeeping_t bookKeeping;
596 
597  // Add a new channel to the end of the list we'll
598  // write out after we've processed this event.
599  bookKeeping.channelIndex = channels->size();
600  channels->emplace_back( channel );
601  channelIndex = bookKeeping.channelIndex;
602 
603  // Save the pointer to the newly-created
604  // sim::SimChannel.
605  //channelPtr = &(channels->back());
606  //bookKeeping.channelPtr = channelPtr;
607 
608  // Initialize a vector with the index of the step that
609  // created this channel.
610  bookKeeping.stepList.push_back( edIndex );
611 
612  // Save the bookkeeping information for this channel.
613  channelDataMap[channel] = bookKeeping;
614  }
615  else {
616  // We've created this SimChannel for a previous energy
617  // deposit. Get its address.
618 
619  //std::cout << "\tHave seen this channel before." << std::endl;
620 
621  auto& bookKeeping = search->second;
622  channelIndex = bookKeeping.channelIndex;
623  //channelPtr = bookKeeping.channelPtr;
624 
625  // Has this step contributed to this channel before?
626  auto& stepList = bookKeeping.stepList;
627  auto stepSearch = std::find(stepList.begin(), stepList.end(), edIndex );
628  if ( stepSearch == stepList.end() ) {
629  // No, so add this step's index to the list.
630  stepList.push_back( edIndex );
631  }
632  }
633 
634  sim::SimChannel* channelPtr = &(channels->at(channelIndex));
635 
636  //std::cout << "\tAdding electrons to SimChannel" << std::endl;
637  //std::cout << "\t\t"
638  // << energyDeposit.TrackID() << " " << tdc
639  // << " " << xyz[0] << " " << xyz[1] << " " << xyz[2]
640  // << " " << fnEnDiff[k] << " " << fnElDiff[k]
641  // << std::endl;
642 
643  //if(!channelPtr) std::cout << "\tUmm...ptr is NULL?" << std::endl;
644  //else std::cout << "\tChannel is " << channelPtr->Channel() << std::endl;
645  // Add the electron clusters and energy to the
646  // sim::SimChannel
647  channelPtr->AddIonizationElectrons(energyDeposit.TrackID(),
648  tdc,
649  fnElDiff[k],
650  xyz,
651  fnEnDiff[k]);
652 
654  SimDriftedElectronClusterCollection->push_back(sim::SimDriftedElectronCluster(
655  fnElDiff[k],
656  TDiff + simTime, // timing
657  {mp.X(),mp.Y(),mp.Z()}, // mean position of the deposited energy
658  {fDriftClusterPos[0],fDriftClusterPos[1],fDriftClusterPos[2]}, // final position of the drifted cluster
659  {LDiffSig,TDiffSig,TDiffSig}, // Longitudinal (X) and transverse (Y,Z) diffusion
660  fnEnDiff[k], //deposited energy that originated this cluster
661  energyDeposit.TrackID()) );
662 
663  //std::cout << "\tAdded the electrons." << std::endl;
664 
665  }
666  catch(cet::exception &e) {
667  mf::LogWarning("SimDriftElectrons") << "unable to drift electrons from point ("
668  << xyz[0] << "," << xyz[1] << "," << xyz[2]
669  << ") with exception " << e;
670  } // end try to determine channel
671  } // end loop over clusters
672  } // end loop over planes
673  } // for each sim::SimEnergyDeposit
674  /*
675  // Now that we've processed the information for all the
676  // sim::SimEnergyDeposit objects into sim::SimChannel objects,
677  // create the associations between them.
678 
679  // Define the container for the associations between the channels
680  // and the energy deposits (steps). Note it's possible for an
681  // energy deposit to be associated with more than one channel (if
682  // its electrons drift to multiple wires), and a channel will
683  // almost certainly have multiple energy deposits.
684  std::unique_ptr< art::Assns<sim::SimEnergyDeposit, sim::SimChannel> >
685  step2channel (new art::Assns<sim::SimEnergyDeposit, sim::SimChannel>);
686 
687  // For every element in the 3-D fChannelMaps array...
688  for ( auto i = fChannelMaps.begin(); i != fChannelMaps.end(); ++i ) {
689  for ( auto j = i->begin(); j != i->end(); ++j ) {
690  for ( auto k = j->begin(); k != j->end(); ++k ) {
691  const ChannelBookKeeping_t& bookKeeping = (*k).second;
692  const size_t channelIndex = bookKeeping.channelIndex;
693 
694  // Create a one-to-one association between each channel and
695  // each step that created it.
696  for ( size_t m = 0; m < bookKeeping.stepList.size(); ++m)
697  {
698  const size_t edIndex = bookKeeping.stepList[m];
699  // Props to me for figuring out the following two
700  // statements. You have to look deeply in the
701  // documentation for art::Ptr and util::Associations to
702  // put this together.
703  art::Ptr<sim::SimEnergyDeposit> energyDepositPtr( energyDepositHandle, edIndex );
704  util::CreateAssn(*this, event, *channels, energyDepositPtr, *step2channel, channelIndex);
705  }
706  }
707  }
708  }
709  */
710  // Write the sim::SimChannel collection.
711  event.put(std::move(channels));
712  if (fStoreDriftedElectronClusters) event.put(std::move(SimDriftedElectronClusterCollection));
713 
714  // ... and its associations.
715  //event.put(std::move(step2channel));
716 
717  return;
718  }
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space.
Definition: geo_vectors.h:167
double PlanePitch(unsigned int p1=0, unsigned int p2=1) const
Returns the center of the TPC volume in world coordinates [cm].
Definition: TPCGeo.cxx:419
Double_t xx
Definition: macro.C:12
Energy deposited on a readout channel by simulated tracks.
Definition: SimChannel.h:143
CryostatGeo const & PositionToCryostat(geo::Point_t const &point) const
Returns the cryostat at specified location.
void CalculateIonizationAndScintillation(sim::SimEnergyDeposit const &edep)
unsigned int Nplanes() const
Number of planes in this tpc.
Definition: TPCGeo.h:145
Geometry information for a single TPC.
Definition: TPCGeo.h:37
std::vector< std::vector< ChannelMap_t > > fChannelMaps
art::ServiceHandle< geo::Geometry > fGeometry
Handle to the Geometry service.
int Ticks() const
Current clock tick (that is, the number of tick Time() falls in).
Definition: ElecClock.h:235
geo::TPCGeo const & PositionToTPC(geo::Point_t const &point) const
Returns the TPC at specified location.
const detinfo::DetectorClocks * fTimeService
double energy
Definition: plottest35.C:25
virtual double G4ToElecTime(double g4_time) const =0
Given a simulation time [ns], converts it into electronics time [µs].
void AddIonizationElectrons(TrackID_t trackID, TDC_t tdc, double numberElectrons, double const *xyz, double energy)
Add ionization electrons and energy to this channel.
Definition: SimChannel.cxx:52
std::map< raw::ChannelID_t, ChannelBookKeeping_t > ChannelMap_t
double NumberIonizationElectrons() const
short int DetectDriftDirection() const
Returns the expected drift direction based on geometry.
Definition: TPCGeo.cxx:182
::detinfo::ElecClock fClock
TPC electronics clock.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
#define LOG_DEBUG(id)
std::unique_ptr< CLHEP::RandGauss > fRandGauss
TPCGeo const & TPC(unsigned int const tpc=0, unsigned int const cstat=0) const
Returns the specified TPC.
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:27
Float_t e
Definition: plot.C:34
raw::ChannelID_t NearestChannel(geo::Point_t const &worldLoc, geo::PlaneID const &planeid) const
Returns the ID of the channel nearest to the specified position.
const double * PlaneLocation(unsigned int p) const
Returns the coordinates of the center of the specified plane [cm].
Definition: TPCGeo.cxx:413
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
Event finding and building.
void detsim::SimDriftElectrons::reconfigure ( fhicl::ParameterSet const &  p)

Definition at line 210 of file SimDriftElectrons_module.cc.

References fSimModuleLabel, fStoreDriftedElectronClusters, and fhicl::ParameterSet::get().

Referenced by SimDriftElectrons(), and ~SimDriftElectrons().

211  {
212  std::string label= p.get< std::string >("SimulationLabel");
214 
215  fStoreDriftedElectronClusters = p.get< bool >("StoreDriftedElectronClusters", false);
216 
217 
218  return;
219  }
void art::Consumer::showMissingConsumes ( ) const
protectedinherited

Definition at line 125 of file Consumer.cc.

Referenced by art::EDProducer::doEndJob(), art::EDFilter::doEndJob(), art::EDAnalyzer::doEndJob(), and art::RootOutput::endJob().

126 {
127  if (!moduleContext_)
128  return;
129 
130  // If none of the branches have missing consumes statements, exit early.
131  if (std::all_of(cbegin(missingConsumes_),
132  cend(missingConsumes_),
133  [](auto const& perBranch) { return perBranch.empty(); }))
134  return;
135 
136  constexpr cet::HorizontalRule rule{60};
137  mf::LogPrint log{"MTdiagnostics"};
138  log << '\n'
139  << rule('=') << '\n'
140  << "The following consumes (or mayConsume) statements are missing from\n"
141  << module_context(moduleDescription_) << '\n'
142  << rule('-') << '\n';
143 
144  cet::for_all_with_index(
145  missingConsumes_, [&log](std::size_t const i, auto const& perBranch) {
146  for (auto const& pi : perBranch) {
147  log << " "
148  << assemble_consumes_statement(static_cast<BranchType>(i), pi)
149  << '\n';
150  }
151  });
152  log << rule('=');
153 }
cet::exempt_ptr< ModuleDescription const > moduleDescription_
Definition: Consumer.h:140
constexpr T pi()
Returns the constant pi (up to 35 decimal digits of precision)
bool moduleContext_
Definition: Consumer.h:136
ConsumableProductSets missingConsumes_
Definition: Consumer.h:139
void art::Consumer::validateConsumedProduct ( BranchType const  bt,
ProductInfo const &  pi 
)
protectedinherited

Definition at line 101 of file Consumer.cc.

References art::errors::ProductRegistrationFailure.

103 {
104  // Early exits if consumes tracking has been disabled or if the
105  // consumed product is an allowed consumable.
106  if (!moduleContext_)
107  return;
108 
109  if (cet::binary_search_all(consumables_[bt], pi))
110  return;
111 
112  if (requireConsumes_) {
114  "Consumer: an error occurred during validation of a "
115  "retrieved product\n\n")
116  << "The following consumes (or mayConsume) statement is missing from\n"
117  << module_context(moduleDescription_) << ":\n\n"
118  << " " << assemble_consumes_statement(bt, pi) << "\n\n";
119  }
120 
121  missingConsumes_[bt].insert(pi);
122 }
cet::exempt_ptr< ModuleDescription const > moduleDescription_
Definition: Consumer.h:140
bool requireConsumes_
Definition: Consumer.h:137
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
constexpr T pi()
Returns the constant pi (up to 35 decimal digits of precision)
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
ConsumableProductSets missingConsumes_
Definition: Consumer.h:139

Member Data Documentation

std::vector< std::vector<ChannelMap_t> > detsim::SimDriftElectrons::fChannelMaps
private

Definition at line 151 of file SimDriftElectrons_module.cc.

Referenced by produce().

::detinfo::ElecClock detsim::SimDriftElectrons::fClock
private

TPC electronics clock.

Definition at line 173 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

double detsim::SimDriftElectrons::fDriftClusterPos[3]
private

Definition at line 167 of file SimDriftElectrons_module.cc.

Referenced by produce().

double detsim::SimDriftElectrons::fElectronClusterSize
private

Definition at line 122 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

double detsim::SimDriftElectrons::fElectronLifetime
private

Definition at line 121 of file SimDriftElectrons_module.cc.

Referenced by beginJob().

art::ServiceHandle<geo::Geometry> detsim::SimDriftElectrons::fGeometry
private

Handle to the Geometry service.

Definition at line 172 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

larg4::ISCalcSeparate detsim::SimDriftElectrons::fISAlg
private

Definition at line 177 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

double detsim::SimDriftElectrons::fLDiff_const
private

Definition at line 130 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

double detsim::SimDriftElectrons::fLifetimeCorr_const
private

Definition at line 129 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

std::vector< double > detsim::SimDriftElectrons::fLongDiff
private

Definition at line 161 of file SimDriftElectrons_module.cc.

Referenced by produce().

double detsim::SimDriftElectrons::fLongitudinalDiffusion
private

Definition at line 126 of file SimDriftElectrons_module.cc.

Referenced by beginJob().

int detsim::SimDriftElectrons::fMinNumberOfElCluster
private

Definition at line 123 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

size_t detsim::SimDriftElectrons::fNCryostats
private

Definition at line 157 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

std::vector< double > detsim::SimDriftElectrons::fnElDiff
private

Definition at line 164 of file SimDriftElectrons_module.cc.

Referenced by produce().

std::vector< double > detsim::SimDriftElectrons::fnEnDiff
private

Definition at line 165 of file SimDriftElectrons_module.cc.

Referenced by produce().

std::vector<size_t> detsim::SimDriftElectrons::fNTPCs
private

Definition at line 158 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

std::unique_ptr<CLHEP::RandGauss> detsim::SimDriftElectrons::fRandGauss
private

Definition at line 119 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

double detsim::SimDriftElectrons::fRecipDriftVel[3]
private

Definition at line 132 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

art::InputTag detsim::SimDriftElectrons::fSimModuleLabel
private

Definition at line 116 of file SimDriftElectrons_module.cc.

Referenced by produce(), and reconfigure().

bool detsim::SimDriftElectrons::fStoreDriftedElectronClusters
private

Definition at line 134 of file SimDriftElectrons_module.cc.

Referenced by produce(), reconfigure(), and SimDriftElectrons().

double detsim::SimDriftElectrons::fTDiff_const
private

Definition at line 131 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

const detinfo::DetectorClocks* detsim::SimDriftElectrons::fTimeService
private

Definition at line 118 of file SimDriftElectrons_module.cc.

Referenced by beginJob(), and produce().

std::vector< double > detsim::SimDriftElectrons::fTransDiff1
private

Definition at line 162 of file SimDriftElectrons_module.cc.

Referenced by produce().

std::vector< double > detsim::SimDriftElectrons::fTransDiff2
private

Definition at line 163 of file SimDriftElectrons_module.cc.

Referenced by produce().

double detsim::SimDriftElectrons::fTransverseDiffusion
private

Definition at line 127 of file SimDriftElectrons_module.cc.

Referenced by beginJob().


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