9 #include "art/Framework/Core/EDAnalyzer.h"
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"
46 explicit CalWireAna(fhicl::ParameterSet
const& pset);
93 , fCalWireModuleLabel(pset.
get<
std::string >(
"CalWireModuleLabel"))
94 , fDetSimModuleLabel (pset.
get<
std::string >(
"DetSimModuleLabel"))
103 art::ServiceHandle<art::TFileService const>
tfs;
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);
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.);
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);
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);
148 = art::ServiceHandle<lariov::ChannelStatusService const>()->GetProvider();
149 art::Handle< std::vector<raw::RawDigit> > rdHandle;
151 art::Handle< std::vector<recob::Wire> > wHandle;
158 art::PtrVector<recob::Wire> wvec;
159 for(
unsigned int i = 0; i < wHandle->size(); ++i){
160 art::Ptr<recob::Wire>
w(wHandle,i);
163 art::PtrVector<raw::RawDigit> rdvec;
164 for(
unsigned int i = 0; i < rdHandle->size(); ++i){
165 art::Ptr<raw::RawDigit>
r(rdHandle,i);
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;
181 for(
unsigned int rd = 0; rd < rdvec.size(); ++rd){
183 std::vector<double> signal(fft->FFTSize());
184 for(
unsigned int wd = 0; wd < wvec.size(); ++wd){
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();
193 for(
unsigned int ii = 0; ii < wirSig.size(); ++ii) {
194 signal[ii] = wirSig[ii];
198 if (wd == (wvec.size()-1) ){
199 MF_LOG_DEBUG(
"CalWireAna") <<
"caldata::CalWireAna:Big problem! No matching Wire for RawDigit. Bailing." << rd;
204 std::vector<double> adc(fft->FFTSize());
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));
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)) {
217 for(
int i = 0; i < signalSize; i++) sum+=pow(adc[i]-pedestal,2.0);
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());
226 rdvec[rd]->Channel() > indChan0 &&
227 rdvec[rd]->Channel() < indChan1){
228 fft->AlignedSum(ir,adc);
229 fft->AlignedSum(iw,signal);
232 rdvec[rd]->Channel() > colChan0 &&
233 rdvec[rd]->Channel() < colChan1) {
234 fft->AlignedSum(cr,adc);
235 fft->AlignedSum(cw,signal);
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()));
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()));
251 static unsigned int pulseHeight = 5;
252 unsigned int tmin = 1;
253 unsigned int tmax = 1;
254 int indMax = TMath::LocMax(signalSize,&adc[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;
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;
273 fWindow->Fill(indMax, tmax - tmin);
275 std::vector<double> winDiffs;
278 static unsigned int tRawLead = 0;
279 for(
unsigned int t = 1; t < signalSize; ++t){
280 fDiffsW->Fill(signal[t]-signal[t-1]);
283 if (t>=tmin && t<=tmax && tmax>=pulseHeight && (t+tRawLead)<signalSize){
285 winDiffs.push_back((adc[t+tRawLead]-signal[t])/adc[t+tRawLead]);
286 fDiffsRW->Fill(adc[t+tRawLead]-signal[t]);
288 if (sigMax >= pulseHeight){
295 MF_LOG_DEBUG(
"CalWireAna") <<
"on channel " << rdvec[rd]->Channel();
297 double tmp = TMath::Mean(winDiffs.size(),&winDiffs[0]);
298 double tmp2 = TMath::RMS(winDiffs.size(),&winDiffs[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++) {
double std(const std::vector< short > &wf, const double ped_mean, size_t start, size_t nsample)
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.
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.
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
Interface for experiment-specific service for channel quality info.
process_name can override from command line with o or output caldata
Base class for creation of raw signals on wires.
art framework interface to geometry description
Signal from collection planes.