LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
filt::LArG4ParticleFilter Class Reference
Inheritance diagram for filt::LArG4ParticleFilter:
art::EDFilter art::ProducerBase art::Consumer art::EngineCreator art::ProductRegistryHelper

Public Types

using ModuleType = EDFilter
 
using WorkerType = WorkerT< EDFilter >
 
template<typename UserConfig >
using Table = ProducerBase::Table< UserConfig >
 

Public Member Functions

 LArG4ParticleFilter (fhicl::ParameterSet const &pset)
 
virtual ~LArG4ParticleFilter ()
 
virtual bool filter (art::Event &e)
 
void reconfigure (fhicl::ParameterSet const &pset)
 
void beginJob ()
 
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 ()
 

Static Public Attributes

static constexpr bool Pass {true}
 
static constexpr bool Fail {false}
 

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 Member Functions

bool IsInterestingParticle (const art::Ptr< simb::MCParticle > particle, int index)
 
bool PDGCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
bool MinMomentumCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
bool MaxMomentumCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
bool StartInTPCCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
bool StopInTPCCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
bool TPCTrajLengthCheck (const art::Ptr< simb::MCParticle > particle, int index)
 
double CalculateLength (const std::vector< TVector3 > &position_segment)
 

Private Attributes

art::ServiceHandle< geo::GeometryfGeom
 
std::vector< int > fInterestingPDGs
 
std::vector< double > fParticleMinMomentum
 
std::vector< double > fParticleMaxMomentum
 
std::vector< int > fStartInTPC
 
std::vector< int > fStopInTPC
 
std::vector< double > fParticleMinTPCLength
 
bool fRequireAllInterestingParticles
 
std::vector< bool > fFoundInterestingParticles
 

Detailed Description

Definition at line 25 of file LArG4ParticleFilter_module.cc.

Member Typedef Documentation

using art::EDFilter::ModuleType = EDFilter
inherited

Definition at line 37 of file EDFilter.h.

template<typename UserConfig >
using art::EDFilter::Table = ProducerBase::Table<UserConfig>
inherited

Definition at line 46 of file EDFilter.h.

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

Definition at line 38 of file EDFilter.h.

Constructor & Destructor Documentation

filt::LArG4ParticleFilter::LArG4ParticleFilter ( fhicl::ParameterSet const &  pset)
explicit
virtual filt::LArG4ParticleFilter::~LArG4ParticleFilter ( )
inlinevirtual

Member Function Documentation

void filt::LArG4ParticleFilter::beginJob ( )
virtual

Reimplemented from art::EDFilter.

Definition at line 117 of file LArG4ParticleFilter_module.cc.

Referenced by ~LArG4ParticleFilter().

117  {
118 
119  return;
120  }
double filt::LArG4ParticleFilter::CalculateLength ( const std::vector< TVector3 > &  position_segment)
private

Definition at line 264 of file LArG4ParticleFilter_module.cc.

References DEFINE_ART_MODULE.

Referenced by TPCTrajLengthCheck(), and ~LArG4ParticleFilter().

264  {
265  double length = 0;
266  //Check how many points we have in the segment. If it is one or less, there is nothing to calculate so return 0
267  if (position_segment.size() <= 1) return length;
268 
269  //Now we need to compare every adjacent pair of positions to work out the length of this segment
270  for (unsigned int i = 1; i < position_segment.size(); i++){
271  length += (position_segment[i] - position_segment[i-1]).Mag();
272  }
273 
274  return length;
275  }
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::EDFilter::currentContext ( ) const
protectedinherited

Definition at line 120 of file EDFilter.cc.

References art::EDFilter::current_context_.

121  {
122  return current_context_.get();
123  }
CPC_exempt_ptr current_context_
Definition: EDFilter.h:125
bool filt::LArG4ParticleFilter::filter ( art::Event e)
virtual

Implements art::EDFilter.

Definition at line 78 of file LArG4ParticleFilter_module.cc.

