00001 #include "SctData/NoiseOccupancyTestResult.h"
00002 #include "SctData/RawScanResult.h"
00003 #include "Sct/IS/IONameIS.h"
00004 #include "../../AnalysisTestFramework.h"
00005 #include "../../CutUtils.h"
00006 #include "../../TestFileUtil.h"
00007
00008 using namespace SctData;
00009 using namespace Sct::IS;
00010
00011 struct Info {
00012 unsigned int runNumber;
00013 unsigned int scanNumber;
00014 unsigned int chip;
00015 unsigned int nScans;
00016 float SCTDAQVersion;
00017 char serial[15];
00018 };
00019 string InfoStr = "Run/i:Scan:Chip:NScans:SCTDAQVersion/F:Serial/C";
00020
00021 struct NOData {
00022 double mean;
00023 double rms;
00024 double offset;
00025 double noise;
00026 int pass;
00027 };
00028 string DataStr = "Mean/D:Rms:Offset:Noise:Pass/I";
00029
00030
00031 NOData RodDaq;
00032 NOData SctDaq;
00033 Info info;
00034
00035
00036 string Ext = "_Noise.dat";
00037 string Output = "${SCT_DAQ_ROOT}/SystemTests/logs/NoiseOccupancy.root";
00038 string Arg = "-8";
00039
00040 class NoiseOccupancyCompare : public AnalysisTestFramework<NoiseOccupancyTestResult> {
00041 public:
00042 virtual void publishData(SctTestApiStatus* status);
00043 virtual void downloadData(string serialNumber);
00044 virtual void compare(const NoiseOccupancyTestResult& t);
00045 virtual void summaryOutput();
00046 virtual void setup();
00047 };
00048
00049
00050 string getFileName(string serial) {
00051 ostringstream oss;
00052 oss << serial << Ext;
00053
00054 return oss.str();
00055 }
00056
00057 void NoiseOccupancyCompare::summaryOutput() {
00058 if (cut(*tree, "mean", "(RodDaq.Mean-SctDaq.Mean)", 5e-5, 5e-5, 2e-4, true) > 0) {
00059 ++exitCode;
00060 cout << "Failed mean tail check" << endl;
00061 }
00062
00063 if (cut(*tree, "rms", "(RodDaq.Rms-SctDaq.Rms)", 5e-5, 5e-5, 2e-4, true) > 0.001) {
00064 ++exitCode;
00065 cout << "Failed rms tail check" << endl;
00066 }
00067 if (cut(*tree, "Offset", "(RodDaq.Offset-SctDaq.Offset)/SctDaq.Offset", 0.01, 0.01, 0.03, true, "Info.SCTDAQVersion>3.401") > 0) {
00068 ++exitCode;
00069 cout << "Failed offset tail check" << endl;
00070 }
00071 if (cut(*tree, "Offset", "(RodDaq.Offset-SctDaq.Offset-9.5)", 1, 3, 10, true, "Info.SCTDAQVersion<3.401") > 0) {
00072 ++exitCode;
00073 cout << "Failed old version offset tail check" << endl;
00074 }
00075 if (cut(*tree, "noise", "(RodDaq.Noise-SctDaq.Noise)/SctDaq.Noise", 0.01, 0.02, 0.1, true) > 0) {
00076 ++exitCode;
00077 cout << "Failed noise tail check" << endl;
00078 }
00079 if (cut(*tree, "pass", "(RodDaq.Pass-SctDaq.Pass)", 0.01, 0.01, 0.01, true) > 0) {
00080 ++exitCode;
00081 cout << "Failed pass tail check" << endl;
00082 }
00083 exitCode += errorCode;
00084 }
00085
00086 void NoiseOccupancyCompare::compare(const NoiseOccupancyTestResult& sd) {
00087 strncpy(info.serial, sd.getModuleName().c_str(), 14);
00088 info.runNumber = sd.getRunNumber();
00089 info.scanNumber = sd.getScanNumberAt(0);
00090 info.nScans = sd.getNScans();
00091
00092 string fileName = getFileName(sd.getModuleName());
00093 ifstream file (fileName.c_str());
00094 if (!file.good())
00095 throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00096
00097 SctDaq.pass = TestFileUtil::getPass(file);
00098 info.SCTDAQVersion = TestFileUtil::skipHeader(file);
00099
00100 shared_ptr<RawScanResult> result;
00101
00102 for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00103 string chipStr;
00104 info.chip = chip;
00105 file >> chipStr >> SctDaq.offset >> SctDaq.mean >> SctDaq.rms >> SctDaq.noise;
00106
00107 file.ignore(256, '\n');
00108
00109
00110 if (SctDaq.offset < 0) {
00111 if (!result) {
00112 try {
00113 IONameIS name(RawScanResult::getUniqueID(sd.getHeader()), "SctData::RawScanResult", SctNames::getEventDataName());
00114 shared_ptr<Serializable> ob = IOManagerIS::instance().read(name.getIOName());
00115 result = dynamic_pointer_cast<RawScanResult>(ob);
00116 } catch (IoException& e) {}
00117 }
00118 if (result) {
00119 double target = 2.5*result->getConfiguration().getChipConfiguration(chip).getTrimTarget();
00120 SctDaq.offset+=target;
00121 }
00122 }
00123
00124 const ChipNOResult& data = sd.getChipResult(chip);
00125
00126 RodDaq.mean = data.mean;
00127 RodDaq.offset = data.offset;
00128 RodDaq.rms = data.rms;
00129 RodDaq.noise = data.getNoise();
00130 RodDaq.pass = sd.getPassed();
00131
00132
00133 tree->Fill();
00134 }
00135 }
00136
00137
00141 void NoiseOccupancyCompare::setup() {
00142 string name = Env::substituteVariables(Output);
00143 file = new TFile(name.c_str(), "RECREATE");
00144 tree = new TTree("NOData", "NoiseOccupancy Comparison Data");
00145 tree->Branch("RodDaq", &RodDaq, DataStr.c_str());
00146 tree->Branch("SctDaq", &SctDaq, DataStr.c_str());
00147 tree->Branch("Info", &info, InfoStr.c_str());
00148 info.serial[14] = '\0';
00149 }
00150
00154 void NoiseOccupancyCompare::downloadData(string serialNumber) {
00155 ostringstream oss;
00156 TestInfo info = moduleData.getNoiseOccupancyInfo(serialNumber);
00157 oss << "java ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00158 system(oss.str().c_str());
00159 }
00160
00165 void NoiseOccupancyCompare::publishData(SctTestApiStatus* status) {
00166 highLevelApi->noiseOccupancy(status);
00167 }
00168
00169
00170 int main(int argc, char** argv) {
00171 NoiseOccupancyCompare sdc;
00172 sdc.analyzeAll(argc, argv);
00173 return sdc.getExitCode();
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193