All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CalWireAna_module.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // CalWireAna class designed to make histos.
4 //
5 //
6 //
7 ////////////////////////////////////////////////////////////////////////
8 
9 #include "art/Framework/Core/EDAnalyzer.h"
10 
11 // C++ includes
12 #include <algorithm>
13 #include <string>
14 
15 // Framework includes
16 #include "art/Framework/Core/ModuleMacros.h"
17 #include "canvas/Persistency/Common/FindOneP.h"
18 #include "art/Framework/Principal/Event.h"
19 #include "fhiclcpp/ParameterSet.h"
20 #include "art/Framework/Principal/Handle.h"
21 #include "art/Framework/Services/Registry/ServiceHandle.h"
22 #include "art_root_io/TFileService.h"
23 #include "messagefacility/MessageLogger/MessageLogger.h"
24 
25 // LArSoft includes
32 
33 // ROOT includes
34 #include "TComplex.h"
35 #include "TH1.h"
36 #include "TH2.h"
37 #include "TMath.h"
38 
39 namespace caldata {
40 
41  /// Base class for creation of raw signals on wires.
42  class CalWireAna : public art::EDAnalyzer {
43 
44  public:
45 
46  explicit CalWireAna(fhicl::ParameterSet const& pset);
47 
48  /// read/write access to event
49  void analyze (const art::Event& evt);
50  void beginJob();
51  void endJob();
52 
53  private:
54 
55  std::string fCalWireModuleLabel;///< name of module that produced the wires
56  std::string fDetSimModuleLabel; //< name of module that produced the digits
57 
58  TH1F* fDiffsR; ///< histogram of Raw tdc to tdc differences
59  TH1F* fDiffsW; ///< histogram of Wire (post-deconvoution) tdc to tdc differences
60  TH1F* fDiffsRW;
61  TH1F* fDiffsRWgph;
62  TH1F* fMin;
63  TH1F* fMax;
64  TH1F* fIR;
65  TH1F* fCR;
66  TH1F* fIW;
67  TH1F* fCW;
68  TH1F* fRawIndPeak; //Raw Induction Peak Values
69  TH1F* fRawColPeak; //Raw Collection Peak Values
70  TH1F* fCalIndPeak; //Calibrated Induction Peak Values
71  TH1F* fCalColPeak; //Calibrated Collection Peak Values
72  TH1F* fNoiseHist; //Noise Frequency Spectrum
73  TH1F* fNoiseRMS; //Noise RMS values
74  TH2F* fWireSig;
75  TH2F* fRawSig;
76  TH2F* fRD_WireMeanDiff2D; ///< histogram of difference between original tdc value and compressesed value vs original value
77  TH2F* fRD_WireRMSDiff2D; ///< histogram of difference between original tdc value and compressesed value vs original value
78  TH2F* fDiffsRWvsR;
80  TH2F* fWindow;
81 
82 
83  }; // class CalWireAna
84 
85 } // End caldata namespace.
86 
87 
88 namespace caldata{
89 
90  //-------------------------------------------------
91  CalWireAna::CalWireAna(fhicl::ParameterSet const& pset)
92  : EDAnalyzer (pset)
93  , fCalWireModuleLabel(pset.get< std::string >("CalWireModuleLabel"))
94  , fDetSimModuleLabel (pset.get< std::string >("DetSimModuleLabel"))
95  {
96 
97  }
98 
99  //-------------------------------------------------
101  {
102  // get access to the TFile service
103  art::ServiceHandle<art::TFileService const> tfs;
104 
105  fDiffsR = tfs->make<TH1F>("One timestamp diffs in RawDigits", ";#Delta ADC;", 40, -19.5, 20.5);
106  fDiffsW = tfs->make<TH1F>("One timestamp diffs in Wires", ";#Delta ADC;", 20, -9.5, 10.5);
107  fDiffsRW = tfs->make<TH1F>("Same timestamp diffs in RD-Wires", ";#Delta ADC;", 20, -9.5, 10.5);
108  fDiffsRWvsR = tfs->make<TH2F>("Same timestamp diffs in RD-Wires vs R", ";#Delta ADC;", 481,-0.5,480.5, 20, -9.5, 10.5);
109  fDiffsRWgph = tfs->make<TH1F>("Same timestamp diffs in RD-Wires gph", ";#Delta ADC;", 20, -9.5, 10.5);
110  fDiffsRWvsRgph = tfs->make<TH2F>("Same timestamp diffs in RD-Wires vs R gph", ";#Delta ADC;", 481,-0.5,480.5, 20, -9.5, 10.5);
111  fRawSig = tfs->make<TH2F>("One event, one channel Raw", "timestamp", 481,-0.5,480.5, 21,-0.5, 20.5);
112  fWireSig = tfs->make<TH2F>("One event, one channel Wire", "timestamp", 481,-0.5,480.5, 21, -0.5, 20.5);
113 
114  fRD_WireMeanDiff2D = tfs->make<TH2F>("Mean (Raw-CALD)-over-Raw in Window gph","Wire number",481,-0.05,480.5, 40, -1., 1.);
115  fRD_WireRMSDiff2D = tfs->make<TH2F>("RMS (Raw-CALD)-over-Raw in Window gph","Wire number",481,-0.05,480.5, 10, 0., 2.);
116 
117  fWindow = tfs->make<TH2F>("tmax-tmin vs indMax", "ticks", 200, 0, 2000, 20, -2.5, 60.5);
118  fMin = tfs->make<TH1F>("Value of min", "ticks", 21, -20.5, 0.5);
119  fMax = tfs->make<TH1F>("Value of max", "ticks", 21, 0.5, 20.5);
120  fRawIndPeak = tfs->make<TH1F>("indPeakRaw", ";Induction Peaks Raw;",40,5,45);
121  fRawColPeak = tfs->make<TH1F>("colPeakRaw", ";Collection Peaks Raw;",40,5,45);
122  fCalIndPeak = tfs->make<TH1F>("indPeakCal", ";Induction Peaks Calibrated;",40,5,45);
123  fCalColPeak = tfs->make<TH1F>("colPeakCal", ";Collection Peaks Calibrated;",40,5,45);
124 
125  fIR = tfs->make<TH1F>("Raw Ind signal","time ticks",4096,0.0,4096.);
126  fCR = tfs->make<TH1F>("Raw Coll signal","time ticks",4096,0.0,4096.);
127  fIW = tfs->make<TH1F>("Wire Ind signal","time ticks",4096,0.0,4096.);
128  fCW = tfs->make<TH1F>("Wire Coll signal","time ticks",4096,0.0,4096.);
129  fNoiseHist = tfs->make<TH1F>("Noise Histogram","FFT Bins",2049,0,2049);
130  fNoiseRMS = tfs->make<TH1F>("Noise RMS","RMS",25,0,2.0);
131 
132  return;
133 
134  }
135 
136  //-------------------------------------------------
138  {
139  }
140 
141  //-------------------------------------------------
142  void CalWireAna::analyze(const art::Event& evt)
143  {
144 
145  // loop over the raw digits and get the adc vector for each, then compress it and uncompress it
146 
147  lariov::ChannelStatusProvider const& channelStatus
148  = art::ServiceHandle<lariov::ChannelStatusService const>()->GetProvider();
149  art::Handle< std::vector<raw::RawDigit> > rdHandle;
150  evt.getByLabel(fDetSimModuleLabel,rdHandle);
151  art::Handle< std::vector<recob::Wire> > wHandle;
152  evt.getByLabel(fCalWireModuleLabel,wHandle);
153 
154  // get the raw::RawDigit associated by fCalWireModuleLabel to wires in wHandle;
155  // RawDigitsFromWire.at(index) will be a art::Ptr<raw::RawDigit>
156  art::FindOneP<raw::RawDigit> RawDigitsFromWire(wHandle, evt, fCalWireModuleLabel);
157 
158  art::PtrVector<recob::Wire> wvec;
159  for(unsigned int i = 0; i < wHandle->size(); ++i){
160  art::Ptr<recob::Wire> w(wHandle,i);
161  wvec.push_back(w);
162  }
163  art::PtrVector<raw::RawDigit> rdvec;
164  for(unsigned int i = 0; i < rdHandle->size(); ++i){
165  art::Ptr<raw::RawDigit> r(rdHandle,i);
166  rdvec.push_back(r);
167  }
168 
169  art::ServiceHandle<geo::Geometry const> geom;
170  art::ServiceHandle<util::LArFFT> fft;
171  double pedestal = rdvec[0]->GetPedestal();
172  double threshold = 9.0;
173  double signalSize = rdvec[0]->Samples();
174  uint32_t indChan0=64;
175  uint32_t indChan1=110;
176  uint32_t colChan0=312;
177  uint32_t colChan1=354;
178  std::vector<double> ir(fft->FFTSize()),iw(fft->FFTSize()),cr(fft->FFTSize()),cw(fft->FFTSize());
179  ir[signalSize]=iw[signalSize]=cr[signalSize]=cw[signalSize]=1.0;
180  /// loop over all the raw digits in a window around peak
181  for(unsigned int rd = 0; rd < rdvec.size(); ++rd){
182  // Find corresponding wire.
183  std::vector<double> signal(fft->FFTSize());
184  for(unsigned int wd = 0; wd < wvec.size(); ++wd){
185  // if (wvec[wd]->RawDigit() == rdvec[rd]){
186  if (RawDigitsFromWire.at(wd) == rdvec[rd]){
187  std::vector<float> wirSig = wvec[wd]->Signal();
188  if(wirSig.size() > signal.size()) {
189  MF_LOG_DEBUG("CalWireAna")<<"Incompatible vector size "<<wirSig.size()
190  <<" "<<signal.size();
191  return;
192  }
193  for(unsigned int ii = 0; ii < wirSig.size(); ++ii) {
194  signal[ii] = wirSig[ii];
195  }
196  break;
197  }
198  if (wd == (wvec.size()-1) ){
199  MF_LOG_DEBUG("CalWireAna") << "caldata::CalWireAna:Big problem! No matching Wire for RawDigit. Bailing." << rd;
200  return;
201  }
202  }
203 
204  std::vector<double> adc(fft->FFTSize());
205 
206  for(unsigned int t = 1; t < rdvec[rd]->Samples(); ++t){
207  fDiffsR->Fill(rdvec[rd]->ADC(t) - rdvec[rd]->ADC(t-1));
208  adc[t-1]=rdvec[rd]->ADC(t-1);
209  fRawSig->Fill(rd,rdvec[rd]->ADC(t));
210  }
211  //get the last one for the adc vector
212  adc[rdvec[rd]->Samples()-1] = rdvec[rd]->ADC(rdvec[rd]->Samples()-1);
213  if(!channelStatus.IsBad(rdvec[rd]->Channel()) &&
214  (*max_element(adc.begin(),adc.end()) < pedestal+threshold &&
215  *min_element(adc.begin(),adc.end()) >pedestal -threshold)) {
216  double sum=0;
217  for(int i = 0; i < signalSize; i++) sum+=pow(adc[i]-pedestal,2.0);
218  fNoiseRMS->Fill(TMath::Sqrt(sum/(double)signalSize));
219  std::vector<double> temp(fft->FFTSize());
220  std::vector<TComplex> fTemp(fft->FFTSize()/2+1);
221  for(int i = 0; i < signalSize; i++) temp[i]=(adc[i]-pedestal)*sin(TMath::Pi()*(double)i/signalSize);
222  fft->DoFFT(temp,fTemp);
223  for(int i = 0; i < fft->FFTSize()/2+1; i++) fNoiseHist->Fill(i,fTemp[i].Rho());
224  }
225  if(geom->SignalType(rdvec[rd]->Channel()) == geo::kInduction &&
226  rdvec[rd]->Channel() > indChan0 &&
227  rdvec[rd]->Channel() < indChan1){
228  fft->AlignedSum(ir,adc);
229  fft->AlignedSum(iw,signal);
230  }
231  if(geom->SignalType(rdvec[rd]->Channel()) == geo::kCollection &&
232  rdvec[rd]->Channel() > colChan0 &&
233  rdvec[rd]->Channel() < colChan1) {
234  fft->AlignedSum(cr,adc);
235  fft->AlignedSum(cw,signal);
236  }
237  if(geom->SignalType(rdvec[rd]->Channel()) == geo::kInduction) {
238  if(*max_element(adc.begin(),adc.end()) > pedestal+threshold)
239  fRawIndPeak->Fill(*max_element(adc.begin(),adc.end()));
240  if(*max_element(signal.begin(),signal.end()) > pedestal+threshold)
241  fCalIndPeak->Fill(*max_element(signal.begin(),signal.end()));
242  }
243  if(geom->SignalType(rdvec[rd]->Channel()) == geo::kCollection) {
244  if(*max_element(adc.begin(),adc.end()) > pedestal +threshold)
245  fRawColPeak->Fill(*max_element(adc.begin(),adc.end()));
246  if(*max_element(signal.begin(),signal.end()) > pedestal+threshold)
247  fCalColPeak->Fill(*max_element(signal.begin(),signal.end()));
248  }
249 
250  int window = 8;
251  static unsigned int pulseHeight = 5;
252  unsigned int tmin = 1;
253  unsigned int tmax = 1;
254  int indMax = TMath::LocMax(signalSize,&adc[0]);
255  double sigMin = 0.0;
256  double sigMax = TMath::MaxElement(signalSize,&adc[0]);
257  if(geom->SignalType(rdvec[rd]->Channel()) == geo::kInduction && sigMax>=pulseHeight) {
258  int indMin = TMath::LocMin(signalSize,&adc[0]);
259  sigMin = TMath::MinElement(signalSize,&adc[0]);
260  tmin = std::max(indMax-window,0);
261  tmax = std::min(indMin+window,(int)signalSize-1);
262  MF_LOG_DEBUG("CalWireAna") << "Induction channel, indMin,tmin,tmax "
263  << rd<< " " << indMin<< " " << tmin << " " << tmax;
264  }
265  else if (sigMax>=pulseHeight){
266  tmin = std::max(indMax-window,0);
267  tmax = std::min(indMax+window,(int)signalSize-1);
268  MF_LOG_DEBUG("CalWireAna") << "Collection channel, tmin,tmax "<< rd<< " " << tmin << " " << tmax;
269  }
270 
271  fMin->Fill(sigMin);
272  fMax->Fill(sigMax);
273  fWindow->Fill(indMax, tmax - tmin);
274 
275  std::vector<double> winDiffs;
276  int cnt=0;
277  // for(unsigned int t = tmin; t < tmax; ++t)
278  static unsigned int tRawLead = 0;
279  for(unsigned int t = 1; t < signalSize; ++t){
280  fDiffsW->Fill(signal[t]-signal[t-1]);
281  fWireSig->Fill(rd,signal[t]);
282 
283  if (t>=tmin && t<=tmax && tmax>=pulseHeight && (t+tRawLead)<signalSize){
284  cnt++;
285  winDiffs.push_back((adc[t+tRawLead]-signal[t])/adc[t+tRawLead]);
286  fDiffsRW->Fill(adc[t+tRawLead]-signal[t]);
287  fDiffsRWvsR->Fill(rd,adc[t+tRawLead]-signal[t]);
288  if (sigMax >= pulseHeight){
289  fDiffsRWgph->Fill(adc[t+tRawLead]-signal[t]);
290  fDiffsRWvsRgph->Fill(rd,adc[t+tRawLead]-signal[t]);
291  }
292  }
293  }
294 
295  MF_LOG_DEBUG("CalWireAna") << "on channel " << rdvec[rd]->Channel();
296  // TMath::Mean with iterators doesn't work. EC,23-Sep-2010.
297  double tmp = TMath::Mean(winDiffs.size(),&winDiffs[0]);
298  double tmp2 = TMath::RMS(winDiffs.size(),&winDiffs[0]);
299  double tmp3=0;
300  for (unsigned int ii=0; ii<rdvec[rd]->Samples(); ii++) tmp3+=rdvec[rd]->ADC(ii);
301  for(int i = 0; i < fft->FFTSize(); i++) {
302  fIR->Fill(i,ir[i]);
303  fIW->Fill(i,iw[i]);
304  fCR->Fill(i,cr[i]);
305  fCW->Fill(i,cw[i]);
306  }
307  fRD_WireMeanDiff2D->Fill(rd,tmp);
308  fRD_WireRMSDiff2D->Fill(rd,tmp2);
309 
310  }//end loop over rawDigits
311 
312  return;
313  }//end analyze method
314 
315  DEFINE_ART_MODULE(CalWireAna)
316 
317 }//end namespace
double std(const std::vector< short > &wf, const double ped_mean, size_t start, size_t nsample)
Definition: UtilFunc.cxx:42
TH2F * fRD_WireMeanDiff2D
histogram of difference between original tdc value and compressesed value vs original value ...
virtual bool IsBad(raw::ChannelID_t channel) const =0
Returns whether the specified channel is bad in the current run.
void analyze(const art::Event &evt)
read/write access to event
Definition of basic raw digits.
TH1F * fDiffsR
histogram of Raw tdc to tdc differences
TH2F * fRD_WireRMSDiff2D
histogram of difference between original tdc value and compressesed value vs original value ...
Signal from induction planes.
Definition: geo_types.h:145
Class providing information about the quality of channels.
std::string fCalWireModuleLabel
name of module that produced the wires
CalWireAna(fhicl::ParameterSet const &pset)
Var Sqrt(const Var &v)
Use to take sqrt of a var.
Definition: Var.cxx:172
std::string fDetSimModuleLabel
Interface for experiment-specific channel quality info provider.
TH1F * fDiffsW
histogram of Wire (post-deconvoution) tdc to tdc differences
Declaration of basic channel signal object.
art::ServiceHandle< art::TFileService > tfs
TCEvent evt
Definition: DataStructs.cxx:8
Interface for experiment-specific service for channel quality info.
esac echo uname r
process_name can override from command line with o or output caldata
Definition: pid.fcl:40
Base class for creation of raw signals on wires.
art framework interface to geometry description
Signal from collection planes.
Definition: geo_types.h:146