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