Public Types | Public Member Functions | Protected Member Functions | Private Attributes | List of all members
jmshower::JMClusterMerge Class Reference
Inheritance diagram for jmshower::JMClusterMerge:
art::EDProducer art::detail::Producer art::detail::LegacyModule art::Modifier art::ModuleBase art::ProductRegistryHelper

Public Types

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

Public Member Functions

 JMClusterMerge (fhicl::ParameterSet const &pset)
 
 ~JMClusterMerge ()
 
void reconfigure (const fhicl::ParameterSet &pset)
 
void produce (art::Event &evt)
 
void beginJob ()
 
std::string workerType () const
 
void doBeginJob ()
 
void doEndJob ()
 
void doRespondToOpenInputFile (FileBlock const &fb)
 
void doRespondToCloseInputFile (FileBlock const &fb)
 
void doRespondToOpenOutputFiles (FileBlock const &fb)
 
void doRespondToCloseOutputFiles (FileBlock const &fb)
 
bool doBeginRun (RunPrincipal &rp, ModuleContext const &mc)
 
bool doEndRun (RunPrincipal &rp, ModuleContext const &mc)
 
bool doBeginSubRun (SubRunPrincipal &srp, ModuleContext const &mc)
 
bool doEndSubRun (SubRunPrincipal &srp, ModuleContext const &mc)
 
bool doEvent (EventPrincipal &ep, ModuleContext const &mc, std::atomic< std::size_t > &counts_run, std::atomic< std::size_t > &counts_passed, std::atomic< std::size_t > &counts_failed)
 
ModuleDescription const & moduleDescription () const
 
void setModuleDescription (ModuleDescription const &)
 
std::array< std::vector< ProductInfo >, NumBranchTypes > const & getConsumables () const
 
void sortConsumables (std::string const &current_process_name)
 
template<typename T , BranchType BT>
ViewToken< TconsumesView (InputTag const &tag)
 
template<typename T , BranchType BT>
ViewToken< TmayConsumeView (InputTag const &tag)
 

Protected Member Functions

ConsumesCollector & consumesCollector ()
 
template<typename T , BranchType = InEvent>
ProductToken< Tconsumes (InputTag const &)
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > consumesView (InputTag const &)
 
template<typename T , BranchType = InEvent>
void consumesMany ()
 
template<typename T , BranchType = InEvent>
ProductToken< TmayConsume (InputTag const &)
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > mayConsumeView (InputTag const &)
 
template<typename T , BranchType = InEvent>
void mayConsumeMany ()
 

Private Attributes

std::string pSliceDir
 
std::string fClusterLabel
 
int fDebug
 Controls debug output 0=none, 99=scream. More...
 
double fDHitGood
 Maximum distance from the line for a hit to be considered part of it. More...
 
int fMinHit
 
double fGoodness
 
int fMaxPlane
 
bool fMCCheater
 True/false MCCheater SimHit/SimTrack input. More...
 
TH1F * fHistoGoodness
 
TH1F * fHistoGoodnessLog
 Easier to read in the reco validation. More...
 
TH1F * fHistoEnergy
 
TH1F * fHistoPurity
 
TH1F * fHistoRemainingCells
 
TTree * fTrack
 
int m_trackNHit1
 
int m_trackNHit2
 
int m_trackNPlane1
 
int m_trackNPlane2
 
double m_trackChisq1
 
double m_trackChisq2
 
double m_trackChisq
 
double m_trackDiffChisq
 
double m_trackGap
 
double m_trackDHit
 

Detailed Description

Definition at line 46 of file JMClusterMerge_module.cc.

Member Typedef Documentation

Definition at line 17 of file EDProducer.h.

template<typename UserConfig , typename KeysToIgnore = void>
using art::detail::Producer::Table = Modifier::Table<UserConfig, KeysToIgnore>
inherited

Definition at line 25 of file Producer.h.

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

Definition at line 18 of file EDProducer.h.

Constructor & Destructor Documentation

jmshower::JMClusterMerge::JMClusterMerge ( fhicl::ParameterSet const &  pset)
explicit

Definition at line 124 of file JMClusterMerge_module.cc.

References reconfigure().

125  : EDProducer(pset)
126  {
127  reconfigure(pset);
128  produces< std::vector<rb::Track> >();
129 
130  }
EDProducer(fhicl::ParameterSet const &pset)
Definition: EDProducer.h:20
void reconfigure(const fhicl::ParameterSet &pset)
jmshower::JMClusterMerge::~JMClusterMerge ( )

Definition at line 133 of file JMClusterMerge_module.cc.

134  {
135  }

Member Function Documentation

void jmshower::JMClusterMerge::beginJob ( )
virtual

Reimplemented from art::EDProducer.

Definition at line 137 of file JMClusterMerge_module.cc.

References fHistoEnergy, fHistoGoodness, fHistoGoodnessLog, fHistoPurity, fHistoRemainingCells, fTrack, m_trackChisq, m_trackChisq1, m_trackChisq2, m_trackDHit, m_trackDiffChisq, m_trackGap, m_trackNHit1, m_trackNHit2, m_trackNPlane1, and m_trackNPlane2.

138  {
140 
141  fHistoGoodness = tfs->make<TH1F>("fHistoGoodness","Goodness of candidates for merging;Goodness;events", 1000,0.,1000.);
142  fHistoGoodnessLog = tfs->make<TH1F>("fHistoGoodnessLog","Goodness of candidates for merging;Log10[Goodness+1];events", 100,0.,3.);
143  fHistoEnergy = tfs->make<TH1F>("fHistoEnergy","Total Energy of Cells;PE;events", 100,10000.,20000.);
144  fHistoPurity = tfs->make<TH1F>("fHistoPurity","Purity of Clusters;(Hits of true particle/total hits in cluster);events",101,0.,1.01);
145  fHistoRemainingCells = tfs->make<TH1F>("fHistoRemainingCells","True hits not put into a cluster;Missing Cells;events",100,0.,100.);
146 
147  fTrack = tfs->make<TTree>("fTrack","fTrack");
148 
149  fTrack->Branch("trackNHit1", &m_trackNHit1);
150  fTrack->Branch("trackNHit2",&m_trackNHit2);;
151  fTrack->Branch("trackNPlane1",&m_trackNPlane1);
152  fTrack->Branch("trackNPlane2",&m_trackNPlane2);
153  fTrack->Branch("trackChisq1",&m_trackChisq1);
154  fTrack->Branch("trackChisq2",&m_trackChisq2);
155  fTrack->Branch("trackChisq",&m_trackChisq);
156  fTrack->Branch("trackDiffChisq",&m_trackDiffChisq);
157  fTrack->Branch("trackGap",&m_trackGap);
158  fTrack->Branch("trackDHit",&m_trackDHit);
159 
160  }
TH1F * fHistoGoodnessLog
Easier to read in the reco validation.
template<typename T , BranchType BT>
ProductToken< T > art::ModuleBase::consumes ( InputTag const &  tag)
protectedinherited

