00001 #include <is/isinfo.h>
00002 #include <is/isinfotmpl.h>
00003 #include <ipc/object.h>
00004 #include <ipc/server.h>
00005 #include <iostream>
00006 #include <boost/shared_ptr.hpp>
00007
00008 #include <TH1.h>
00009
00010 #include "sctConf/configipc.h"
00011 #include "TestApi.h"
00012 #include "Sct/SctNames.h"
00013 #include "Sct/SctParameters.h"
00014
00015 #include "DummyHardware.h"
00016 #include "ScanMap.h"
00017 #include "Exceptions.h"
00018 #include "Configuration.h"
00019 #include "SctDaqRootFile.h"
00020
00021 using namespace ::SctApi;
00022 using namespace Sct;
00023 using namespace std;
00024
00025 namespace SctTest {
00026
00027 TestApi::TestApi() : SctApi(configServer = shared_ptr<SctConfiguration::Configuration>(new SctConfiguration::ConfigIPC())) {
00028 }
00029
00030 TestApi::TestApi(boost::shared_ptr<SctConfiguration::Configuration> newConf) : SctApi(newConf) {
00031 }
00032
00033 int TestApi::initialiseRod(unsigned int partition, unsigned int crate, unsigned int rod) {
00034 return 0;
00035 }
00036
00037 int TestApi::initialiseTim(unsigned int partition, unsigned int crate) {
00038 return 0;
00039 }
00040
00041 int TestApi::initialiseBOC(unsigned int partition, unsigned int crate, unsigned int rod) {
00042 return 0;
00043 }
00044
00045 void TestApi::getABCDModule(UINT32 mid, BankType bank) {
00046 if(mid==0xffffffff) {
00047 cout << "TestApi::getABCDModule called for all modules. Bank: " << bank << endl;
00048 for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin(); iter != moduleMap.end(); iter ++) {
00049 getABCDModule(iter->first, bank);
00050 }
00051 return;
00052 }
00053
00054 cout << "SctTestApi::getABCDModule called, mid: " << mid << " bank: " << bank <<endl;
00055 ABCDModule *previous = lookupConfig(mid);
00056 *previous = DummyHardware::instance().getConfig(mid, bank);
00057 }
00058
00059 void TestApi::setABCDModule(UINT32 mid, BankType bank) {
00060 if(mid==0xffffffff) {
00061 cout << "TestApi::setABCDModule called for all modules. Bank: " << bank << endl;
00062 for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin(); iter != moduleMap.end(); iter ++) {
00063 setABCDModule(iter->first, bank);
00064 }
00065 return;
00066 }
00067
00068 cout << "SctTestApi::setABCDModule called, mid: " << mid << " bank: " << bank <<endl;
00069 DummyHardware::instance().setConfig(mid, bank, *lookupConfig(mid));
00070 }
00071
00072 void TestApi::sendABCDModule(UINT32 mid, BankType bank, UINT32 type) {
00073 if(mid==0xffffffff) {
00074 cout << "TestApi::sendABCDModule called for all modules. Bank: " << bank << " Type:" << type << endl;
00075 for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin(); iter != moduleMap.end(); iter ++) {
00076 sendABCDModule(iter->first, bank, type);
00077 }
00078 return;
00079 }
00080
00081 cout << "SctTestApi::sendABCDModule called, mid: " << mid << " bank: " << bank << " type: " << type << endl;
00082 DummyHardware::instance().sendConfig(mid, bank);
00083 }
00084
00085 void TestApi::sendAllABCDModules(BankType bank, UINT32 type) {
00086 cout << "SctTestApi::sendAllABCDModules called, bank: " << bank << endl;
00087 for(map<UINT32, ABCDModule>::const_iterator iter = moduleMap.begin(); iter != moduleMap.end(); iter ++) {
00088 sendABCDModule(iter->first, bank, type);
00089 }
00090 }
00091
00092
00093
00094 bool TestApi::preScanHardwareCheck(Scan& scan, ScanEx& extra) {
00095
00096 return true;
00097 }
00098
00102 unsigned int countBits(unsigned int bits) {
00103 unsigned int count = 0;
00104 while (bits) {
00105 if (bits & 1) ++count;
00106 bits >>= 1;
00107 }
00108 return count;
00109 }
00110
00111 unsigned int countBits(char bits) {
00112 unsigned int count = 0;
00113 while (bits) {
00114 if (bits & 1) ++count;
00115 bits >>= 1;
00116 }
00117 return count;
00118 }
00119
00120 double TestApi::calculateScanTime(const ScanEx& ex) {
00121 unsigned int maxModules = 0;
00122 bool multiDsp = false;
00123
00124
00125 for (ScanEx::RodInfoMap::const_iterator i=ex.rodInfo.begin(); i!=ex.rodInfo.end(); ++i) {
00126 RodScanEx r = i->second;
00127 if (countBits(r.bitFieldDSP) > 1) multiDsp = true;
00128
00129 for (unsigned int dsp=0; dsp<4; ++dsp) {
00130
00131 unsigned int nModules = countBits(r.groupChannels[dsp].mask0) + countBits(r.groupChannels[dsp].mask1)
00132 + countBits(r.groupChannels[dsp + 4].mask0) + countBits(r.groupChannels[dsp + 4].mask1);
00133 if (nModules > maxModules) maxModules = nModules;
00134 }
00135 }
00136 multiDsp = true;
00137 if (multiDsp) return Configuration::instance().getScanTime() * maxModules / (4*Configuration::instance().getMultiDspEfficiency());
00138 else return Configuration::instance().getScanTime() * maxModules;
00139 }
00140
00141 int TestApi::pollHistogramming(ScanEx &ex, int bins, int events, int timeout) {
00142 cout << "SctTestApi::pollHistogramming called with " << bins << " bins." << endl;
00143
00144 int currBin = 0;
00145
00146 ISInfoDictionary& isDict = SctNames::getISDictionary();
00147
00148 ISInfoInt binNumber(0);
00149 isDict.insert("SCTAPIServer.currentBin", binNumber);
00150
00151 ISInfoInt maxNumber(bins-1);
00152 isDict.insert("SCTAPIServer.maxBin", maxNumber);
00153
00154
00155 double scanTime = calculateScanTime(ex);
00156 for (int slept=0; slept<scanTime+1; ) {
00157 slept += 1 - sleep(1);
00158
00159 currBin = (int)((double)slept/scanTime * bins);
00160
00161 ISInfoInt binNumber(currBin);
00162 isDict.update("SCTAPIServer.currentBin", binNumber);
00163 }
00164
00165 isDict.remove("SCTAPIServer.currentBin");
00166 isDict.remove("SCTAPIServer.maxBin");
00167
00168 return 0;
00169 }
00170
00171 char* TestApi::readHistogramRawData(const Scan& scan, const ScanEx& extra, UINT32 mid, int frame) {
00172 cout << "SctTestApi::readHistogramRawData called for module: " << mid << endl;
00173 try {
00174 string serialNum = convertToString(mid);
00175 string dataFile = ScanMap::instance().getDataFile(serialNum, DummyHardware::instance().getCurrentConfig(mid), scan.getScanVariable1());
00176
00177
00178 SctDaqRootFile file(dataFile);
00179 string acSerialNum = ScanMap::convertSerial(serialNum);
00180
00181 int cycleNum = file.getCycleNum(acSerialNum);
00182
00183
00184 auto_ptr<TH1F> hist0Data = file.getHistData(cycleNum, 0);
00185 auto_ptr<TH1F> hist1Data = file.getHistData(cycleNum, 1);
00186 auto_ptr<TH1F> triggerData = file.getTriggerData();
00187
00188 file.dealWithOccupancy(*hist0Data, *hist1Data, *triggerData, scan.getScanVariable1());
00189
00190 modifyScanInformation(scan, *triggerData);
00191
00192 if (scan.getOption(Scan::BITS32))
00193 return file.fillData32(*hist0Data, *hist1Data);
00194 else
00195 return file.fillData16(*hist0Data, *hist1Data);
00196
00197 } catch (SctTest::SctTestException& ioe) {
00198 cout << "Catch" << endl;
00199 ioe.sendToMrs(MRS_DIAGNOSTIC);
00200
00201 int nBins = scan.getScanPoints1().size();
00202 int binSize = 0x800*4;
00203 char *data = new char[nBins * binSize];
00204 for (int i=0; i<nBins * binSize; ++i) {
00205 data[i] = 0;
00206 }
00207 return data;
00208 }
00209 }
00210
00211 void TestApi::modifyScanInformation(const Scan& c_scan, const TH1F& triggerData) {
00212 Scan& scan = const_cast<Scan&>(c_scan);
00213 Scan::ScanPoints points;
00214 for (int i=1; i<=triggerData.GetNbinsX(); ++i) {
00215 points.push_back(triggerData.GetBinCenter(i));
00216 }
00217 scan.setScanPoints1(points);
00218 scan.setNTrigs(triggerData.GetBinContent(1));
00219 }
00220
00221
00222 }