00001 #ifndef PULSE_RECO_CC
00002 #define PULSE_RECO_CC
00003
00004 #include "pulse_reco.hh"
00005
00006
00007 pulse_reco::pulse_reco() : ana_base(), _reco_algo_v(), _ped_algo(){
00008
00009
00010 _reco_algo_v.clear();
00011
00012 _ped_nsample_cosmic = 1;
00013
00014 _ped_nsample_beam = 8;
00015
00016 _ped_method = kHEAD;
00017
00018 _name="pulse_reco";
00019
00020 };
00021
00022
00023 bool pulse_reco::initialize(){
00024
00025
00026 if(!(_reco_algo_v.size())) {
00027
00028 Message::send(MSG::ERROR,__PRETTY_FUNCTION__,"Pulse reconstruction algorithm not set!");
00029
00030 return false;
00031 }
00032
00033 return true;
00034
00035 }
00036
00037
00038 bool pulse_reco::analyze(storage_manager* storage){
00039
00040
00041 pmt_wf_collection *waveforms = (pmt_wf_collection*)(storage->get_data(DATA_STRUCT::PMT_WF_COLLECTION));
00042
00043 bool status = true;
00044
00045 for(pmt_wf_collection::iterator iter(waveforms->begin());
00046 iter!=waveforms->end();
00047 ++iter){
00048
00049
00050
00051
00052 if((*iter).size()<1){
00053
00054 Message::send(MSG::WARNING,__PRETTY_FUNCTION__,
00055 Form("Found 0-length waveform vector! Skipping Event = %d, Ch. = %d ...",
00056 waveforms->event_id(), (*iter).channel_number()));
00057 continue;
00058 }
00059
00060
00061
00062
00063 double ped_mean = 0;
00064 double sigma = 0;
00065
00066 size_t ped_nsample = ( is_beam(&(*iter)) ? _ped_nsample_beam : _ped_nsample_cosmic);
00067
00068 switch(_ped_method){
00069
00070 case kHEAD:
00071
00072 _ped_algo.compute_pedestal(&(*iter), 0, ped_nsample);
00073
00074 ped_mean = _ped_algo.mean();
00075
00076 sigma = _ped_algo.sigma();
00077
00078 break;
00079
00080 case kTAIL:
00081
00082 _ped_algo.compute_pedestal(&(*iter), ((*iter).size()-ped_nsample), ped_nsample);
00083
00084 ped_mean = _ped_algo.mean();
00085
00086 sigma = _ped_algo.sigma();
00087
00088 break;
00089
00090 case kBOTH:
00091
00092 _ped_algo.compute_pedestal(&(*iter), 0, ped_nsample);
00093
00094 ped_mean = _ped_algo.mean();
00095
00096 sigma = _ped_algo.sigma();
00097
00098 _ped_algo.compute_pedestal(&(*iter), ((*iter).size()-ped_nsample), ped_nsample);
00099
00100 if( sigma > _ped_algo.sigma() ) {
00101
00102 ped_mean = _ped_algo.mean();
00103
00104 sigma = _ped_algo.sigma();
00105
00106 }
00107
00108 break;
00109 }
00110
00111
00112
00113
00114 for(auto reco_algo : _reco_algo_v){
00115
00116 reco_algo->set_ped_mean(ped_mean);
00117
00118 reco_algo->set_ped_rms (sigma);
00119
00120 status = status && reco_algo->reco(&(*iter));
00121
00122
00123
00124
00125 pulse_collection *pulses = (pulse_collection*)(storage->get_data(reco_algo->storage_type()));
00126
00127 for(size_t i=0; i < reco_algo->get_npulse(); ++i) {
00128
00129
00130 pulse_info pulse;
00131
00132 pulse.set_timeslice ( (*iter).timeslice() );
00133 pulse.set_channel_number ( (*iter).channel_number() );
00134 pulse.set_channel_frame_id ( (*iter).channel_frame_id() );
00135 pulse.set_disc_id ( (*iter).disc_id() );
00136
00137 pulse.set_ped_mean ( reco_algo->ped_mean() );
00138 pulse.set_ped_rms ( reco_algo->ped_rms() );
00139 pulse.set_charge ( reco_algo->get_pulse(i)->area );
00140 pulse.set_pulse_peak ( reco_algo->get_pulse(i)->peak );
00141 pulse.set_start_time ( reco_algo->get_pulse(i)->t_start );
00142 pulse.set_max_time ( reco_algo->get_pulse(i)->t_max );
00143 pulse.set_end_time ( reco_algo->get_pulse(i)->t_end );
00144
00145 pulses->push_back(pulse);
00146
00147
00148 pulses->set_sum_charge ( pulses->sum_charge() + reco_algo->get_pulse(i)->area);
00149 pulses->set_sum_peak ( pulses->sum_peak() + reco_algo->get_pulse(i)->peak);
00150 pulses->set_npulse ( pulses->npulse() + 1 );
00151
00152 }
00153 }
00154 }
00155
00156 return status;
00157
00158 }
00159
00160
00161 bool pulse_reco::finalize() {
00162
00163
00164 _fout->cd();
00165
00166 return true;
00167
00168 }
00169
00170 #endif