Definition at line 55 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::consumes(), T, and getGoodRuns4SAM::tag.

56  {
57  return collector_.consumes<T, BT>(tag);
58  }
ConsumesCollector collector_
Definition: ModuleBase.h:50
ProductToken< T > consumes(InputTag const &)
double T
Definition: Xdiff_gwt.C:5
ConsumesCollector& art::ModuleBase::consumesCollector ( )
protectedinherited
template<typename T , BranchType BT>
void art::ModuleBase::consumesMany ( )
protectedinherited

Definition at line 69 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::consumesMany(), and T.

70  {
71  collector_.consumesMany<T, BT>();
72  }
ConsumesCollector collector_
Definition: ModuleBase.h:50
double T
Definition: Xdiff_gwt.C:5
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::ModuleBase::consumesView ( InputTag const &  )
protectedinherited
template<typename T , BranchType BT>
ViewToken<T> art::ModuleBase::consumesView ( InputTag const &  tag)
inherited

Definition at line 62 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::consumesView(), T, and getGoodRuns4SAM::tag.

63  {
64  return collector_.consumesView<T, BT>(tag);
65  }
ConsumesCollector collector_
Definition: ModuleBase.h:50
ViewToken< Element > consumesView(InputTag const &)
double T
Definition: Xdiff_gwt.C:5
void art::detail::Producer::doBeginJob ( )
inherited
bool art::detail::Producer::doBeginRun ( RunPrincipal rp,
ModuleContext const &  mc 
)
inherited
bool art::detail::Producer::doBeginSubRun ( SubRunPrincipal srp,
ModuleContext const &  mc 
)
inherited
void art::detail::Producer::doEndJob ( )
inherited
bool art::detail::Producer::doEndRun ( RunPrincipal rp,
ModuleContext const &  mc 
)
inherited
bool art::detail::Producer::doEndSubRun ( SubRunPrincipal srp,
ModuleContext const &  mc 
)
inherited
bool art::detail::Producer::doEvent ( EventPrincipal ep,
ModuleContext const &  mc,
std::atomic< std::size_t > &  counts_run,
std::atomic< std::size_t > &  counts_passed,
std::atomic< std::size_t > &  counts_failed 
)
inherited
void art::detail::Producer::doRespondToCloseInputFile ( FileBlock const &  fb)
inherited
void art::detail::Producer::doRespondToCloseOutputFiles ( FileBlock const &  fb)
inherited
void art::detail::Producer::doRespondToOpenInputFile ( FileBlock const &  fb)
inherited
void art::detail::Producer::doRespondToOpenOutputFiles ( FileBlock const &  fb)
inherited
std::array<std::vector<ProductInfo>, NumBranchTypes> const& art::ModuleBase::getConsumables ( ) const
inherited
template<typename T , BranchType BT>
ProductToken< T > art::ModuleBase::mayConsume ( InputTag const &  tag)
protectedinherited

Definition at line 76 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::mayConsume(), T, and getGoodRuns4SAM::tag.

77  {
78  return collector_.mayConsume<T, BT>(tag);
79  }
ProductToken< T > mayConsume(InputTag const &)
ConsumesCollector collector_
Definition: ModuleBase.h:50
double T
Definition: Xdiff_gwt.C:5
template<typename T , BranchType BT>
void art::ModuleBase::mayConsumeMany ( )
protectedinherited

Definition at line 90 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::mayConsumeMany(), and T.

91  {
93  }
ConsumesCollector collector_
Definition: ModuleBase.h:50
double T
Definition: Xdiff_gwt.C:5
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::ModuleBase::mayConsumeView ( InputTag const &  )
protectedinherited
template<typename T , BranchType BT>
ViewToken<T> art::ModuleBase::mayConsumeView ( InputTag const &  tag)
inherited

Definition at line 83 of file ModuleBase.h.

References art::ModuleBase::collector_, art::ConsumesCollector::mayConsumeView(), T, and getGoodRuns4SAM::tag.

84  {
85  return collector_.mayConsumeView<T, BT>(tag);
86  }
ConsumesCollector collector_
Definition: ModuleBase.h:50
ViewToken< Element > mayConsumeView(InputTag const &)
double T
Definition: Xdiff_gwt.C:5
ModuleDescription const& art::ModuleBase::moduleDescription ( ) const
inherited
void jmshower::JMClusterMerge::produce ( art::Event evt)
virtual

Implements art::EDProducer.

Definition at line 178 of file JMClusterMerge_module.cc.

References rb::Track::AppendTrajectoryPoint(), cc(), om::cout, cv, DEFINE_ART_MODULE(), dir, makeTrainCVSamples::dirs, e, febshutoff_auto::end, allTimeWatchdog::endl, energy, fClusterLabel, fDebug, fMaxPlane, fMinHit, geom(), art::DataViewImpl::getByLabel(), jmshower::hitSort(), MECModelEnuComparisons::i, rb::Cluster::IsNoise(), geo::kX, geo::kY, demo0::length, geo::LinFit(), Munits::m2, rb::Cluster::MaxTNS(), rb::Cluster::MinTNS(), nc, rb::Cluster::NXCell(), rb::Cluster::NYCell(), pSliceDir, art::PtrVector< T >::push_back(), art::DataViewImpl::put(), util::pythag(), rb::Cluster::SetNoise(), art::PtrVector< T >::size(), gen_hdf5record::size, rb::SortByPlane(), std::sqrt(), febshutoff_auto::start, rb::Prong::Start(), rb::Track::Stop(), track, and POTSpillRate::view.

