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
00020 string s = serialNum.replace(0, 2, "20");
00021
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
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
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
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
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