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

Generated on Fri Sep 16 18:02:02 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5