179  {
181  evt.getByLabel(fClusterLabel, clusthandle);
182 
183  std::unique_ptr< std::vector<rb::Track> > trackcol(new std::vector<rb::Track> );
184 
185  std::vector< std::vector<double> > starts;
186  starts.resize(clusthandle->size());
187  std::vector< std::vector<double> > ends;
188  ends.resize(clusthandle->size());
189  std::vector< std::vector<double> > dirs;
190  dirs.resize(clusthandle->size());
191  std::vector<double> sig;
192  sig.resize(clusthandle->size());
193 
194  std::vector<bool> isnoise;
195  isnoise.resize(clusthandle->size());
196 
197  std::vector<rb::Cluster> vCluster;
198  std::vector< int > trId;
199 
200  unsigned int cc = 0;
201  double energy = 0;
202 
203  //get slices for timing information
205  evt.getByLabel(pSliceDir,slicecol);
206  std::vector< std::pair< double, double> > tMap; //contains min and max time for each slice in event, first number is min, secont max
207  for (unsigned int i=0; i<slicecol->size(); ++i) {
208  const rb::Cluster& s = (*slicecol)[i];
209  if (s.IsNoise()) continue;
210  std::pair< double, double> p(s.MinTNS(), s.MaxTNS()); //add min and max time as a pair for a given slice
211  tMap.push_back(p);
212  }
213 
214  for (unsigned int cv=0;cv<2;cv++) {
216  if (cv == 0) {
217  view = geo::kX;
218  }
219  else {
220  view = geo::kY;
221  }
222 
223  std::vector< art::Ptr<rb::Cluster> > cluster;
224 
225 
226 
227  for(unsigned int i = 0; i < clusthandle->size(); i++){
228  art::Ptr<rb::Cluster> clust(clusthandle, i);
229  if ((cv == 0) && (clust->NXCell() > 0))cluster.push_back(clust);
230  if ((cv == 1) && (clust->NYCell() > 0)) cluster.push_back(clust);
231  }
232 
233 
234  std::sort(cluster.begin(), cluster.end(), hitSort);
236  std::vector< std::vector< art::Ptr< rb::CellHit> > > cells(cluster.size());
237 
238  std::vector< std::vector<int> > motherids(cluster.size());
239  std::vector< std::vector<int> > sonids(cluster.size());
240  std::vector< unsigned int > samemotherson(cluster.size());
241 
242  for (unsigned int i=0;i<cluster.size();i++) {
243  samemotherson[i]=0;
244  for ( unsigned int nh=0;nh<cluster[i]->NCell();nh++) {
245  cells[i].push_back(cluster[i]->Cell(view,nh));
246  energy += cluster[i]->Cell(view,nh)->PE();
247  }
248  if (cells[i].size() > 1) rb::SortByPlane(cells[i]);
249  }
250 
251  for ( unsigned int nc=0;nc<cluster.size();nc++) {
252  if(cluster[nc]->NCell()==0)continue;
253  std::vector<art::Ptr< rb::CellHit> >::iterator itr = cells[nc].begin();
254  art::PtrVector<rb::CellHit> mergecells;
255  for(unsigned int i = 0; i < cluster[nc]->NCell(); i++){
256  mergecells.push_back(cluster[nc]->Cell(view,i));
257  }
258  std::vector<double> xzViewX;
259  std::vector<double> xzViewZ;
260  std::vector<double> yzViewY;
261  std::vector<double> yzViewZ;
262  std::vector<double> xzViewW; // W = weight
263  std::vector<double> yzViewW; // W = weight
264  double xyz[3]; // xyz[0]=x, xyz[1]=y, xyz[2]=z
265  int planeMax = -9999;
266  int planeMin = 9999;
267 
268  //initialize min and max time for a slice window
269  double minTNS = 0.;
270  double maxTNS = 0.;
271  //determine which slice the cluster candidate is a part of
272  for( unsigned int i = 0; i < tMap.size(); ++i){
273  if ((cluster[nc]->MinTNS() >= tMap[i].first) && (cluster[nc]->MaxTNS() <= tMap[i].second)){
274  //setting min and max time to the size of the slice the cluster belongs to
275  minTNS = tMap[i].first;
276  maxTNS = tMap[i].second;
277  break;
278  }
279  }
280 
281  while( itr != cells[nc].end() ){
282  double sig = 1.;
283  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
284  if((*itr)->View() == geo::kX){
285  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
286  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
287  xzViewX.push_back(xyz[0]);
288  xzViewZ.push_back(xyz[2]);
289  xzViewW.push_back(sig);
290  }
291  if((*itr)->View() == geo::kY){
292  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
293  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
294  yzViewY.push_back(xyz[1]);
295  yzViewZ.push_back(xyz[2]);
296  yzViewW.push_back(sig);
297  }
298  itr++;
299  }// end loop over hits in this track
300 
301  double Chi2 = 0.;
302 
303  double xzStart[2] = {0.,0.};
304  double xzEnd[2] = {0.,0.};
305  double slopeXZ = 0.;
306  double interceptXZ = 0.;
307  if (xzViewX.size() >1){
308  Chi2 = geo::LinFit(xzViewZ, xzViewX, xzViewW, &xzStart[0],
309  &xzStart[1], &xzEnd[0], &xzEnd[1]);
310  slopeXZ = 999999.;
311  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
312  if(fabs(xzStart[0] - xzEnd[0]) > 1.e-2){
313  slopeXZ = (xzEnd[1] - xzStart[1])/(xzEnd[0] - xzStart[0]);
314  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
315  }
316  }
317 
318  double yzStart[2] = {0.,0.};
319  double yzEnd[2] = {0.,0.};
320  double slopeYZ = 0.;
321  double interceptYZ = 0.;
322  if (yzViewY.size() >1){
323  Chi2 = geo::LinFit(yzViewZ, yzViewY, yzViewW, &yzStart[0],
324  &yzStart[1], &yzEnd[0], &yzEnd[1]);
325  slopeYZ = 999999.;
326  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
327  if(fabs(yzStart[0] - yzEnd[0]) > 1.e-2){
328  slopeYZ = (yzEnd[1] - yzStart[1])/(yzEnd[0] - yzStart[0]);
329  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
330  }
331  }
332 
333  ///////////////////////////////////////////////////////////////////
334  ///////////////////////////////////////////////////////////////////
335  unsigned int clustcount = cluster.size();
336 
337  for ( unsigned int numclust=0;numclust<cluster.size();numclust++) {
338  if(cluster[numclust]->NCell()==0)continue;
339  if (numclust <= nc) continue;
340 
341  //check to make sure merge candidate is part of the same time slice as cluster we are trying to add
342  if ((cluster[numclust]->MinTNS() < minTNS) || (cluster[numclust]->MaxTNS() > maxTNS)) continue;
343 
344  std::vector<double> xzViewXtest;
345  std::vector<double> xzViewZtest;
346  std::vector<double> yzViewYtest;
347  std::vector<double> yzViewZtest;
348  std::vector<double> xzViewWtest; // W = weight
349  std::vector<double> yzViewWtest; // W = weight
350  double xzStarttest[2] = {0.,0.};
351  double xzEndtest[2] = {0.,0.};
352  double yzStarttest[2] = {0.,0.};
353  double yzEndtest[2] = {0.,0.};
354  int tplaneMax = -9999;
355  int tplaneMin = 9999;
356  bool add = true;
357 
358  if (((int)cells[numclust].size() >= fMinHit) && ((int)cells[nc].size() >= fMinHit)){
359  itr = cells[numclust].begin();
360  while( itr != cells[numclust].end() ){
361  double sig = 1.;
362  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
363  if((*itr)->View() == geo::kX){
364  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
365  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
366  xzViewXtest.push_back(xyz[0]);
367  xzViewZtest.push_back(xyz[2]);
368  xzViewWtest.push_back(sig);
369  }
370  if((*itr)->View() == geo::kY){
371  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
372  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
373  yzViewYtest.push_back(xyz[1]);
374  yzViewZtest.push_back(xyz[2]);
375  yzViewWtest.push_back(sig);
376  }
377  itr++;
378  }// end loop over hits in this track
379 
380  double Chi2test = 0.;
381 
382  if (xzViewXtest.size() >1){
383  Chi2test = geo::LinFit(xzViewZtest, xzViewXtest, xzViewWtest, &xzStarttest[0], &xzStarttest[1], &xzEndtest[0], &xzEndtest[1]);
384  }
385 
386  if (yzViewYtest.size() >1){
387  Chi2test = geo::LinFit(yzViewZtest, yzViewYtest, yzViewWtest, &yzStarttest[0], &yzStarttest[1], &yzEndtest[0], &yzEndtest[1]);
388  }
389 
390  itr = cells[nc].begin();
391  while( itr != cells[nc].end() ){
392  double sig = 1.;
393  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
394  if((*itr)->View() == geo::kX){
395  xzViewXtest.push_back(xyz[0]);
396  xzViewZtest.push_back(xyz[2]);
397  xzViewWtest.push_back(sig);
398  }
399  if((*itr)->View() == geo::kY){
400  yzViewYtest.push_back(xyz[1]);
401  yzViewZtest.push_back(xyz[2]);
402  yzViewWtest.push_back(sig);
403  }
404  itr++;
405  }// end loop over hits in this track
406 
407  double Chi2merge = 0.;
408 
409  if (xzViewXtest.size() >1){
410  Chi2merge = geo::LinFit(xzViewZtest, xzViewXtest, xzViewWtest, &xzStarttest[0],
411  &xzStarttest[1], &xzEndtest[0], &xzEndtest[1]);
412  }
413 
414  if (yzViewYtest.size() >1){
415  Chi2merge = geo::LinFit(yzViewZtest, yzViewYtest, yzViewWtest, &yzStarttest[0],
416  &yzStarttest[1], &yzEndtest[0], &yzEndtest[1]);
417  }
418 
419  double diffChi2 = (Chi2merge - Chi2 - Chi2test)/(cells[numclust].size() +
420  cells[nc].size());
421 
422  if(cluster[nc]->NCell()+cluster[nc]->NCell()>=20){
423  if(diffChi2 > 7.) add = false;
424  }
425 
426  if(cluster[nc]->NCell()+cluster[nc]->NCell()<20){
427  if(diffChi2 > 30.) add = false;
428  }
429 
430  if (tplaneMax < planeMin) {
431  if (planeMin - tplaneMax > fMaxPlane) {add = false;}
432  }
433  if (tplaneMin > planeMax) {
434  if (tplaneMin - planeMax > fMaxPlane) {add = false;}
435  }
436 
437  for(unsigned int m1=0;m1<motherids[nc].size();m1++){
438  for(unsigned int m2=0;m2<motherids[numclust].size();m2++){
439  if(motherids[nc][m1]==motherids[numclust][m2]) add = false;
440  }
441  }
442 
443 
444  if (add) {
445 
446  motherids[numclust].push_back(nc);
447  sonids[nc].push_back(numclust);
448 
449  xzStart[0] = xzStarttest[0];
450  xzStart[1] = xzStarttest[1];
451  yzStart[0] = yzStarttest[0];
452  yzStart[1] = yzStarttest[1];
453  xzEnd[0] = xzEndtest[0];
454  xzEnd[1] = xzEndtest[1];
455  yzEnd[0] = yzEndtest[0];
456  yzEnd[1] = yzEndtest[1];
457 
458  for ( unsigned int nh=0;nh<cluster[numclust]->NCell();nh++) {
459  cells[nc].push_back(cluster[numclust]->Cell(view,nh));
460  mergecells.push_back(cluster[numclust]->Cell(view,nh));
461  }
462 
463  rb::SortByPlane(cells[nc]);
464  rb::SortByPlane(mergecells);
465 
466  Chi2 = Chi2merge;
467 
468 
469 
470  planeMax = -9999;
471  planeMin = 9999;
472  itr = cells[nc].begin();
473  while( itr != cells[nc].end() ){
474  if((*itr)->View() == geo::kX){
475  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
476  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
477  }
478  if((*itr)->View() == geo::kY){
479  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
480  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
481  }
482  itr++;
483  }// end loop over hits in this track
484 
485  slopeXZ = 999999.;
486  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
487  if(fabs(xzStart[0] - xzEnd[0]) > 1.e-2){
488  slopeXZ = (xzEnd[1] - xzStart[1])/(xzEnd[0] - xzStart[0]);
489  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
490  }
491 
492  slopeYZ = 999999.;
493  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
494  if(fabs(yzStart[0] - yzEnd[0]) > 1.e-2){
495  slopeYZ = (yzEnd[1] - yzStart[1])/(yzEnd[0] - yzStart[0]);
496  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
497  }
498  }
499  }
500 
501 
502  if (((int)cells[numclust].size() < fMinHit) && ((int)cells[nc].size() >= fMinHit)){
503 
504  double dHit = 0.; // distance of current hit from line
505  double slope = 0.; // slope for the hit view
506  double intercept = 0.; // intercept in the hit view
507  double point = 0.;
508  tplaneMax = -9999;
509  tplaneMin = 9999;
510  itr = cells[numclust].begin();
511  while( itr != cells[numclust].end() ){
512  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
513  if((*itr)->View() == geo::kX){
514  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
515  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
516  slope = slopeXZ;
517  intercept = interceptXZ;
518  point = xyz[0];
519 
520  }
521  else if((*itr)->View() == geo::kY){
522  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
523  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
524  slope = slopeYZ;
525  intercept = interceptYZ;
526  point = xyz[1];
527  }
528  dHit += fabs(-slope*xyz[2] + point - intercept)/sqrt(slope*slope + 1.);
529  itr++;
530  }
531  dHit = dHit / cells[numclust].size();
532 
533  if(fabs(cluster[numclust]->MinPlane()-cluster[nc]->MinPlane())<8){
534  if(dHit > 30.) add = false;
535  }
536  if(fabs(cluster[numclust]->MinPlane()-cluster[nc]->MinPlane())>=8){
537  if(dHit > 30.) add = false;
538  }
539 
540  if (tplaneMax < planeMin) {
541  if (planeMin - tplaneMax > fMaxPlane) {add = false;}
542  }
543  if (tplaneMin > planeMax) {
544  if (tplaneMin - planeMax > fMaxPlane) {add = false;}
545  }
546 
547  for(unsigned int m1=0;m1<motherids[nc].size();m1++){
548  for(unsigned int m2=0;m2<motherids[numclust].size();m2++){
549  if(motherids[nc][m1]==motherids[numclust][m2]) add = false;
550  }
551  }
552 
553 
554  if (add){
555 
556  motherids[numclust].push_back(nc);
557  sonids[nc].push_back(numclust);
558 
559  for ( unsigned int nh=0;nh<cluster[numclust]->NCell();nh++) {
560  cells[nc].push_back(cluster[numclust]->Cell(view,nh));
561  mergecells.push_back(cluster[numclust]->Cell(view,nh));
562  }
563 
564  rb::SortByPlane(cells[nc]);
565  rb::SortByPlane(mergecells);
566 
567  planeMax = -9999;
568  planeMin = 9999;
569  itr = cells[nc].begin();
570  while( itr != cells[nc].end() ){
571  double sig = 1.;
572  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
573 
574  if((*itr)->View() == geo::kX){
575  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
576  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
577  xzViewXtest.push_back(xyz[0]);
578  xzViewZtest.push_back(xyz[2]);
579  xzViewWtest.push_back(sig);
580  }
581  if((*itr)->View() == geo::kY){
582  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
583  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
584  yzViewYtest.push_back(xyz[1]);
585  yzViewZtest.push_back(xyz[2]);
586  yzViewWtest.push_back(sig);
587  }
588  itr++;
589  }// end loop over hits in this track
590 
591  if (xzViewXtest.size() >1){
592  Chi2 = geo::LinFit(xzViewZtest, xzViewXtest, xzViewWtest, &xzStarttest[0], &xzStarttest[1], &xzEndtest[0], &xzEndtest[1]);
593  }
594 
595  if (yzViewYtest.size() >1){
596  Chi2 = geo::LinFit(yzViewZtest, yzViewYtest, yzViewWtest, &yzStarttest[0], &yzStarttest[1], &yzEndtest[0], &yzEndtest[1]);
597  }
598 
599  xzStart[0] = xzStarttest[0];
600  xzStart[1] = xzStarttest[1];
601  yzStart[0] = yzStarttest[0];
602  yzStart[1] = yzStarttest[1];
603  xzEnd[0] = xzEndtest[0];
604  xzEnd[1] = xzEndtest[1];
605  yzEnd[0] = yzEndtest[0];
606  yzEnd[1] = yzEndtest[1];
607 
608  // reset the end points based on startz and endz
609  slopeXZ = 999999.;
610  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
611  if(fabs(xzStart[0] - xzEnd[0]) > 1.e-2){
612  slopeXZ = (xzEnd[1] - xzStart[1])/(xzEnd[0] - xzStart[0]);
613  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
614  }
615 
616  slopeYZ = 999999.;
617  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
618  if(fabs(yzStart[0] - yzEnd[0]) > 1.e-2){
619  slopeYZ = (yzEnd[1] - yzStart[1])/(yzEnd[0] - yzStart[0]);
620  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
621  }
622  }
623 
624  if ((numclust == (cluster.size()-1)) && (clustcount != cluster.size())){
625  numclust=0;
626  clustcount = cluster.size();
627  }
628 
629  }
630 
631 
632  if ((int)cells[numclust].size() < 3 && (int)cells[nc].size() < 3 && (int)cells[numclust].size()>0 && (int)cells[nc].size()>0 ) {
633  double dHit = 0.; // distance of current hit from line
634  double point = 0.;
635  tplaneMax = -9999;
636  tplaneMin = 9999;
637  dHit = 9999;
638  itr = cells[numclust].begin();
639  while( itr != cells[numclust].end() ){
640  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
641  if((*itr)->View() == geo::kX){
642  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
643  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
644  point = xyz[0];
645  }
646  else if((*itr)->View() == geo::kY){
647  if ((*itr)->Plane() > tplaneMax) tplaneMax = (*itr)->Plane();
648  if ((*itr)->Plane() < tplaneMin) tplaneMin = (*itr)->Plane();
649  point = xyz[1];
650  }
651  for(unsigned int ii = 0; ii<cells[nc].size(); ii++){
652  double point0 = 0;
653  double z0 = 0;
654  if((*itr)->View() == geo::kX){
655  point0 = xzViewX[ii];
656  z0 = xzViewZ[ii];
657  }else{
658  point0 = yzViewY[ii];
659  z0 = yzViewZ[ii];
660  }
661 
662  double Hitd = sqrt((point-point0)*(point-point0)+(xyz[2]-z0)*(xyz[2]-z0));
663  if(Hitd<dHit)dHit = Hitd;
664  }
665  itr++;
666  }
667 
668  int trackGap = 0;
669  if (tplaneMax <= planeMin) {
670  trackGap = planeMin - tplaneMax;
671  }
672  if (tplaneMin > planeMax) {
673  trackGap = tplaneMin - planeMax;
674  }
675 
676  if (trackGap ==0 && dHit > 15){add = false;}
677  if (trackGap !=0 && dHit > 20){add = false;}
678 
679  if (add){
680 
681  motherids[numclust].push_back(nc);
682  sonids[nc].push_back(numclust);
683 
684  for ( unsigned int nh=0;nh<cluster[numclust]->NCell();nh++) {
685  cells[nc].push_back(cluster[numclust]->Cell(view,nh));
686  mergecells.push_back(cluster[numclust]->Cell(view,nh));
687  }
688 
689  rb::SortByPlane(cells[nc]);
690  rb::SortByPlane(mergecells);
691 
692  planeMax = -9999;
693  planeMin = 9999;
694 
695 
696  itr = cells[nc].begin();
697  while( itr != cells[nc].end() ){
698  double sig = 1.;
699  geom->Plane((*itr)->Plane())->Cell((*itr)->Cell())->GetCenter(xyz);
700 
701  if((*itr)->View() == geo::kX){
702  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
703  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
704  xzViewXtest.push_back(xyz[0]);
705  xzViewZtest.push_back(xyz[2]);
706  xzViewWtest.push_back(sig);
707  }
708  if((*itr)->View() == geo::kY){
709  if ((*itr)->Plane() > planeMax) planeMax = (*itr)->Plane();
710  if ((*itr)->Plane() < planeMin) planeMin = (*itr)->Plane();
711  yzViewYtest.push_back(xyz[1]);
712  yzViewZtest.push_back(xyz[2]);
713  yzViewWtest.push_back(sig);
714  }
715  itr++;
716  }// end loop over hits in this track
717 
718  if (xzViewXtest.size() >1){
719  Chi2 = geo::LinFit(xzViewZtest, xzViewXtest, xzViewWtest, &xzStarttest[0], &xzStarttest[1], &xzEndtest[0], &xzEndtest[1]);
720  }
721 
722  if (yzViewYtest.size() >1){
723  Chi2 = geo::LinFit(yzViewZtest, yzViewYtest, yzViewWtest, &yzStarttest[0], &yzStarttest[1], &yzEndtest[0], &yzEndtest[1]);
724  }
725 
726  xzStart[0] = xzStarttest[0];
727  xzStart[1] = xzStarttest[1];
728  yzStart[0] = yzStarttest[0];
729  yzStart[1] = yzStarttest[1];
730  xzEnd[0] = xzEndtest[0];
731  xzEnd[1] = xzEndtest[1];
732  yzEnd[0] = yzEndtest[0];
733  yzEnd[1] = yzEndtest[1];
734 
735  // reset the end points based on startz and endz
736  slopeXZ = 999999.;
737  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
738  if(fabs(xzStart[0] - xzEnd[0]) > 1.e-2){
739  slopeXZ = (xzEnd[1] - xzStart[1])/(xzEnd[0] - xzStart[0]);
740  interceptXZ = xzEnd[1] - slopeXZ*xzEnd[0];
741  }
742 
743  slopeYZ = 999999.;
744  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
745  if(fabs(yzStart[0] - yzEnd[0]) > 1.e-2){
746  slopeYZ = (yzEnd[1] - yzStart[1])/(yzEnd[0] - yzStart[0]);
747  interceptYZ = yzEnd[1] - slopeYZ*yzEnd[0];
748  }
749  }
750 
751  if ((numclust == (cluster.size()-1)) && (clustcount != cluster.size())){
752  numclust=0;
753  clustcount = cluster.size();
754  }
755  }
756 
757  }//end numclust
758  ////////////////////////////////////////////////////////////////////////////////////////
759  ////////////////////////////////////////////////////////////////////////////////////////
760 
761 
762  // are there hits in each view? if not, reset the start and end z positions to
763  // be based on the view with hits
764 
765  if(mergecells.size()<3&&motherids[nc].size()>0)continue;
766  if(mergecells.size()<2)continue;
767 
768  bool sontag = false;
769 
770  if(motherids[nc].size()>0)continue;
771  double startz = 0.;
772  double endz = 0.;
773  if(xzViewZ.size() < 1){
774  startz = yzStart[0];
775  endz = yzEnd[0];
776  yzStart[1] = slopeYZ*startz + interceptYZ;
777  yzEnd[1] = slopeYZ*endz + interceptYZ;
778  xzStart[1] = geom->DetHalfWidth();
779  xzEnd[1] = geom->DetHalfWidth();
780  }
781  if(yzViewZ.size() < 1){
782  startz = xzStart[0];
783  endz = xzEnd[0];
784  xzStart[1] = slopeXZ*startz + interceptXZ;
785  xzEnd[1] = slopeXZ*endz + interceptXZ;
786  yzStart[1] = geom->DetHalfHeight();
787  yzEnd[1] = geom->DetHalfHeight();
788  }
789 
790 
791 
792  double xextremes[2] = {9999., -9999.}; // first is min, second max
793  double yextremes[2] = {9999., -9999.};
794  for(unsigned int i = 0; i < xzViewX.size(); ++i){
795  if(xzViewX[i] < xextremes[0]) xextremes[0] = xzViewX[i];
796  if(xzViewX[i] > xextremes[1]) xextremes[1] = xzViewX[i];
797  }
798 
799  for(unsigned int i = 0; i < yzViewY.size(); ++i){
800  if(yzViewY[i] < yextremes[0]) yextremes[0] = yzViewY[i];
801  if(yzViewY[i] > yextremes[1]) yextremes[1] = yzViewY[i];
802  }// end loop over hits in this track
803  // check that the end points are consistent with the extremes of hits used in each view
804  if(yzStart[1] > yzEnd[1] && yextremes[1] > yzStart[1]) yzStart[1] = yextremes[1];
805  if(yzStart[1] < yzEnd[1] && yextremes[0] < yzStart[1]) yzStart[1] = yextremes[0];
806  if(yzEnd[1] > yzStart[1] && yextremes[1] > yzEnd[1] ) yzEnd[1] = yextremes[1];
807  if(yzEnd[1] < yzStart[1] && yextremes[0] < yzEnd[1] ) yzEnd[1] = yextremes[0];
808  if(xzStart[1] > xzEnd[1] && xextremes[1] > xzStart[1]) xzStart[1] = xextremes[1];
809  if(xzStart[1] < xzEnd[1] && xextremes[0] < xzStart[1]) xzStart[1] = xextremes[0];
810  if(xzEnd[1] > xzStart[1] && xextremes[1] > xzEnd[1] ) xzEnd[1] = xextremes[1];
811  if(xzEnd[1] < xzStart[1] && xextremes[0] < xzEnd[1] ) xzEnd[1] = xextremes[0];
812 
813  //check that the end points are within the detector
814  if(xzStart[1] < -geom->DetHalfWidth()) xzStart[1] = -geom->DetHalfWidth();
815  if(xzStart[1] > geom->DetHalfWidth()) xzStart[1] = geom->DetHalfWidth();
816  if(xzEnd[1] < -geom->DetHalfWidth()) xzEnd[1] = -geom->DetHalfWidth();
817  if(xzEnd[1] > geom->DetHalfWidth()) xzEnd[1] = geom->DetHalfWidth();
818 
819  if(yzStart[1] < -geom->DetHalfHeight()) yzStart[1] = -geom->DetHalfHeight();
820  if(yzStart[1] > geom->DetHalfHeight()) yzStart[1] = geom->DetHalfHeight();
821  if(yzEnd[1] < -geom->DetHalfHeight()) yzEnd[1] = -geom->DetHalfHeight();
822  if(yzEnd[1] > geom->DetHalfHeight()) yzEnd[1] = geom->DetHalfHeight();
823 
824  double length = util::pythag(endz-startz, xzEnd[1]-xzStart[1], yzEnd[1]-yzStart[1]);
825  double dcosx = (xzEnd[1] - xzStart[1])/length;
826  double dcosy = (yzEnd[1] - yzStart[1])/length;
827  double dcosz = (endz - startz)/length;
828 
829  double evis = 0;
830  for(unsigned int i=0; i<mergecells.size(); i++){
831  evis += mergecells[i]->PE();
832  }
833  rb::Cluster Clust(mergecells);
834  vCluster.push_back(Clust);
835  starts[cc].push_back(xzStart[1]);
836  starts[cc].push_back(yzStart[1]);
837  starts[cc].push_back(startz);
838  ends[cc].push_back(xzEnd[1]);
839  ends[cc].push_back(yzEnd[1]);
840  ends[cc].push_back(endz);
841  dirs[cc].push_back(dcosx);
842  dirs[cc].push_back(dcosy);
843  dirs[cc].push_back(dcosz);
844  sig[cc] = evis;
845  isnoise[cc] = sontag;
846  cc++;
847  std::vector< int > trackcount;
848 
849  }
850  }
851 
852  std::unique_ptr< std::vector<rb::Cluster> > clustcol(new std::vector<rb::Cluster> );
853  for(unsigned int i = 0; i < vCluster.size(); i++)
854  {
855  TVector3 start(starts[i][0], starts[i][1], starts[i][2]);
856  TVector3 end(ends[i][0], ends[i][1], ends[i][2]);
857  TVector3 dir(dirs[i][0], dirs[i][1], dirs[i][2]);
858 
859  if(fDebug > 0){
860  std::cout << "3D end points are " << std::endl;
861  start.Print();
862  end.Print();
863  }
864 
865  rb::Track track(vCluster[i], start, dir);
866  track.AppendTrajectoryPoint(end);
867  track.SetNoise(isnoise[i]);
868  if(fDebug){
869  std::cout << "track start at " << track.Start().X() << " "
870  << track.Start().Y() << " " << track.Start().Z() << std::endl;
871  std::cout << "track end at " << track.Stop().X() << " "
872  << track.Stop().Y() << " " << track.Stop().Z() << std::endl;
873  }
874 
875  trackcol->push_back(track);
876  }
877  evt.put(std::move(trackcol));
878  return;
879  }//End of produce section
double LinFit(const std::vector< double > &x, const std::vector< double > &y, const std::vector< double > &w, double *x1, double *y1, double *x2, double *y2)
Find the best-fit line to a collection of points in 2-D by minimizing the squared vertical distance f...
Definition: Geo.cxx:373
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
static bool hitSort(art::Ptr< rb::Cluster > c1, art::Ptr< rb::Cluster > c2)
const char * p
Definition: xmltok.h:285
T sqrt(T number)
Definition: d0nt_math.hpp:156
Vertical planes which measure X.
Definition: PlaneGeo.h:28
Definition: event.h:19
A collection of associated CellHits.
Definition: Cluster.h:47
A rb::Prong with full reconstructed trajectory.
Definition: Track.h:20
Horizontal planes which measure Y.
Definition: PlaneGeo.h:29
int fDebug
Controls debug output 0=none, 99=scream.
const XML_Char * s
Definition: expat.h:262
double MinTNS() const
Definition: Cluster.cxx:482
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Definition: DataViewImpl.h:446
length
Definition: demo0.py:21
void push_back(Ptr< U > const &p)
Definition: PtrVector.h:435
const std::string cv[Ncv]
double energy
Definition: plottest35.C:25
double MaxTNS() const
Definition: Cluster.cxx:528
size_type size() const
Definition: PtrVector.h:302
OStream cout
Definition: OStream.cxx:6
static constexpr Double_t m2
Definition: Munits.h:145
TDirectory * dir
Definition: macro.C:5
double pythag(double x, double y)
2D Euclidean distance
Definition: MathUtil.h:29
void cc()
Definition: test_ana.C:28
void geom(int which=0)
Definition: geom.C:163
enum BeamMode nc
bool IsNoise() const
Is the noise flag set?
Definition: Cluster.h:163
Float_t e
Definition: plot.C:35
ProductID put(std::unique_ptr< PROD > &&edp, FullSemantic< Level::Run > const semantic)
Definition: DataViewImpl.h:730
Float_t track
Definition: plot.C:35
void SortByPlane(std::vector< art::Ptr< rb::CellHit > > &c)
Sort c in plane order (low to high).
Definition: CellHit.cxx:124
void jmshower::JMClusterMerge::reconfigure ( const fhicl::ParameterSet pset)