References fFoundInterestingParticles, fInterestingPDGs, fRequireAllInterestingParticles, art::DataViewImpl::getByLabel(), and IsInterestingParticle().

Referenced by ~LArG4ParticleFilter().

78  {
79 
80  //art::ServiceHandle<geo::Geometry> geom;
81 
82  //Reset the found vector
83  for (unsigned int i = 0; i < fFoundInterestingParticles.size(); i++){
84  fFoundInterestingParticles[i] = false;
85  }
86 
87  //Get the vector of particles
89  e.getByLabel("largeant",particles);
90  //Loop through the particles
91  for (unsigned int part_i = 0; part_i < particles->size(); part_i++){
92  //Get the particle
93  const art::Ptr<simb::MCParticle> particle(particles,part_i);
94  //Loop over the list of particles we want and compare it with the particle we are looking it
95  for (unsigned int interest_i = 0; interest_i < fInterestingPDGs.size(); interest_i++){
96  if (IsInterestingParticle(particle,interest_i)) {
97  if (!fRequireAllInterestingParticles) return true; //If we only require at least one of the particles be found then we have already done our job
98  fFoundInterestingParticles[interest_i] = true;
99  bool foundThemAll = true;
100  for (unsigned int found_i = 0; found_i < fFoundInterestingParticles.size(); found_i++){
101  if (fFoundInterestingParticles[found_i] == false){
102  foundThemAll = false;
103  break;
104  }
105  }
106  if (foundThemAll){
107  return true;
108  }
109  }
110  }
111  }
112 
113  //Assume that the event is not worth saving
114  return false;
115  }
std::vector< bool > fFoundInterestingParticles
bool IsInterestingParticle(const art::Ptr< simb::MCParticle > particle, int index)
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
Definition: fwd.h:25
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::EDFilter::getProductID ( std::string const &  instanceName = {}) const
inlineinherited

Definition at line 131 of file EDFilter.h.

References art::EDFilter::moduleDescription_.

132  {
133  return ProducerBase::getProductID<PROD, B>(moduleDescription_,
134  instanceName);
135  }
ModuleDescription moduleDescription_
Definition: EDFilter.h:124
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
bool filt::LArG4ParticleFilter::IsInterestingParticle ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 122 of file LArG4ParticleFilter_module.cc.

References MaxMomentumCheck(), MinMomentumCheck(), PDGCheck(), StopInTPCCheck(), and TPCTrajLengthCheck().

Referenced by filter(), and ~LArG4ParticleFilter().

122  {
123  //Run the checks
124  if (!PDGCheck(particle,index)) return false;
125  if (!MinMomentumCheck(particle,index)) return false;
126  if (!MaxMomentumCheck(particle,index)) return false;
127  if (!StopInTPCCheck(particle,index)) return false;
128  if (!TPCTrajLengthCheck(particle,index)) return false;
129 
130  return true;
131  }
bool MaxMomentumCheck(const art::Ptr< simb::MCParticle > particle, int index)
bool MinMomentumCheck(const art::Ptr< simb::MCParticle > particle, int index)
bool TPCTrajLengthCheck(const art::Ptr< simb::MCParticle > particle, int index)
bool StopInTPCCheck(const art::Ptr< simb::MCParticle > particle, int index)
bool PDGCheck(const art::Ptr< simb::MCParticle > particle, int index)
bool filt::LArG4ParticleFilter::MaxMomentumCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 145 of file LArG4ParticleFilter_module.cc.

References fParticleMaxMomentum, and simb::MCParticle::Momentum().

Referenced by IsInterestingParticle(), and ~LArG4ParticleFilter().

145  {
146  if (fParticleMaxMomentum[index] > 0 && particle->Momentum(0).Vect().Mag() > fParticleMaxMomentum[index]) return false;
147  return true;
148  }
std::vector< double > fParticleMaxMomentum
const TLorentzVector & Momentum(const int i=0) const
Definition: MCParticle.h:224
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 filt::LArG4ParticleFilter::MinMomentumCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 140 of file LArG4ParticleFilter_module.cc.

