2727
2828#include " sbndcode/OpDetReco/OpDeconvolution/Alg/OpDeconvolutionAlg.hh"
2929
30+ #include " sbndcode/Calibration/PDSDatabaseInterface/PMTCalibrationDatabase.h"
31+ #include " sbndcode/Calibration/PDSDatabaseInterface/IPMTCalibrationDatabaseService.h"
3032
3133namespace opdet {
3234 class OpDeconvolutionAlgWiener ;
@@ -37,7 +39,7 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
3739public:
3840 explicit OpDeconvolutionAlgWiener (fhicl::ParameterSet const & p);
3941
40- ~OpDeconvolutionAlgWiener () {}
42+ ~OpDeconvolutionAlgWiener () {delete fFilterTF1 ; }
4143
4244 // Required functions.
4345 std::vector<raw::OpDetWaveform> RunDeconvolution (std::vector<raw::OpDetWaveform> const & wfHandle) override ;
@@ -65,7 +67,6 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
6567 double fPMTChargeToADC ;
6668 double fDecoWaveformPrecision ;
6769 short unsigned int fBaselineSample ;
68- std::string fOpDetDataFile ;
6970 std::string fFilter ;
7071 std::string fElectronics ;
7172 bool fScaleHypoSignal ;
@@ -80,6 +81,7 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
8081 unsigned int NDecoWf;
8182
8283 TF1 *fFilterTF1 ;
84+
8385 std::vector<double > fSignalHypothesis ;
8486 std::vector<double > fNoiseHypothesis ;
8587
@@ -88,6 +90,8 @@ class opdet::OpDeconvolutionAlgWiener : opdet::OpDeconvolutionAlg {
8890 short unsigned int fBaseSampleBins ;
8991 double fBaseVarCut ;
9092
93+ sbndDB::PMTCalibrationDatabase const * fPMTCalibrationDatabaseService ;
94+
9195 // Declare member functions
9296 void ApplyExpoAvSmoothing (std::vector<double >& wf);
9397 void ApplyUnAvSmoothing (std::vector<double >& wf);
@@ -125,7 +129,6 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
125129 fPMTChargeToADC = p.get < double >(" PMTChargeToADC" );
126130 fDecoWaveformPrecision = p.get < double >(" DecoWaveformPrecision" );
127131 fBaselineSample = p.get < short unsigned int >(" BaselineSample" );
128- fOpDetDataFile = p.get < std::string >(" OpDetDataFile" );
129132 fSkipChannelList = p.get < std::vector<int >>(" SkipChannelList" );
130133 fFilter = p.get < std::string >(" Filter" );
131134 fElectronics = p.get < std::string >(" Electronics" );
@@ -138,6 +141,8 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
138141 fBaseVarCut = p.get < double >(" BaseVarCut" );
139142 fFilterParams = p.get < std::vector<double > >(" FilterParams" );
140143
144+ fFilterTF1 = new TF1 (" FilterTemplate" , fFilter .c_str ());
145+
141146 fNormUnAvSmooth =1 ./(2 *fUnAvNeighbours +1 );
142147 NDecoWf=0 ;
143148 MaxBinsFFT=std::pow (2 , fMaxFFTSizePow );
@@ -147,38 +152,10 @@ opdet::OpDeconvolutionAlgWiener::OpDeconvolutionAlgWiener(fhicl::ParameterSet co
147152 if (fElectronics ==" Daphne" ) fSamplingFreq =fDaphne_Freq /1000 .;// in GHz
148153 auto const * lar_prop = lar::providerFrom<detinfo::LArPropertiesService>();
149154
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 ){
155+ // Load PMT Calibration Database
156+ fPMTCalibrationDatabaseService = lar::providerFrom<sbndDB::IPMTCalibrationDatabaseService const >();
157+
158+ if (!fUseParamFilter ){
182159 // Create light signal hypothesis for "on-fly" Wiener filter
183160 fSignalHypothesis .resize (MaxBinsFFT, 0 );
184161 if (fFilter ==" Wiener" )
@@ -200,38 +177,26 @@ std::vector<raw::OpDetWaveform> opdet::OpDeconvolutionAlgWiener::RunDeconvolutio
200177 {
201178 int channelNumber = wf.ChannelNumber ();
202179 auto it = std::find (fSkipChannelList .begin (), fSkipChannelList .end (), channelNumber);
203- bool AnalyseChannel = false ;
204180 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++)
181+ fSinglePEWave = fPMTCalibrationDatabaseService ->getSER (channelNumber);
182+ double SPEAmplitude = fPMTCalibrationDatabaseService ->getSPEAmplitude (channelNumber);
183+ double SPEPeakValue = *std::max_element (fSinglePEWave .begin (), fSinglePEWave .end (), [](double a, double b) {return std::abs (a) < std::abs (b);});
184+ double SinglePENormalization = std::abs (SPEAmplitude/SPEPeakValue);
185+ std::transform (fSinglePEWave .begin (), fSinglePEWave .end (), fSinglePEWave .begin (), [SinglePENormalization](double val) {return val * SinglePENormalization;});
186+ fSinglePEWave .resize (MaxBinsFFT, 0 );
187+ // If use channel dependent param filter
188+ if (fUseParamFilter )
207189 {
208- if (fSinglePEChannels [i]==channelNumber)
190+ double GaussFilterPower = fPMTCalibrationDatabaseService ->getGaussFilterPower (channelNumber);
191+ double GaussFilterWC = fPMTCalibrationDatabaseService ->getGaussFilterWC (channelNumber);
192+ fFilterParamChannel = {GaussFilterWC, GaussFilterPower};
193+ for (size_t k=0 ; k<fFilterParamChannel .size (); k++)
209194 {
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 ;
195+ fFilterTF1 ->SetParameter (k, fFilterParamChannel [k]);
230196 }
197+ mf::LogInfo (" OpDeconvolutionAlg" )<<" Creating parametrized filter... TF1:" <<fFilter << " for channel " << channelNumber <<std::endl;
231198 }
232- if (AnalyseChannel == false ) mf::LogError (" OpDeconvolutionAlg" ) << " SER for channel " << channelNumber <<" not found in the file \n " ;
233199 }
234- if (!AnalyseChannel) continue ;
235200 // Read waveform
236201 size_t wfsize=wf.Waveform ().size ();
237202 if (wfsize>MaxBinsFFT){
@@ -537,15 +502,13 @@ std::vector<TComplex> opdet::OpDeconvolutionAlgWiener::DeconvolutionKernel(size_
537502 }
538503 }
539504
540-
541505 if (fDebug ){
542506 std::string name=" h_wienerfilter_" +std::to_string (NDecoWf);
543507 TH1F * hs_wiener = tfs->make < TH1F >
544508 (name.c_str ()," Wiener Filter;Frequency Bin;Magnitude" ,size/2 , 0 , size/2 );
545509 for (size_t k=0 ; k<size/2 ; k++)
546510 hs_wiener->SetBinContent (k, TComplex::Abs ( kernel[k]*serfft[k] ) );
547511 }
548- if (fUseParamFilter && fUseParamFilterInidividualChannel ) delete fFilterTF1 ;
549512 return kernel;
550513}
551514
0 commit comments