20 #include "art_root_io/TFileService.h" 31 #include "larevt/CalibrationDBI/Interface/ChannelStatusProvider.h" 32 #include "larevt/CalibrationDBI/Interface/ChannelStatusService.h" 101 fDiffsR = tfs->make<TH1F>(
"One timestamp diffs in RawDigits",
";#Delta ADC;", 40, -19.5, 20.5);
102 fDiffsW = tfs->make<TH1F>(
"One timestamp diffs in Wires",
";#Delta ADC;", 20, -9.5, 10.5);
103 fDiffsRW = tfs->make<TH1F>(
"Same timestamp diffs in RD-Wires",
";#Delta ADC;", 20, -9.5, 10.5);
105 "Same timestamp diffs in RD-Wires vs R",
";#Delta ADC;", 481, -0.5, 480.5, 20, -9.5, 10.5);
107 tfs->make<TH1F>(
"Same timestamp diffs in RD-Wires gph",
";#Delta ADC;", 20, -9.5, 10.5);
108 fDiffsRWvsRgph = tfs->make<TH2F>(
"Same timestamp diffs in RD-Wires vs R gph",
117 tfs->make<TH2F>(
"One event, one channel Raw",
"timestamp", 481, -0.5, 480.5, 21, -0.5, 20.5);
119 tfs->make<TH2F>(
"One event, one channel Wire",
"timestamp", 481, -0.5, 480.5, 21, -0.5, 20.5);
122 "Mean (Raw-CALD)-over-Raw in Window gph",
"Wire number", 481, -0.05, 480.5, 40, -1., 1.);
124 "RMS (Raw-CALD)-over-Raw in Window gph",
"Wire number", 481, -0.05, 480.5, 10, 0., 2.);
126 fWindow = tfs->make<TH2F>(
"tmax-tmin vs indMax",
"ticks", 200, 0, 2000, 20, -2.5, 60.5);
127 fMin = tfs->make<TH1F>(
"Value of min",
"ticks", 21, -20.5, 0.5);
128 fMax = tfs->make<TH1F>(
"Value of max",
"ticks", 21, 0.5, 20.5);
129 fRawIndPeak = tfs->make<TH1F>(
"indPeakRaw",
";Induction Peaks Raw;", 40, 5, 45);
130 fRawColPeak = tfs->make<TH1F>(
"colPeakRaw",
";Collection Peaks Raw;", 40, 5, 45);
131 fCalIndPeak = tfs->make<TH1F>(
"indPeakCal",
";Induction Peaks Calibrated;", 40, 5, 45);
132 fCalColPeak = tfs->make<TH1F>(
"colPeakCal",
";Collection Peaks Calibrated;", 40, 5, 45);
134 fIR = tfs->make<TH1F>(
"Raw Ind signal",
"time ticks", 4096, 0.0, 4096.);
135 fCR = tfs->make<TH1F>(
"Raw Coll signal",
"time ticks", 4096, 0.0, 4096.);
136 fIW = tfs->make<TH1F>(
"Wire Ind signal",
"time ticks", 4096, 0.0, 4096.);
137 fCW = tfs->make<TH1F>(
"Wire Coll signal",
"time ticks", 4096, 0.0, 4096.);
138 fNoiseHist = tfs->make<TH1F>(
"Noise Histogram",
"FFT Bins", 2049, 0, 2049);
139 fNoiseRMS = tfs->make<TH1F>(
"Noise RMS",
"RMS", 25, 0, 2.0);
147 lariov::ChannelStatusProvider
const& channelStatus =
159 for (
unsigned int i = 0; i < wHandle->size(); ++i) {
163 for (
unsigned int i = 0; i < rdHandle->size(); ++i) {
168 double pedestal = rdvec[0]->GetPedestal();
169 double threshold = 9.0;
170 double signalSize = rdvec[0]->Samples();
171 uint32_t indChan0 = 64;
172 uint32_t indChan1 = 110;
173 uint32_t colChan0 = 312;
174 uint32_t colChan1 = 354;
177 ir[signalSize] = iw[signalSize] = cr[signalSize] = cw[signalSize] = 1.0;
180 for (
unsigned int rd = 0; rd < rdvec.
size(); ++rd) {
182 std::vector<double> signal(fft->
FFTSize());
183 for (
unsigned int wd = 0; wd < wvec.
size(); ++wd) {
184 if (RawDigitsFromWire.at(wd) == rdvec[rd]) {
185 std::vector<float> wirSig = wvec[wd]->Signal();
186 if (wirSig.size() > signal.size()) {
188 <<
"Incompatible vector size " << wirSig.size() <<
" " << signal.size();
191 for (
unsigned int ii = 0; ii < wirSig.size(); ++ii) {
192 signal[ii] = wirSig[ii];
196 if (wd == (wvec.
size() - 1)) {
198 <<
"caldata::CalWireAna:Big problem! No matching Wire for RawDigit. Bailing." << rd;
203 std::vector<double> adc(fft->
FFTSize());
205 for (
unsigned int t = 1; t < rdvec[rd]->Samples(); ++t) {
206 fDiffsR->Fill(rdvec[rd]->ADC(t) - rdvec[rd]->ADC(t - 1));
207 adc[t - 1] = rdvec[rd]->ADC(t - 1);
208 fRawSig->Fill(rd, rdvec[rd]->ADC(t));
211 adc[rdvec[rd]->Samples() - 1] = rdvec[rd]->ADC(rdvec[rd]->Samples() - 1);
212 if (!channelStatus.IsBad(rdvec[rd]->Channel()) &&
213 (*max_element(adc.begin(), adc.end()) < pedestal + threshold &&
214 *min_element(adc.begin(), adc.end()) > pedestal - threshold)) {
216 for (
int i = 0; i < signalSize; i++)
217 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++)
222 temp[i] = (adc[i] - pedestal) * sin(TMath::Pi() * (
double)i / signalSize);
223 fft->
DoFFT(temp, fTemp);
224 for (
int i = 0; i < fft->
FFTSize() / 2 + 1; i++)
227 if (wireReadoutGeom.SignalType(rdvec[rd]->Channel()) ==
geo::kInduction &&
228 rdvec[rd]->Channel() > indChan0 && rdvec[rd]->Channel() < indChan1) {
233 rdvec[rd]->Channel() > colChan0 && rdvec[rd]->Channel() < colChan1) {
237 if (wireReadoutGeom.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()));
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 (wireReadoutGeom.SignalType(rdvec[rd]->Channel()) ==
geo::kInduction &&
258 sigMax >= pulseHeight) {
259 int indMin = TMath::LocMin(signalSize, &adc[0]);
260 sigMin = TMath::MinElement(signalSize, &adc[0]);
261 tmin = std::max(indMax - window, 0);
262 tmax = std::min(indMin + window, (
int)signalSize - 1);
263 MF_LOG_DEBUG(
"CalWireAna") <<
"Induction channel, indMin,tmin,tmax " << rd <<
" " << indMin
264 <<
" " << tmin <<
" " << tmax;
266 else if (sigMax >= pulseHeight) {
267 tmin = std::max(indMax - window, 0);
268 tmax = std::min(indMax + window, (
int)signalSize - 1);
270 <<
"Collection channel, tmin,tmax " << rd <<
" " << tmin <<
" " << tmax;
275 fWindow->Fill(indMax, tmax - tmin);
277 std::vector<double> winDiffs;
279 static unsigned int tRawLead = 0;
280 for (
unsigned int t = 1; t < signalSize; ++t) {
281 fDiffsW->Fill(signal[t] - signal[t - 1]);
284 if (t >= tmin && t <= tmax && tmax >= pulseHeight && (t + tRawLead) < signalSize) {
286 winDiffs.push_back((adc[t + tRawLead] - signal[t]) / adc[t + tRawLead]);
287 fDiffsRW->Fill(adc[t + tRawLead] - signal[t]);
288 fDiffsRWvsR->Fill(rd, adc[t + tRawLead] - signal[t]);
289 if (sigMax >= pulseHeight) {
296 MF_LOG_DEBUG(
"CalWireAna") <<
"on channel " << rdvec[rd]->Channel();
298 double tmp = TMath::Mean(winDiffs.size(), &winDiffs[0]);
299 double tmp2 = TMath::RMS(winDiffs.size(), &winDiffs[0]);
300 for (
int i = 0; i < fft->
FFTSize(); i++) {
TH2F * fRD_WireMeanDiff2D
histogram of difference between original tdc value and compressesed value vs original value ...
Definition of basic raw digits.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
void emplace_back(Args &&...args)
void DoFFT(std::vector< T > &input, std::vector< TComplex > &output)
EDAnalyzer(fhicl::ParameterSet const &pset)
creation of calibrated signals on wires
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 ...
#define DEFINE_ART_MODULE(klass)
Signal from induction planes.
std::string fCalWireModuleLabel
name of module that produced the wires
CalWireAna(fhicl::ParameterSet const &pset)
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
void AlignedSum(std::vector< T > &input, std::vector< T > &output, bool add=true)
std::string fDetSimModuleLabel
TH1F * fDiffsW
histogram of Wire (post-deconvoution) tdc to tdc differences
Declaration of basic channel signal object.
void analyze(const art::Event &evt) override
read/write access to event
Base class for creation of raw signals on wires.
Signal from collection planes.