Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

RetrieveAndCompare.cpp

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

Generated on Thu Jul 8 11:41:13 2004 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5