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     //double* wave = chdata->GetWaveform();
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      
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on 20 Jun 2014 for daqman by  doxygen 1.6.1