00001 #include "SctData/TrimRangeTestResult.h"
00002 #include "sctConfIPC/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();
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 private:
00089 void checkShapeForEachRange(TTree& t, double prob, string name, string var, string cut="1");
00090 };
00091
00092
00093 string getFileName(string serial) {
00094 ostringstream oss;
00095 oss << serial << Ext;
00096
00097 return oss.str();
00098 }
00099
00100 void TrimRangeCompare::summaryOutput() {
00101
00102 if (cut(*tree, "pass", "(RodDaq.Pass-SctDaq.Pass)", 0.01, 0.01, 0.01, true, "Info.SCTDAQVersion>3.425") > 0) {
00103 ++exitCode;
00104 cout << "Failed pass tail check" << endl;
00105 }
00106
00107 if (cut(*tree, "ntrim", "(RodDaq.NTrim-SctDaq.NTrim)", 0.01, 0.01, 0.01, true, "Info.SCTDAQVersion>3.425") > 0) {
00108 ++exitCode;
00109 cout << "Failed ntrim tail check" << endl;
00110 }
00111
00112 if (cut(*tree, "range", "(RodDaq.Range-SctDaq.Range)", 0.1, 0.1, 0.3, true, "Info.SCTDAQVersion>3.425") > 0.1) {
00113 ++exitCode;
00114 cout << "Failed range tail check" << endl;
00115 }
00116 if (cut(*tree, "target", "(RodDaq.Target-SctDaq.Target)", 0.01, 0.01, 0.01, true, "Info.SCTDAQVersion>3.425") > 0) {
00117 ++exitCode;
00118 cout << "Failed target tail check" << endl;
00119 }
00120 if (cut(*tree, "meanVt50", "(RodDaq.MeanVt-SctDaq.MeanVt)", 1, 1, 0.01, true, "Info.SCTDAQVersion>3.425") > 0) {
00121 ++exitCode;
00122 cout << "Failed meanVt50 tail check" << endl;
00123 }
00124
00125
00126 double val = 0;
00127 val = compareShape(*tree, "rangeShape", "RodDaq.Range", "SctDaq.Range", "Info.SCTDAQVersion>3.425");
00128
00129 if (val > 0 && val < 0.9) {
00130 ++exitCode;
00131 cout << "Failed range shape check: " << val << endl;
00132 }
00133
00134 val = compareShape(*channelTree, "trimValShape", "RodDaq.Trim", "SctDaq.Trim", "Info.SCTDAQVersion>3.425");
00135
00136 if (val > 0 && val < 0.9) {
00137 ++exitCode;
00138 cout << "Failed TrimVal shape check: " << val << endl;
00139 }
00140
00141 checkShapeForEachRange(*tree, 0.9, "StepMeanShape", "MeanStep", "Info.SCTDAQVersion>3.425");
00142 checkShapeForEachRange(*tree, 0.9, "StepRmsShape", "RmsStep", "Info.SCTDAQVersion>3.425");
00143 checkShapeForEachRange(*tree, 0.9, "OffsetMeanShape", "MeanOffset", "Info.SCTDAQVersion>3.425");
00144 checkShapeForEachRange(*tree, 0.9, "OffsetRmsShape", "RmsOffset", "Info.SCTDAQVersion>3.425");
00145 checkShapeForEachRange(*tree, 0.9, "Vt50RmsShape", "RmsVt", "Info.SCTDAQVersion>3.425");
00146
00147 exitCode += errorCode;
00148 }
00149
00150 void TrimRangeCompare::checkShapeForEachRange(TTree& t, double prob, string name, string var, string cut) {
00151 string rodVar = "RodDaq." + var;
00152 string sctVar = "SctDaq." + var;
00153
00154 for (unsigned int i=0; i<4; ++i) {
00155 ostringstream ossName;
00156 ossName << name << i;
00157 string curName = ossName.str();
00158 ostringstream oss;
00159 oss << "RodDaq.Range==" << i << " && SctDaq.Range==" << i << " && " << cut;
00160 string curCut = oss.str();
00161 double val = compareShape(t, curName, rodVar, sctVar, curCut);
00162 if (val > 0 && val < prob) {
00163 ++exitCode;
00164 cout << "Failed " << name << " shape check for range " << i << " Prob: " << val << endl;
00165 }
00166 }
00167 }
00168
00169 void TrimRangeCompare::compare(const TrimRangeTestResult& sd) {
00170 float version = compareChip(sd);
00171 compareChannel(sd, version);
00172 }
00173
00174 float TrimRangeCompare::compareChip(const TrimRangeTestResult& sd) {
00175 strncpy(info.serial, sd.getModuleName().c_str(), 14);
00176 info.runNumber = sd.getRunNumber();
00177 info.scanNumber = sd.getScanNumberAt(0);
00178 info.nScans = sd.getNScans();
00179 info.charge = sd.charge;
00180 info.type = sd.type;
00181 info.algorithm = sd.algorithm;
00182
00183 string fileName = getFileName(sd.getModuleName());
00184 ifstream file (fileName.c_str());
00185 if (!file.good())
00186 throw IllegalStateError("Failed to open comparison file: " + fileName, __FILE__, __LINE__);
00187
00188 SctDaq.pass = TestFileUtil::getPass(file);
00189 info.SCTDAQVersion = TestFileUtil::skipHeader(file);
00190
00191 for (unsigned int chip = 0; chip<nChipModule; ++chip) {
00192 info.chip = chip;
00193 string chipStr;
00194 file >> chipStr >> SctDaq.range >> SctDaq.target >> SctDaq.ntrim >> SctDaq.meanVt50 >> SctDaq.rmsVt50
00195 >> SctDaq.meanStep >> SctDaq.rmsStep >> SctDaq.meanOffset >> SctDaq.rmsOffset;
00196
00197 file.ignore(256, '\n');
00198
00199 RodDaq.pass = sd.getPassed()?(sd.getProblem()?2:1):0;
00200 RodDaq.range = sd.chipTrim[chip]->range;
00201 RodDaq.target = sd.chipTrim[chip]->target;
00202 RodDaq.meanVt50 = sd.chipTrim[chip]->channelTrim.mean().vthr;
00203 RodDaq.rmsVt50 = sqrt(sd.chipTrim[chip]->channelTrim.var().vthr);
00204 RodDaq.meanOffset = sd.chipTrimData[chip]->getOffsets().mean();
00205 RodDaq.rmsOffset = sqrt(sd.chipTrimData[chip]->getOffsets().var());
00206 RodDaq.meanStep = sd.chipTrimData[chip]->getSteps().mean();
00207 RodDaq.rmsStep = sqrt(sd.chipTrimData[chip]->getSteps().var());
00208 RodDaq.ntrim = sd.chipTrimData[chip]->channelData.n();
00209
00210 tree->Fill();
00211 }
00212 return info.SCTDAQVersion;
00213 }
00214
00215
00216 void TrimRangeCompare::compareChannel(const TrimRangeTestResult& sd, float version) {
00217 ModuleConfiguration mc;
00218 mc.getABCDModule() = config.getModuleConfig(sd.getModuleName());
00219
00220 strncpy(chInfo.serial, sd.getModuleName().c_str(), 14);
00221 chInfo.runNumber = sd.getRunNumber();
00222 chInfo.scanNumber = sd.getScanNumberAt(0);
00223 chInfo.nScans = sd.getNScans();
00224 chInfo.charge = sd.charge;
00225 chInfo.type = sd.type;
00226 chInfo.algorithm = sd.algorithm;
00227 chInfo.SCTDAQVersion = version;
00228
00229 vector<int> validChannels(nChannelModule, 1);
00230
00231 string fileName = sd.getModuleName() + ".mask";
00232 ifstream file (fileName.c_str());
00233 if (!file.good())
00234 throw IllegalStateError("Failed to open mask file: " + fileName, __FILE__, __LINE__);
00235
00236 while (!file.eof()) {
00237 unsigned int channel = 0;
00238 file >> channel;
00239 if (!file.good()) continue;
00240
00241 file.ignore(256, '\n');
00242
00243 validChannels[channel] = 0;
00244 }
00245
00246
00247 for (unsigned int chip=0; chip<nChipModule; ++chip) {
00248 for (unsigned int channel=0; channel<nChannelChip; ++channel) {
00249 chInfo.channel = chip*nChannelChip + channel;
00250 chSctDaq.trim = mc.getChipConfiguration(chip).getTrim(channel);
00251 chSctDaq.status = validChannels[chip*nChannelChip+channel];
00252
00253 chRodDaq.trim = sd.chipTrim[chip]->channelTrim.getAt(channel).value.trim;
00254 chRodDaq.status = sd.chipTrim[chip]->channelTrim.getAt(channel).valid;
00255 chRodDaq.vthr = sd.chipTrim[chip]->channelTrim.getAt(channel).value.vthr;
00256 chRodDaq.offset = sd.chipTrimData[chip]->channelData.getAt(channel).value.p0;
00257 chRodDaq.step = 1.f/sd.chipTrimData[chip]->channelData.getAt(channel).value.p1;
00258
00259 channelTree->Fill();
00260 }
00261 }
00262 }
00263
00264
00268 void TrimRangeCompare::setup() {
00269 string name = Env::substituteVariables(Output);
00270 file = new TFile(name.c_str(), "RECREATE");
00271 tree = new TTree("TRChip", "TrimRange Chip Comparison Data");
00272 channelTree = new TTree("TRChannel", "TrimRange Channel Comparison Data");
00273 tree->Branch("RodDaq", &RodDaq, ChipDataStr.c_str());
00274 tree->Branch("SctDaq", &SctDaq, ChipDataStr.c_str());
00275 tree->Branch("Info", &info, ChipInfoStr.c_str());
00276
00277 channelTree->Branch("RodDaq", &chRodDaq, ChannelDataStr.c_str());
00278 channelTree->Branch("SctDaq", &chSctDaq, ChannelDataStr.c_str());
00279 channelTree->Branch("Info", &chInfo, ChannelInfoStr.c_str());
00280
00281 info.serial[14] = '\0';
00282 chInfo.serial[14] = '\0';
00283 }
00284
00288 void TrimRangeCompare::downloadData(string serialNumber) {
00289 ostringstream oss;
00290 ostringstream oss1;
00291 SctTest::TestInfo info = moduleData.getTrimInfo(serialNumber);
00292 oss << "java -Dtdaq.ipc.init.ref=$TDAQ_IPC_INIT_REF ProdDatabase/getDBfiles " << Arg << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00293 oss1 << "java -Dtdaq.ipc.init.ref=$TDAQ_IPC_INIT_REF ProdDatabase/getDBfiles -trim " << " -d -r " << info.runNumber << " -s " << info.scanNumber << " " << serialNumber;
00294 system(oss.str().c_str());
00295 system(oss1.str().c_str());
00296 }
00297
00302 void TrimRangeCompare::publishData() {
00303 highLevelApi->trim();
00304 }
00305
00306 TrimRangeCompare::TrimRangeCompare() {
00307 channelTree = 0;
00308 }
00309
00310
00311 int main(int argc, char** argv) {
00312 IPCCore::init(argc,argv);
00313 TrimRangeCompare sdc;
00314 sdc.analyzeAll(argc, argv);
00315 return sdc.getExitCode();
00316 }
00317