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