00001
00015 #ifndef PULSE_VIEWER_HH
00016 #define PULSE_VIEWER_HH
00017
00018 #include <TH1D.h>
00019 #include <TCanvas.h>
00020 #include <TLine.h>
00021 #include <TPad.h>
00022 #include <TPaveText.h>
00023 #include <TROOT.h>
00024 #include <TStyle.h>
00025 #include <TGaxis.h>
00026 #include <TColor.h>
00027
00028 #include <set>
00029 #include <algorithm>
00030
00031 #include "ana_base.hh"
00032
00042 class pulse_viewer : public ana_base{
00043
00044 public:
00045
00047 pulse_viewer();
00048
00050 virtual ~pulse_viewer(){};
00051
00053 virtual bool initialize();
00054
00056 virtual bool analyze(storage_manager* storage);
00057
00059 virtual bool finalize();
00060
00068 TH1D* next_pulse(PMT::ch_number_t ch);
00069
00074 TH1D* previous_pulse(PMT::ch_number_t ch);
00075
00076
00078 const TCanvas* get_canvas() const {return _cWF;};
00079
00081 const std::set<PMT::ch_number_t> get_hit_channels() const {return _channels;};
00082
00088 PMT::ch_number_t next_channel();
00089
00091 void display_cut_ranges();
00092
00093
00094
00095
00096
00098 short get_npulse(PMT::ch_number_t ch);
00099
00101 void set_range_pulse_start_time(double v1, double v2) {_cut_tstart.first=v1; _cut_tstart.second=v2; };
00102
00104 void set_range_pulse_start_time_reco(double v1, double v2) {_cut_tstart_reco.first=v1; _cut_tstart_reco.second=v2; };
00105
00107 void set_range_pulse_end_time(double v1, double v2) {_cut_tend.first=v1; _cut_tend.second=v2; };
00108
00110 void set_range_pulse_amp(double v1, double v2) {_cut_amp.first=v1; _cut_amp.second=v2; };
00111
00113 void set_range_pulse_charge(double v1,double v2) {_cut_charge.first=v1; _cut_charge.second=v2; };
00114
00116 void set_range_ped_mean(double v1, double v2) {_cut_pedbase.first=v1; _cut_pedbase.second=v2; };
00117
00119 void set_range_ped_rms(double v1, double v2) {_cut_pedrms.first=v1; _cut_pedrms.second=v2; };
00120
00122 void set_range_event_id(PMT::word_t v1, PMT::word_t v2) {_cut_event_id.first=v1; _cut_event_id.second=v2; };
00123
00125 void set_range_channel(PMT::ch_number_t v1, PMT::ch_number_t v2) {_cut_channels.first=v1; _cut_channels.second=v2;};
00126
00128 void set_range_sum_charge(double v1, double v2) {_cut_sum_charge.first=v1; _cut_sum_charge.second=v2;};
00129
00131 void set_range_sum_peak(double v1, double v2) {_cut_sum_peak.first=v1; _cut_sum_peak.second=v2;};
00132
00134 void set_range_npulse(double v1, double v2) {_cut_npulse.first=v1; _cut_npulse.second=v2;};
00135
00136
00137
00138
00139
00140
00142 const std::pair<double,double> range_pulse_start_time() const {return _cut_tstart;};
00143
00145 const std::pair<double,double> range_pulse_start_time_reco() const {return _cut_tstart_reco;};
00146
00148 const std::pair<double,double> range_pulse_end_time() const {return _cut_tend;};
00149
00151 const std::pair<double,double> range_pulse_amp() const {return _cut_amp;};
00152
00154 const std::pair<double,double> range_pulse_charge() const {return _cut_charge;};
00155
00157 const std::pair<double,double> range_ped_mean() const {return _cut_pedbase;};
00158
00160 const std::pair<double,double> range_ped_rms() const {return _cut_pedrms;};
00161
00163 const std::pair<PMT::word_t,PMT::word_t> range_event_id() const {return _cut_event_id;};
00164
00166 const std::pair<PMT::word_t,PMT::word_t> range_channel() const {return _cut_channels;};
00167
00169 const std::pair<double,double> range_sum_charge() const {return _cut_sum_charge;};
00170
00172 const std::pair<double,double> range_sum_peak() const {return _cut_sum_peak;};
00173
00175 const std::pair<UInt_t,UInt_t> range_npulse() const {return _cut_npulse;};
00176
00177 protected:
00178
00180 void set_style();
00181
00183 void reset_cuts();
00184
00186 void clear_map();
00187
00189 void clear_viewer();
00190
00195 TH1D* get_waveform(PMT::ch_number_t ch, size_t index);
00196
00198 void add_channel_entry(PMT::ch_number_t ch);
00199
00200 PMT::word_t _event_id;
00201 double _sum_charge;
00202 double _sum_peak;
00203 UInt_t _npulse;
00204 std::set<PMT::ch_number_t> _channels;
00205 std::set<PMT::ch_number_t>::iterator _ch_iter;
00206
00209 std::map<PMT::ch_number_t,std::pair<short,short> > _pulse_count;
00210 std::map<PMT::ch_number_t,std::vector<PMT::word_t> > _pulse_frame_id;
00211 std::map<PMT::ch_number_t,std::vector<PMT::word_t> > _pulse_sample_number;
00212 std::map<PMT::ch_number_t,std::vector<double> > _pulse_tstart;
00213 std::map<PMT::ch_number_t,std::vector<double> > _pulse_tstart_reco;
00214 std::map<PMT::ch_number_t,std::vector<double> > _pulse_tend;
00215 std::map<PMT::ch_number_t,std::vector<double> > _pulse_amp;
00216 std::map<PMT::ch_number_t,std::vector<double> > _pulse_charge;
00217 std::map<PMT::ch_number_t,std::vector<double> > _pulse_pedbase;
00218 std::map<PMT::ch_number_t,std::vector<double> > _pulse_pedrms;
00219 std::map<PMT::ch_number_t,std::map<PMT::word_t,std::map<PMT::word_t,std::vector<PMT::ch_adc_t> > > > _waveforms;
00220
00222 TCanvas* _cWF;
00223
00224
00225 TPad *_pTitle;
00226 TPad *_pData;
00227
00228
00229 TPad *_pNote;
00230 TPad *_pWF;
00231
00232
00233 TText *_fTitle;
00234 TPaveText *_fNote;
00235
00237 TH1D* _hWF;
00238
00240 TLine *_lStart, *_lEnd, *_lBase, *_lRMSTop, *_lRMSBottom, *_lTop;
00241
00243 std::pair<double,double> _cut_tstart, _cut_tstart_reco, _cut_tend, _cut_amp, _cut_charge, _cut_pedbase, _cut_pedrms;
00244
00246 std::pair<double,double> _cut_sum_charge, _cut_sum_peak;
00247
00249 std::pair<UInt_t,UInt_t> _cut_npulse;
00250
00252 std::pair<PMT::word_t,PMT::word_t> _cut_event_id;
00253
00255 std::pair<PMT::ch_number_t,PMT::ch_number_t> _cut_channels;
00256 };
00257
00258 #endif
00259