00001 #include "SctData/TimeWalkTestResult.h"
00002 #include "../../AnalysisTestFramework.h"
00003 #include "../../CutUtils.h"
00004 #include "../../TestFileUtil.h"
00005 #include "ipc/core.h"
00006
00007 struct Info {
00008 unsigned int runNumber;
00009 unsigned int scanNumber;
00010 unsigned int chip;
00011 unsigned int nScans;
00012 char serial[15];
00013 };
00014 string InfoStr = "Run/i:Scan:Chip:NScans:Serial/C";
00015
00016 struct SDData {
00017 double timeWalk;
00018 double calibration;
00019 int pass;
00020 };
00021 string DataStr = "TimeWalk/D:Calibration:Pass/I";
00022
00023
00024 SDData RodDaq;
00025 SDData SctDaq;
00026 struct Info info;
00027
00028
00029 string Ext = "_TimeWalk.dat";
00030 string Output = "${SCT_DAQ_ROOT}/SystemTests/logs/TimeWalk.root";
00031 string Arg = "-9";
00032
00033 class TimeWalkCompare : public AnalysisTestFramework<TimeWalkTestResult> {
00034 public:
00035 virtual void publishData();
00036 virtual void downloadData(string serialNumber);
00037 virtual void compare(const TimeWalkTestResult& t);
00038 virtual void summaryOutput();
00039 virtual void setup();
00040 };
00041
00042
00043 string getFileName(string serial) {
00044 ostringstream oss;
00045 oss << serial << Ext;
00046
00047 return oss.str();
00048 }
00049
00050 void TimeWalkCompare::compare(const TimeWalkTestResult& sd) {
00051 strncpy(info.serial, sd.getModuleName().c_str(), 14);
00052 info.runNumber = sd.getRunNumber();
00053 info.scanNumber = sd.getScanNumberAt(0);
00054 info.nScans = sd.getNScans();
00055
00056 string fileName = getFileName(sd.getModuleName());
00057 ifstream file (fileName.c_str());
00058 if (!file.good())
00059 throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00060
00061 SctDaq.pass = TestFileUtil::getPass(file);
00062 TestFileUtil::skipHeader(file);
00063
00064 for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00065 string chipStr;
00066 info.chip = chip;
00067 file >> chipStr >> SctDaq.timeWalk >> SctDaq.calibration;
00068
00069 file.ignore(256, '\n');
00070
00071 RodDaq.timeWalk = sd.getChipResult(chip).timewalk;
00072 RodDaq.calibration = sd.getChipResult(chip).calibration;
00073 RodDaq.pass = sd.getPassed();
00074
00075 tree->Fill();
00076 }
00077 }
00078
00079
00080 void TimeWalkCompare::summaryOutput() {
00081 if (cut(*tree, "timewalk", "(RodDaq.TimeWalk-SctDaq.TimeWalk)/SctDaq.TimeWalk*100", 1, 2, 10) > 0) {
00082 ++exitCode;
00083 cout << "Failed timewalk tail check" << endl;
00084 }
00085 if (cut(*tree, "calibration", "(RodDaq.Calibration-SctDaq.Calibration)/SctDaq.Calibration*100", 0.3, 0.5, 2) > 0) {
00086 ++exitCode;
00087 cout << "Failed calibration tail check" << endl;
00088 }
00089 exitCode += errorCode;
00090 }
00091
00092
00096 void TimeWalkCompare::setup() {
00097 string name = Env::substituteVariables(Output);
00098 file = new TFile(name.c_str(), "RECREATE");
00099 tree = new TTree("TWData", "TimeWalk Comparison Data");
00100 tree->Branch("RodDaq", &RodDaq, DataStr.c_str());
00101 tree->Branch("SctDaq", &SctDaq, DataStr.c_str());
00102 tree->Branch("Info", &info, InfoStr.c_str());
00103 info.serial[14] = '\0';
00104 }
00105
00109 void TimeWalkCompare::downloadData(string serialNumber) {
00110 ostringstream oss;
00111 SctTest::TestInfo info = moduleData.getTimeWalkInfo(serialNumber);
00112 oss << "java -Dtdaq.ipc.init.ref=$TDAQ_IPC_INIT_REF ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00113 system(oss.str().c_str());
00114 }
00115
00120 void TimeWalkCompare::publishData() {
00121 highLevelApi->timeWalk();
00122 }
00123
00124
00125 int main(int argc, char** argv) {
00126 IPCCore::init(argc,argv);
00127 TimeWalkCompare sdc;
00128 sdc.analyzeAll(argc, argv);
00129 return sdc.getExitCode();
00130 }
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142