Definition at line 163 of file JMClusterMerge_module.cc.

References fClusterLabel, fDebug, fDHitGood, fGoodness, fMaxPlane, fMCCheater, fMinHit, fhicl::ParameterSet::get(), pSliceDir, and string.

Referenced by JMClusterMerge().

164  {
165  pSliceDir = pset.get< std::string >("SliceDir" );
166  fClusterLabel = pset.get< std::string >("ClusterLabel" );
167  fDebug = pset.get< int >("Debug" );
168  fDHitGood = pset.get< double >("DHitGood" );
169  fMinHit = pset.get< int >("MinHit" );
170  fGoodness = pset.get< double >("Goodness" );
171  fMaxPlane = pset.get< int >("MaxPlane" );
172  fMCCheater = pset.get< bool >("MCCheater");
173  }
int fDebug
Controls debug output 0=none, 99=scream.
double fDHitGood
Maximum distance from the line for a hit to be considered part of it.
bool fMCCheater
True/false MCCheater SimHit/SimTrack input.
T get(std::string const &key) const
Definition: ParameterSet.h:231
enum BeamMode string
void art::ModuleBase::setModuleDescription ( ModuleDescription const &  )
inherited
void art::ModuleBase::sortConsumables ( std::string const &  current_process_name)
inherited
std::string art::EDProducer::workerType ( ) const
inherited

