00001 #include "SummaryWriter.h"
00002
00003 #include "Sct/SctParameters.h"
00004 #include "Sct/SctNames.h"
00005 #include "SctData/ModuleDefectList.h"
00006 #include "SctData/ModuleDefect.h"
00007 #include "SctData/TestResult.h"
00008 #include "SctData/ConfigurationVariable.h"
00009 #include "SctData/Stat.h"
00010 #include "Sct/Version.h"
00011 #include <boost/date_time/posix_time/posix_time.hpp>
00012 #include <unistd.h>
00013
00014 using namespace std;
00015
00016 namespace SctData {
00017 namespace TestSummary{
00018
00019 SummaryWriter::SummaryWriter() {}
00020
00021 SummaryWriter::~SummaryWriter() {}
00022
00023 string getHostName() {
00024 char name[255];
00025 if (gethostname(name, 255)) return "";
00026 return string(name);
00027 }
00028
00029 void SummaryWriter::writeHeader(const TestResult& r, ostream& out) const throw() {
00030 boost::posix_time::ptime t(boost::posix_time::second_clock::local_time());
00031 out << "#\n%NewTest\n#\n" ;
00032 out << "SERIAL NUMBER : " << r.getModuleName() <<endl;
00033 out << "TEST MADE BY : " << SctNames::getUser() << endl;
00034 out << "LOCATION MADE : " << SctNames::getLocation() << endl;
00035 out << "Run number : " << r.getRunNumber() << "-" << r.getScanNumberAt(0) << endl;
00036 out << "TEST_DATE : " << (short)t.date().day() << "/" << (short)t.date().month() << "/" << (short)t.date().year() << endl;
00037 out << "PASSED : " ;
00038 if (r.getPassed()) out << "YES";
00039 else out << "NO";
00040 out << endl;
00041 out << "PROBLEM : ";
00042 if (r.getProblem()) out << "YES";
00043 else out << "NO";
00044 out << endl;
00045 out << "#\n%DAQ_INFO\n#HOST\n\"" << getHostName() << "\"" << endl;
00046 out << "VERSION \n" << Sct::VersionString << endl;
00047 out << "#DUT\n\"module\"" << endl;
00048 out << "#TIME\n\"" << boost::posix_time::to_simple_string(t.time_of_day()) << "\"\n#" << endl;
00049
00050 vector<string> comments = r.getComments();
00051 out << endl;
00052 for (unsigned int i=0; i<comments.size(); ++i) {
00053 out << "%Comment" << endl << "COMMENT : " << comments[i] << endl;
00054 }
00055
00056 if (r.getNScans()>1){
00057 out << "%SCAN_INFO\n#"<<endl;
00058 out << "#POINT_TYPE\n" << r.getTestVariable().getVariableName() << endl;
00059 out << "#N_POINTS\n" << r.getNScans() << endl;
00060 out << "#POINTS";
00061 for (unsigned ipt=0; ipt<r.getNScans(); ++ipt){
00062 if (ipt%8==0) out << "\n";
00063 out << r.getTestPointAt(ipt) << "\t";
00064 }
00065 out << "\n#" << endl;
00066 }
00067 }
00068
00069 void SummaryWriter::write(const ModuleDefectList& list, std::ostream& out) const throw(Sct::IoError, Sct::LogicError){
00070 const vector< shared_ptr<const ModuleDefect > >& defects = list.getAllDefects();
00071
00072 if ( defects.empty() ){
00073 out << "#No defects found\n#" << endl; return;
00074 }
00075
00076 unsigned largestDefect=0;
00077
00078 Stats<int> channels(nChannelModule, Stat<int>(0, true) );
00079
00080 for (unsigned i=0; i< defects.size() ; ++i ){
00081 const ModuleDefect& d = *defects[i];
00082 const ModuleElement& e = d.getModuleElement();
00083
00084 for (unsigned ichannel = e.getFirst(); ichannel <= e.getLast(); ++ichannel ){
00085 channels.modifyAt(ichannel).valid=false;
00086 }
00087
00088 if (e.getNChannels() > largestDefect) largestDefect=e.getNChannels() ;
00089
00090 out << "%Defect" << endl;
00091 out << "DEFECT NAME : " << defects[i]->getName()<<endl;
00092 out << "FIRST CHANNEL : " << defects[i]->getModuleElement().getFirst()<<endl;
00093 out << "LAST CHANNEL : " << defects[i]->getModuleElement().getLast()<<endl;
00094 out << "#"<<endl;
00095 }
00096 out << "#" << defects.size() << " defects found"
00097 << " affecting " << nChannelModule-channels.n() << " strips\n"
00098 << "#" << largestDefect << " maximum consecutive defects\n#"<< endl;
00099 }
00100
00101 string SummaryWriter::getChipName(const unsigned short ichip) throw() {
00102 short unsigned id=ichip;
00103 if (id>=6) id+=2;
00104 switch(id){
00105 case (0) : return string("M0"); break;
00106 case (5) : return string("E5"); break;
00107 case (8) : return string("M8"); break;
00108 case (13) : return string("E13"); break;
00109 default : {
00110 char name[5];
00111 sprintf(name,"S%d",id);
00112 return string(name);
00113 break;
00114 }
00115 }
00116 }
00117 }
00118 }