LArSoft  v07_13_02
Liquid Argon Software toolkit - http://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 #ifndef SHOWERFINDER_H
9 #define SHOWERFINDER_H
10 
11 #include <vector>
12 #include <string>
13 
14 // Framework includes
18 
19 extern "C" {
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 }
23 #include <sstream>
24 #include <math.h>
25 #include <algorithm>
26 
27 // Framework includes
29 #include "fhiclcpp/ParameterSet.h"
37 
38 // LArSoft Includes
47 
48 
49 // ROOT
50 #include "TMath.h"
51 #include "TF1.h"
52 #include "TH1D.h"
53 
54 
56 namespace shwf {
57 
58  class ShowerFinder : public art::EDProducer {
59 
60  public:
61 
62  explicit ShowerFinder(fhicl::ParameterSet const&);
63  virtual ~ShowerFinder();
64 
65  void reconfigure(fhicl::ParameterSet const& p);
66  void produce(art::Event& evt);
67 
68  private:
69 
70  std::string fVertexModuleLabel;
71  std::string fClusterModuleLabel;
72  std::string fHoughLineModuleLabel;
74  double fRcone;
75  double fLcone;
76 
77  protected:
78 
79 
80  }; // class ShowerFinder
81 
82 
83 }
84 
85 #endif // SHOWERFINDER_H
86 
87 
88 namespace shwf{
89 
90  //-------------------------------------------------
92  {
93  this->reconfigure(pset);
94 
95  produces< std::vector<recob::Shower> >();
96  produces< art::Assns<recob::Shower, recob::Cluster> >();
97  produces< art::Assns<recob::Shower, recob::Hit> >();
98  }
99 
100 
101  //-------------------------------------------------
103  {
104  }
105 
106  //-------------------------------------------------
108  {
109  fVertexModuleLabel = pset.get<std::string > ("VertexModuleLabel");
110  fClusterModuleLabel = pset.get<std::string > ("ClusterModuleLabel");
111  fHoughLineModuleLabel = pset.get<std::string > ("HoughLineModuleLabel");
112  fVertexStrengthModuleLabel= pset.get<std::string > ("VertexStrengthModuleLabel");
113  fRcone = pset.get<double > ("Rcone");
114  fLcone = pset.get<double > ("Lcone");
115 
116  return;
117  }
118 
119  //
120  //-------------------------------------------------
124  {
125 
126  std::unique_ptr<std::vector<recob::Shower> > showercol(new std::vector<recob::Shower>);
127  std::unique_ptr< art::Assns<recob::Shower, recob::Cluster> > cassn(new art::Assns<recob::Shower, recob::Cluster>);
128  std::unique_ptr< art::Assns<recob::Shower, recob::Hit> > hassn(new art::Assns<recob::Shower, recob::Hit>);
129 
130  // Read in the vertex List object(s).
132  evt.getByLabel(fVertexModuleLabel,vertexListHandle);
133 
134  // Read in the hough line List object(s).
136  evt.getByLabel(fHoughLineModuleLabel,houghListHandle);
137 
138  // Read in the cluster List object(s).
139  art::Handle< std::vector<recob::Cluster> > clusterListHandle;
140  evt.getByLabel(fClusterModuleLabel,clusterListHandle);
141 
142  art::FindManyP<recob::Hit> fmh(clusterListHandle, evt, fClusterModuleLabel);
143 
144  // Read in the vertex Strength List object(s).
145  art::Handle< std::vector<recob::EndPoint2D> > vertexStrengthListHandle;
146  evt.getByLabel(fVertexStrengthModuleLabel,vertexStrengthListHandle);
147 
148  std::vector<size_t> protoShowers; //vector of indices of clusters associated to a cone
149 
150  std::vector< art::Ptr<recob::Hit> > clusterhits; //hits in the cluster
151 
153 
154  //This vector will contain all strong and strongest vertices
156 
157  //This loop is going over all the vertices in the event
158  //and is interested in ONLY strong and strongest vertices.
159  mf::LogInfo("ShowerFinder") << "Vertex STRENGTH list size = " << vertexStrengthListHandle->size()
160  << " AND vertices:" << vertexListHandle->size()
161  << "\nCLUSTER list size = " << clusterListHandle->size()
162  << " AND Hough: :" << houghListHandle->size();
163 
164  for(size_t iv = 0; iv < vertexListHandle->size(); ++iv){
165  art::Ptr<recob::EndPoint2D> vertex(vertexListHandle, iv);
166  //std::cout << "Vertex " << iv << " : str = " << vertex->ID() << std::endl;
167  //if(vertex->Strength() == 4 || vertex->Strength() == 3){
168  if(vertex->ID() == 1 || vertex->Strength() == 3){ //only use Strongest and strong
169  vertSel.push_back(vertex);
170  }
171  else continue;
172  }
173 
174  //Definition of the geometry of the cone (which is basically a triangle)
175  double scan_angle = 0; //angle of the scan steps
176  double xa_cone = 0; // x coordinate of the cone's apex (wire number)
177  double ya_cone = 0; // y coordinate of the cone's apex (drift time)
178  double x1_cone = 0; // x coordinate of the cone's top right point (wire number)
179  double y1_cone = 0; // y coordinate of the cone's top right point (drift time)
180  double x2_cone = 0; // x coordinate of the cone's top left point (wire number)
181  double y2_cone = 0; // y coordinate of the cone's top left point (drift time)
182 
183  //The length of the side of the cone
184  double fScone = std::sqrt( (fRcone*fRcone) + (fLcone*fLcone));
185 
186  // Opening angle of the cone (defined from input parameters)
187  double cone_angle = (TMath::ATan(fRcone / fLcone)) / 2.0;
188  mf::LogInfo("ShowerFinder") << "Cone Opening Angle: " << (180.0*cone_angle)/TMath::Pi();
189  double compl_angle = 0;
190 
191  unsigned int n_scan =1 + (int)(TMath::Pi() / (2.0*cone_angle));
192  mf::LogInfo("ShowerFinder") << "N scan: " << n_scan;
193 
194  double x_hit = 0; //x coordinate of hit
195  double y_hit = 0; //y coordinate of hit
196 
197  int hits_cluster_counter = 0; //count the number of hits in a cluster that is inside a cone
198  //int hits_cluster_Total = 0; //The total number of hits in a cluster
199 
200  // For EVERY vertex, the algorithm is going to scan the plane to find clusters
201  // contained in the scanning cones
202 
203  for(size_t ivert = 0; ivert < vertSel.size(); ++ivert){
204 
205  mf::LogInfo("ShowerFinder") << "Number of STRONG vertices = " << vertSel.size();
206 
207  //get the coordinates of the vertex for the summit of the cone
208  xa_cone = vertSel[ivert]->WireID().Wire; //for update to EndPoint2D ... WK 4/22/13
209  ya_cone = vertSel[ivert]->DriftTime();
210 
211  mf::LogInfo("ShowerFinder") << "Vertex at: (" << xa_cone << ", " << ya_cone << ")";
212 
213  //Beginning of the scan!
214  for(unsigned int iscan = 0; iscan < n_scan; ++iscan){
215 
216  mf::LogInfo("ShowerFinder") << ">>>> Start SCAN: " << iscan;
217 
218  //define the scan anlge
219  scan_angle = (TMath::Pi()/2.0) - (iscan*(2.0*cone_angle));
220 
221  mf::LogInfo("ShowerFinder") << "Scan Angle: " << (180.*scan_angle)/TMath::Pi();
222 
223  //get the complementary angle for geometry puurposes
224  compl_angle = scan_angle - cone_angle;
225 
226  //Calculate the coordinates of the top right corner of the cone
227  x1_cone = xa_cone + fScone*(std::cos(compl_angle));
228  y1_cone = ya_cone + fScone*(std::sin(compl_angle));
229 
230  //Calculate the coordinates of the top left corner of the cone
231  x2_cone = xa_cone + fScone*(std::cos(scan_angle + cone_angle));
232  y2_cone = ya_cone + fScone*(std::sin(scan_angle + cone_angle));
233 
234  //Looking if a cluster is in this cone (loop over all hits of all clusters)
235  protoShowers.clear();
236  for(size_t iclust = 0; iclust < clusterListHandle->size(); ++iclust){
237 
238  // art::Ptr<recob::Cluster> clust(clusterListHandle, iclust);
239  recob::Cluster const& clust = clusterListHandle->at(iclust);
240 
241  //Get the hits vector from the cluster
242  clusterhits = fmh.at(iclust);
243  if(clusterhits.size() == 0) continue;
244 
245  //Loop over ALL hits in the cluster. Looking if the cluster's
246  // hit is comprised in the cone
247  for(size_t ihits = 0; ihits < clusterhits.size(); ++ihits){
248 
249 
250  x_hit = clusterhits[ihits]->WireID().Wire; //for update to EndPoint2D ... WK 4/22/13
251  y_hit = clusterhits[ihits]->PeakTime();
252 
253  // Check in hits is INSIDE cone
254 
255  //define the 2 line equations:
256  if(y_hit <= ((y2_cone - ya_cone)/(x2_cone - xa_cone))*x_hit + ya_cone &&
257  y_hit >= ((y1_cone - ya_cone)/(x1_cone - xa_cone))*x_hit + ya_cone){
258  hits_cluster_counter++;
259  }
260 
261  }//end hits loop
262 
263  //If there is more than 50% if the cluster INSIDE the cone, this is a protoshower
264  if(clusterhits.size() == 0) continue;
265  if(((double)hits_cluster_counter / (double)clusterhits.size()) >= 0.5){
266  mf::LogInfo("ShowerFinder") << "GOT A SHOWER!!! in scan " << iscan
267  << " cluster: " << iclust << " : " << clust.ID();
268 
272 
273  protoShowers.push_back(iclust);
274  }
275  clusterhits.clear();
276  hits_cluster_counter = 0;
277 
278  } //end cluster loop
279 
280  if(protoShowers.empty()) continue;
281 
282  // loop over hits in the protoShowers to determine the total charge of the shower
283  double totalCharge = 0.;
284 
285  for(size_t p = 0; p < protoShowers.size(); ++p){
286  const size_t psIndex = protoShowers[p];
287  for (art::Ptr<recob::Hit> const& hit: fmh.at(psIndex))
288  if(hit->SignalType() == geo::kCollection) totalCharge += hit->Integral();
289  }
290 
292  // fill with bogus values for now
293  //double dcosVtx[3] = { util::kBogusD };
294  //double dcosVtxErr[3] = { util::kBogusD };
295  //double maxTransWidth[2] = { util::kBogusD };
296  //double distMaxWidth = util::kBogusD;
297 
298  //showercol->push_back( recob::Shower(dcosVtx, dcosVtxErr, maxTransWidth, totalCharge, distMaxWidth) );
299  showercol->push_back(recob::Shower());
300 
301  // associate the shower with its clusters
302  util::CreateAssn(*this, evt, *cassn,
303  showercol->size() - 1, protoShowers.begin(), protoShowers.end());
304 
305  // get the hits associated with each cluster and associate those with the shower
306  for(size_t p = 0; p < protoShowers.size(); ++p){
307  const size_t psIndex = protoShowers[p];
308  std::vector< art::Ptr<recob::Hit> > hits = fmh.at(psIndex);
309  util::CreateAssn(*this, evt, *showercol, hits, *hassn);
310  }
311 
312  } //end scan loop
313  } //end vertices loop
314 
316  //NEED TO SEPARATE THE SHOWERS FROM THE DIFFERENT VERTEX!!!!
318 
319 
320  mf::LogInfo("ShowerFinder") << "---> Recorded shower = "<< showercol->size();
322  //if the shower is stand alone ok, else, erase the next one
323  //shower.SetID(is);
324  //shower.SetVertexCoord(xa_cone, ya_cone);
325 
326  vertSel.clear();
327 
328  evt.put(std::move(showercol));
329  evt.put(std::move(cassn));
330  evt.put(std::move(hassn));
331 
332  return;
333  } // end of produce
334 
335 } // end of namespace
336 
337 
338 namespace shwf{
339 
341 
342 } //end of shower namespace
std::string fHoughLineModuleLabel
label of module finding hough line
int ID() const
Definition: EndPoint2D.h:58
Encapsulate the construction of a single cyostat.
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
Declaration of signal hit object.
std::string fVertexModuleLabel
label of module finding 2D endpoint
shower finding
Set of hits with a 2D structure.
Definition: Cluster.h:71
std::string fClusterModuleLabel
label of module finding clusters
void reconfigure(fhicl::ParameterSet const &p)
ProductID put(std::unique_ptr< PROD > &&product)
Definition: Event.h:102
void hits()
Definition: readHits.C:15
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:42
void push_back(Ptr< U > const &p)
Definition: PtrVector.h:441
T get(std::string const &key) const
Definition: ParameterSet.h:231
bool CreateAssn(PRODUCER const &prod, art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t indx=UINT_MAX)
Creates a single one-to-one association.
void produce(art::Event &evt)
Declaration of cluster object.
size_type size() const
Definition: PtrVector.h:308
Detector simulation of raw signals on wires.
std::string fVertexStrengthModuleLabel
label of module finding 2D endpoint
Utility object to perform functions of association.
double fRcone
radious of cone for method
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
ID_t ID() const
Identifier of this cluster.
Definition: Cluster.h:738
TCEvent evt
Definition: DataStructs.cxx:5
double fLcone
length of the cone
void clear()
Definition: PtrVector.h:537
Definition: fwd.h:25
ShowerFinder(fhicl::ParameterSet const &)
double Strength() const
Definition: EndPoint2D.h:59
art framework interface to geometry description
Encapsulate the construction of a single detector plane.
Signal from collection planes.
Definition: geo_types.h:93
vertex reconstruction