All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SmallClusterFinder_module.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // \file SmallClusterFinder.cxx
4 //
5 // \author corey.adams@yale.edu
6 //
7 // This algorithm is designed to find small clusters that could correspond to gammas
8 // or low energy electrons.
9 //
10 /* There are two parameters that matter from the fcl file:
11  fNHitsInClust is the number of hits that should be in these small clusters
12  ^-- Gamma events seem to rarely have more than 4 hits in the cluster
13  ^-- SN events are unclear. Should this even be used for SN?
14  fRadiusSizePar is the distance (in cm) between the small clusters and any other hits.
15 
16  This algorithm sorts the hits by plane, and then looks at each hit individually. If
17  there is a hit within RadiusSizePar, it gets added to a local list. All other hits
18  are ignored. Then, if the number of hits that got added to the local list is greater
19  then NHitsInClust, the original hit is ignored. If it's less, the original hit is
20  presumed to be part of a very small (or single hit) cluster. So its added to the list
21  of hits in the small cluster.
22 
23  All of the small clusters are then split apart into groups in the way you would expect.
24  Each cluster is assigned an ID number to distinguish it, and the hits that aren't
25  identified as small clusters all end up in the "leftover" cluster. The numbering scheme
26  is ID = 100*iPlane + Cluster on that plane, and the leftover hits are the first (0th)
27  cluster written out.
28 
29  All of the heavy lifting is done is the SmallClusterFinderAlg.
30  This module remains responsible for interacting with the framework, getting hits,
31  writing clusters, etc.
32 
33  Thanks to Andrzej for the basic alg.
34 
35  -Corey
36 */
37 //
38 ///////////////////////////////////////////////////////////////////////
39 
40 #include <iostream>
41 
42 // include the proper bit of the framework
43 #include "art/Framework/Core/EDProducer.h"
44 #include "art/Framework/Core/ModuleMacros.h"
45 #include "art/Framework/Principal/Event.h"
46 #include "art/Framework/Services/Registry/ServiceHandle.h"
47 
48 //All the larsoft goodies:
60 
61 namespace cluster {
62 
63  class SmallClusterFinder : public art::EDProducer {
64  public:
65  explicit SmallClusterFinder(fhicl::ParameterSet const& pset);
66 
67  private:
68  void beginJob() override;
69  void produce(art::Event& evt) override; /**Routine that finds the cluster and sets
70  the dTdW of the 2D shower*/
71 
72  art::ServiceHandle<geo::Geometry const> geom;
73 
74  //input parameters
75  std::string fHitFinderModuleLabel;
76  bool verbose;
77  // double fRadiusSizePar; //Determines the max radius of the cluster, must be separated
78  // double fNHitsInClust; //Forces cluster to have a max number of hits
79  // Remember, this is the *small* cluster finder
80 
81  SmallClusterFinderAlg fSmallClusterFinderAlg; //object that actually finds and sorts gammas
82 
83  unsigned int fNPlanes; // number of planes
84 
85  int GetPlaneAndTPC(art::Ptr<recob::Hit> a,
86  unsigned int& p,
87  unsigned int& cs,
88  unsigned int& t,
89  unsigned int& w);
90 
91  }; // class SmallAngleFinder
92 
93 }
94 namespace cluster {
95  SmallClusterFinder::SmallClusterFinder(fhicl::ParameterSet const& pset)
96  : EDProducer{pset}, fSmallClusterFinderAlg(pset.get<fhicl::ParameterSet>("smallClustAlg"))
97  {
98  fHitFinderModuleLabel = pset.get<std::string>("HitFinderModuleLabel");
99  verbose = pset.get<bool>("Verbose");
100 
101  produces<std::vector<recob::Cluster>>(); //This code makes clusters
102  produces<art::Assns<recob::Cluster, recob::Hit>>(); //Matches clusters with hits
103  }
104 
105  // ***************** //
106  void
108  {
109  // this will not change on a run per run basis.
110  fNPlanes = geom->Nplanes(); //get the number of planes in the TPC
111  }
112 
113  // ***************** //
114  // This method actually makes the clusters.
115  void
117  {
118  /**Get Clusters*/
119 
120  //Get the hits for this event:
121  art::Handle<std::vector<recob::Hit>> HitListHandle;
122  evt.getByLabel(fHitFinderModuleLabel, HitListHandle);
123 
124  //A vector to hold hits, not yet filled:
125  std::vector<art::Ptr<recob::Hit>> hitlist;
126 
127  //How many hits in this event? Tell user:
128  if (verbose)
129  std::cout << " ++++ Hitsreceived received " << HitListHandle->size() << " +++++ "
130  << std::endl;
131  //Catch the case were there are no hits in the event:
132  if (HitListHandle->size() == 0) {
133  if (verbose) std::cout << "No hits received! Exiting." << std::endl;
134  return;
135  }
136  hitlist.resize(HitListHandle->size());
137 
138  //wrap the hits in art::Ptrs to pass to the Alg
139  for (unsigned int iHit = 0; iHit < hitlist.size(); iHit++) {
140  hitlist[iHit] = art::Ptr<recob::Hit>(HitListHandle, iHit);
141  }
142 
143  //std::cout << "Passing " << hitlist.size() << " hits to the alg." << std::endl;
144 
145  // Now run the alg to find the gammas:
146  auto const clockData = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(evt);
147  auto const detProp =
148  art::ServiceHandle<detinfo::DetectorPropertiesService const>()->DataFor(evt, clockData);
149  util::GeometryUtilities const gser{*geom, clockData, detProp};
150  fSmallClusterFinderAlg.FindSmallClusters(gser, clockData, detProp, hitlist);
151 
152  // make an art::PtrVector of the clusters
153  auto SmallClusterFinder = std::make_unique<std::vector<recob::Cluster>>();
154  auto assn = std::make_unique<art::Assns<recob::Cluster, recob::Hit>>();
155 
156  // prepare the algorithm to compute the cluster characteristics;
157  // we use the "standard" one here; configuration would happen here,
158  // but we are using the default configuration for that algorithm
160 
161  for (unsigned int iplane = 0; iplane < fNPlanes; iplane++) {
162 
163  auto const leftoverHits = fSmallClusterFinderAlg.GetLeftoversByPlane(iplane);
164 
165  //write the leftover hits as a cluster:
166  if (leftoverHits.size() != 0) {
167  // pick some information from the first hit
168  geo::PlaneID planeID = leftoverHits.front()->WireID().planeID();
169  if (verbose)
170  std::cout << "Writing leftover hits to cluster ID: " << iplane * 100 << std::endl;
171 
172  ClusterParamAlgo.ImportHits(gser, leftoverHits);
173 
174  // create the recob::Cluster directly in the vector
175  ClusterCreator leftover(gser,
176  ClusterParamAlgo, // algo
177  0., // start_wire
178  0., // sigma_start_wire
179  0., // start_tick
180  0., // sigma_start_tick
181  0., // end_wire
182  0., // sigma_end_wire,
183  0., // end_tick
184  0., // sigma_end_tick
185  iplane * 100, // ID
186  geom->Plane(iplane, planeID.TPC, planeID.Cryostat).View(),
187  planeID, // plane
188  recob::Cluster::Sentry // sentry
189  );
190 
191  SmallClusterFinder->emplace_back(leftover.move());
192 
193  util::CreateAssn(evt, *SmallClusterFinder, leftoverHits, *assn);
194  } //leftovers are written for this plane, if they exist.
195 
196  auto const smallClusters = fSmallClusterFinderAlg.GetSmallClustersByPlane(iplane);
197  for (unsigned int i = 0; i < smallClusters.size(); i++) {
198  // pick some information from the first hit
199  geo::PlaneID planeID; // invalid by default
200  if (!smallClusters.empty()) planeID = smallClusters[i].front()->WireID().planeID();
201 
202  ClusterParamAlgo.ImportHits(gser, smallClusters[i]);
203 
204  // create the recob::Cluster directly in the vector
205  ClusterCreator clust(gser,
206  ClusterParamAlgo, // algo
207  0., // start_wire
208  0., // sigma_start_wire
209  0., // start_tick
210  0., // sigma_start_tick
211  0., // end_wire
212  0., // sigma_end_wire,
213  0., // end_tick
214  0., // sigma_end_tick
215  iplane * 100 + i + 1, // ID
216  geom->Plane(iplane, planeID.TPC, planeID.Cryostat).View(),
217  planeID, // plane
218  recob::Cluster::Sentry // sentry
219  );
220 
221  SmallClusterFinder->emplace_back(clust.move());
222  // associate the hits to this cluster
223  util::CreateAssn(evt, *SmallClusterFinder, smallClusters[i], *assn);
224  }
225  }
226 
227  evt.put(std::move(SmallClusterFinder));
228  evt.put(std::move(assn));
229  } //end produce
230 
231  DEFINE_ART_MODULE(SmallClusterFinder)
232 }
Class managing the creation of a new recob::Cluster object.
process_name cluster
Definition: cheaterreco.fcl:51
void produce(art::Event &evt) override
SmallClusterFinderAlg fSmallClusterFinderAlg
Declaration of signal hit object.
pdgs p
Definition: selectors.fcl:22
The data type to uniquely identify a Plane.
Definition: geo_types.h:472
SmallClusterFinder(fhicl::ParameterSet const &pset)
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:212
void FindSmallClusters(util::GeometryUtilities const &gser, detinfo::DetectorClocksData const &dataClocks, detinfo::DetectorPropertiesData const &detProp, std::vector< art::Ptr< recob::Hit >> allHits)
static const SentryArgument_t Sentry
An instance of the sentry object.
Definition: Cluster.h:182
process_name gaushit a
walls no front
Definition: selectors.fcl:105
v let verbose
Helper functions to create a cluster.
Wrapper for ClusterParamsAlgBase objects to accept diverse input.
std::vector< art::Ptr< recob::Hit > > GetLeftoversByPlane(unsigned int iPlane)
Wrapper for ClusterParamsAlgBase objects to accept arbitrary input.
Declaration of cluster object.
bool CreateAssn(art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t index=UINT_MAX)
Creates a single one-to-one association.
int GetPlaneAndTPC(art::Ptr< recob::Hit > a, unsigned int &p, unsigned int &cs, unsigned int &t, unsigned int &w)
Encapsulate the construction of a single detector plane.
std::vector< std::vector< art::Ptr< recob::Hit > > > GetSmallClustersByPlane(unsigned int iPlane)
art::ServiceHandle< geo::Geometry const > geom
Interface to class computing cluster parameters.
TCEvent evt
Definition: DataStructs.cxx:8
TPCID_t TPC
Index of the TPC within its cryostat.
Definition: geo_types.h:406
BEGIN_PROLOG could also be cout
auto const detProp