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
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
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
00048 all_points.push_back( full_scan_point_data(iscan,
00049 ipoint,
00050 pts.getPoint(ipoint)+results[iscan].second )
00051 );
00052 }
00053 }
00054
00055
00056 std::sort(all_points.begin(), all_points.end());
00057
00058
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
00075
00076
00077 }
00078 }