00001 #ifndef BEAMGATE_DEBUGGER_CC
00002 #define BEAMGATE_DEBUGGER_CC
00003
00004 #include "beamgate_debugger.hh"
00005
00006 beamgate_debugger::beamgate_debugger()
00007 : ana_base(), _pre_sample(), _post_sample()
00008 {
00009
00010 _name="beamgate_debugger";
00011 _hPrePedMean=0;
00012 _hPrePedRMS=0;
00013
00014 _hPostPedMean=0;
00015 _hPostPedRMS=0;
00016
00017 _hMaxADC=0;
00018 _hMaxTime=0;
00019
00020 _hSampleSize=0;
00021
00022 _pre_nsample=6;
00023 _post_nsample=6;
00024
00025 }
00026
00027 bool beamgate_debugger::initialize(){
00028 if(_verbosity[MSG::DEBUG])
00029 Message::send(MSG::DEBUG,__FUNCTION__,"called...");
00030
00031 reset();
00032 prepare_histo();
00033 _pre_sample.reserve(_pre_nsample);
00034 _post_sample.reserve(_post_nsample);
00035
00036 _ch_cnt=PMT::NUM_PMT_CHANNEL;
00037 _beam_window_width=PMT::BEAMGATE_NSAMPLE;
00038 _adc_max=PMT::MAX_ADC;
00039
00040 if(_verbosity[MSG::DEBUG])
00041 Message::send(MSG::DEBUG,__FUNCTION__,"ends...");
00042
00043 return true;
00044 }
00045
00046 void beamgate_debugger::reset(){
00047
00048 if(_verbosity[MSG::DEBUG])
00049 Message::send(MSG::DEBUG,__FUNCTION__,"called...");
00050
00051 if(_hSampleSize) delete _hSampleSize;
00052 if(_hPrePedMean) delete _hPrePedMean;
00053 if(_hPrePedRMS) delete _hPrePedRMS;
00054 if(_hPostPedMean) delete _hPostPedMean;
00055 if(_hPostPedRMS) delete _hPostPedRMS;
00056 if(_hMaxADC) delete _hMaxADC;
00057 if(_hMaxTime) delete _hMaxTime;
00058
00059 _hSampleSize=0;
00060 _hPrePedMean=0;
00061 _hPostPedMean=0;
00062 _hPrePedRMS=0;
00063 _hPostPedRMS=0;
00064 _hMaxADC=0;
00065 _hMaxTime=0;
00066 _pre_sample.clear();
00067 _post_sample.clear();
00068
00069 if(_verbosity[MSG::DEBUG])
00070 Message::send(MSG::DEBUG,__FUNCTION__,"ends...");
00071 }
00072
00073 void beamgate_debugger::prepare_histo(){
00074
00075 if(_verbosity[MSG::DEBUG])
00076 Message::send(MSG::DEBUG,__FUNCTION__,"called...");
00077
00078 if(!_hSampleSize)
00079 _hSampleSize = new TH2D("hSampleSize",
00080 "Number of ADC words; Channel Number; Number of words",
00081 _ch_cnt, -0.5, _ch_cnt-0.5,
00082 int(_beam_window_width*1.5), -0.5, (double)(int(_beam_window_width*1.5)-0.5));
00083 else _hSampleSize->Reset();
00084
00085 if(!_hPrePedMean)
00086 _hPrePedMean = new TH2D("hPrePedMean",
00087 Form("Pedestal mean from first %d samples; Channel Number; Ped. Mean",
00088 _pre_nsample),
00089 _ch_cnt, -0.5, _ch_cnt-0.5,
00090 80,2030,2070);
00091 else _hPrePedMean->Reset();
00092
00093 if(!_hPostPedMean)
00094 _hPostPedMean = new TH2D("hPostPedMean",
00095 Form("Pedestal mean from last %d samples; Channel Number; Ped. Mean",
00096 _post_nsample),
00097 _ch_cnt, -0.5, _ch_cnt-0.5,
00098 80,2030,2070);
00099 else _hPostPedMean->Reset();
00100
00101 if(!_hPrePedRMS)
00102 _hPrePedRMS = new TH2D("hPrePedRMS",
00103 Form("Pedestal RMS from first %d samples; Channel Number; Ped. RMS",
00104 _pre_nsample),
00105 _ch_cnt, -0.5, _ch_cnt-0.5,
00106 40,0,20);
00107 else _hPrePedRMS->Reset();
00108
00109 if(!_hPostPedRMS)
00110 _hPostPedRMS = new TH2D("hPostPedRMS",
00111 Form("Pedestal RMS from first %d samples; Channel Number; Ped. RMS",
00112 _post_nsample),
00113 _ch_cnt, -0.5, _ch_cnt-0.5,
00114 40,0,20);
00115 else _hPostPedRMS->Reset();
00116
00117 if(!_hMaxADC)
00118 _hMaxADC = new TH2D("hMaxADC",
00119 "Maximum ADC Counts; Channel Number; Max ADC",
00120 _ch_cnt, -0.5, _ch_cnt-0.5,
00121 _adc_max,-0.5,_adc_max-0.5);
00122 else _hMaxADC->Reset();
00123
00124 if(!_hMaxTime)
00125 _hMaxTime = new TH2D("hMaxTime",
00126 "Maximum Time Counts; Channel Number; Max Time",
00127 _ch_cnt, -0.5, _ch_cnt-0.5,
00128 100,0,_beam_window_width*1.5);
00129 else _hMaxTime->Reset();
00130
00131 if(_verbosity[MSG::DEBUG])
00132 Message::send(MSG::DEBUG,__FUNCTION__,"ends...");
00133 }
00134
00135 bool beamgate_debugger::analyze(storage_manager* data){
00136
00137 bool beam_wf=false;
00138
00139 double ped_mean=0;
00140 double ped_rms=0;
00141
00142 PMT::ch_adc_t max_adc=0;
00143 UShort_t max_time=0;
00144 UShort_t index=0;
00145
00146 pmt_wf_collection *ewf = (pmt_wf_collection*)(data->get_data(DATA_STRUCT::PMT_WF_COLLECTION));
00147
00148 for(std::vector<pmt_waveform>::const_iterator wf_iter(ewf->begin());
00149 wf_iter!=ewf->end();
00150 ++wf_iter){
00151
00152 beam_wf=false;
00153 switch((*wf_iter).disc_id()) {
00154 case PMT::BEAM_DISC:
00155 case PMT::BEAM_WIN:
00156 beam_wf=true;
00157 break;
00158 case PMT::BASE_DISC:
00159 case PMT::COSMIC_DISC:
00160 case PMT::MICHEL_DISC:
00161 beam_wf=( (*wf_iter).size()>_beam_window_width );
00162 break;
00163 case PMT::DISC_MAX:
00164 break;
00165 }
00166 if(!beam_wf) continue;
00167
00168 _hSampleSize->Fill((*wf_iter).channel_number()+1,((*wf_iter).size()));
00169
00170 ped_mean=0;
00171 ped_rms=0;
00172 max_adc=0;
00173 max_time=0;
00174 index=0;
00175
00176 _pre_sample.clear();
00177 _post_sample.clear();
00178
00179 for(pmt_waveform::const_iterator adc_iter((*wf_iter).begin());
00180 adc_iter!=(*wf_iter).end();
00181 ++adc_iter) {
00182
00183 if( index < _pre_nsample )
00184
00185 _pre_sample.push_back((double)((*adc_iter)));
00186
00187 if( index >= ((*wf_iter).size() - _post_nsample) )
00188
00189 _post_sample.push_back((double)((*adc_iter)));
00190
00191 if( (*adc_iter) > max_adc ) {
00192 max_adc = (*adc_iter);
00193 max_time = index;
00194 }
00195
00196 index++;
00197 }
00198
00199 get_ped_info(ped_mean,ped_rms,&_pre_sample);
00200 _hPrePedMean->Fill((*wf_iter).channel_number(), ped_mean);
00201 _hPrePedRMS->Fill((*wf_iter).channel_number(), ped_rms);
00202
00203 get_ped_info(ped_mean,ped_rms,&_post_sample);
00204 _hPostPedMean->Fill((*wf_iter).channel_number(), ped_mean);
00205 _hPostPedRMS->Fill((*wf_iter).channel_number(), ped_rms);
00206
00207 _hMaxADC->Fill((*wf_iter).channel_number(), max_adc);
00208 _hMaxTime->Fill((*wf_iter).channel_number(), max_time);
00209 }
00210
00211
00212 return true;
00213
00214 }
00215
00216 bool beamgate_debugger::finalize(){
00217
00218 if(_verbosity[MSG::DEBUG])
00219 Message::send(MSG::DEBUG,__FUNCTION__,"called...");
00220
00221 _fout->cd();
00222 _hPrePedMean->Write();
00223 _hPrePedRMS->Write();
00224 _hPostPedMean->Write();
00225 _hPostPedRMS->Write();
00226 _hMaxADC->Write();
00227 _hMaxTime->Write();
00228
00229 if(_verbosity[MSG::DEBUG])
00230 Message::send(MSG::DEBUG,__FUNCTION__,"ends...");
00231
00232 return true;
00233
00234 }
00235
00236 #endif