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