References fParticleMinMomentum, and simb::MCParticle::Momentum().

Referenced by IsInterestingParticle(), and ~LArG4ParticleFilter().

140  {
141  if (fParticleMinMomentum[index] > 0 && particle->Momentum(0).Vect().Mag() < fParticleMinMomentum[index]) return false;
142  return true;
143  }
const TLorentzVector & Momentum(const int i=0) const
Definition: MCParticle.h:224
std::vector< double > fParticleMinMomentum
bool art::ProducerBase::modifiesEvent ( ) const
inlineinherited

Definition at line 40 of file ProducerBase.h.

References art::ProducerBase::getProductID().

41  {
42  return true;
43  }
bool filt::LArG4ParticleFilter::PDGCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 133 of file LArG4ParticleFilter_module.cc.

References fInterestingPDGs, and simb::MCParticle::PdgCode().

Referenced by IsInterestingParticle(), and ~LArG4ParticleFilter().

133  {
134  int pdg = fInterestingPDGs[index];
135  if (pdg == 0) return true; //User does not care what the PDG is
136  if (particle->PdgCode() != pdg) return false;
137  return true;
138  }
int PdgCode() const
Definition: MCParticle.h:216
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 filt::LArG4ParticleFilter::reconfigure ( fhicl::ParameterSet const &  pset)

Definition at line 68 of file LArG4ParticleFilter_module.cc.

References fInterestingPDGs, fParticleMaxMomentum, fParticleMinMomentum, fParticleMinTPCLength, fRequireAllInterestingParticles, fStopInTPC, and fhicl::ParameterSet::get().

Referenced by ~LArG4ParticleFilter().

68  {
69  fInterestingPDGs = pset.get<std::vector<int> >("InterestingPDGs");
70  fParticleMinMomentum = pset.get<std::vector<double> >("ParticleMinMomentum");
71  fParticleMaxMomentum = pset.get<std::vector<double> >("ParticleMaxMomentum");
72  fStopInTPC = pset.get<std::vector<int> >("StopInTPC");
73  fParticleMinTPCLength = pset.get<std::vector<double> >("ParticleMinTPCLength");
74  fRequireAllInterestingParticles = pset.get<bool>("RequireAllInterestingParticles");
75  return;
76  }
std::vector< double > fParticleMinTPCLength
std::vector< double > fParticleMaxMomentum
std::vector< double > fParticleMinMomentum
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
bool filt::LArG4ParticleFilter::StartInTPCCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 150 of file LArG4ParticleFilter_module.cc.

References fGeom, geo::GeometryCore::FindTPCAtPosition(), fStartInTPC, geo::CryostatID::isValid, and simb::MCParticle::Position().

Referenced by ~LArG4ParticleFilter().

150  {
151  //Firstly check if we even care if the particle starts in the TPC or not
152  int demand = fStartInTPC[index];
153  if (demand == 0) return true; //We don't care if the particle starts in the TPC or not so pass the check
154  //Get starting position of particle
155  TLorentzVector starting_position_4vect = particle->Position(0);
156  double starting_position[3];
157  starting_position[0] = starting_position_4vect.X();
158  starting_position[1] = starting_position_4vect.Y();
159  starting_position[2] = starting_position_4vect.Z();
160 
161  geo::TPCID tpcid = fGeom->FindTPCAtPosition(starting_position);
162  bool validtpc = tpcid.isValid;
163  //Now we need to compare if we have a TPC that we started in with whether we wanted to start in a TPC at all
164  if (validtpc){
165  //The particle DID start in a TPC. Now, did we WANT this to happen
166  if (demand == 1) return true; //We DID want this to happen
167  else return false;
168  }
169  else{
170  //The particle did NOT start in a TPC. Did we WANT this to happen?
171  if (demand == 2) return true; //We DID want this to happen
172  else return false;
173  }
174 
175  //Assume true by default
176  return true;
177  }
const TLorentzVector & Position(const int i=0) const
Definition: MCParticle.h:223
bool isValid
Whether this ID points to a valid element.
Definition: geo_types.h:129
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
art::ServiceHandle< geo::Geometry > fGeom
The data type to uniquely identify a TPC.
Definition: geo_types.h:195
bool filt::LArG4ParticleFilter::StopInTPCCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 180 of file LArG4ParticleFilter_module.cc.

