LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
WienerFilterAna_module.cc
Go to the documentation of this file.
1 //
3 // WienerFilterAna class designed to calculate the optimum filter for an event
4 // (based strongly on CalWireAna)
5 // andrzej.szelc@yale.edu
6 //
7 //
9 
10 // C++ includes
11 #include <string>
12 #include <vector>
13 
14 // Framework includes
20 #include "art_root_io/TFileService.h"
22 #include "fhiclcpp/ParameterSet.h"
24 
25 // LArSoft includes
31 
32 // ROOT includes
33 #include <TH1.h>
34 
35 namespace detsim {
36 
39  public:
40  explicit WienerFilterAna(fhicl::ParameterSet const& pset);
41 
43  void analyze(const art::Event& evt);
44  void beginJob();
45  void endJob();
46 
47  private:
48  std::string fDetSimModuleLabel; //< name of module that produced the digits
49 
50  TH1F* fCnoise[10][10][5];
51  TH1F* fCsignal[10][10][5];
52 
53  TH1F* fCnoise_av[10][10][5];
54  TH1F* fCsignal_av[10][10][5];
55 
56  TH1F* fFilter_av[10][10][5];
57 
58  TH1* ff;
59  TH1F* hh;
60  int fNBins;
61  }; // class WienerFilterAna
62 
63 } // End caldata namespace.
64 
65 namespace detsim {
66 
67  //-------------------------------------------------
69  : EDAnalyzer(pset), fDetSimModuleLabel(pset.get<std::string>("DetSimModuleLabel"))
70  {}
71 
72  //-------------------------------------------------
74  {
75  // get access to the TFile service
77 
79  int fNTicks = fFFT->FFTSize();
80  fNBins = fNTicks / 2 + 1;
81  auto const clock_data =
83  double samprate = sampling_rate(clock_data);
84  double sampfreq = 1. / samprate * 1e6; // in kHz
86  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout>()->Get();
87  unsigned int fNPlanes = wireReadoutGeom.Nplanes();
88  unsigned int fNCryostats = geo->Ncryostats();
89  unsigned int fNTPC = geo->NTPC();
90 
91  for (unsigned int icstat = 0; icstat < fNCryostats; icstat++) {
92  for (unsigned int itpc = 0; itpc < fNTPC; itpc++) {
93  for (unsigned int iplane = 0; iplane < fNPlanes; iplane++) {
94  fCnoise[icstat][itpc][iplane] =
95  tfs->make<TH1F>(Form("fft_noise_%d_%d_%d", icstat, itpc, iplane),
96  Form("fft_of_unfiltered_noise_%d_%d_%d", icstat, itpc, iplane),
97  fNBins,
98  0,
99  sampfreq / 2);
100 
101  fCsignal[icstat][itpc][iplane] = tfs->make<TH1F>(
102  Form("fft_signal_%d_%d_%d", icstat, itpc, iplane),
103  Form("fft_of_unfiltered_noise_and_signal_%d_%d_%d", icstat, itpc, iplane),
104  fNBins,
105  0,
106  sampfreq / 2);
107 
108  fCnoise_av[icstat][itpc][iplane] =
109  tfs->make<TH1F>(Form("fft_noise_%d_%d_%d_av", icstat, itpc, iplane),
110  Form("fft_of_unfiltered_noise_%d_%d_%d_av", icstat, itpc, iplane),
111  fNBins,
112  0,
113  sampfreq / 2);
114  fCsignal_av[icstat][itpc][iplane] = tfs->make<TH1F>(
115  Form("fft_signal_%d_%d_%d_av", icstat, itpc, iplane),
116  Form("fft_of_unfiltered_noise_and_signal_%d_%d_%d_av", icstat, itpc, iplane),
117  fNBins,
118  0,
119  sampfreq / 2);
120 
121  fFilter_av[icstat][itpc][iplane] =
122  tfs->make<TH1F>(Form("fft_filter_%d_%d_%d_av", icstat, itpc, iplane),
123  Form("fft_filter_%d_%d_%d_av", icstat, itpc, iplane),
124  fNBins,
125  0,
126  sampfreq / 2);
127  }
128  }
129  }
130 
131  hh = tfs->make<TH1F>(Form("waveform"), Form("waveform"), fNTicks, 0, fNTicks);
132  }
133 
134  //-------------------------------------------------
136  {
138  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout>()->Get();
139  unsigned int nplanes = wireReadoutGeom.Nplanes();
140  unsigned int fNCryostats = geom->Ncryostats();
141  unsigned int fNTPC = geom->NTPC();
142 
143  // calculate filters
144 
145  for (unsigned int icstat = 0; icstat < fNCryostats; icstat++) {
146  for (unsigned int itpc = 0; itpc < fNTPC; itpc++) {
147  for (unsigned int pp = 0; pp < nplanes; pp++) {
148 
149  for (int ii = 1; ii < fCsignal_av[icstat][itpc][pp]->GetNbinsX(); ii++) {
150 
151  double diff = ((fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) *
152  fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) -
153  fCnoise_av[icstat][itpc][pp]->GetBinContent(ii) *
154  fCnoise_av[icstat][itpc][pp]->GetBinContent(ii)) >= 0) ?
155  fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) *
156  fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) -
157  fCnoise_av[icstat][itpc][pp]->GetBinContent(ii) *
158  fCnoise_av[icstat][itpc][pp]->GetBinContent(ii) :
159  0;
160 
161  if (fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) > 0)
162  fFilter_av[icstat][itpc][pp]->SetBinContent(
163  ii,
164  (double)((diff) / (fCsignal_av[icstat][itpc][pp]->GetBinContent(ii) *
165  fCsignal_av[icstat][itpc][pp]->GetBinContent(ii))));
166  else
167  fFilter_av[icstat][itpc][pp]->SetBinContent(ii, 0);
168 
169  } // end loop on Csignal
170  } // end loop on planes
171  } // end loop on TPCs
172  } // end loop on cryostats
173  }
174 
175  //-------------------------------------------------
177  {
178  // loop over the raw digits and get the adc vector for each, then compress it and uncompress it
179 
181  evt.getByLabel(fDetSimModuleLabel, rdHandle);
182  mf::LogInfo("WienerFilterMicroBooNE") << " readout Wiener " << rdHandle->size() << std::endl;
183  // return;
184  if (!rdHandle->size()) return;
185  mf::LogInfo("WienerFilterMicroBooNE")
186  << "WienerFilterMicroBooNE:: rdHandle size is " << rdHandle->size();
187 
188  // Read in the digit List object(s).
189 
190  // Use the handle to get a particular (0th) element of collection.
192  for (unsigned int i = 0; i < rdHandle->size(); ++i) {
193  art::Ptr<raw::RawDigit> r(rdHandle, i);
194  rdvec.push_back(r);
195  }
196 
198 
199  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout const>()->Get();
200  for (unsigned int rd = 0; rd < rdvec.size(); ++rd) {
201 
202  std::vector<double> adc(fft->FFTSize());
203 
204  for (unsigned int t = 1; t < rdvec[rd]->Samples(); t++) {
205  adc[t - 1] = rdvec[rd]->ADC(t - 1);
206  hh->SetBinContent(t, rdvec[rd]->ADC(t));
207  }
208 
209  geo::WireID wireid = wireReadoutGeom.ChannelToWire(rdvec[rd]->Channel())[0];
210 
211  // this is hardcoded for the time being. Should be automatized.
212  unsigned int plane = wireid.Plane;
213  unsigned int wire = wireid.Wire;
215  unsigned int cstat = wireid.Cryostat;
216  unsigned int tpc = wireid.TPC;
217  ff = hh->FFT(NULL, "MAG M");
218  if (wire >= 50 && wire < 250) {
219  for (int ii = 0; ii < fNBins; ii++) {
220  fCnoise_av[cstat][tpc][plane]->AddBinContent(ii, ff->GetBinContent(ii));
221  if (wire == 150) fCnoise[cstat][tpc][plane]->SetBinContent(ii, ff->GetBinContent(ii));
222  }
223  }
224  else if (wire >= 700 && wire < 900) {
225  for (int ii = 0; ii < fNBins; ii++) {
226  fCsignal_av[cstat][tpc][plane]->AddBinContent(ii, ff->GetBinContent(ii));
227  if (wire == 800) fCsignal[cstat][tpc][plane]->SetBinContent(ii, ff->GetBinContent(ii));
228  }
229  }
230 
231  } //end loop over rawDigits
232  } //end analyze method
233 
234 } //end namespace
235 
TRandom r
Definition: spectrum.C:23
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
unsigned int NTPC(CryostatID const &cryoid=details::cryostat_zero) const
Returns the total number of TPCs in the specified cryostat.
Definition: GeometryCore.h:416
Detector simulation of raw signals on wires.
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:195
STL namespace.
Definition of basic raw digits.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
Definition: AddMC.C:8
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:430
EDAnalyzer(fhicl::ParameterSet const &pset)
Definition: EDAnalyzer.cc:6
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
Definition: GeometryCore.h:303
int FFTSize() const
Definition: LArFFT.h:66
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
void push_back(Ptr< U > const &p)
Definition: PtrVector.h:435
Base class for creation of raw signals on wires.
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:373
size_type size() const
Definition: PtrVector.h:302
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
Definition: StdUtils.h:120
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
TCEvent evt
Definition: DataStructs.cxx:8
void analyze(const art::Event &evt)
read/write access to event
WienerFilterAna(fhicl::ParameterSet const &pset)
TPCID_t TPC
Index of the TPC within its cryostat.
Definition: geo_types.h:315
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
ROOT libraries.
art framework interface to geometry description