@@ -37,7 +37,7 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
3737public:
3838 explicit OpDeconvolutionAlgWiener (fhicl::ParameterSet const & p);
3939
40- ~OpDeconvolutionAlgWiener () {}
40+ ~OpDeconvolutionAlgWiener () {delete fFilterTF1 ; }
4141
4242 // Required functions.
4343 std::vector<raw::OpDetWaveform> RunDeconvolution (std::vector<raw::OpDetWaveform> const & wfHandle) override ;
@@ -65,7 +65,6 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
6565 double fPMTChargeToADC ;
6666 double fDecoWaveformPrecision ;
6767 short unsigned int fBaselineSample ;
68- std::string fOpDetDataFile ;
6968 std::string fFilter ;
7069 std::string fElectronics ;
7170 bool fScaleHypoSignal ;
@@ -80,6 +79,7 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
8079 unsigned int NDecoWf;
8180
8281 TF1 *fFilterTF1 ;
82+
8383 std::vector<double > fSignalHypothesis ;
8484 std::vector<double > fNoiseHypothesis ;
8585
@@ -125,7 +125,6 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
125125 fPMTChargeToADC = p.get < double >(" PMTChargeToADC" );
126126 fDecoWaveformPrecision = p.get < double >(" DecoWaveformPrecision" );
127127 fBaselineSample = p.get < short unsigned int >(" BaselineSample" );
128- fOpDetDataFile = p.get < std::string >(" OpDetDataFile" );
129128 fSkipChannelList = p.get < std::vector<int >>(" SkipChannelList" );
130129 fFilter = p.get < std::string >(" Filter" );
131130 fElectronics = p.get < std::string >(" Electronics" );
@@ -138,6 +137,8 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
138137 fBaseVarCut = p.get < double >(" BaseVarCut" );
139138 fFilterParams = p.get < std::vector<double > >(" FilterParams" );
140139
140+ fFilterTF1 = new TF1 (" FilterTemplate" , fFilter .c_str ());
141+
141142 fNormUnAvSmooth =1 ./(2 *fUnAvNeighbours +1 );
142143 NDecoWf=0 ;
143144 MaxBinsFFT=std::pow (2 , fMaxFFTSizePow );
@@ -147,38 +148,10 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
147148 if (fElectronics ==" Daphne" ) fSamplingFreq =fDaphne_Freq /1000 .;// in GHz
148149 auto const * lar_prop = lar::providerFrom<detinfo::LArPropertiesService>();
149150
150- // Load SER
151- std::string fname;
152- cet::search_path sp (" FW_SEARCH_PATH" );
153- sp.find_file (fOpDetDataFile , fname);
154- TFile* file = TFile::Open (fname.c_str (), " READ" );
155- std::vector<std::vector<double >>* SinglePEVec_p;
156- std::vector<int >* fSinglePEChannels_p ;
157- std::vector<double >* fPeakAmplitude_p ;
158- std::vector<std::vector<double >> * fFilterParamVector_p ;
159-
160- file->GetObject (" SERChannels" , fSinglePEChannels_p );
161- file->GetObject (" SinglePEVec" , SinglePEVec_p);
162- file->GetObject (" PeakAmplitude" , fPeakAmplitude_p );
163- file->GetObject (" FilterParams" , fFilterParamVector_p );
164-
165- if (fElectronics ==" Daphne" ) file->GetObject (" SinglePEVec_40ftCable_Daphne" , SinglePEVec_p);
166- fSinglePEWaveVector = *SinglePEVec_p;
167- fSinglePEChannels = *fSinglePEChannels_p ;
168- fPeakAmplitude = *fPeakAmplitude_p ;
169- fFilterParamVector = *fFilterParamVector_p ;
170-
171- mf::LogInfo (" OpDeconvolutionAlg" )<<" Loaded SER from " <<fOpDetDataFile <<" ... size=" <<fSinglePEWave .size ()<<std::endl;
172- file->Close ();
173-
174- if (fUseParamFilter && !fUseParamFilterInidividualChannel ){
175- // If use param filter but not one for each channel, build it here
176- fFilterTF1 = new TF1 (" FilterTemplate" , fFilter .c_str ());
177- for (size_t k=0 ; k<fFilterParams .size (); k++)
178- fFilterTF1 ->SetParameter (k, fFilterParams [k]);
179- mf::LogInfo (" OpDeconvolutionAlg" )<<" Creating parametrized filter... TF1:" <<fFilter <<std::endl;
180- }
181- else if (!fUseParamFilter ){
151+ // Load PMT Calibration Database
152+ fPMTCalibrationDatabaseService = lar::providerFrom<sbndDB::IPMTCalibrationDatabaseService const >();
153+
154+ if (!fUseParamFilter ){
182155 // Create light signal hypothesis for "on-fly" Wiener filter
183156 fSignalHypothesis .resize (MaxBinsFFT, 0 );
184157 if (fFilter ==" Wiener" )
@@ -200,38 +173,26 @@ std::vector<raw::OpDetWaveform> opdet::OpDeconvolutionAlgWiener::RunDeconvolutio
200173 {
201174 int channelNumber = wf.ChannelNumber ();
202175 auto it = std::find (fSkipChannelList .begin (), fSkipChannelList .end (), channelNumber);
203- bool AnalyseChannel = false ;
204176 if (it == fSkipChannelList .end ()) {
205- // If it's not try to find its SER in the file
206- for (size_t i=0 ; i<fSinglePEChannels .size (); i++)
177+ fSinglePEWave = fPMTCalibrationDatabaseService ->getSER (channelNumber);
178+ double SPEAmplitude = fPMTCalibrationDatabaseService ->getSPEAmplitude (channelNumber);
179+ double SPEPeakValue = *std::max_element (fSinglePEWave .begin (), fSinglePEWave .end (), [](double a, double b) {return std::abs (a) < std::abs (b);});
180+ double SinglePENormalization = std::abs (SPEAmplitude/SPEPeakValue);
181+ std::transform (fSinglePEWave .begin (), fSinglePEWave .end (), fSinglePEWave .begin (), [SinglePENormalization](double val) {return val * SinglePENormalization;});
182+ fSinglePEWave .resize (MaxBinsFFT, 0 );
183+ // If use channel dependent param filter
184+ if (fUseParamFilter )
207185 {
208- if (fSinglePEChannels [i]==channelNumber)
186+ double GaussFilterPower = fPMTCalibrationDatabaseService ->getGaussFilterPower (channelNumber);
187+ double GaussFilterWC = fPMTCalibrationDatabaseService ->getGaussFilterWC (channelNumber);
188+ fFilterParamChannel = {GaussFilterWC, GaussFilterPower};
189+ for (size_t k=0 ; k<fFilterParamChannel .size (); k++)
209190 {
210- fSinglePEWave = fSinglePEWaveVector [i];
211- double SPEPeakValue = *std::max_element (fSinglePEWave .begin (), fSinglePEWave .end (), [](double a, double b) {return std::abs (a) < std::abs (b);});
212- double SinglePENormalization = std::abs (fPeakAmplitude [i]/SPEPeakValue);
213- std::transform (fSinglePEWave .begin (), fSinglePEWave .end (), fSinglePEWave .begin (), [SinglePENormalization](double val) {return val * SinglePENormalization;});
214- fSinglePEWave .resize (MaxBinsFFT, 0 );
215- AnalyseChannel = true ;
216- // If use channel dependent param filter
217- if (fUseParamFilterInidividualChannel )
218- {
219- fFilterParamChannel = fFilterParamVector [i];
220- fFilterTF1 = new TF1 (" FilterTemplate" , fFilter .c_str ());
221- for (size_t k=0 ; k<fFilterParamChannel .size (); k++)
222- {
223- fFilterTF1 ->SetParameter (k, fFilterParamChannel [k]);
224- }
225-
226-
227- mf::LogInfo (" OpDeconvolutionAlg" )<<" Creating parametrized filter... TF1:" <<fFilter << " for channel " << channelNumber <<std::endl;
228- }
229- break ;
191+ fFilterTF1 ->SetParameter (k, fFilterParamChannel [k]);
230192 }
193+ mf::LogInfo (" OpDeconvolutionAlg" )<<" Creating parametrized filter... TF1:" <<fFilter << " for channel " << channelNumber <<std::endl;
231194 }
232- if (AnalyseChannel == false ) mf::LogError (" OpDeconvolutionAlg" ) << " SER for channel " << channelNumber <<" not found in the file \n " ;
233195 }
234- if (!AnalyseChannel) continue ;
235196 // Read waveform
236197 size_t wfsize=wf.Waveform ().size ();
237198 if (wfsize>MaxBinsFFT){
@@ -537,15 +498,13 @@ std::vector<TComplex> opdet::OpDeconvolutionAlgWiener::DeconvolutionKernel(size_
537498 }
538499 }
539500
540-
541501 if (fDebug ){
542502 std::string name=" h_wienerfilter_" +std::to_string (NDecoWf);
543503 TH1F * hs_wiener = tfs->make < TH1F >
544504 (name.c_str ()," Wiener Filter;Frequency Bin;Magnitude" ,size/2 , 0 , size/2 );
545505 for (size_t k=0 ; k<size/2 ; k++)
546506 hs_wiener->SetBinContent (k, TComplex::Abs ( kernel[k]*serfft[k] ) );
547507 }
548- if (fUseParamFilter && fUseParamFilterInidividualChannel ) delete fFilterTF1 ;
549508 return kernel;
550509}
551510
0 commit comments