Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

TestApi.cpp

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 //Scan methods
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     //Loop over all RODs
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         //Loop over DSPs
00129         for (unsigned int dsp=0; dsp<4; ++dsp) {
00130             // The second 4 "dsp" groups are for the second scan point set
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     //Calculate scan time:
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         //cout << "Datafile: " << dataFile << endl;
00177 
00178         SctDaqRootFile file(dataFile);
00179         string acSerialNum = ScanMap::convertSerial(serialNum);
00180         //cout << "Actual Serial  " << acSerialNum << endl;
00181         int cycleNum = file.getCycleNum(acSerialNum);
00182         //cout << "Cycle: " << cycleNum << endl;
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;    // In bytes, so works for 16bit histograms er?
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 }

Generated on Thu Jul 15 09:51:00 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5