References fGeom, geo::GeometryCore::FindTPCAtPosition(), fStopInTPC, geo::CryostatID::isValid, simb::MCParticle::NumberTrajectoryPoints(), and simb::MCParticle::Position().

Referenced by IsInterestingParticle(), and ~LArG4ParticleFilter().

180  {
181  //Firstly check if we even care if the particle stops in the TPC or not
182  int demand = fStopInTPC[index];
183  if (demand == 0) return true; //We don't care if the particle stops in the TPC or not so pass the check
184  //Get final position of particle
185  TLorentzVector final_position_4vect = particle->Position(particle->NumberTrajectoryPoints()-1);
186  double final_position[3];
187  final_position[0] = final_position_4vect.X();
188  final_position[1] = final_position_4vect.Y();
189  final_position[2] = final_position_4vect.Z();
190 
191  geo::TPCID tpcid = fGeom->FindTPCAtPosition(final_position);
192  bool validtpc = tpcid.isValid;
193  //Now we need to compare if we have a TPC that we stopped in with whether we wanted to stop in a TPC at all
194  if (validtpc){
195  //The particle DID stop in a TPC. Now, did we WANT this to happen
196  if (demand == 1) return true; //We DID want this to happen
197  else return false;
198  }
199  else{
200  //The particle did NOT stop in a TPC. Did we WANT this to happen?
201  if (demand == 2) return true; //We DID want this to happen
202  else return false;
203  }
204 
205  //Assume true by default
206  return true;
207  }
unsigned int NumberTrajectoryPoints() const
Definition: MCParticle.h:222
const TLorentzVector & Position(const int i=0) const
Definition: MCParticle.h:223
bool isValid
Whether this ID points to a valid element.
Definition: geo_types.h:129
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
art::ServiceHandle< geo::Geometry > fGeom
The data type to uniquely identify a TPC.
Definition: geo_types.h:195
bool filt::LArG4ParticleFilter::TPCTrajLengthCheck ( const art::Ptr< simb::MCParticle particle,
int  index 
)
private

Definition at line 209 of file LArG4ParticleFilter_module.cc.

References CalculateLength(), fGeom, geo::GeometryCore::FindTPCAtPosition(), fParticleMinTPCLength, geo::CryostatID::isValid, simb::MCParticle::NumberTrajectoryPoints(), and simb::MCParticle::Position().

Referenced by IsInterestingParticle(), and ~LArG4ParticleFilter().

