TestApi.cpp

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

Generated on Mon Feb 6 14:01:34 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6