LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
CalWire_module.cc
Go to the documentation of this file.
1 //
3 // CalWire class
4 //
5 // brebel@fnal.gov
6 //
8 #ifndef CALWIRE_H
9 #define CALWIRE_H
10 
11 // ROOT includes
12 #include <TFile.h>
13 #include <TH2D.h>
14 #include <TH1D.h>
15 #include <TF1.h>
16 #include <TComplex.h>
17 
18 // Framework includes
19 #include "fhiclcpp/ParameterSet.h"
21 #include "cetlib_except/exception.h"
22 #include "cetlib/search_path.h"
28 #include "art/Framework/Core/EDProducer.h" // include the proper bit of the framework
30 
31 // LArSoft includes
32 #include "larcoreobj/SimpleTypesAndConstants/RawTypes.h" // raw::ChannelID_t
36 #include "lardataobj/RawData/raw.h"
41 
43 namespace caldata {
44 
45  class CalWire : public art::EDProducer {
46 
47  public:
48 
49  // create calibrated signals on wires. this class runs
50  // an fft to remove the electronics shaping.
51  explicit CalWire(fhicl::ParameterSet const& pset);
52  virtual ~CalWire();
53 
54  void produce(art::Event& evt);
55  void beginJob();
56  void endJob();
57  void reconfigure(fhicl::ParameterSet const& p);
58 
59  private:
60 
61  std::string fResponseFile;
62  // for c2: fDataSize is not used
64  // int fDataSize; ///< size of raw data on one wire
67  std::string fDigitModuleLabel;
68 
69  std::vector<std::vector<TComplex> > fKernelR;
70  std::vector<std::vector<TComplex> > fKernelS;
72  std::vector<double> fDecayConstsR;
74  std::vector<double> fDecayConstsS;
76  std::vector<int> fKernMapR;
78  std::vector<int> fKernMapS;
80  protected:
82 
83  }; // class CalWire
84 }
85 
86 namespace caldata{
87 
88  //-------------------------------------------------
90  {
91  this->reconfigure(pset);
92 
93  produces< std::vector<recob::Wire> >();
94  produces<art::Assns<raw::RawDigit, recob::Wire>>();
95 
96  }
97 
98  //-------------------------------------------------
100  {
101  }
102 
105  {
106  fDigitModuleLabel = p.get< std::string >("DigitModuleLabel", "daq");
107  cet::search_path sp("FW_SEARCH_PATH");
108  sp.find_file(p.get<std::string>("ResponseFile"), fResponseFile);
109  fExpEndBins = p.get< int > ("ExponentialEndBins");
110  fPostsample = p.get< int > ("PostsampleBins");
111  }
112 
113  //-------------------------------------------------
115  {
116 
117  LOG_DEBUG("CalWire") << "CalWire_plugin: Opening Electronics Response File: "
118  << fResponseFile.c_str();
119 
120  TFile f(fResponseFile.c_str());
121  if( f.IsZombie() )
122  mf::LogWarning("CalWire") << "Cannot open response file "
123  << fResponseFile.c_str();
124 
125  TH2D *respRe = dynamic_cast<TH2D*>(f.Get("real/RespRe") );
126  TH2D *respIm = dynamic_cast<TH2D*>(f.Get("real/RespIm") );
127  TH1D *decayHist = dynamic_cast<TH1D*>(f.Get("real/decayHist"));
128  unsigned int wires = decayHist->GetNbinsX();
129  unsigned int bins = respRe->GetYaxis()->GetNbins();
130  unsigned int bin = 0;
131  unsigned int wire = 0;
132  fDecayConstsR.resize(wires);
133  fKernMapR.resize(wires);
134  fKernelR.resize(respRe->GetXaxis()->GetNbins());
135  const TArrayD *edges = respRe->GetXaxis()->GetXbins();
136  for(int i = 0; i < respRe->GetXaxis()->GetNbins(); ++i) {
137  fKernelR[i].resize(bins);
138  for(bin = 0; bin < bins; ++bin) {
139 
140  const TComplex a(respRe->GetBinContent(i+1,bin+1),
141  respIm->GetBinContent(i+1,bin+1));
142  fKernelR[i][bin]=a;
143  }
144  for(; wire < (*edges)[i+1]; ++wire) {
145  fKernMapR[wire]=i;
146  fDecayConstsR[wire]=decayHist->GetBinContent(wire+1);
147  }
148  }
149  respRe = dynamic_cast<TH2D*>(f.Get("sim/RespRe") );
150  respIm = dynamic_cast<TH2D*>(f.Get("sim/RespIm") );
151  decayHist = dynamic_cast<TH1D*>(f.Get("sim/decayHist"));
152  wires = decayHist->GetNbinsX();
153  bins = respRe->GetYaxis()->GetNbins();
154  fDecayConstsS.resize(wires);
155  fKernMapS.resize(wires);
156  fKernelS.resize(respRe->GetXaxis()->GetNbins());
157  const TArrayD *edges1 = respRe->GetXaxis()->GetXbins();
158  wire =0;
159  for(int i = 0; i < respRe->GetXaxis()->GetNbins(); ++i) {
160  fKernelS[i].resize(bins);
161  for(bin = 0; bin < bins; ++bin) {
162  const TComplex b(respRe->GetBinContent(i+1,bin+1),
163  respIm->GetBinContent(i+1,bin+1));
164  fKernelS[i][bin]=b;
165  }
166  for(; wire < (*edges1)[i+1]; ++wire) {
167  fKernMapS[wire]=i;
168  fDecayConstsS[wire]=decayHist->GetBinContent(wire+1);
169  }
170  }
171 
172  f.Close();
173  }
174 
177  {
178  }
179 
182  {
183 
184 
185  // get the geometry
187 
188  std::vector<double> decayConsts;
189  std::vector<int> kernMap;
190  std::vector<std::vector<TComplex> > kernel;
191  //Put correct response functions and decay constants in place
192  if(evt.isRealData()) {
193  decayConsts=fDecayConstsR;
194  kernMap=fKernMapR;
195  kernel=fKernelR;
196  }
197  else {
198  decayConsts=fDecayConstsS;
199  kernMap=fKernMapS;
200  kernel=fKernelS;
201  }
202 
203  // get the FFT service to have access to the FFT size
205 
206  // make a collection of Wires
207  std::unique_ptr<std::vector<recob::Wire> > wirecol(new std::vector<recob::Wire>);
208  // ... and an association set
209  std::unique_ptr<art::Assns<raw::RawDigit,recob::Wire> > WireDigitAssn
211 
212  // Read in the digit List object(s).
214  evt.getByLabel(fDigitModuleLabel, digitVecHandle);
215 
216  if (!digitVecHandle->size()) return;
217  mf::LogInfo("CalWire") << "CalWire:: digitVecHandle size is " << digitVecHandle->size();
218 
219  // Use the handle to get a particular (0th) element of collection.
220  art::Ptr<raw::RawDigit> digitVec0(digitVecHandle, 0);
221 
222  unsigned int dataSize = digitVec0->Samples(); //size of raw data vectors
223 
224  int transformSize = fFFT->FFTSize();
225  raw::ChannelID_t channel(raw::InvalidChannelID); // channel number
226  unsigned int bin(0); // time bin loop variable
227 
228  double decayConst = 0.; // exponential decay constant of electronics shaping
229  double fitAmplitude = 0.; //This is the seed value for the amplitude in the exponential tail fit
230  std::vector<float> holder; // holds signal data
231  std::vector<short> rawadc(transformSize); // vector holding uncompressed adc values
232  std::vector<TComplex> freqHolder(transformSize+1); // temporary frequency data
233 
234  // loop over all wires
235  for(unsigned int rdIter = 0; rdIter < digitVecHandle->size(); ++rdIter){ // ++ move
236  holder.clear();
237 
238  art::Ptr<raw::RawDigit> digitVec(digitVecHandle, rdIter);
239  channel = digitVec->Channel();
240 
241  holder.resize(transformSize);
242 
243  // uncompress the data
244  raw::Uncompress(digitVec->ADCs(), rawadc, digitVec->Compression());
245 
246  for(bin = 0; bin < dataSize; ++bin)
247  holder[bin]=(rawadc[bin]-digitVec->GetPedestal());
248  // fExpEndBins only nonzero for detectors needing exponential tail fitting
249  if(fExpEndBins && std::abs(decayConsts[channel]) > 0.0){
250 
251  TH1D expTailData("expTailData","Tail data for fit",
252  fExpEndBins,dataSize-fExpEndBins,dataSize);
253  TF1 expFit("expFit","[0]*exp([1]*x)");
254 
255  for(bin = 0; bin < (unsigned int)fExpEndBins; ++bin)
256  expTailData.Fill(dataSize-fExpEndBins+bin,holder[dataSize-fExpEndBins+bin]);
257  decayConst = decayConsts[channel];
258  fitAmplitude = holder[dataSize-fExpEndBins]/exp(decayConst*(dataSize-fExpEndBins));
259  expFit.FixParameter(1,decayConst);
260  expFit.SetParameter(0,fitAmplitude);
261  expTailData.Fit(&expFit,"QWN","",dataSize-fExpEndBins,dataSize);
262  expFit.SetRange(dataSize,transformSize);
263  for(bin = 0; bin < dataSize; ++bin)
264  holder[dataSize+bin]= expFit.Eval(bin+dataSize);
265  }
266  // This is actually deconvolution, by way of convolution with the inverted
267  // kernel. This code assumes the response function has already been
268  // been transformed and inverted. This way a complex multiplication, rather
269  // than a complex division is performed saving 2 multiplications and
270  // 2 divsions
271 
272  // the example below is for MicroBooNE, experiments should
273  // adapt as appropriate
274 
275  // Figure out which kernel to use (0=induction, 1=collection).
276  geo::SigType_t sigtype = geom->SignalType(channel);
277  size_t k;
278  if(sigtype == geo::kInduction)
279  k = 0;
280  else if(sigtype == geo::kCollection)
281  k = 1;
282  else
283  throw cet::exception("CalWire") << "Bad signal type = " << sigtype << "\n";
284  if (k >= kernel.size())
285  throw cet::exception("CalWire") << "kernel size < " << k << "!\n";
286 
287  fFFT->Convolute(holder,kernel[k]);
288 
289  holder.resize(dataSize,1e-5);
290  //This restores the DC component to signal removed by the deconvolution.
291  if(fPostsample) {
292  double average=0.0;
293  for(bin=0; bin < (unsigned int)fPostsample; ++bin)
294  average+=holder[holder.size()-1-bin]/(double)fPostsample;
295  for(bin = 0; bin < holder.size(); ++bin) holder[bin]-=average;
296  }
297  wirecol->push_back(recob::WireCreator(holder,*digitVec).move());
298  // add an association between the last object in wirecol
299  // (that we just inserted) and digitVec
300  if (!util::CreateAssn(*this, evt, *wirecol, digitVec, *WireDigitAssn)) {
302  << "Can't associate wire #" << (wirecol->size() - 1)
303  << " with raw digit #" << digitVec.key();
304  } // if failed to add association
305  } // for raw digits
306 
307  if(wirecol->size() == 0)
308  mf::LogWarning("CalWire") << "No wires made for this event.";
309 
310  evt.put(std::move(wirecol));
311  evt.put(std::move(WireDigitAssn));
312 
313  return;
314  }
315 
316 } // end namespace caldata
317 
318 
319 namespace caldata{
320 
322 
323 } // end namespace caldata
324 
325 
326 #endif // CALWIRE_H
327 
328 
key_type key() const
Definition: Ptr.h:356
float GetPedestal() const
Definition: RawDigit.h:213
const ADCvector_t & ADCs() const
Reference to the compressed ADC count vector.
Definition: RawDigit.h:209
std::string fResponseFile
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
std::vector< int > fKernMapR
Helper functions to create a wire.
ChannelID_t Channel() const
DAQ channel this raw data was read from.
Definition: RawDigit.h:211
std::vector< double > fDecayConstsR
Definition of basic raw digits.
SigType_t SignalType(geo::PlaneID const &pid) const
Returns the type of signal on the channels of specified TPC plane.
bool isRealData() const
Definition: Event.h:83
Class managing the creation of a new recob::Wire object.
Definition: WireCreator.h:53
creation of calibrated signals on wires
unsigned short Samples() const
Number of samples in the uncompressed ADC data.
Definition: RawDigit.h:212
TFile f
Definition: plotHisto.C:6
ProductID put(std::unique_ptr< PROD > &&product)
Definition: Event.h:102
std::vector< double > fDecayConstsS
int FFTSize() const
Definition: LArFFT.h:69
constexpr ChannelID_t InvalidChannelID
ID of an invalid channel.
Definition: RawTypes.h:31
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:42
Signal from induction planes.
Definition: geo_types.h:92
enum geo::_plane_sigtype SigType_t
Enumerate the possible plane projections.
Collect all the RawData header files together.
T get(std::string const &key) const
Definition: ParameterSet.h:231
void Convolute(std::vector< T > &input, std::vector< T > &respFunc)
Definition: LArFFT.h:172
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.
float bin[41]
Definition: plottest35.C:14
std::vector< std::vector< TComplex > > fKernelR
raw::Compress_t Compression() const
Compression algorithm used to store the ADC counts.
Definition: RawDigit.h:215
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
void reconfigure(fhicl::ParameterSet const &p)
Utility object to perform functions of association.
std::string fDigitModuleLabel
module that made digits
Encapsulate the construction of a single detector plane.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
std::vector< std::vector< TComplex > > fKernelS
int fExpEndBins
number of end bins to consider for tail fit
#define LOG_DEBUG(id)
Declaration of basic channel signal object.
int fPostsample
number of postsample bins
void produce(art::Event &evt)
std::vector< int > fKernMapS
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:27
void Uncompress(const std::vector< short > &adc, std::vector< short > &uncompressed, raw::Compress_t compress)
Uncompresses a raw data buffer.
Definition: raw.cxx:756
Float_t e
Definition: plot.C:34
CalWire(fhicl::ParameterSet const &pset)
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
Signal from collection planes.
Definition: geo_types.h:93