RetrieveAndCompare.cpp

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 //Globals variables:
00061 TRChipData RodDaq;                    //Our data
00062 TRChipData SctDaq;                    //SCTDAQ data
00063 ChipInfo info;                          //Some info
00064 
00065 TRChannelData chRodDaq; 
00066 TRChannelData chSctDaq; 
00067 ChannelInfo chInfo;
00068 
00069 //Noise Occupancy stuff
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     //Value checks
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     //Only check for versions>3.42
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     //Awaits a new version of SCTDAQ
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     //Distribution shape checks
00126     double val = 0;
00127     val = compareShape(*tree, "rangeShape", "RodDaq.Range", "SctDaq.Range", "Info.SCTDAQVersion>3.425");
00128     //cout << "Range shape: " << (val*100) << "%" << endl;
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     //cout << "TrimVal shape: " << (val*100) << "%" << endl;
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     //Ignore rest of line
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     //Ignore rest of line
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 

Generated on Mon Feb 6 14:01:26 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6