209  {
210  double min_traj_length = fParticleMinTPCLength[index];
211 
212  //Firstly, if we don't care about the TPC trajectory length then pass the check
213  if (min_traj_length < 0) return true;
214 
215  //Now the hard bit
216  //To do this, we need to collect the sequential particle positions which are contained in the TPC into segments. The reason for doing this is that the particle may enter a TPC, leave it and enter it again and if this isn't taken into account, the length might be grossly overestimated
217  //It is easiest to store the positions in a vector of vectors
218  bool OK = false;
219  std::vector< std::vector<TVector3> > position_segments;
220  //We are also going to need an empty vector to store in the above vector
221  std::vector<TVector3> position_segment;
222  //Loop through the trajectory points
223  for (unsigned int i = 0; i < particle->NumberTrajectoryPoints(); i++){
224  //Extract the current position of the particle
225  double curr_pos[3];
226  curr_pos[0] = particle->Position(i).X();
227  curr_pos[1] = particle->Position(i).Y();
228  curr_pos[2] = particle->Position(i).Z();
229  geo::TPCID curr_tpcid = fGeom->FindTPCAtPosition(curr_pos);
230  //There are a couple of things to check here. If the particle is currently in the TPC, then we need to store that particular position. If it is NOT in the TPC, then its either exited the TPC or has not yet entered. If it has just exited, then the position_segment should have some positions stored in it, it which case we now need to store this segment. If it has not yet entered the TPC, then we don't need to do anything
231  //If it is currently in the TPC
232  if (curr_tpcid.isValid) position_segment.push_back(particle->Position(i).Vect());
233  //It has just exited the TPC
234  else if (position_segment.size() > 0){
235  //Store the segment
236  position_segments.push_back(position_segment);
237  //Now reset the segment
238  position_segment.clear();
239  }
240  //There is nothing to do because the particle has remained outside of the TPC
241  }
242  //We need to check once more if the position_segment vector has been filled
243  if (position_segment.size() > 0){
244  position_segments.push_back(position_segment);
245  position_segment.clear();
246  }
247  //Now lets check the length of each segment
248  //Firstly, if we didn't store a segment then the particle fails the check
249  if (position_segments.size() == 0) return false;
250  //Now loop through the segments and check if they are above threshold
251  for (unsigned int i = 0; i < position_segments.size(); i++){
252  double segment_length = CalculateLength(position_segments[i]);
253  if (segment_length > min_traj_length){
254  //We found a track segment in the TPC which passes the length threshold so don't flag as bad
255  OK = true;
256  break;
257  }
258  }
259  if (!OK) return false;
260 
261  return true;
262  }
unsigned int NumberTrajectoryPoints() const
Definition: MCParticle.h:222
const TLorentzVector & Position(const int i=0) const
Definition: MCParticle.h:223
bool isValid
Whether this ID points to a valid element.
Definition: geo_types.h:129
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
std::vector< double > fParticleMinTPCLength
art::ServiceHandle< geo::Geometry > fGeom
double CalculateLength(const std::vector< TVector3 > &position_segment)
The data type to uniquely identify a TPC.
Definition: geo_types.h:195
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

constexpr bool art::EDFilter::Fail {false}
staticinherited

Definition at line 33 of file EDFilter.h.

std::vector<bool> filt::LArG4ParticleFilter::fFoundInterestingParticles
private

Definition at line 56 of file LArG4ParticleFilter_module.cc.

Referenced by filter().

art::ServiceHandle<geo::Geometry> filt::LArG4ParticleFilter::fGeom
private
std::vector<int> filt::LArG4ParticleFilter::fInterestingPDGs
private

Definition at line 48 of file LArG4ParticleFilter_module.cc.

Referenced by filter(), PDGCheck(), and reconfigure().

std::vector<double> filt::LArG4ParticleFilter::fParticleMaxMomentum
private

Definition at line 50 of file LArG4ParticleFilter_module.cc.

Referenced by MaxMomentumCheck(), and reconfigure().

std::vector<double> filt::LArG4ParticleFilter::fParticleMinMomentum
private

Definition at line 49 of file LArG4ParticleFilter_module.cc.

Referenced by MinMomentumCheck(), and reconfigure().

std::vector<double> filt::LArG4ParticleFilter::fParticleMinTPCLength
private

Definition at line 53 of file LArG4ParticleFilter_module.cc.

Referenced by reconfigure(), and TPCTrajLengthCheck().

bool filt::LArG4ParticleFilter::fRequireAllInterestingParticles
private

Definition at line 54 of file LArG4ParticleFilter_module.cc.

Referenced by filter(), and reconfigure().

std::vector<int> filt::LArG4ParticleFilter::fStartInTPC
private

Definition at line 51 of file LArG4ParticleFilter_module.cc.

Referenced by StartInTPCCheck().

std::vector<int> filt::LArG4ParticleFilter::fStopInTPC
private

Definition at line 52 of file LArG4ParticleFilter_module.cc.

Referenced by reconfigure(), and StopInTPCCheck().

constexpr bool art::EDFilter::Pass {true}
staticinherited

Definition at line 32 of file EDFilter.h.


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