EvalRois.cc
00001 #include "EvalRois.hh"
00002 #include "BaselineFinder.hh"
00003 #include "ConvertData.hh"
00004 #include "SumChannels.hh"
00005 #include "RootWriter.hh"
00006 #include "intarray.hh"
00007 #include "ChannelData.hh"
00008 #include "Integrator.hh"
00009 #include "Roi.hh"
00010 #include "EventHandler.hh"
00011 #include <algorithm>
00012 #include <numeric>
00013
00014
00015 EvalRois::EvalRois() :
00016 ChannelModule(GetDefaultName(),
00017 "Measure the max, min, and integral of samples over a set of regions of interest defined by start and end times in microseconds")
00018 {
00019 AddDependency<ConvertData>();
00020 AddDependency<BaselineFinder>();
00021 RegisterParameter("regions", _regions, "Start/end time pairs to evaluate");
00022 }
00023
00024 EvalRois::~EvalRois() {}
00025
00026 int EvalRois::Initialize()
00027 {
00028 if(_regions.size() > 0){
00029 Message(DEBUG)<<"Saving info for "<<_regions.size()<<" regions.\n";
00030 }
00031 else{
00032 Message(ERROR)<<"No ROIs defined for EvalRois!\n";
00033 return 1;
00034 }
00035 return 0;
00036 }
00037
00038 int EvalRois::Finalize() { return 0; }
00039
00040 int EvalRois::Process(ChannelData* chdata)
00041 {
00042
00043 Baseline& base = chdata->baseline;
00044 if(!base.found_baseline) return 0;
00045 for(size_t window = 0; window < _regions.size(); window++){
00046 chdata->regions.push_back(Roi());
00047 Roi& roi = chdata->regions.back();
00048 roi.start_time = _regions[window].first;
00049 roi.end_time = _regions[window].second;
00050 roi.start_index = (int)std::max(roi.start_time * chdata->sample_rate +
00051 chdata->trigger_index , 0.);
00052 roi.end_index = (int)std::max(roi.end_time * chdata->sample_rate +
00053 chdata->trigger_index, 0.);
00054 roi.start_index = std::min(roi.start_index, chdata->nsamps);
00055 roi.end_index = std::min(roi.end_index, chdata->nsamps);
00056
00057
00058 double* subtractedwave = chdata->GetBaselineSubtractedWaveform();
00059 double* min_iter = std::min_element(subtractedwave+roi.start_index, subtractedwave+roi.end_index);
00060 double* max_iter = std::max_element(subtractedwave+roi.start_index, subtractedwave+roi.end_index);
00061 roi.max = *(max_iter);
00062 roi.min = *(min_iter);
00063 roi.min_index = min_iter-subtractedwave;
00064
00065 if(! chdata->integral.empty()){
00066 roi.integral = chdata->integral[roi.end_index] -
00067 chdata->integral[roi.start_index];
00068 }
00069 else{
00070
00071 roi.integral = std::accumulate(subtractedwave+roi.start_index,
00072 subtractedwave+roi.end_index,
00073 0.);
00074 }
00075 roi.npe = -roi.integral / chdata->spe_mean;
00076 }
00077
00078 return 0;
00079 }
00080