00001 #include "SctData/PipelineTestResult.h"
00002 #include "../../AnalysisTestFramework.h"
00003 #include "../../CutUtils.h"
00004 #include "../../TestFileUtil.h"
00005
00006 struct Info {
00007 unsigned int runNumber;
00008 unsigned int scanNumber;
00009 unsigned int chip;
00010 unsigned int nScans;
00011 char serial[15];
00012 };
00013 string InfoStr = "Run/i:Scan:Chip:NScans:Serial/C";
00014
00015 struct SDData {
00016 int ngood;
00017 int pass;
00018 };
00019 string DataStr = "NGood/I:Pass/I";
00020
00021
00022 SDData RodDaq;
00023 SDData SctDaq;
00024 Info info;
00025
00026
00027 string Ext = "_Pipeline.dat";
00028 string Output = "${SCT_DAQ_ROOT}/SystemTests/logs/Pipeline.root";
00029 string Arg = "-3";
00030
00031 class PipelineCompare : public AnalysisTestFramework<PipelineTestResult> {
00032 public:
00033 virtual void publishData(SctTestApiStatus* status);
00034 virtual void downloadData(string serialNumber);
00035 virtual void compare(const PipelineTestResult& t);
00036 virtual void setup();
00037 virtual void summaryOutput();
00038 };
00039
00040
00041 string getFileName(string serial) {
00042 ostringstream oss;
00043 oss << serial << Ext;
00044
00045 return oss.str();
00046 }
00047
00048 void PipelineCompare::compare(const PipelineTestResult& sd) {
00049 strncpy(info.serial, sd.getModuleName().c_str(), 14);
00050 info.runNumber = sd.getRunNumber();
00051 info.scanNumber = sd.getScanNumberAt(0);
00052 info.nScans = sd.getNScans();
00053
00054 string fileName = getFileName(sd.getModuleName());
00055 ifstream file (fileName.c_str());
00056 if (!file.good())
00057 throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00058
00059 SctDaq.pass = TestFileUtil::getPass(file);
00060 TestFileUtil::skipHeader(file);
00061
00062 for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00063 string chipStr;
00064 info.chip = chip;
00065 file >> chipStr >> SctDaq.ngood;
00066
00067 file.ignore(256, '\n');
00068
00069 RodDaq.ngood = nChannelChip - sd.getDefects().getDefectsAffectingElement(ModuleElement::Chip(chip))->getAllDefects().size();
00070 RodDaq.pass = sd.getPassed();
00071
00072 tree->Fill();
00073 }
00074 }
00075
00076
00077 void PipelineCompare::summaryOutput() {
00078 if (cut(*tree, "ngood", "(RodDaq.NGood-SctDaq.NGood)", 0.01, 0.01, 0.01) > 0) {
00079 ++exitCode;
00080 cout << "Failed ngood tail check" << endl;
00081 }
00082 if (cut(*tree, "pass", "(RodDaq.Pass-SctDaq.Pass)", 0.01, 0.01, 0.01) > 0) {
00083 ++exitCode;
00084 cout << "Failed pass tail check" << endl;
00085 }
00086 exitCode += errorCode;
00087 }
00088
00092 void PipelineCompare::setup() {
00093 string name = Env::substituteVariables(Output);
00094 file = new TFile(name.c_str(), "RECREATE");
00095 tree = new TTree("PipeData", "Pipeline Comparison Data");
00096 tree->Branch("RodDaq", &RodDaq, DataStr.c_str());
00097 tree->Branch("SctDaq", &SctDaq, DataStr.c_str());
00098 tree->Branch("Info", &info, InfoStr.c_str());
00099 info.serial[14] = '\0';
00100 }
00101
00105 void PipelineCompare::downloadData(string serialNumber) {
00106 ostringstream oss;
00107 TestInfo info = moduleData.getPipelineInfo(serialNumber);
00108 oss << "java ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00109 system(oss.str().c_str());
00110 }
00111
00116 void PipelineCompare::publishData(SctTestApiStatus* status) {
00117 highLevelApi->pipeline(status);
00118 }
00119
00120
00121 int main(int argc, char** argv) {
00122 PipelineCompare sdc;
00123 sdc.analyzeAll(argc, argv);
00124 return sdc.getExitCode();
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137