LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
ShowerFinder_module.cc
Go to the documentation of this file.
1 // ShowerFinder class
3 //
4 // \author roxanne.guenette@yale.edu
5 //
7 
8 #include <string>
9 
10 // Framework includes
14 
15 #include <math.h>
16 
17 // Framework includes
23 #include "fhiclcpp/ParameterSet.h"
25 
26 // LArSoft Includes
33 
34 // ROOT
35 #include "TMath.h"
36 
38 namespace shwf {
39 
40  class ShowerFinder : public art::EDProducer {
41  public:
42  explicit ShowerFinder(fhicl::ParameterSet const&);
43 
44  private:
45  void produce(art::Event& evt);
46 
47  std::string fVertexModuleLabel;
48  std::string fClusterModuleLabel;
49  std::string fHoughLineModuleLabel;
51  double fRcone;
52  double fLcone;
53  }; // class ShowerFinder
54 
55 }
56 
57 namespace shwf {
58 
59  //-------------------------------------------------
61  {
62  fVertexModuleLabel = pset.get<std::string>("VertexModuleLabel");
63  fClusterModuleLabel = pset.get<std::string>("ClusterModuleLabel");
64  fHoughLineModuleLabel = pset.get<std::string>("HoughLineModuleLabel");
65  fVertexStrengthModuleLabel = pset.get<std::string>("VertexStrengthModuleLabel");
66  fRcone = pset.get<double>("Rcone");
67  fLcone = pset.get<double>("Lcone");
68 
69  produces<std::vector<recob::Shower>>();
70  produces<art::Assns<recob::Shower, recob::Cluster>>();
71  produces<art::Assns<recob::Shower, recob::Hit>>();
72  }
73 
74  //
75  //-------------------------------------------------
79  {
80 
81  std::unique_ptr<std::vector<recob::Shower>> showercol(new std::vector<recob::Shower>);
82  std::unique_ptr<art::Assns<recob::Shower, recob::Cluster>> cassn(
84  std::unique_ptr<art::Assns<recob::Shower, recob::Hit>> hassn(
86 
87  // Read in the vertex List object(s).
89  evt.getByLabel(fVertexModuleLabel, vertexListHandle);
90 
91  // Read in the hough line List object(s).
93  evt.getByLabel(fHoughLineModuleLabel, houghListHandle);
94 
95  // Read in the cluster List object(s).
96  art::Handle<std::vector<recob::Cluster>> clusterListHandle;
97  evt.getByLabel(fClusterModuleLabel, clusterListHandle);
98 
99  art::FindManyP<recob::Hit> fmh(clusterListHandle, evt, fClusterModuleLabel);
100 
101  // Read in the vertex Strength List object(s).
102  art::Handle<std::vector<recob::EndPoint2D>> vertexStrengthListHandle;
103  evt.getByLabel(fVertexStrengthModuleLabel, vertexStrengthListHandle);
104 
105  std::vector<size_t> protoShowers; //vector of indices of clusters associated to a cone
106 
107  std::vector<art::Ptr<recob::Hit>> clusterhits; //hits in the cluster
108 
110 
111  //This vector will contain all strong and strongest vertices
113 
114  //This loop is going over all the vertices in the event
115  //and is interested in ONLY strong and strongest vertices.
116  mf::LogInfo("ShowerFinder") << "Vertex STRENGTH list size = "
117  << vertexStrengthListHandle->size()
118  << " AND vertices:" << vertexListHandle->size()
119  << "\nCLUSTER list size = " << clusterListHandle->size()
120  << " AND Hough: :" << houghListHandle->size();
121 
122  for (size_t iv = 0; iv < vertexListHandle->size(); ++iv) {
123  art::Ptr<recob::EndPoint2D> vertex(vertexListHandle, iv);
124  //std::cout << "Vertex " << iv << " : str = " << vertex->ID() << std::endl;
125  //if(vertex->Strength() == 4 || vertex->Strength() == 3){
126  if (vertex->ID() == 1 || vertex->Strength() == 3) { //only use Strongest and strong
127  vertSel.push_back(vertex);
128  }
129  else
130  continue;
131  }
132 
133  //Definition of the geometry of the cone (which is basically a triangle)
134  double scan_angle = 0; //angle of the scan steps
135  double xa_cone = 0; // x coordinate of the cone's apex (wire number)
136  double ya_cone = 0; // y coordinate of the cone's apex (drift time)
137  double x1_cone = 0; // x coordinate of the cone's top right point (wire number)
138  double y1_cone = 0; // y coordinate of the cone's top right point (drift time)
139  double x2_cone = 0; // x coordinate of the cone's top left point (wire number)
140  double y2_cone = 0; // y coordinate of the cone's top left point (drift time)
141 
142  //The length of the side of the cone
143  double fScone = std::sqrt((fRcone * fRcone) + (fLcone * fLcone));
144 
145  // Opening angle of the cone (defined from input parameters)
146  double cone_angle = (TMath::ATan(fRcone / fLcone)) / 2.0;
147  mf::LogInfo("ShowerFinder") << "Cone Opening Angle: " << (180.0 * cone_angle) / TMath::Pi();
148  double compl_angle = 0;
149 
150  unsigned int n_scan = 1 + (int)(TMath::Pi() / (2.0 * cone_angle));
151  mf::LogInfo("ShowerFinder") << "N scan: " << n_scan;
152 
153  double x_hit = 0; //x coordinate of hit
154  double y_hit = 0; //y coordinate of hit
155 
156  int hits_cluster_counter = 0; //count the number of hits in a cluster that is inside a cone
157  //int hits_cluster_Total = 0; //The total number of hits in a cluster
158 
159  // For EVERY vertex, the algorithm is going to scan the plane to find clusters
160  // contained in the scanning cones
161 
162  for (size_t ivert = 0; ivert < vertSel.size(); ++ivert) {
163 
164  mf::LogInfo("ShowerFinder") << "Number of STRONG vertices = " << vertSel.size();
165 
166  //get the coordinates of the vertex for the summit of the cone
167  xa_cone = vertSel[ivert]->WireID().Wire; //for update to EndPoint2D ... WK 4/22/13
168  ya_cone = vertSel[ivert]->DriftTime();
169 
170  mf::LogInfo("ShowerFinder") << "Vertex at: (" << xa_cone << ", " << ya_cone << ")";
171 
172  //Beginning of the scan!
173  for (unsigned int iscan = 0; iscan < n_scan; ++iscan) {
174 
175  mf::LogInfo("ShowerFinder") << ">>>> Start SCAN: " << iscan;
176 
177  //define the scan anlge
178  scan_angle = (TMath::Pi() / 2.0) - (iscan * (2.0 * cone_angle));
179 
180  mf::LogInfo("ShowerFinder") << "Scan Angle: " << (180. * scan_angle) / TMath::Pi();
181 
182  //get the complementary angle for geometry puurposes
183  compl_angle = scan_angle - cone_angle;
184 
185  //Calculate the coordinates of the top right corner of the cone
186  x1_cone = xa_cone + fScone * (std::cos(compl_angle));
187  y1_cone = ya_cone + fScone * (std::sin(compl_angle));
188 
189  //Calculate the coordinates of the top left corner of the cone
190  x2_cone = xa_cone + fScone * (std::cos(scan_angle + cone_angle));
191  y2_cone = ya_cone + fScone * (std::sin(scan_angle + cone_angle));
192 
193  //Looking if a cluster is in this cone (loop over all hits of all clusters)
194  protoShowers.clear();
195  for (size_t iclust = 0; iclust < clusterListHandle->size(); ++iclust) {
196 
197  // art::Ptr<recob::Cluster> clust(clusterListHandle, iclust);
198  recob::Cluster const& clust = clusterListHandle->at(iclust);
199 
200  //Get the hits vector from the cluster
201  clusterhits = fmh.at(iclust);
202  if (clusterhits.size() == 0) continue;
203 
204  //Loop over ALL hits in the cluster. Looking if the cluster's
205  // hit is comprised in the cone
206  for (size_t ihits = 0; ihits < clusterhits.size(); ++ihits) {
207 
208  x_hit = clusterhits[ihits]->WireID().Wire; //for update to EndPoint2D ... WK 4/22/13
209  y_hit = clusterhits[ihits]->PeakTime();
210 
211  // Check in hits is INSIDE cone
212 
213  //define the 2 line equations:
214  if (y_hit <= ((y2_cone - ya_cone) / (x2_cone - xa_cone)) * x_hit + ya_cone &&
215  y_hit >= ((y1_cone - ya_cone) / (x1_cone - xa_cone)) * x_hit + ya_cone) {
216  hits_cluster_counter++;
217  }
218 
219  } //end hits loop
220 
221  //If there is more than 50% if the cluster INSIDE the cone, this is a protoshower
222  if (clusterhits.size() == 0) continue;
223  if (((double)hits_cluster_counter / (double)clusterhits.size()) >= 0.5) {
224  mf::LogInfo("ShowerFinder") << "GOT A SHOWER!!! in scan " << iscan
225  << " cluster: " << iclust << " : " << clust.ID();
226 
230 
231  protoShowers.push_back(iclust);
232  }
233  clusterhits.clear();
234  hits_cluster_counter = 0;
235 
236  } //end cluster loop
237 
238  if (protoShowers.empty()) continue;
239 
240  showercol->push_back(recob::Shower());
241 
242  // associate the shower with its clusters
244  evt, *cassn, showercol->size() - 1, protoShowers.begin(), protoShowers.end());
245 
246  // get the hits associated with each cluster and associate those with the shower
247  for (size_t p = 0; p < protoShowers.size(); ++p) {
248  const size_t psIndex = protoShowers[p];
249  std::vector<art::Ptr<recob::Hit>> hits = fmh.at(psIndex);
250  util::CreateAssn(evt, *showercol, hits, *hassn);
251  }
252 
253  } //end scan loop
254  } //end vertices loop
255 
257  //NEED TO SEPARATE THE SHOWERS FROM THE DIFFERENT VERTEX!!!!
259 
260  mf::LogInfo("ShowerFinder") << "---> Recorded shower = " << showercol->size();
262  //if the shower is stand alone ok, else, erase the next one
263  //shower.SetID(is);
264  //shower.SetVertexCoord(xa_cone, ya_cone);
265 
266  vertSel.clear();
267 
268  evt.put(std::move(showercol));
269  evt.put(std::move(cassn));
270  evt.put(std::move(hassn));
271 
272  return;
273  } // end of produce
274 
275 } // end of namespace
276 
277 namespace shwf {
278 
280 
281 } //end of shower namespace
std::string fHoughLineModuleLabel
label of module finding hough line
int ID() const
Definition: EndPoint2D.h:66
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
Declaration of signal hit object.
EDProducer(fhicl::ParameterSet const &pset)
Definition: EDProducer.cc:6
std::string fVertexModuleLabel
label of module finding 2D endpoint
shower finding
Set of hits with a 2D structure.
Definition: Cluster.h:69
std::string fClusterModuleLabel
label of module finding clusters
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: Event.h:77
void hits()
Definition: readHits.C:15
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
void push_back(Ptr< U > const &p)
Definition: PtrVector.h:435
void produce(art::Event &evt)
Declaration of cluster object.
size_type size() const
Definition: PtrVector.h:302
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.
std::string fVertexStrengthModuleLabel
label of module finding 2D endpoint
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Utility object to perform functions of association.
double fRcone
radious of cone for method
ID_t ID() const
Identifier of this cluster.
Definition: Cluster.h:711
TCEvent evt
Definition: DataStructs.cxx:8
double fLcone
length of the cone
void clear()
Definition: PtrVector.h:533
Definition: fwd.h:26
ShowerFinder(fhicl::ParameterSet const &)
double Strength() const
Definition: EndPoint2D.h:70
art framework interface to geometry description
vertex reconstruction