FullScanTool.cpp

00001 #include "FullScanTool.h"
00002 #include <algorithm>
00003 
00004 namespace SctAnalysis{
00005 
00006 FullScanTool::FullScanTool(RawScanResult& raw) : RawScanResult(raw.getHeader(), 
00007                                    raw.getConfiguration(),
00008                                    raw.getPoints(),
00009                                    raw.getScanData(0),
00010                                    raw.getScanData(1)
00011                                    ) {}
00012   
00013   
00014 FullScanTool::~FullScanTool() throw() {
00015 }
00016 
00017 void FullScanTool::add(boost::shared_ptr<const SctData::RawScanResult> raw, double offset){
00018   if (!raw) throw Sct::IllegalStateError("Null-pointer to raw scan result", __FILE__,__LINE__);
00019   results.push_back(std::make_pair(raw,offset));
00020 }
00021 
00022 // first sort the scan-points by value
00023 struct full_scan_point_data{
00024   full_scan_point_data(int scan, int point_in_scan, double value) : scan(scan), 
00025                                     point_in_scan(point_in_scan), 
00026                                     value(value)
00027   {
00028   }
00029   int scan;
00030   int point_in_scan;
00031   double value;
00032   bool operator< (const full_scan_point_data& other) const {
00033     return value<other.value;
00034   }
00035 };
00036 
00037 
00038 
00039 void FullScanTool::combine(){
00040   using namespace SctData;
00041 
00042   // add all points from all scans to a big list
00043   std::vector<full_scan_point_data> all_points;
00044   for (unsigned iscan=0; iscan<results.size(); ++iscan){
00045     const ScanPoints& pts = results[iscan].first->getPoints();
00046     for (unsigned ipoint=0; ipoint < pts.getNPoints(); ++ipoint){
00047       // point has value which differs because of offset
00048       all_points.push_back( full_scan_point_data(iscan, 
00049                          ipoint, 
00050                          pts.getPoint(ipoint)+results[iscan].second )
00051                 );
00052     }
00053   }
00054   
00055   // sort that list by value
00056   std::sort(all_points.begin(), all_points.end());
00057   
00058   // make a new set of scanpoints
00059   float points[all_points.size()];
00060   unsigned events[all_points.size()];
00061   unsigned errors[all_points.size()];
00062   
00063   for (unsigned ipoint=0;ipoint<all_points.size(); ++ipoint){
00064     const ScanPoints& old_points = results[all_points[ipoint].scan].first->getPoints();
00065     points[ipoint] = old_points.getPoint(all_points[ipoint].point_in_scan);
00066     events[ipoint] = old_points.getNEvents(all_points[ipoint].point_in_scan);
00067     errors[ipoint] = old_points.getNErrorEvents(all_points[ipoint].point_in_scan);
00068   }
00069 
00070   ScanPoints new_points(all_points.size(), points, events, errors);
00071   
00072   getPoints() = new_points;
00073   
00074   // RawScanResultIOHelper helper;
00075   // helper.set(*this);
00076   
00077 }
00078 }

Generated on Mon Feb 6 14:01:20 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6