00001 #include "ConfigUpdater.h"
00002 #include "ConfigUpdaterManager.h"
00003 #include "Sct/SctParameters.h"
00004 #include "Sct/SctNames.h"
00005 #include "SctData/TrimRangeTestResult.h"
00006 #include "SctData/StrobeDelayTestResult.h"
00007 #include "SctData/NPtGainTestResult.h"
00008 #include "SctData/ResponseCurve.h"
00009 #include "CalibrationControllerImpl.h"
00010 #include "CommonWithDsp/ABCD/ABCDscans.h"
00011
00012 using SctData::TestResult;
00013 using namespace Sct;
00014
00015 namespace SctCalibrationController {
00016
00017 unsigned long ConfigUpdater::getMID(const SctData::TestResult& t) const {
00018 Sct_SctApiStatus status;
00020 return CalibrationControllerImpl::instance().getApi()->findModuleSerial(&status, const_cast<char*> ( t.getModuleName().c_str()) );
00021 }
00022
00023 bool StrobeDelayConfigUpdater::inMap = ConfigUpdaterManager::instance().setUpdater("SctData::StrobeDelayTestResult", shared_ptr<ConfigUpdater> (new StrobeDelayConfigUpdater()));
00024
00025 void StrobeDelayConfigUpdater::update(const TestResult& testresult) const {
00026 const SctData::StrobeDelayTestResult& t = dynamic_cast<const SctData::StrobeDelayTestResult&> (testresult);
00027 unsigned long mid = getMID(t);
00028 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT("CalibrationController updating StrobeDelay") << MRS_PARAM<long>("ModuleID", mid) << MRS_DIAGNOSTIC << ENDM;
00029 for (unsigned ichip=0; ichip<Sct::nChipModule; ++ichip) {
00030 Sct_SctApiStatus status;
00031 CalibrationControllerImpl::instance().getApi()->modifyABCDChipVar(&status, mid, ichip, ST_STROBE_DELAY, (double) t.getOptimum(ichip));
00032 }
00033 }
00034
00035 bool TrimRangeConfigUpdater::inMap = ConfigUpdaterManager::instance().setUpdater("SctData::TrimRangeTestResult", shared_ptr<TrimRangeConfigUpdater> (new TrimRangeConfigUpdater() ) );
00036
00037 void TrimRangeConfigUpdater::update(const TestResult& testresult) const {
00038 const SctData::TrimRangeTestResult& t = dynamic_cast<const SctData::TrimRangeTestResult&> (testresult) ;
00039 unsigned long mid = getMID(t);
00040 short trims[nChannelModule];
00041 for (unsigned ichip=0; ichip<Sct::nChipModule; ++ichip) {
00042 Sct_SctApiStatus status;
00043 CalibrationControllerImpl::instance().getApi()->
00044 modifyABCDChipVar(&status, mid, ichip, ST_TRIM_RANGE , (double) t.chipTrim[ichip]->range );
00045 for (unsigned ichannel=0; ichannel < nChannelChip; ++ ichannel){
00046 trims[ichip*nChannelChip+ichannel] = t.chipTrim[ichip]->channelTrim.getAt(ichannel).value.trim ;
00047 }
00048 }
00049 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT("CalibrationController updating trims") << MRS_PARAM<long>("ModuleID", mid) << MRS_INFORMATION << ENDM;
00050 Sct_SctApiStatus status;
00051 Sct_SctApi_T_CharBlock data = _Sct_SctApi_T_CharBlock_sequence::Create(nChannelModule, trims);
00052 CalibrationControllerImpl::instance().getApi()->modifyABCDTrims(&status, mid, data) ;
00053 }
00054
00055 bool NPtGainConfigUpdater::inMap = ConfigUpdaterManager::instance().setUpdater("SctData::NPtGainTestResult", shared_ptr<NPtGainConfigUpdater> (new NPtGainConfigUpdater() ) );
00056
00057 void NPtGainConfigUpdater::update(const TestResult& testresult) const {
00058 const SctData::NPtGainTestResult& t = dynamic_cast<const SctData::NPtGainTestResult&> (testresult) ;
00059 unsigned long mid = getMID(t);
00060 SctNames::Mrs() << "CC_UPDATE" << MRS_TEXT("CalibrationController updating response curve") << MRS_PARAM<const char*>("Module", t.getModuleName().c_str()) << MRS_INFORMATION << ENDM;
00061 for (unsigned ichip=0; ichip<Sct::nChipModule; ++ichip) {
00062 shared_ptr<const SctData::ResponseCurve> rc = t.getChipData(ichip).rc;
00063 shared_ptr<const TF1> func = rc->getFunction();
00064
00065
00066
00067
00068 Sct_SctApiStatus status;
00069 CalibrationControllerImpl::instance().getApi()->
00070 modifyABCDRC(&status, mid, ichip, rc->getIndex(),
00071 (double) func->GetParameter(0),
00072 (double) func->GetParameter(1),
00073 (double) func->GetParameter(2) );
00074 }
00075
00076 }
00077 }