00001 #include "SctData/TrimRangeTestResult.h"
00002 #include "sctConf/configipc.h"
00003 #include "../../AnalysisTestFramework.h"
00004 #include "../../TestFileUtil.h"
00005 #include "../../CutUtils.h"
00006
00007 using namespace SctConfiguration;
00008
00009 struct ChipInfo {
00010 float charge;
00011 float SCTDAQVersion;
00012 unsigned int runNumber;
00013 unsigned int scanNumber;
00014 unsigned int chip;
00015 unsigned int nScans;
00016 short type;
00017 unsigned short algorithm;
00018 char serial[15];
00019 };
00020 string ChipInfoStr = "Charge/F:SCTDAQVersion:Run/i:Scan:Chip:NScans:Type/S:Alg/s:Serial/C";
00021
00022 struct ChannelInfo {
00023 float charge;
00024 float SCTDAQVersion;
00025 unsigned int runNumber;
00026 unsigned int scanNumber;
00027 unsigned int channel;
00028 unsigned int nScans;
00029 short type;
00030 unsigned short algorithm;
00031 char serial[15];
00032 };
00033 string ChannelInfoStr = "Charge/F:SCTDAQVersion:Run/i:Scan:Channel:NScans:Type/S:Alg/s:Serial/C";
00034
00035
00036 struct TRChipData {
00037 float target;
00038 float meanVt50;
00039 float rmsVt50;
00040 float meanOffset;
00041 float rmsOffset;
00042 float meanStep;
00043 float rmsStep;
00044 int range;
00045 int ntrim;
00046 int pass;
00047 };
00048 string ChipDataStr = "Target/F:MeanVt:RmsVt:MeanOffset:RmsOffset:MeanStep:RmsStep:Range/I:NTrim:Pass";
00049
00050 struct TRChannelData {
00051 int trim;
00052 int status;
00053 float vthr;
00054 float offset;
00055 float step;
00056 };
00057 string ChannelDataStr = "Trim/I:Status:Vt/F:Offset:Step";
00058
00059
00060
00061 TRChipData RodDaq;
00062 TRChipData SctDaq;
00063 ChipInfo info;
00064
00065 TRChannelData chRodDaq;
00066 TRChannelData chSctDaq;
00067 ChannelInfo chInfo;
00068
00069
00070 string Ext = "_Trim.dat";
00071 string Output = "${SCT_DAQ_ROOT}/SystemTests/logs/TrimRange.root";
00072 string Arg = "-6";
00073
00074 class TrimRangeCompare : public AnalysisTestFramework<TrimRangeTestResult> {
00075 public:
00076 TrimRangeCompare();
00077 virtual void publishData(SctTestApiStatus* status);
00078 virtual void downloadData(string serialNumber);
00079 virtual void compare(const TrimRangeTestResult& t);
00080 virtual float compareChip(const TrimRangeTestResult& t);
00081 virtual void compareChannel(const TrimRangeTestResult& t, float version);
00082 virtual void summaryOutput();
00083 virtual void setup();
00084
00085 ConfigIPC config;
00086 TTree* channelTree;
00087 };
00088
00089
00090 string getFileName(string serial) {
00091 ostringstream oss;
00092 oss << serial << Ext;
00093
00094 return oss.str();
00095 }
00096
00097 void TrimRangeCompare::summaryOutput() {
00098 if (cut(*tree, "pass", "(RodDaq.Pass-SctDaq.Pass)", 0.01, 0.01, 0.01, true) > 0) {
00099 ++exitCode;
00100 cout << "Failed pass tail check" << endl;
00101 }
00102 if (cut(*tree, "ntrim", "(RodDaq.NTrim-SctDaq.NTrim)", 0.01, 0.01, 0.01, true) > 0) {
00103 ++exitCode;
00104 cout << "Failed ntrim tail check" << endl;
00105 }
00106 if (cut(*tree, "range", "(RodDaq.Range-SctDaq.Range)", 0.01, 0.01, 0.01, true) > 0) {
00107 ++exitCode;
00108 cout << "Failed range tail check" << endl;
00109 }
00110 if (cut(*tree, "target", "(RodDaq.Target-SctDaq.Target)", 0.01, 0.01, 0.01, true) > 0) {
00111 ++exitCode;
00112 cout << "Failed target tail check" << endl;
00113 }
00114 if (cut(*tree, "meanVt50", "(RodDaq.MeanVt-SctDaq.MeanVt)", 0.01, 0.01, 0.01, true) > 0) {
00115 ++exitCode;
00116 cout << "Failed meanVt50 tail check" << endl;
00117 }
00118 if (cut(*tree, "rmsVt50", "(RodDaq.RmsVt-SctDaq.RmsVt)", 0.01, 0.01, 0.01, true) > 0) {
00119 ++exitCode;
00120 cout << "Failed rmsVt50 tail check" << endl;
00121 }
00122 if (cut(*tree, "meanOffset", "(RodDaq.MeanOffset-SctDaq.MeanOffset)", 0.01, 0.01, 0.01, true) > 0) {
00123 ++exitCode;
00124 cout << "Failed meanOffset tail check" << endl;
00125 }
00126 if (cut(*tree, "rmsOffset", "(RodDaq.RmsOffset-SctDaq.RmsOffset)", 0.01, 0.01, 0.01, true) > 0) {
00127 ++exitCode;
00128 cout << "Failed rmsOffset tail check" << endl;
00129 }
00130 if (cut(*tree, "meanStep", "(RodDaq.MeanStep-SctDaq.MeanStep)", 0.01, 0.01, 0.01, true) > 0) {
00131 ++exitCode;
00132 cout << "Failed meanStep tail check" << endl;
00133 }
00134 if (cut(*tree, "rmsStep", "(RodDaq.RmsStep-SctDaq.RmsStep)", 0.01, 0.01, 0.01, true) > 0) {
00135 ++exitCode;
00136 cout << "Failed rmsStep tail check" << endl;
00137 }
00138 exitCode += errorCode;
00139 }
00140
00141
00142 void TrimRangeCompare::compare(const TrimRangeTestResult& sd) {
00143 float version = compareChip(sd);
00144 compareChannel(sd, version);
00145 }
00146
00147 float TrimRangeCompare::compareChip(const TrimRangeTestResult& sd) {
00148 strncpy(info.serial, sd.getModuleName().c_str(), 14);
00149 info.runNumber = sd.getRunNumber();
00150 info.scanNumber = sd.getScanNumberAt(0);
00151 info.nScans = sd.getNScans();
00152 info.charge = sd.charge;
00153 info.type = sd.type;
00154 info.algorithm = sd.algorithm;
00155
00156 string fileName = getFileName(sd.getModuleName());
00157 ifstream file (fileName.c_str());
00158 if (!file.good())
00159 throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00160
00161 SctDaq.pass = TestFileUtil::getPass(file);
00162 info.SCTDAQVersion = TestFileUtil::skipHeader(file);
00163
00164 for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00165 info.chip = chip;
00166 string chipStr;
00167 file >> chipStr >> SctDaq.range >> SctDaq.target >> SctDaq.ntrim >> SctDaq.meanVt50 >> SctDaq.rmsVt50
00168 >> SctDaq.meanStep >> SctDaq.rmsStep >> SctDaq.meanOffset >> SctDaq.rmsOffset;
00169
00170 file.ignore(256, '\n');
00171
00172 RodDaq.pass = sd.getPassed()?(sd.getProblem()?2:1):0;
00173 RodDaq.range = sd.chipTrim[chip]->range;
00174 RodDaq.target = sd.chipTrim[chip]->target;
00175 RodDaq.meanVt50 = sd.chipTrim[chip]->channelTrim.mean().vthr;
00176 RodDaq.rmsVt50 = sqrt(sd.chipTrim[chip]->channelTrim.var().vthr);
00177 RodDaq.meanOffset = sd.chipTrimData[chip]->getOffsets().mean();
00178 RodDaq.rmsOffset = sqrt(sd.chipTrimData[chip]->getOffsets().var());
00179 RodDaq.meanStep = sd.chipTrimData[chip]->getSteps().mean();
00180 RodDaq.rmsStep = sqrt(sd.chipTrimData[chip]->getSteps().var());
00181 RodDaq.ntrim = sd.chipTrimData[chip]->channelData.n();
00182
00183 tree->Fill();
00184 }
00185 return info.SCTDAQVersion;
00186 }
00187
00188
00189 void TrimRangeCompare::compareChannel(const TrimRangeTestResult& sd, float version) {
00190 ModuleConfiguration mc;
00191 mc.getABCDModule() = config.getModuleConfig(sd.getModuleName());
00192
00193 strncpy(chInfo.serial, sd.getModuleName().c_str(), 14);
00194 chInfo.runNumber = sd.getRunNumber();
00195 chInfo.scanNumber = sd.getScanNumberAt(0);
00196 chInfo.nScans = sd.getNScans();
00197 chInfo.charge = sd.charge;
00198 chInfo.type = sd.type;
00199 chInfo.algorithm = sd.algorithm;
00200 chInfo.SCTDAQVersion = version;
00201
00202 vector<int> validChannels(nChannelModule, 1);
00203
00204 string fileName = sd.getModuleName() + ".mask";
00205 ifstream file (fileName.c_str());
00206 if (!file.good())
00207 throw IllegalStateError("Failed to open mask file: " + fileName, __FILE__, __LINE__);
00208
00209 while (!file.eof()) {
00210 unsigned int channel = 0;
00211 file >> channel;
00212 if (!file.good()) continue;
00213
00214 file.ignore(256, '\n');
00215
00216 validChannels[channel] = 0;
00217 }
00218
00219
00220 for (unsigned int chip=0; chip<nChipModule; ++chip) {
00221 for (unsigned int channel=0; channel<nChannelChip; ++channel) {
00222 chInfo.channel = chip*nChannelChip + channel;
00223 chSctDaq.trim = mc.getChipConfiguration(chip).getTrim(channel);
00224 chSctDaq.status = validChannels[chip*nChannelChip+channel];
00225
00226 chRodDaq.trim = sd.chipTrim[chip]->channelTrim.getAt(channel).value.trim;
00227 chRodDaq.status = sd.chipTrim[chip]->channelTrim.getAt(channel).valid;
00228 chRodDaq.vthr = sd.chipTrim[chip]->channelTrim.getAt(channel).value.vthr;
00229 chRodDaq.offset = sd.chipTrimData[chip]->channelData.getAt(channel).value.p0;
00230 chRodDaq.step = 1.f/sd.chipTrimData[chip]->channelData.getAt(channel).value.p1;
00231
00232 channelTree->Fill();
00233 }
00234 }
00235 }
00236
00237
00241 void TrimRangeCompare::setup() {
00242 string name = Env::substituteVariables(Output);
00243 file = new TFile(name.c_str(), "RECREATE");
00244 tree = new TTree("TRChip", "TrimRange Chip Comparison Data");
00245 channelTree = new TTree("TRChannel", "TrimRange Channel Comparison Data");
00246 tree->Branch("RodDaq", &RodDaq, ChipDataStr.c_str());
00247 tree->Branch("SctDaq", &SctDaq, ChipDataStr.c_str());
00248 tree->Branch("Info", &info, ChipInfoStr.c_str());
00249
00250 channelTree->Branch("RodDaq", &chRodDaq, ChannelDataStr.c_str());
00251 channelTree->Branch("SctDaq", &chSctDaq, ChannelDataStr.c_str());
00252 channelTree->Branch("Info", &chInfo, ChannelInfoStr.c_str());
00253
00254 info.serial[14] = '\0';
00255 chInfo.serial[14] = '\0';
00256 }
00257
00261 void TrimRangeCompare::downloadData(string serialNumber) {
00262 ostringstream oss;
00263 ostringstream oss1;
00264 TestInfo info = moduleData.getTrimInfo(serialNumber);
00265 oss << "java ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00266 oss1 << "java ProdDatabase/getDBfiles -trim " << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00267 system(oss.str().c_str());
00268 system(oss1.str().c_str());
00269 }
00270
00275 void TrimRangeCompare::publishData(SctTestApiStatus* status) {
00276 highLevelApi->trim(status);
00277 }
00278
00279 TrimRangeCompare::TrimRangeCompare() {
00280 channelTree = 0;
00281 }
00282
00283
00284 int main(int argc, char** argv) {
00285 TrimRangeCompare sdc;
00286 sdc.analyzeAll(argc, argv);
00287 return sdc.getExitCode();
00288 }
00289