ScanMap.cpp

00001 #include "ScanMap.h"
00002 #include "ModuleDataFile.h"
00003 #include "Exceptions.h"
00004 #include "Sct/IoExceptions.h"
00005 #include <iostream>
00006 #include <fstream>
00007 #include <sstream>
00008 
00009 using namespace std;
00010 
00011 namespace SctTest {
00012     
00013 ScanMap& ScanMap::instance() {
00014     static ScanMap sm;
00015     return sm;
00016 }
00017 
00018 string ScanMap::convertSerial(string serialNum) {
00019     //cout << serialNum << " converted to : " << flush;
00020     string s = serialNum.replace(0, 2, "20");
00021     //cout << s << endl;
00022     return s;
00023 }
00024     
00025 string ScanMap::getDataFile(string serialNum, const ABCDModule& config, unsigned short scanVar) const {
00026     serialNum = convertSerial(serialNum);
00027 
00028     if (scanVar == ST_QCAL) scanVar = ST_VCAL;
00029     if (scanVar == ST_QTHR) scanVar = ST_VTHR;
00030     
00031     if (scanVar == ST_VTHR) return getThresholdDataFile(serialNum, config);
00032     if (scanVar == ST_STROBE_DELAY) return getStrobeDataFile(serialNum, config);
00033     
00034     //OK, it must have been a digital scan - return the first one that matches
00035     
00036     ScanInfo si;
00037     si.serialNum = serialNum;
00038     si.scanVar = scanVar;
00039     
00040     DigitalMap::const_iterator i = digitalMap.find(si);
00041     if (i == digitalMap.end()) {
00042         cout << "Failed to find digital scan for " << serialNum << " Scan var: " << scanVar << endl;
00043         throw NoDataFileException("No data file for: " + serialNum, __FILE__, __LINE__);
00044     }
00045     else return (*i).second;
00046 }
00047     
00048 string ScanMap::getThresholdDataFile(string serialNum, const ABCDModule& config) const {
00049     ThresholdScanDetails tsd(config);
00050     
00051     //Find all 
00052     pair<ThresholdMap::const_iterator, ThresholdMap::const_iterator> its = thresholdMap.equal_range(serialNum);
00053     for (ThresholdMap::const_iterator it = its.first; it!=its.second; ++it) {
00054         if ((*it).second == tsd) {
00055             return (*it).second.fileName;
00056         }
00057     }
00058     cout << "Failed to find threshold scan for " << serialNum << ". Details: charge " << tsd.charge << " Range " << tsd.range << " Trims " << tsd.trims << endl;
00059     throw NoDataFileException("No data file for: " + serialNum, __FILE__, __LINE__);
00060 }
00061 
00062 string ScanMap::getStrobeDataFile(string serialNum, const ABCDModule& config) const {
00063     StrobeDelayScanDetails tsd(config);
00064     
00065     //Find all 
00066     pair<StrobeMap::const_iterator, StrobeMap::const_iterator> its = strobeMap.equal_range(serialNum);
00067     for (StrobeMap::const_iterator it = its.first; it!=its.second; ++it) {
00068         if ((*it).second == tsd) {
00069             return (*it).second.fileName;
00070         }
00071     }
00072     cout << "Failed to find strobe delay scan for " << serialNum << ". Details: charge " << tsd.charge << " threshold " << tsd.threshold << endl;
00073     throw NoDataFileException("No data file for: " + serialNum, __FILE__, __LINE__);
00074 }
00075 
00076 void ScanMap::initialize(string fileName) {
00077     ModuleDataFile mdf(fileName);
00078 
00079     digitalMap.clear();
00080     strobeMap.clear();
00081     thresholdMap.clear();
00082 
00083     while (mdf.hasMoreRecords()) {
00084         ModuleDataRecord mdr = mdf.getNextRecord();
00085         if (mdr.testName == "FullBypassTest")
00086             addFullBypassTest(mdr);
00087         if (mdr.testName == "PipelineTest")
00088             addPipelineTest(mdr);
00089         if (mdr.testName == "StrobeDelay")
00090             addStrobeDelay(mdr);
00091         if (mdr.testName == "ThreePointGain")
00092             addThreePointGain(mdr);
00093         if (mdr.testName == "Trim")
00094             addTrim(mdr);
00095         if (mdr.testName == "ResponseCurve")
00096             addResponseCurve(mdr);
00097         if (mdr.testName == "NO")
00098             addNoise(mdr);
00099         if (mdr.testName == "Timewalk")
00100             addTimewalk(mdr);
00101     }
00102 }
00103 
00104 void ScanMap::addFullBypassTest(const ModuleDataRecord& mdr) {
00105     ScanInfo si;
00106     si.serialNum = mdr.serialNumber;
00107     si.scanVar = ST_TOKEN;
00108     for (unsigned int i=0; i<6; ++i) {
00109         digitalMap.insert(make_pair(si, constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber+i)));
00110     }
00111 }
00112 
00113 void ScanMap::addPipelineTest(const ModuleDataRecord& mdr) {
00114     //Not implemented atm.
00115 }
00116 
00117 void ScanMap::addStrobeDelay(const ModuleDataRecord& mdr) {
00118     StrobeDelayScanDetails sdsd;
00119     sdsd.charge = 4.0;
00120     sdsd.threshold = 2.0;
00121     sdsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber);
00122     strobeMap.insert(make_pair(mdr.serialNumber, sdsd));
00123 }
00124 
00125 void ScanMap::addThreePointGain(const ModuleDataRecord& mdr) {
00126     ThresholdScanDetails tsd;
00127     tsd.range = 0;
00128     tsd.trims = 0;
00129     double charges[] = {1.5, 2.0, 2.5};
00130     for (unsigned int i=0; i<3; ++i) {
00131         tsd.charge = charges[i];
00132         tsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber+i);
00133         thresholdMap.insert(make_pair(mdr.serialNumber, tsd));
00134     }
00135 }
00136 
00137 void ScanMap::addTrim(const ModuleDataRecord& mdr) {
00138     ThresholdScanDetails tsd;
00139     tsd.charge = 1.0;
00140     for (unsigned int i=0; i<28; ++i) {
00141         tsd.range = i<16 ? 0 : (i-16)/4+1;
00142         tsd.trims = i<16 ? i : ((i-16)%4+1)*4-1;
00143         tsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber+i);
00144         thresholdMap.insert(make_pair(mdr.serialNumber, tsd));
00145     }
00146 }
00147 
00148 void ScanMap::addResponseCurve(const ModuleDataRecord& mdr) {
00149     ThresholdScanDetails tsd;
00150     tsd.range = -1;
00151     tsd.trims = -1;
00152     double charges[] = {0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0, 4.0, 6.0, 8.0};
00153     for (unsigned int i=0; i<10; ++i) {
00154         tsd.charge = charges[i];
00155         tsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber+i);
00156         thresholdMap.insert(make_pair(mdr.serialNumber, tsd));
00157     }
00158 }
00159 
00160 void ScanMap::addNoise(const ModuleDataRecord& mdr) {
00161     ThresholdScanDetails tsd;
00162     tsd.range = -1;
00163     tsd.trims = -1;
00164     tsd.charge = 0;
00165     tsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber);
00166     thresholdMap.insert(make_pair(mdr.serialNumber, tsd));
00167 }
00168 
00169 void ScanMap::addTimewalk(const ModuleDataRecord& mdr) {
00170     StrobeDelayScanDetails sdsd;
00171     sdsd.threshold = 1.0;
00172     double charges[] = {1.25, 1.5, 1.75, 2, 3, 4.0, 5.0, 6.0, 8.0, 10.0};
00173     for (unsigned int i=0; i<10; ++i) {
00174         sdsd.charge = charges[i];
00175         sdsd.fileName = constructFileName(mdr.dataPath, mdr.runNumber, mdr.scanNumber+i);
00176         strobeMap.insert(make_pair(mdr.serialNumber, sdsd));
00177     }
00178 }
00179 
00180 string ScanMap::constructFileName(string path, unsigned int runNumber, unsigned int scanNumber) const {
00181     ostringstream oss;
00182     oss << path << "/strun" << runNumber << "_" << scanNumber << ".root";
00183     return oss.str();
00184 }
00185 
00186 }
00187 

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