Member Data Documentation

std::string jmshower::JMClusterMerge::fClusterLabel
private

Definition at line 58 of file JMClusterMerge_module.cc.

Referenced by produce(), and reconfigure().

int jmshower::JMClusterMerge::fDebug
private

Controls debug output 0=none, 99=scream.

Definition at line 59 of file JMClusterMerge_module.cc.

Referenced by produce(), and reconfigure().

double jmshower::JMClusterMerge::fDHitGood
private

Maximum distance from the line for a hit to be considered part of it.

Definition at line 60 of file JMClusterMerge_module.cc.

Referenced by reconfigure().

double jmshower::JMClusterMerge::fGoodness
private

Definition at line 62 of file JMClusterMerge_module.cc.

Referenced by reconfigure().

TH1F* jmshower::JMClusterMerge::fHistoEnergy
private

Definition at line 67 of file JMClusterMerge_module.cc.

Referenced by beginJob().

TH1F* jmshower::JMClusterMerge::fHistoGoodness
private

Definition at line 65 of file JMClusterMerge_module.cc.

Referenced by beginJob().

TH1F* jmshower::JMClusterMerge::fHistoGoodnessLog
private

Easier to read in the reco validation.

Definition at line 66 of file JMClusterMerge_module.cc.

Referenced by beginJob().

