pulse_reco.cc

Go to the documentation of this file.
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     // Step 0: skipe 0-length waveform with a warning message
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     // Step 1: apply pedestal estimation
00062     //  
00063     double ped_mean = 0;
00064     double sigma  = 0;
00065     // Figure out whether this is a beam readout or not
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     // Step 2: apply reco algos
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       // Step 3: loop over reconstructed pulse ane store.
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     // Fill output data product for waveform-wise info
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     // Accumulate event-wise charge/amplitude sum
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       } // end of reco-ed pulse loop
00153     } // end of reco algorithm loop
00154   } // end of PMT waveform loop
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

Generated on Mon Apr 7 15:35:12 2014 for MyProject by  doxygen 1.4.7