00001 #ifndef RESPONSECURVE_H
00002 #define RESPONSECURVE_H
00003
00004 #include "../ipc/TestRequest.h"
00005 #include "../ipc/CalibrationController.h"
00006 #include "../ipc/ScanLibrary.h"
00007 #include "../ipc/Sct_CalibrationController.hh"
00008 #include "../CalibrationControllerImpl.h"
00009
00010 #include "../SctApiException.h"
00011 #include "Sct/LogicErrors.h"
00012
00013 #include <CommonWithDsp/ABCD/ABCDscans.h>
00014 #include <iostream>
00015 #include <vector>
00016
00017 using namespace Sct;
00018 using namespace std;
00019 using namespace SctCalibrationController::Ipc;
00020 using namespace SctCalibrationController;
00021
00022 namespace SctCalibrationController {
00023 namespace Scripts {
00024
00025 class ResponseCurve : public TestRequestImpl {
00026 public:
00027 static ResponseCurve& instance() {
00028 static ResponseCurve rc;
00029 return rc;
00030 }
00031
00032 virtual void startTest(Sct_SctApi_T_SctApi& api, string& name, unsigned short& testVariable, unsigned long& nScans, vector<double>& testPoints) {
00033 this->api = &api;
00034
00035 Sct_SctApiStatus status;
00036 api.modifyABCDVar(&status, ST_COMPRESSION, 1);
00037 if (status.returnCode != 0)
00038 throw SctApiException(status.returnCode, "ResponseCurve::startTest", __FILE__, __LINE__);
00039
00040 api.modifyABCDVar(&status, ST_EDGE_DETECT, 0);
00041 if (status.returnCode != 0)
00042 throw SctApiException(status.returnCode, "ResponseCurve::startTest", __FILE__, __LINE__);
00043
00044 api.modifyABCDVar(&status, ST_SEND_MASK, 0);
00045 if (status.returnCode != 0)
00046 throw SctApiException(status.returnCode, "ResponseCurve::startTest", __FILE__, __LINE__);
00047
00048 name = "NPtGainTest";
00049 testVariable = ST_QCAL;
00050
00051 charges.push_back(0.5);
00052 charges.push_back(0.75);
00053 charges.push_back(1.0);
00054 charges.push_back(1.25);
00055 charges.push_back(1.5);
00056 charges.push_back(2.);
00057 charges.push_back(3);
00058 charges.push_back(4);
00059 charges.push_back(6);
00060 charges.push_back(8);
00061
00062 testPoints = charges;
00063 nScans = testPoints.size();
00064 }
00065
00066 virtual Sct_SctApi_T_Scan* getNextScan(unsigned long index) {
00067 if (api == 0)
00068 throw InvariantViolatedError("Api pointer is 0 in getNextScan!", __FILE__, __LINE__);
00069
00070 ScanLibrary& sl = CalibrationControllerImpl::instance().getScanLibrary();
00071
00072 Sct_SctApiStatus status;
00073 api->modifyABCDVar(&status, ST_QCAL, charges[index]);
00074 if (status.returnCode != 0)
00075 throw SctApiException(status.returnCode, "ResponseCurve::getNextScan", __FILE__, __LINE__);
00076
00077 return &sl.thresholdScanfC(1000, charges[index]);
00078 }
00079
00080 virtual bool canFeedback() {
00081 return true;
00082 }
00083
00084 virtual void endTest() {
00085 api = 0;
00086 charges.clear();
00087 }
00088
00089
00090 private:
00091 ResponseCurve() {}
00092 Sct_SctApi_T_SctApi* api;
00093 vector<double> charges;
00094 };
00095 }
00096 }
00097 #endif //RESPONSECURVE_H