TH1F* jmshower::JMClusterMerge::fHistoPurity
private

Definition at line 68 of file JMClusterMerge_module.cc.

Referenced by beginJob().

TH1F* jmshower::JMClusterMerge::fHistoRemainingCells
private

Definition at line 69 of file JMClusterMerge_module.cc.

Referenced by beginJob().

int jmshower::JMClusterMerge::fMaxPlane
private

Definition at line 63 of file JMClusterMerge_module.cc.

Referenced by produce(), and reconfigure().

bool jmshower::JMClusterMerge::fMCCheater
private

True/false MCCheater SimHit/SimTrack input.

Definition at line 64 of file JMClusterMerge_module.cc.

Referenced by reconfigure().

int jmshower::JMClusterMerge::fMinHit
private

Definition at line 61 of file JMClusterMerge_module.cc.

Referenced by produce(), and reconfigure().

TTree* jmshower::JMClusterMerge::fTrack
private

Definition at line 71 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackChisq
private

Definition at line 78 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackChisq1
private

Definition at line 76 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackChisq2
private

Definition at line 77 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackDHit
private

Definition at line 81 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackDiffChisq
private

Definition at line 79 of file JMClusterMerge_module.cc.

Referenced by beginJob().

double jmshower::JMClusterMerge::m_trackGap
private

Definition at line 80 of file JMClusterMerge_module.cc.

Referenced by beginJob().

int jmshower::JMClusterMerge::m_trackNHit1
private

Definition at line 72 of file JMClusterMerge_module.cc.

Referenced by beginJob().

int jmshower::JMClusterMerge::m_trackNHit2
private

Definition at line 73 of file JMClusterMerge_module.cc.

Referenced by beginJob().

int jmshower::JMClusterMerge::m_trackNPlane1
private

Definition at line 74 of file JMClusterMerge_module.cc.

Referenced by beginJob().

int jmshower::JMClusterMerge::m_trackNPlane2
private

Definition at line 75 of file JMClusterMerge_module.cc.

Referenced by beginJob().

std::string jmshower::JMClusterMerge::pSliceDir
private

Definition at line 57 of file JMClusterMerge_module.cc.

Referenced by produce(), and reconfigure().


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