HTMLReportUtilities.java

00001 package ProdDatabase;
00002 import java.util.*;
00003 import java.sql.*;
00004 import java.util.zip.*;
00005 import java.io.*;
00006 import java.text.DecimalFormat;
00007 import Preferences.*;
00008 
00009 public class HTMLReportUtilities implements SCTDBInfo {
00010 
00011    public static boolean DEBUG=false;
00012 
00013    private static Hashtable sctdaqTestNameHash, sctdaqTestNumberHash;
00014 
00015   private static void fillHashes() {
00016          if(sctdaqTestNameHash!=null) return;
00017          sctdaqTestNameHash = new Hashtable();
00018          sctdaqTestNumberHash = new Hashtable();
00019          for(int i=0;i<sctdaqDBTestNames.length;i++) {
00020              sctdaqTestNameHash.put(sctdaqDBTestNames[i],sctdaqNormalTestNames[i]);
00021              sctdaqTestNumberHash.put(sctdaqDBTestNames[i],new Integer(i));
00022              }
00023       }
00024 //******************************************************
00025    public static SctDaqTestInfo getHTMLTestInfo(String test_no) throws Exception {
00026 
00027       SctDaqTestInfo testInfo=null;
00028       fillHashes();
00029 
00030       StringBuffer genTable = new StringBuffer();
00031       StringBuffer sqlStat = new StringBuffer("SELECT test_name,ser_no,test_date,locn_name FROM tests WHERE test_no="+test_no);
00032 
00033 // submit query
00034      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00035      if(DEBUG) System.out.println(sqlStat.toString());
00036      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00037      int recordCount=0;
00038    
00039      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00040           recordCount++;
00041           String dbTestName = resultSet.getString(1);
00042           String testName = dbTestName;
00043           int index=-1;
00044           if(sctdaqTestNameHash.containsKey(dbTestName)) {
00045                 testName = (String)sctdaqTestNameHash.get(dbTestName);
00046                 index = ((Integer)sctdaqTestNumberHash.get(dbTestName)).intValue();
00047                 }
00048           testInfo = new SctDaqTestInfo(resultSet.getString(2),testName,guiUtilities.DaveUtils.extractDate(resultSet.getString(3)),resultSet.getString(4),index);
00049           }
00050      statement.close();
00051      return testInfo;
00052      }
00053 // *****************************************************************************************************************
00054    public static String getHTMLCommentsTable(String test_no) throws Exception {
00055 
00056       StringBuffer genTable = new StringBuffer("<h3>Comments</h3>\n");
00057       StringBuffer sqlStat = new StringBuffer("SELECT CMNT_TEXT FROM TEST_CMNTS WHERE TEST_NO="+test_no);
00058 
00059 // submit query
00060      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00061 //    System.out.println("Interrogating defects table ...");
00062      if(DEBUG) System.out.println(sqlStat.toString());
00063      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00064      int recordCount=0;
00065 
00066 // now get the data
00067      int ntotal=0;
00068      int nCount=0;
00069      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00070           recordCount++;
00071 
00072           String comment = resultSet.getString(1);
00073         nCount++;
00074         genTable.append(comment+"<br>\n");
00075 
00076         }
00077       statement.close();
00078       if(nCount==0) genTable.append("No comments found\n");
00079       return genTable.toString();
00080       }
00081 //**************************************************************************8
00082   public static String getHTMLPlotTable(String test_no) throws Exception {
00083 // now look for plots
00084       String testnames = " AND (tests.TEST_name LIKE 'Hyb%' OR tests.TEST_name LIKE 'DetModIV')";
00085       StringBuffer genTable = new StringBuffer("<h3>Plots</h3>\n");
00086 
00087       StringBuffer sqlStat = new StringBuffer("SELECT tests.ser_no,tests.test_no,web_links.web_link_desc,web_links.url FROM tests,web_links");
00088       sqlStat.append(" WHERE tests.test_no=web_links.test_no AND tests.test_no="+test_no);
00089       sqlStat.append(testnames);
00090  
00091 // submit query
00092      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00093      if(DEBUG) System.out.println(sqlStat.toString());
00094      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00095 // now get the raw data
00096      int nCount=0;
00097      Hashtable webLinkHash = new Hashtable();
00098      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00099           String theSN = resultSet.getString(1);
00100           String thisTestNo = resultSet.getString(2);
00101           String urlDescription = resultSet.getString(3);
00102           String thisURLlink = resultSet.getString(4);
00103           boolean isPostscript = (thisURLlink.endsWith(".ps") || thisURLlink.endsWith(".ps.gz"));
00104 // check special case - RAL url and longterm test
00105           if(thisURLlink.indexOf("http://hepunx.rl.ac.uk/atlassct/cgibin/getfile.pl?file=")!=-1) thisURLlink+="&module="+theSN;
00106 
00107         if(nCount==0) {
00108           genTable.append("<table cellspacing=5 border=1>\n");
00109           for(int i=0;i<2;i++) genTable.append("<col width=*>\n");
00110           genTable.append("<tr><td valign=top align=left><b>Title</b></td><td valign=top align=left><b>Link</b></td></tr>\n");
00111           }
00112         nCount++;
00113         String link= isPostscript ? "Type"+guiUtilities.HTMLViewer.URLTOPOSTSCRIPT+"&ref="+thisURLlink : thisURLlink;
00114         genTable.append("<tr><td valign=top align=left>"+urlDescription+"</td><td valign=top align=left><a href="+link+">"+thisURLlink+"</a></td></tr>\n");
00115 
00116          }
00117       statement.close();
00118       if(nCount==0) genTable.append("No Plots available.\n");
00119       else genTable.append("</table>\n");
00120       return genTable.toString();
00121       }
00122 
00123 
00124 
00125 // *****************************************************************************************************************
00126    public static String getHTMLDCSTable(String test_no) throws Exception {
00127 
00128       StringBuffer genTable = new StringBuffer("<h3>DCS Information</h3>\n");
00129       StringBuffer sqlStat = new StringBuffer("SELECT T0,T1,VDET,IDET,VCC,ICC,VDD,IDD,TIME_POWERED FROM SCT_TSTDCSINFO WHERE TEST_NO="+test_no); 
00130 // submit query
00131      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00132      if(DEBUG) System.out.println(sqlStat.toString());
00133      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00134      int recordCount=0;
00135 
00136 // now get the data
00137      int ntotal=0;
00138      int nCount=0;
00139      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00140           recordCount++;
00141         if(nCount==0) {
00142           genTable.append("<table cellspacing=5 border=1>\n");
00143           for(int i=0;i<9;i++) genTable.append("<col width=*>\n");
00144           genTable.append("<tr><td><b>T0</b></td><td><b>T1</b></td><td><b>Vdet</b></td><td><b>Idet</b></td><td><b>Vcc</b></td><td><b>Icc</b></td><td><b>Vdd</b></td><td><b>Idd</b></td><td><b>Time Powered</b></td></tr>\n");
00145           }
00146         nCount++;
00147         genTable.append("<tr>");
00148         for(int i=0;i<9;i++) genTable.append("<td>"+resultSet.getString(i+1)+"</td>");
00149         genTable.append("</tr>\n");
00150 
00151         }
00152       statement.close();
00153       if(nCount==0) genTable.append("<p>No DCS information available\n");
00154       else genTable.append("</table>\n");
00155       return genTable.toString();
00156       }
00157 // *****************************************************************************************************************
00158    public static String getHTMLDAQTable(String test_no) throws Exception {
00159 
00160       StringBuffer genTable = new StringBuffer("<h3>DAQ Information</h3>\n");
00161       StringBuffer sqlStat = new StringBuffer("SELECT HOST,VERSION,DUT,TEST_TIME FROM SCT_TSTDAQINFO WHERE TEST_NO="+test_no); 
00162 // submit query
00163      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00164      if(DEBUG) System.out.println(sqlStat.toString());
00165      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00166      int recordCount=0;
00167 
00168 // now get the data
00169      int ntotal=0;
00170      int nCount=0;
00171      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00172           recordCount++;
00173         if(nCount==0) {
00174           genTable.append("<table cellspacing=5 border=1>\n");
00175           for(int i=0;i<4;i++) genTable.append("<col width=*>\n");
00176           genTable.append("<tr><td valign=top align=left><b>Host</b></td><td valign=top align=left><b>DAQ Version</b></td><td valign=top align=left><b>DeviceType</b></td><td valign=top align=left><b>Time</b></td></tr>\n");
00177           }
00178         nCount++;
00179         genTable.append("<tr>");
00180         for(int i=0;i<4;i++) genTable.append("<td valign=top align=left>"+resultSet.getString(i+1)+"</td>");
00181         genTable.append("</tr>\n");
00182 
00183         }
00184       statement.close();
00185       if(nCount==0) genTable.append("No DAQ information available\n");
00186       else genTable.append("</table>\n");
00187       return genTable.toString();
00188       }
00189 
00190 // *****************************************************************************************************************
00191    public static String getHTMLScanTable(String test_no) throws Exception {
00192       String[] pointValues = new String[16];
00193       StringBuffer genTable = new StringBuffer("<h3>Scan Information</h3>\n");
00194       StringBuffer sqlStat = new StringBuffer("SELECT POINT_TYPE,N_POINTS");
00195       for(int i=0;i<16;i++) sqlStat.append(",POINT_"+i);
00196       sqlStat.append(" FROM SCT_TSTSCANINFO WHERE TEST_NO="+test_no); 
00197 // submit query
00198      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00199      if(DEBUG) System.out.println(sqlStat.toString());
00200      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00201      int recordCount=0;
00202     
00203 // now get the data
00204      int ntotal=0;
00205      int nCount=0;
00206      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00207           recordCount++;
00208           String point_type = resultSet.getString(1);
00209           String nPoints = resultSet.getString(2);
00210           int inPoints = Integer.parseInt(nPoints);
00211           for(int i=0;i<16;i++) pointValues[i]=resultSet.getString(i+3);
00212         if(nCount==0) {
00213           genTable.append("<table cellspacing=5 border=1>\n");
00214           for(int i=0;i<2+inPoints;i++) genTable.append("<col width=*>\n");
00215           genTable.append("<tr><td valign=top align=left><b>Type</b></td><td valign=top align=left><b># Points</b></td><td valign=top align=left><b>Values</b></td></tr>\n");
00216           }
00217         nCount++;
00218         genTable.append("<tr>");
00219         genTable.append("<td valign=top align=left>"+point_type+"</td><td valign=top align=left>"+nPoints+"</td>");
00220         genTable.append("<td valign=top align=left>"+pointValues[0]);
00221         for(int y=1;y<inPoints;y++) genTable.append(","+pointValues[y]);
00222         genTable.append("</tr>\n");
00223 
00224         }
00225       statement.close();
00226       if(nCount==0) genTable.append("<p>No scan information for this test type.\n");
00227       else genTable.append("</table>\n");
00228       return genTable.toString();
00229       }
00230 // *****************************************************************************************************************
00231    public static String getSCTDAQHTMLTestData(String test_no, int testType) throws Exception {
00232 // build vector table of full data from each test.
00233 // the first element will be a string with optional data, or just the name of the test.
00234      StringBuffer genTable = new StringBuffer("<h3>Test Data</h3>\n");
00235 
00236      if(testType==-1) {
00237           genTable.append("Unknown test type");
00238           return genTable.toString();
00239           }
00240      int nCount=0;
00241      SCTDBInterface db = SCTDBInterface.getInstance();
00242      Statement statement = db.connection.createStatement();
00243      ResultSet resultSet;
00244      StringBuffer sqlStat;
00245 
00246      switch(testType) {
00247         case SCTDB_TEST_RESET:
00248         case SCTDB_TEST_REDUNDANCY:
00249            genTable.append("No test data available for this test type.");
00250            return genTable.toString();
00251         case SCTDB_TEST_TRIM:
00252             sqlStat = new StringBuffer("SELECT TR_CHARGE,TR_TYPE,TR_ALGORITHM FROM "+sctdaqDBTableNames[testType]);
00253             sqlStat.append(" WHERE test_no="+test_no);
00254             resultSet = statement.executeQuery(sqlStat.toString());
00255             for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00256                genTable.append("Charge="+resultSet.getString(1)+" Type="+resultSet.getString(2)+" Algorithm="+resultSet.getString(3));
00257                }
00258 //            statement.close();
00259             break;
00260          default:
00261       }
00262 
00263 
00264      int totalRows = (testType==SCTDB_TEST_RESET || testType==SCTDB_TEST_LONGTERM || testType==SCTDB_TEST_IV) ? 1 : DBChipParameterNames[testType].length;
00265      for(int theRowNo=0;theRowNo<totalRows;theRowNo++) {
00266             sqlStat = new StringBuffer("SELECT ");
00267             switch(testType) {
00268                     case SCTDB_TEST_RESET:
00269                         sqlStat.append(sctdaqDBTableNames[testType]+".ICC_NOCONFIG");
00270                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDD_NOCONFIG");
00271                         sqlStat.append(","+sctdaqDBTableNames[testType]+".ICC_NOCLOCK");
00272                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDD_NOCLOCK");
00273                         break;
00274                      case SCTDB_TEST_LONGTERM:
00275                         sqlStat.append(sctdaqDBTableNames[testType]+".DURATION");
00276                         sqlStat.append(","+sctdaqDBTableNames[testType]+".FAIL_TIME");
00277                         sqlStat.append(","+sctdaqDBTableNames[testType]+".T0_MIN");
00278                         sqlStat.append(","+sctdaqDBTableNames[testType]+".T0_MAX");
00279                         sqlStat.append(","+sctdaqDBTableNames[testType]+".T1_MIN");
00280                         sqlStat.append(","+sctdaqDBTableNames[testType]+".T1_MAX");
00281                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDET_MIN");
00282                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDET_MAX");
00283                         sqlStat.append(","+sctdaqDBTableNames[testType]+".ICC_MIN");
00284                         sqlStat.append(","+sctdaqDBTableNames[testType]+".ICC_MAX");
00285                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDD_MIN");
00286                         sqlStat.append(","+sctdaqDBTableNames[testType]+".IDD_MAX");
00287                         break;
00288                       case SCTDB_TEST_IV:
00289                         sqlStat.append(sctdaqDBTableNames[testType]+".I_LEAK_150");
00290                         sqlStat.append(","+sctdaqDBTableNames[testType]+".I_LEAK_350");
00291                         break;
00292                      default:
00293                         sqlStat.append(chipDBnames[0]+DBChipParameterNames[testType][theRowNo]);
00294                         for(int y=1;y<chipDBnames.length;y++) sqlStat.append(","+chipDBnames[y]+DBChipParameterNames[testType][theRowNo]);
00295                      }
00296             sqlStat.append(" FROM "+sctdaqDBTableNames[testType]);
00297             sqlStat.append(" WHERE test_no="+test_no);
00298 
00299 // submit query
00300 
00301      if(DEBUG) System.out.println(sqlStat.toString());
00302             resultSet = statement.executeQuery(sqlStat.toString());
00303             int recordCount=0;
00304 
00305 // now get the data
00306 
00307             for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00308                if(nCount==0) {
00309                   genTable.append("<table cellspacing=5 border=1>\n");
00310                   if(testType==SCTDB_TEST_LONGTERM) {
00311                   genTable.append("<tr><td><b>Duration</b></td>");
00312                   genTable.append("<td><b>Fail Time</b></td>");
00313                   genTable.append("<td><b>T0(min)</b></td>");
00314                   genTable.append("<td><b>T0(max)</b></td>");
00315                   genTable.append("<td><b>T1(min)</b></td>");
00316                   genTable.append("<td><b>T1(max)</b></td>");
00317                   genTable.append("<td><b>Idet(min)</b></td>");
00318                   genTable.append("<td><b>Idet(max)</b></td>");
00319                   genTable.append("<td><b>Icc(min)</b></td>");
00320                   genTable.append("<td><b>Icc(max)</b></td>");
00321                   genTable.append("<td><b>Idd(min)</b></td>");
00322                   genTable.append("<td><b>Idd(max)</b></td></tr>");
00323                   }
00324                  else if(testType==SCTDB_TEST_RESET) {
00325                     genTable.append("<tr><td><b>Icc NoConf</b></td>");
00326                     genTable.append("<td><b>Idd NoConf</b></td>");
00327                     genTable.append("<td><b>Icc NoClock</b></td>");
00328                     genTable.append("<td><b>Idd NoClock</b></td></tr>\n");
00329                    }
00330                  else if(testType==SCTDB_TEST_IV) {
00331                     genTable.append("<tr><td><b>I @ 150V</b></td>");
00332                     genTable.append("<td><b>I @ 350V</b></td></tr>\n");
00333                     }
00334                   else {
00335                     for(int i=0;i<13;i++) genTable.append("<col width=*>\n");
00336                     genTable.append("<tr><td><b>Parameter</b></td>");
00337                     for(int z=0;z<chipDBnames.length;z++) genTable.append("<td><b>"+chipDBnames[z].substring(0,chipDBnames[z].length()-1)+"</b></td>");
00338                     genTable.append("</tr>\n");
00339                     }
00340                   }
00341                nCount++;
00342                recordCount++;
00343 // add the parameter name in the first column
00344      switch(testType) {
00345                      case SCTDB_TEST_RESET:
00346                      case SCTDB_TEST_LONGTERM:
00347                      case SCTDB_TEST_IV:
00348                              genTable.append("<tr>");
00349                              break;
00350                      default:
00351                              genTable.append("<tr><td>"+(String)fullTestParameterNames[testType][theRowNo]+"</td>");
00352                      }
00353                 if(testType==SCTDB_TEST_NOISE && (theRowNo==1 || theRowNo==2)) { // scientific notation for occupancy and occ rms
00354                       for(int y=0;y<chipDBnames.length;y++) {
00355                            String theValue = resultSet.getString(1+y);
00356                            double theNumber = Double.valueOf(theValue).doubleValue();
00357                            DecimalFormat myFormatter = new DecimalFormat("0.##E0");
00358                            genTable.append("<td>"+myFormatter.format(theNumber)+"</td>");
00359                            }
00360                        }
00361                else if(testType==SCTDB_TEST_RESET) for(int y=0;y<4;y++) genTable.append("<td>"+resultSet.getString(1+y)+"</td>");
00362                else if(testType==SCTDB_TEST_LONGTERM) for(int y=0;y<12;y++) genTable.append("<td>"+resultSet.getString(1+y)+"</td>");
00363                else if(testType==SCTDB_TEST_IV) for(int y=0;y<2;y++) genTable.append("<td>"+resultSet.getString(1+y)+"</td>");               
00364                else for(int y=0;y<chipDBnames.length;y++) genTable.append("<td>"+resultSet.getString(1+y)+"</td>");
00365                genTable.append("</tr>\n");
00366                 }
00367              }
00368       statement.close();
00369       if(nCount==0) genTable.append("No test data found\n");
00370       else genTable.append("</table>\n");
00371       return genTable.toString();
00372    }
00373 //**********************************************************************************************
00374    public static String getHTMLDefectTable(String test_no) throws Exception {
00375 
00376       StringBuffer genTable = new StringBuffer("<h3>Defects</h3>\n");
00377       StringBuffer sqlStat = new StringBuffer("SELECT CHAN_1ST,CHAN_LAST,DEFECT_NAME FROM DEFECTS WHERE TEST_NO="+test_no);
00378       sqlStat.append(" ORDER BY CHAN_1ST");
00379 
00380 // submit query
00381      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00382 //    System.out.println("Interrogating defects table ...");
00383      if(DEBUG) System.out.println(sqlStat.toString());
00384      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00385      int recordCount=0;
00386 
00387 // now get the data
00388      int ntotal=0;
00389      int nCount=0;
00390      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00391           recordCount++;
00392           String chan1 = resultSet.getString(1);
00393           String chan2 = resultSet.getString(2);
00394           String defectname = resultSet.getString(3);
00395         if(nCount==0) {
00396           genTable.append("<table cellspacing=5 border=1>\n");
00397           for(int i=0;i<2;i++) genTable.append("<col width=*>\n");
00398           genTable.append("<tr><td><b>Channel</b></td><td><b>Defect Type</b></td></tr>\n");
00399           }
00400         nCount++;
00401         String chans = (chan1.equals(chan2)) ? chan1 : chan1+"-"+chan2;
00402         genTable.append("<tr><td>"+chans+"</td><td>"+defectname+"</td></tr>\n");
00403 
00404         }
00405       statement.close();
00406       if(nCount==0) genTable.append("No defects found\n");
00407       else genTable.append("</table>\n");
00408       return genTable.toString();
00409       }
00410 //**********************************************************************
00411      public static String getModuleReport(String serno) {
00412 
00413      try {
00414        if(!GeneralUtilities.itemExists(serno)) return null; // check it exists
00415      }catch(Exception ee){};
00416 
00417     System.out.println("Generating detailed report for module "+serno+". Be patient...");
00418 
00419      java.text.DecimalFormat ivFormatter = new java.text.DecimalFormat("#.###");
00420 
00421      ModuleInfo moduleInfo = new ModuleInfo(serno);
00422 
00423      StringBuffer html = new StringBuffer(guiUtilities.DaveUtils.getHTMLHeader("Module Summary Report for "+serno));
00424 
00425      if(!moduleInfo.isModule()) {
00426         html.append("Sorry, "+serno+" is not a module!");
00427         html.append(guiUtilities.DaveUtils.getHTMLFooter());
00428         return html.toString();
00429         }
00430         
00431      try {
00432      if(!moduleInfo.isBarrelModule()) html.append(createModuleEvaluationTable(serno));
00433      }catch(Exception eVal){}
00434 
00435      SignoffDataInterface signoffInfo=null;
00436      if(moduleInfo.isBarrelModule()) {
00437        signoffInfo = new SignoffDataInterface(serno,"FINALSIGNOFF");
00438        html.append("<h3>Module Signoff Information</h3>");
00439        Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00440        if(signoffDataHash.size()==0) html.append("None uploaded");
00441        else {
00442           html.append("<table border=1>");
00443           int count=1;
00444           for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00445               String location  = (String)e.nextElement();    
00446               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00447               html.append("<tr><td align=right><font color=navy>Overall category:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.CATEGORY,true)+"</td></tr>");
00448               if(signoffInfo.getString(location,ModuleSignoffData.CATEGORY,true).matches("FAIL|Fail")) {
00449                 html.append("<tr><td align=right><font color=navy>Reason for FAIL:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.FAILREASON,true)+"</td></tr>");
00450                 }
00451               html.append("<tr><td align=right><font color=navy>Barrel Asignment:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.BARREL,true)+"</td></tr>");
00452               if(signoffInfo.getString(location,ModuleSignoffData.BARREL,true).matches("[56]+")) {
00453                 html.append("<tr><td align=right>Reason for B5/6:</td><td>"+signoffInfo.getString(location,ModuleSignoffData.B56REASON,true)+"</td></tr>");
00454                 }
00455               html.append("<tr><td align=right><font color=navy>Comment:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.COMMENT,true)+"</td></tr>");
00456               count++;
00457               }
00458               html.append("</table>");
00459           }
00460        if(!signoffInfo.qualityInfoIsPresent()) signoffInfo = new SignoffDataInterface(serno,"SIGNOFF");
00461        }
00462 
00463      html.append("<h3>Assembly Information</h3>");
00464      html.append("<table border=1>");
00465      html.append("<tr><td><b>Component</b></td><td><b>SerialNo</b></td><td><b>Position</b></td><td colspan=2><b>Details</td></tr>\n");
00466      for(int i=0;i<moduleParts.length;i++) {
00467        if(moduleInfo.isForwardModule() && (i==SCTDBInfo.bmBB || i==SCTDBInfo.bmSB || i==SCTDBInfo.bmHPC)) continue;
00468        String sn = moduleInfo.getSerialNo(i);
00469        String testInfo = "n/a";
00470        if(moduleInfo.isBarrelModule()) {
00471           testInfo = moduleInfo.getDataSheetTestNo(i);
00472           if(testInfo==null) testInfo="Datasheet not available";
00473           else testInfo = "<a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.DATASHEET)+"&ref="+testInfo+"\">Datasheet</a>";
00474           }
00475        html.append("<tr><td>"+moduleParts[i]+"</td><td>"+sn+"</td><td>n/a</td><td colspan=2>"+testInfo+"</td></tr>\n");
00476        }
00477      Vector sensorList = moduleInfo.getSensorList();
00478      if(sensorList.size()==0) html.append("<tr><td>Sensors</td><td>Not Uploaded.</td><td>n/a</td><td colspan=2>Data not available</td></tr>\n");
00479      else {
00480         for(int i=0;i<sensorList.size();i++) {
00481            Hashtable tempHash = (Hashtable)sensorList.elementAt(i);
00482            String thisSN=(String)tempHash.get("SERIALNO");
00483            String posn = (String)tempHash.get("POSITION");
00484            String type = "Sensor";
00485            if(moduleInfo.isForwardModule()) {
00486              if(thisSN.matches("\\d{7}03\\d{5}")) type="W12 Sensor";
00487              else if(thisSN.matches("\\d{7}04\\d{5}")) type="W21 Sensor";
00488              else if(thisSN.matches("\\d{7}05\\d{5}")) type="W22 Sensor";
00489              else if(thisSN.matches("\\d{7}06\\d{5}")) type="W31 Sensor";
00490              else if(thisSN.matches("\\d{7}07\\d{5}")) type="W32 Sensor";
00491              }
00492            String link = "<a href=Type"+Integer.toString(guiUtilities.HTMLViewer.SENSORTESTDATA)+"&ref="+thisSN+">All Test Data</a>";
00493            html.append("<tr><td>"+type+"</td><td>"+thisSN+"</td><td>"+posn+"</td><td colspan=2>"+link+"</td></tr>\n");
00494            }
00495          }
00496      Vector asicList = moduleInfo.getAsicList();
00497      if(asicList.size()==0) html.append("<tr><td>ASICs</td><td>Not Uploaded.</td><td>n/a</td><td colspan=2>Data not available</td></tr>\n");
00498      else {
00499         for(int i=0;i<asicList.size();i++) {
00500            String thisASIC = (String)asicList.elementAt(i);
00501            String thisASICInfo = moduleInfo.getASICInfo(thisASIC);
00502            String thisASICcorrFactor = moduleInfo.getASICcorrFactor(thisASIC);
00503            html.append("<tr><td>ASIC</td><td>"+thisASIC+"</td><td>"+Integer.toString(i+1)+"</td><td>"+thisASICInfo+"</td><td>cFactor "+thisASICcorrFactor+"</td></tr>\n");
00504            }
00505         }
00506      html.append("</table>");
00507 
00508      try {
00509       String hsn = moduleInfo.getHybridSerialNo();
00510       if(hsn!=null) html.append(createASICReWorkTable(hsn));
00511      }catch(Exception e0){System.err.println("Error retrieving dissam logs: "+e0.toString());}
00512 
00513      try {
00514       html.append(createVisualTestTable(serno,"Module"));
00515       html.append(createVisualTestTable(moduleInfo.getHybridSerialNo(),"Hybrid"));
00516      }catch(Exception e){System.err.println("Error downloading visual inspection info: "+e.toString());}
00517 
00518      System.out.println("Still working...");
00519 
00520      html.append("<h3>Metrology Data</h3>");
00521      if(moduleInfo.noMetrologyTests()==0) html.append("No data uploaded.");
00522      else {
00523         html.append("<table border=1>");
00524         html.append("<tr><td>Type</td><td>Event</td><td>Status</td><td>Location</td><td>Date</td><td>Data</td></tr>\n");
00525         for(int i=0;i<moduleInfo.noMetrologyTests();i++) {
00526          MetrologyTest met = moduleInfo.getMetrologyTest(i);
00527          int linkType = (met.getType().equals("XY")) ? guiUtilities.HTMLViewer.XYMETDATA : guiUtilities.HTMLViewer.ZMETDATA;
00528          String link = "<a href=Type"+Integer.toString(linkType)+"&ref="+met.getTestNo()+"\">Datasheet</a>";
00529          html.append("<tr><td>"+met.getType()+"</td><td>"+met.getEvent()+"</td><td>"+met.getStatus()+"</td><td>"+met.getLocation()+"</td><td>"+met.getDate()+"</td></td>"+link+"</td></tr>");
00530          }
00531         html.append("</table>");
00532      }
00533 
00534      html.append("<h3>IV Data</h3>");
00535      html.append("<table border=1>");
00536      html.append("<tr><td>Component</td><td>Location</td><td>Date</td><td>150V</td><td>350V</td><td>500V</td><td>Temperature</td><td>Data</td></tr>\n");
00537      ModuleIVInfo ivInfo = new ModuleIVInfo(serno,sensorList);
00538      html.append("<tr><td>Sensor Sum</td><td>"+ivInfo.getOrigin()+"</td><td> - </td>");
00539      double i150sensor = ivInfo.geti150SensorCurrent();
00540      double i350sensor = ivInfo.geti350SensorCurrent();
00541      double i500sensor = ivInfo.geti500SensorCurrent();
00542      html.append("<td>"+ivFormatter.format(i150sensor)+"</td><td>"+ivFormatter.format(i350sensor)+"</td><td>"+ivFormatter.format(i500sensor)+"</td><td>"+ivInfo.getTemperatureRange()+"</td><td> - </td></tr>");
00543      for(int i=0;i<ivInfo.noModuleIVs();i++) {
00544         ModuleIV mIV = ivInfo.getModuleIV(i);
00545         html.append("<tr><td>Module</td><td>"+mIV.getLocation()+"</td><td>"+mIV.getDate()+"</td>");
00546         double i150 = mIV.geti150();
00547         if(i150==0.) html.append("<td> - </td>");
00548         else {
00549           if(i150sensor>0. && i150>(i150sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i150)+"</td>");
00550           else html.append("<td>"+ivFormatter.format(i150)+"</td>");
00551           }
00552         double i350 = mIV.geti350();
00553         if(i350==0.) html.append("<td> - </td>");
00554         else {
00555           if(i350sensor>0. && i350>(i350sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i350)+"</td>");
00556           else html.append("<td>"+ivFormatter.format(i350)+"</td>");
00557           }
00558         double i500 = mIV.geti500();
00559         if(i500==0.) html.append("<td> - </td>");
00560         else {
00561           if(i500sensor>0. && i500>(i500sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i500)+"</font></td>");
00562           else html.append("<td>"+ivFormatter.format(i500)+"</td>");
00563           }
00564         html.append("<td>"+mIV.getTemperature()+"</td>");
00565         String plotLink = mIV.getLink();
00566         if(plotLink==null) html.append("<td> - </td>");
00567         else {
00568           boolean isPostscript = (plotLink.endsWith(".ps") || plotLink.endsWith(".ps.gz"));
00569           String link = isPostscript ?  "Type"+Integer.toString(guiUtilities.HTMLViewer.URLTOPOSTSCRIPT)+"&ref="+plotLink : plotLink;
00570           html.append("<td><a href=\""+link+"\">Plot</a></td>");
00571           }
00572         html.append("</tr>");
00573         }
00574      html.append("</table>");
00575 // now module quality - for barrels only
00576      if(moduleInfo.isBarrelModule()) {
00577        if(signoffInfo!=null) {
00578          html.append("<h3>IV Quality Information</h3>");
00579          Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00580          if(signoffDataHash.size()==0) html.append("<p>None uploaded");
00581          else {
00582             html.append("<table border=1>");
00583             int count=1;
00584             for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00585               String location  = (String)e.nextElement();      
00586               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00587               html.append("<tr><td align=right valign=top><font color=navy>Category: </font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.IVCATEGORY,true)+"</td></tr>");
00588               html.append("<tr><td align=right valign=top><font color=navy>Comments: </font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.IVCOMMENT,true)+"</td></tr>");
00589               count++;
00590               }
00591             html.append("</table>");
00592            }
00593         }
00594       }
00595 
00596      ModuleSCTDAQInfo sctdaqInfo = new ModuleSCTDAQInfo(serno);
00597      html.append("<h3>SCTDAQ Characterisations</h3>\n");
00598 
00599      if(sctdaqInfo.noTests()>0) {
00600        html.append("<table border=1>\n");
00601        html.append("<tr><td>Location</td><td>Date</td><td>Temperature</td><td>DeltaT</td><td colspan=2 align=center>Excluding Trim Defects</td><td colspan=2 align=center>Including Trim Defects</td><td>Link</td><td>Failed Tests</td></tr>\n");
00602        html.append("<tr><td></td><td></td><td></td><td></td><td>N(defects)</td><td>N(consecutive)</td><td>N(defects)</td><td>N(consecutive)</td><td></td><td></td></tr>\n");
00603        for(int i=0;i<sctdaqInfo.noTests();i++) {
00604          SCTDAQCharacterisation sctdaq = sctdaqInfo.getCharacterisation(i);
00605          String temperature = (sctdaq.getTemperature()>10.) ? "Warm" : "Cold";
00606          double deltaT = sctdaq.getDeltaT();
00607          String deltaTS = new java.text.DecimalFormat("#.###").format(deltaT);
00608          String dT = (Math.abs(deltaT)>=1.) ? "<font color=red>"+deltaTS+"</font>" : deltaTS;
00609          html.append("<tr><td valign=top>"+sctdaq.getLocation()+"</td><td valign=top>"+sctdaq.getDate()+"</td><td valign=top>"+temperature+"</td><td valign=top>"+dT+"</td>");
00610          html.append("<td valign=top>"+Integer.toString(sctdaq.nDefects(2))+"</td><td valign=top>"+Integer.toString(sctdaq.nDefects(3))+"</td>");
00611          html.append("<td valign=top>"+Integer.toString(sctdaq.nDefects(0))+"</td><td valign=top>"+Integer.toString(sctdaq.nDefects(1))+"</td>");
00612          String weblink = serno+"__"+sctdaq.getLocation()+"__"+sctdaq.getDate()+"__"+temperature;
00613          html.append("<td valign=top><a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDAQTESTLIST)+"&ref="+weblink+"\">Characterisation Report</a></td>");
00614          html.append("<td valign=top>");
00615          Set failedTests = sctdaq.getFailedTests();
00616          if(failedTests.size()==0) html.append(" - </td>");
00617          else {
00618              int count=0;
00619              for (Iterator k = failedTests.iterator(); k.hasNext(); ) {
00620                          if(count>0) html.append("<br>");
00621                          html.append((String)k.next());
00622                          count++;
00623                          }
00624              html.append("</td>");
00625            }
00626          html.append("</tr>\n");
00627          }    
00628        html.append("</table>"); 
00629        html.append("<br><a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDAQTESTLIST)+"&ref="+serno+"__\">Click here</a> for a full report of *all* sctdaq tests performed on this module.");
00630        }
00631      else html.append("None uploaded.<br>");
00632 // now module quality - for barrels only
00633      if(moduleInfo.isBarrelModule()) {
00634 //       if(!serno.startsWith("202203302")) signoffInfo = new SignoffDataInterface(serno,"SIGNOFF");
00635        html.append("<h3>Module Quality Information</h3>");
00636        Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00637        if(signoffDataHash.size()==0) html.append("None uploaded");
00638        else {
00639           html.append("<table border=1>");
00640           int count=1;
00641           for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00642               String location  = (String)e.nextElement();      
00643               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00644               html.append("<tr><td align=right valign=top><font color=navy>Category: </font></td><td valign=top>"+signoffInfo.getString(location,ModuleSignoffData.ELECTRICALCATEGORY,true)+"</td></tr>");
00645               html.append("<tr><td align=right valign=top><font color=navy>Comments: </font></td><td valign=top>"+signoffInfo.getString(location,ModuleSignoffData.ELECTRICALCOMMENT,true)+"</td></tr>");     
00646               html.append("<tr><td align=right valign=top><font color=navy>SCurve Category: </font></td><td valign=top>"+signoffInfo.getString(location,ModuleSignoffData.SCURVECATEGORY,true)+"</td></tr>");
00647               html.append("<tr><td align=right valign=top><font color=navy>SCurve Comments: </font></td><td valign=top>"+signoffInfo.getString(location,ModuleSignoffData.SCURVECOMMENT,true)+"</td></tr>");
00648               count++;
00649               }
00650            html.append("</table>");
00651          }
00652       }
00653      html.append(guiUtilities.DaveUtils.getHTMLFooter());
00654      return html.toString();
00655      }
00656 //*************************************************************************
00657    public static String getSensorMfrHTMLTable(Vector snList) throws Exception {
00658 
00659       StringBuffer genTable = new StringBuffer("<h3>General Wafer Properties</h3>\n");
00660 
00661       String serialNos = (String)snList.elementAt(0);
00662       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00663 
00664       StringBuffer sqlStat = new StringBuffer("SELECT ");
00665       sqlStat.append(" tests.ser_no,substr_orient,substr_origin,thickness,i_leak_150,i_leak_350,temperature FROM tests,tstdetmfrs");
00666       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00667       sqlStat.append(" ORDER BY tests.ser_no");
00668 
00669       Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00670       ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00671       int nCount=0;
00672 
00673      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00674         if(nCount==0) {
00675           genTable.append("<table cellspacing=5 border=1>\n");
00676           for(int i=0;i<4;i++) genTable.append("<col width=*>\n");
00677           genTable.append("<tr><td><b>Serial Number</b></td><td><b>Orientation</b></td><td><b>Origin</b></td><td><b>Thickness(um)</b></td></tr>");
00678           }
00679         nCount++;
00680         genTable.append("<tr>");
00681         for(int i=1;i<=4;i++) genTable.append("<td>"+resultSet.getString(i)+"</td>");
00682         genTable.append("</tr>\n");
00683         }
00684       statement.close();
00685       if(nCount==0) genTable.append("<p>No data available\n");
00686       else genTable.append("</table>");
00687       return genTable.toString();
00688       }
00689 //******************************************************************************************************************
00690    public static String getSensorIVHTMLTable(Vector snList) throws Exception {
00691       SCTDBInterface db = SCTDBInterface.getInstance();
00692       Hashtable tempHash;
00693       Hashtable atlasHash = new Hashtable();
00694       Vector tempList;
00695       Vector mfrList = new Vector();
00696       StringBuffer ivTable = new StringBuffer("<h3>IV Data</h3>\n");
00697       String serialNos = (String)snList.elementAt(0);
00698       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00699 
00700       StringBuffer sqlStat = new StringBuffer("SELECT ");
00701       sqlStat.append(" tests.ser_no,tests.locn_name,tests.test_date,i_leak_150,i_leak_350,temperature FROM tests,tstdetmfrs");
00702       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00703       sqlStat.append(" ORDER BY tests.ser_no");
00704 
00705       Statement statement = db.connection.createStatement();
00706 
00707      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00708      int nCount=0;
00709 
00710      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00711         String sn = resultSet.getString(1);
00712         tempHash = new Hashtable();
00713         tempHash.put("SERIALNO",sn);
00714         tempHash.put("NAME",resultSet.getString(2));
00715         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(3)));
00716         tempHash.put("I150",resultSet.getString(4));
00717         tempHash.put("I350",resultSet.getString(5));
00718         tempHash.put("TEMP",resultSet.getString(6));
00719         tempHash.put("STATUS","Pass");
00720         tempHash.put("COMNTS","None.");
00721         mfrList.addElement(tempHash);
00722         nCount++;
00723         }
00724      statement.close();
00725 
00726      sqlStat = new StringBuffer("SELECT ");
00727      sqlStat.append("tests.test_no,tests.ser_no,tests.locn_name,tests.test_date,tests.problem,tests.pass,tstdetivs.temperature,tstdetivs.i_leak_150,tstdetivs.i_leak_350");
00728      sqlStat.append(" FROM tests,tstdetivs");
00729      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00730      sqlStat.append(" AND tests.test_name='DetIVscan'");
00731      sqlStat.append(" AND tstdetivs.test_no=tests.test_no");
00732      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00733 
00734      statement = db.connection.createStatement();
00735      resultSet = statement.executeQuery(sqlStat.toString());
00736 
00737      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00738         tempHash = new Hashtable();
00739         String sn = resultSet.getString(2);
00740         if(atlasHash.containsKey(sn)) tempList = (Vector)atlasHash.get(sn);
00741         else tempList = new Vector();
00742         tempHash.put("TESTNO",resultSet.getString(1));
00743         tempHash.put("SERIALNO",resultSet.getString(2));
00744         tempHash.put("NAME",resultSet.getString(3));
00745         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(4)));
00746         String problemFlag = resultSet.getString(5);
00747         String passFlag = resultSet.getString(6);
00748         String statusFlag; 
00749         if(passFlag.equals("YES")) {
00750              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Pass";
00751              }
00752         else statusFlag = "FAIL";
00753         tempHash.put("STATUS",statusFlag);
00754         tempHash.put("TEMP",resultSet.getString(7));
00755         tempHash.put("I150",resultSet.getString(8));
00756         tempHash.put("I350",resultSet.getString(9));
00757         tempList.addElement(tempHash);
00758         atlasHash.put(sn,tempList);
00759         nCount++;
00760         }
00761        statement.close();
00762 
00763 // now get the comments, if any
00764       String subQuery = sqlStat.toString();
00765       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("AND tstdetivs")-1);
00766       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
00767 
00768 // Now build the html table!!!
00769       for(int i=0;i<mfrList.size();i++) {
00770         if(i==0) {
00771           ivTable.append("<table cellspacing=5 border=1>\n");
00772           for(int j=0;j<8;j++) ivTable.append("<col width=*>\n");
00773           ivTable.append("<tr><td nowrap><b>Serial Number</b></td><td nowrap><b>Location</b></td><td nowrap><b>Date</b></td><td nowrap><b>I@150V</b></td><td nowrap><b>I@350V</b></td><td nowrap><b>Temp(C)</b></td><td nowrap><b>Status</b></td><td nowrap><b>Remarks</b></td></tr>\n");
00774            }
00775         ivTable.append("<tr>");
00776         tempHash = (Hashtable)mfrList.elementAt(i);
00777         String sn = (String)tempHash.get("SERIALNO");
00778         String locn = (String)tempHash.get("NAME");
00779         String date = (String)tempHash.get("DATE");
00780         String i150 = (String)tempHash.get("I150");
00781         String i350 = (String)tempHash.get("I350");
00782         String temp = (String)tempHash.get("TEMP");
00783         String status = (String)tempHash.get("STATUS");
00784         String remarks = (String)tempHash.get("COMNTS");
00785         ivTable.append("<td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+i150+"</td><td>"+i350+"</td><td>"+temp+"</td><td>"+status+"</td><td>"+remarks+"</td></tr>\n");
00786         if(atlasHash.containsKey(sn)) {
00787             tempList = (Vector)atlasHash.get(sn);
00788             for(int j=0;j<tempList.size();j++) {
00789               tempHash = (Hashtable)tempList.elementAt(j);
00790               String testno = (String)tempHash.get("TESTNO");
00791               sn = (String)tempHash.get("SERIALNO");
00792               locn = "<font color=green>"+(String)tempHash.get("NAME")+"</font>";
00793               date = (String)tempHash.get("DATE");
00794               i150 = (String)tempHash.get("I150");
00795               i350 = (String)tempHash.get("I350");
00796               temp = (String)tempHash.get("TEMP");
00797               status = (String)tempHash.get("STATUS");
00798               if(!status.equals("Pass")) status = "<font color=red>"+status+"</font>";
00799               remarks="None.";
00800               if(commentsHash.containsKey(testno)) remarks = (String)commentsHash.get(testno);
00801               if(!remarks.equals("None.")) remarks = "<font color=red>"+remarks+"</font>";
00802               ivTable.append("<tr><td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+i150+"</td><td>"+i350+"</td><td>"+temp+"</td><td>"+status+"</td><td nowrap>"+remarks+"</td></tr>\n");
00803               }
00804           }
00805          }
00806       if(nCount==0) ivTable.append("<p>No data available\n");
00807       else ivTable.append("</table>");
00808       return ivTable.toString();
00809       }
00810 
00811 //******************************************************************************************************************
00812    public static String getSensorDepletionHTMLTable(Vector snList) throws Exception {
00813       SCTDBInterface db = SCTDBInterface.getInstance();
00814       Hashtable tempHash;
00815       Hashtable atlasHash = new Hashtable();
00816       Vector tempList;
00817       Vector mfrList = new Vector();
00818       StringBuffer ivTable = new StringBuffer("<h3>Depletion Voltages</h3>\n");
00819       String serialNos = (String)snList.elementAt(0);
00820       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00821 
00822       StringBuffer sqlStat = new StringBuffer("SELECT ");
00823       sqlStat.append(" tests.ser_no,tests.locn_name,tests.test_date,v_dep FROM tests,tstdetmfrs");
00824       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00825       sqlStat.append(" ORDER BY tests.ser_no");
00826 
00827       Statement statement = db.connection.createStatement();
00828       ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00829       int nCount=0;
00830 
00831       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00832         String sn = resultSet.getString(1);
00833         tempHash = new Hashtable();
00834         tempHash.put("SERIALNO",sn);
00835         tempHash.put("NAME",resultSet.getString(2));
00836         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(3)));
00837         tempHash.put("VDEP",resultSet.getString(4));
00838         tempHash.put("STATUS","Pass");
00839         tempHash.put("COMNTS","None.");
00840         mfrList.addElement(tempHash);
00841         nCount++;
00842         }
00843 
00844      statement.close();
00845 
00846      sqlStat = new StringBuffer("SELECT ");
00847      sqlStat.append("tests.test_no,tests.ser_no,tests.locn_name,tests.test_date,tests.problem,tests.pass,tstdetopts.v_dep");
00848      sqlStat.append(" FROM tests,tstdetopts");
00849      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00850      sqlStat.append(" AND tests.test_name='DetVDep'");
00851      sqlStat.append(" AND tstdetopts.test_no=tests.test_no");
00852      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00853      statement = db.connection.createStatement();
00854      resultSet = statement.executeQuery(sqlStat.toString());
00855 
00856      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00857         tempHash = new Hashtable();
00858         String sn = resultSet.getString(2);
00859         if(atlasHash.containsKey(sn)) tempList = (Vector)atlasHash.get(sn);
00860         else tempList = new Vector();
00861         tempHash.put("TESTNO",resultSet.getString(1));
00862         tempHash.put("SERIALNO",resultSet.getString(2));
00863         tempHash.put("NAME",resultSet.getString(3));
00864         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(4)));
00865         String problemFlag = resultSet.getString(5);
00866         String passFlag = resultSet.getString(6);
00867         String statusFlag; 
00868         if(passFlag.equals("YES")) {
00869              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Pass";
00870              }
00871         else statusFlag = "FAIL";
00872         tempHash.put("STATUS",statusFlag);
00873         tempHash.put("VDEP",resultSet.getString(7));
00874         tempList.addElement(tempHash);
00875         atlasHash.put(sn,tempList);
00876         nCount++;
00877         }
00878       statement.close();
00879 
00880 // now get the comments, if any
00881       String subQuery = sqlStat.toString();
00882       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("AND tstdetopts")-1);
00883       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
00884 
00885 // Now build the html table!!!
00886       for(int i=0;i<mfrList.size();i++) {
00887         if(i==0) {
00888           ivTable.append("<table cellspacing=5 border=1>\n");
00889           for(int j=0;j<8;j++) ivTable.append("<col width=*>\n");
00890           ivTable.append("<tr><td nowrap><b>Serial Number</b></td><td nowrap><b>Location</b></td><td nowrap><b>Date</b></td><td nowrap><b>Depletion</b></td><td nowrap><b>Status</b></td><td nowrap><b>Remarks</b></td></tr>\n");
00891            }
00892         ivTable.append("<tr>");
00893         tempHash = (Hashtable)mfrList.elementAt(i);
00894         String sn = (String)tempHash.get("SERIALNO");
00895         String locn = (String)tempHash.get("NAME");
00896         String date = (String)tempHash.get("DATE");
00897         String vdep = (String)tempHash.get("VDEP");
00898         String status = (String)tempHash.get("STATUS");
00899         String remarks = (String)tempHash.get("COMNTS");
00900         ivTable.append("<td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+vdep+"</td><td>"+status+"</td><td>"+remarks+"</td></tr>\n");
00901         if(atlasHash.containsKey(sn)) {
00902             tempList = (Vector)atlasHash.get(sn);
00903             for(int j=0;j<tempList.size();j++) {
00904               tempHash = (Hashtable)tempList.elementAt(j);
00905               String testno = (String)tempHash.get("TESTNO");
00906               sn = (String)tempHash.get("SERIALNO");
00907               locn = "<font color=green>"+(String)tempHash.get("NAME")+"</font>";
00908               date = (String)tempHash.get("DATE");
00909               vdep = (String)tempHash.get("VDEP");
00910               status = (String)tempHash.get("STATUS");
00911               if(!status.equals("Pass")) status = "<font color=red>"+status+"</font>";
00912               remarks="None.";
00913               if(commentsHash.containsKey(testno)) remarks = (String)commentsHash.get(testno);
00914               if(!remarks.equals("None.")) remarks = "<font color=red>"+remarks+"</font>";
00915               ivTable.append("<tr><td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+vdep+"</td><td>"+status+"</td><td nowrap>"+remarks+"</td></tr>\n");
00916               }
00917           }
00918          }
00919       if(nCount==0) ivTable.append("<p>No data available\n");
00920       else ivTable.append("</table>");
00921       return ivTable.toString();
00922       }
00923 
00924 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00925       public static String getSensorDefectHTMLTable(Vector snList) throws Exception {
00926       SCTDBInterface db = SCTDBInterface.getInstance();
00927       Vector itemList = new Vector();
00928       String serialNos = (String)snList.elementAt(0);
00929       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00930       Vector dets = new Vector();
00931       Vector theLine;
00932       String[] defectNames = {"Pinhole","Oxide-Punchthrough","Short","Open","Implant-Open","Implant-Short","Resistor-Break"};
00933       Hashtable nameHash = new Hashtable();
00934       int ndefectTypes = defectNames.length;
00935       Hashtable[] defectCount = new Hashtable[ndefectTypes];
00936       Hashtable[] defectList = new Hashtable[ndefectTypes];
00937 
00938       StringBuffer ivTable = new StringBuffer("<h3>Defects Summary</h3>\n");
00939       for(int i=0;i<ndefectTypes;i++) {
00940            nameHash.put(defectNames[i],new Integer(i));
00941            defectCount[i] = new Hashtable();
00942            defectList[i] = new Hashtable();
00943            }
00944 
00945       Hashtable totalCount = new Hashtable();
00946       Hashtable serialNoHash = new Hashtable();
00947       Hashtable dateHash = new Hashtable();
00948       Hashtable locationHash = new Hashtable();
00949 
00950       String ser_no="",test_no="";
00951       String test_date,defect_name,chan1,chanlast;
00952 
00953 
00954 // first get a list of all the tests, so that we know what detectors have zero defects..
00955       StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,tests.ser_no,tests.test_date,tests.locn_name FROM tests");
00956       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00957       sqlStat.append(" AND ( tests.test_name='DetDefect' OR tests.test_name='DetMfrSheet')");
00958 // ordering by serial number only
00959       sqlStat.append(" ORDER BY tests.ser_no,tests.test_no"); 
00960       String string1 = sqlStat.toString();
00961 
00962 
00963  //     System.out.println(string1);
00964       Statement statement = db.connection.createStatement();
00965       ResultSet resultSet = statement.executeQuery(string1);
00966       int nCount=0;
00967       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00968           nCount++;
00969           ser_no = resultSet.getString(2);
00970           test_no = resultSet.getString(1);
00971           String date = resultSet.getString(3);
00972           date = guiUtilities.DaveUtils.extractDate(date);
00973           dateHash.put(test_no,date);
00974           String location_name = resultSet.getString(4);
00975           locationHash.put(test_no,location_name);
00976           for(int i=0;i<ndefectTypes;i++) {
00977              defectCount[i].put(test_no,new Integer(0));
00978              defectList[i].put(test_no,"");
00979              }
00980           totalCount.put(test_no,new Integer(0));
00981           serialNoHash.put(test_no,ser_no);
00982           dets.addElement(test_no);
00983           }
00984       statement.close();
00985       String subQuery = string1;
00986 
00987 // need a subquery so that we are looking at the same test numbers!
00988       int in1 = subQuery.indexOf("FROM");
00989       int in2 = subQuery.indexOf("ORDER")-1;
00990       subQuery = "SELECT tests.test_no "+subQuery.substring(in1,in2);
00991 
00992       sqlStat = new StringBuffer("SELECT tests.ser_no,tests.test_no,defect_name,chan_1st,chan_last");
00993       sqlStat.append(" FROM tests,defects");
00994       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00995       sqlStat.append(" AND defects.test_no=tests.test_no");
00996       sqlStat.append(" AND tests.test_no IN ("+subQuery+")");     
00997       sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00998       String string2 = sqlStat.toString();
00999 
01000       statement = db.connection.createStatement();
01001       resultSet = statement.executeQuery(string2);
01002       String olddata;
01003       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01004           nCount++;
01005           ser_no = resultSet.getString(1);
01006           test_no = resultSet.getString(2);
01007           defect_name = resultSet.getString(3);
01008           chan1 = resultSet.getString(4);
01009           chanlast = resultSet.getString(5);
01010           int i1 = Integer.parseInt(chan1);
01011           int i2 = Integer.parseInt(chanlast);
01012 
01013           if(nameHash.containsKey(defect_name)) {
01014              int idefect = ((Integer)nameHash.get(defect_name)).intValue();
01015 
01016              int defCount = ((Integer)defectCount[idefect].get(test_no)).intValue();
01017              int totalDefectCount = ((Integer)totalCount.get(test_no)).intValue();
01018              String defList = (String)defectList[idefect].get(test_no);
01019              for(int j=i1;j<=i2;j++) {
01020                   if(!defList.equals("")) defList+=",";
01021                   defList += Integer.toString(j);
01022                   defCount++;
01023                   totalDefectCount++;
01024                   }
01025              defectCount[idefect].put(test_no,new Integer(defCount));
01026              defectList[idefect].put(test_no,defList);
01027              totalCount.put(test_no,new Integer(totalDefectCount));
01028 
01029              }   
01030              else System.out.println("**WARNING** Strange defect declaration for "+ser_no+" was ignored: "+defect_name);          
01031             }
01032         statement.close();
01033  
01034         for(int i=0;i<dets.size();i++) {
01035           if(i==0) {
01036             ivTable.append("<table cellspacing=5 border=1>\n");
01037             for(int j=0;j<11;j++) ivTable.append("<col width=* nowrap>\n");
01038             ivTable.append("<tr><td nowrap><b>Serial Number</b></td><td nowrap><b>Location</b></td><td nowrap><b>Date</b></td><td nowrap><b>#Defects</b></td>");
01039             for(int j=0;j<ndefectTypes;j++) {
01040                     if(defectNames[j].equals("Oxide-Punchthrough")) ivTable.append("<td nowrap><b>Oxide-PT</b></td>");
01041                     else if(defectNames[j].equals("Implant-Open")) ivTable.append("<td nowrap><b>Implant-O</b></td>");
01042                     else if(defectNames[j].equals("Implant-Short")) ivTable.append("<td nowrap><b>Implant-S</b></td>");
01043                     else if(defectNames[j].equals("Resistor-Break")) ivTable.append("<td nowrap><b>Resistor</b></td>");
01044                     else ivTable.append("<td nowrap><b>"+defectNames[j]+"</b></td>");
01045                     }
01046              }
01047             ivTable.append("\n<tr>");
01048             theLine = new Vector();
01049             String testno = (String)dets.elementAt(i); // this contains the testno's, ordered by serial no
01050             String serialno = (String)serialNoHash.get(testno);
01051             ivTable.append("<td>"+serialno+"</td>");
01052             String locn = (String)locationHash.get(testno);
01053             if(!locn.equals("Hamamatsu") && !locn.equals("CiS")) locn = "<font color=green>"+locn+"</font>";
01054             ivTable.append("<td>"+locn+"</td>");                               // 2nd column is test location
01055             ivTable.append("<td>"+(String)dateHash.get(testno)+"</td>");       // date
01056             ivTable.append("<td>"+((Integer)totalCount.get(testno)).toString()+"</td>");  // 4th column is total # defects
01057             for(int j=0;j<ndefectTypes;j++) {
01058                 String defList = (String)defectList[j].get(testno);
01059                 if(!defList.equals("")) defList=" ("+defList+")";
01060                 ivTable.append("<td nowrap>"+((Integer)defectCount[j].get(testno)).toString()+defList+"</td>");
01061                 }
01062             ivTable.append("</tr>");
01063            }
01064       if(nCount==0) ivTable.append("No data available...");
01065       else ivTable.append("\n</table>");
01066 
01067       return ivTable.toString();
01068         }
01069 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
01070     public static String getSensorVisualTestHTMLTable(Vector snList) throws Exception {
01071       String testnoKey = "TESTNO";
01072       String snKey = "SERIALNO";
01073       String dateKey = "DATE";
01074       String locationKey = "LOCN";
01075       String flagKey = "FLAG";
01076       Hashtable testnoHash = new Hashtable();
01077       Vector testnoList = new Vector();
01078       String serialNos = (String)snList.elementAt(0);
01079       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
01080 
01081       StringBuffer ivTable = new StringBuffer("<h3>Visual Inspection Results</h3>\n");
01082 
01083      StringBuffer sqlStat = new StringBuffer("SELECT ");
01084      sqlStat.append("tests.test_no,tests.ser_no,tests.test_date,tests.locn_name,tests.problem,tests.pass");
01085      sqlStat.append(" FROM tests");
01086      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
01087      sqlStat.append(" AND tests.test_name='Visual_Inspection'");
01088      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
01089 
01090      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01091      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01092      int nCount=0;
01093      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01094           Hashtable thisHash = new Hashtable();
01095           nCount++;
01096           String testno = resultSet.getString(1);
01097           thisHash.put(snKey,resultSet.getString(2));
01098           String date = resultSet.getString(3);
01099           thisHash.put(dateKey,guiUtilities.DaveUtils.extractDate(date));
01100           thisHash.put(locationKey,"<font color=green>"+resultSet.getString(4)+"</font>");
01101           String problemFlag = resultSet.getString(5);
01102           String passFlag = resultSet.getString(6);
01103           String statusFlag; 
01104           if(passFlag.equals("YES")) {
01105              statusFlag = (problemFlag.equals("YES")) ? "<font color=red>PROBLEM</font>" : "Pass";
01106              }
01107           else statusFlag = "<font color=red>FAIL</font>";
01108           thisHash.put(flagKey,statusFlag);
01109           testnoHash.put(testno,thisHash);   
01110           testnoList.addElement(testno);  
01111 
01112             }
01113 
01114       statement.close();
01115 
01116 // now get the comments, if any
01117       String subQuery = sqlStat.toString();
01118       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("ORDER")-1);
01119       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
01120       Hashtable testImagesHash = GeneralUtilities.testImages(subQuery);
01121 
01122       StringBuffer picList = new StringBuffer("\n<h3>Image List:</h3>\n");
01123       int imageCount=0;
01124       for(int i=0;i<testnoList.size();i++) {
01125           if(i==0) {
01126             ivTable.append("<table cellspacing=5 border=1>\n");
01127             for(int j=0;j<6;j++) ivTable.append("<col width=* nowrap>\n");
01128             ivTable.append("<tr><td nowrap><b>Serial Number</b></td><td nowrap><b>Location</b></td><td nowrap><b>Date</b></td><td nowrap><b>Status</b></td><td nowrap><b>Remarks</b></td><td><b>Pictures</b></td>");           
01129             }
01130             ivTable.append("\n<tr>");
01131 
01132 
01133             String testno = (String)testnoList.elementAt(i); // this contains the testno's, ordered by serial no
01134             Hashtable tempHash = (Hashtable)testnoHash.get(testno);
01135             ivTable.append("<td>"+(String)tempHash.get(snKey)+"</td>");;                  // first column is serial number
01136             ivTable.append("<td>"+(String)tempHash.get(locationKey)+"</td>");              
01137             ivTable.append("<td>"+(String)tempHash.get(dateKey)+"</td>");                                    // 3rd column is the date
01138 
01139             ivTable.append("<td>"+(String)tempHash.get(flagKey)+"</td>");
01140             if(commentsHash.containsKey(testno)) ivTable.append("<td nowrap>"+(String)commentsHash.get(testno)+"</td>");
01141             else ivTable.append("<td></td>");
01142             if(testImagesHash.containsKey(testno)) {
01143                Vector imageList = (Vector)testImagesHash.get(testno);
01144 
01145                for(int j=0;j<imageList.size()/2; j++) {
01146                    imageCount++;
01147                    String imageCaption = (String)imageList.elementAt(2*j);  
01148                    String imageName = (String)imageList.elementAt((2*j)+1);
01149                    File theImageFile = new File(PreferencesInterface.getInstance().getPreference(PreferencesInterface.SCRATCH_DIR),imageName);
01150                    GeneralUtilities.saveImage(testno,imageName,theImageFile);
01151                    picList.append("\n<p>"+imageCaption+":");
01152                    picList.append("\n<p><img src="+imageName+">");
01153                    if(j==0) {
01154                               ivTable.append("<td nowrap>"+imageCaption+"</td></tr>");
01155                               }
01156                    else {
01157 
01158                               ivTable.append("\n<tr>");
01159                               ivTable.append("<td>"+(String)tempHash.get(snKey)+"</td>");
01160                               ivTable.append("<td></td>");
01161                               ivTable.append("<td></td>");
01162                               ivTable.append("<td></td>");
01163                               ivTable.append("<td></td>");
01164                               ivTable.append("<td nowrap>"+imageCaption+"</td>");  
01165                               ivTable.append("</tr>");                     
01166                           }
01167 
01168                       }
01169             }
01170             else ivTable.append("<td></td></tr>");
01171             }
01172       if(nCount==0) ivTable.append("No data available ...");
01173       else ivTable.append("</table>");
01174       if(imageCount>0) ivTable.append(picList);
01175       return ivTable.toString();
01176 
01177 
01178       }
01179 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
01180     public static String getImageHTMLTable(String testno) throws Exception {
01181 
01182       StringBuffer ivTable = new StringBuffer("<h3>Images</h3>\n");
01183 
01184      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01185      ResultSet resultSet = statement.executeQuery("SELECT title,name FROM test_images WHERE test_no ="+testno);
01186      Vector imageList = new Vector();
01187      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01188           String title = resultSet.getString(1);
01189           String name = resultSet.getString(2);
01190           imageList.addElement(title);
01191           imageList.addElement(name);
01192           }
01193 
01194       statement.close();
01195 
01196       if(imageList.size()==0) {
01197         ivTable.append("None uploaded.");
01198         return ivTable.toString();
01199         }
01200 
01201 
01202       for(int j=0;j<imageList.size()/2; j++) {
01203 
01204          String imageCaption = (String)imageList.elementAt(2*j);  
01205          String imageName = (String)imageList.elementAt((2*j)+1);
01206          File theImageFile = new File(PreferencesInterface.getInstance().getPreference(PreferencesInterface.SCRATCH_DIR),imageName);
01207          GeneralUtilities.saveImage(testno,imageName,theImageFile);
01208          ivTable.append("\n<p>"+imageCaption+":");
01209          ivTable.append("\n<p><img src="+imageName+">");
01210          }
01211  
01212       return ivTable.toString();
01213 
01214 
01215       }
01216 
01217 //***********************************************************************************
01218    public static String getHTMLModuleSummaryData(String ref) throws Exception {
01219 
01220       fillHashes();
01221 
01222       String location=null;
01223       String date=null;
01224       boolean isWarm=false;
01225       boolean isCold=false;
01226       
01227       String[] info = ref.split("__");
01228       String sn = info[0];
01229       System.out.println("Downloading full sctdaq report for "+sn+". Be patient...");
01230       if(info.length==4) {
01231         location = info[1];
01232         date = info[2];
01233         isWarm = (info[3].equals("Warm"));
01234         isCold = (info[3].equals("Cold"));
01235         }
01236 
01237       SCTDBInterface db = SCTDBInterface.getInstance();
01238       StringBuffer testnames = new StringBuffer(" AND (tests.test_name LIKE 'Hyb%' OR tests.test_name LIKE 'DetModIV')");
01239       if(location!=null && date!=null) testnames.append(" AND tests.locn_name='"+location+"' AND tests.test_date='"+date+"'");
01240       if(isWarm) testnames.append(" AND sct_tstdcsinfo.t0>10 AND sct_tstdcsinfo.test_no=tests.test_no");
01241       else if(isCold) testnames.append(" AND sct_tstdcsinfo.t0<=10 AND sct_tstdcsinfo.test_no=tests.test_no");
01242       else testnames.append(" AND sct_tstdcsinfo.test_no=tests.test_no");
01243       StringBuffer genTable = new StringBuffer("<h3>Test Data</h3>\n");
01244 // first look for defects
01245       StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,defects.CHAN_1ST,defects.CHAN_LAST FROM tests,DEFECTS,sct_tstdcsinfo");
01246       sqlStat.append(" WHERE tests.test_no=defects.test_no AND tests.ser_no="+sn);
01247       sqlStat.append(testnames);
01248 
01249 // submit query
01250      Statement statement = db.connection.createStatement();
01251     if(DEBUG) System.out.println(sqlStat.toString());
01252      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01253 
01254 // now get the data
01255      Hashtable defectsHash = new Hashtable();
01256      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01257           String thisTestNo = resultSet.getString(1);
01258           int n1 = Integer.parseInt(resultSet.getString(2));
01259           int n2 = Integer.parseInt(resultSet.getString(3));
01260           int ntotal=0;
01261           for(int i=n1;i<=n2;i++) ntotal++;
01262           if(defectsHash.containsKey(thisTestNo)) {
01263               String thisTotal = (String)defectsHash.get(thisTestNo);
01264               int ntot = Integer.parseInt(thisTotal);
01265               ntot+=ntotal;
01266               defectsHash.put(thisTestNo,(String)Integer.toString(ntot));
01267               }
01268           else defectsHash.put(thisTestNo,(String)Integer.toString(ntotal));
01269          }
01270       statement.close();
01271 // now look for raw data files
01272       sqlStat = new StringBuffer("SELECT tests.test_no,tests.test_name,test_rawdata.filename FROM tests,test_rawdata,sct_tstdcsinfo");
01273       sqlStat.append(" WHERE tests.test_no=test_rawdata.test_no AND tests.ser_no="+sn);
01274       sqlStat.append(testnames);
01275  
01276 // submit query
01277      statement = db.connection.createStatement();
01278 //    System.out.println("Interrogating raw_data table ...");
01279     if(DEBUG) System.out.println(sqlStat.toString());
01280      resultSet = statement.executeQuery(sqlStat.toString());
01281 // now get the raw data
01282      Hashtable rawDataHash = new Hashtable();
01283      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01284           String thisTestNo = resultSet.getString(1);
01285           String testname = resultSet.getString(2);
01286           String thisFilename = resultSet.getString(3);
01287           String linkName = "Raw Data";
01288           if(testname.equals("Hyb3PGain") || testname.equals("HybRC")) linkName="RC";
01289           if(testname.equals("HybTrim")) linkName = "Trim/Mask";
01290           String link="Type"+guiUtilities.HTMLViewer.RAWDATA+"&ref="+thisTestNo;
01291           if(rawDataHash.containsKey(thisTestNo)) {
01292               String thisLink = (String)rawDataHash.get(thisTestNo);
01293               thisLink += "<br><a href="+link+">"+linkName+"</a>";
01294               rawDataHash.put(thisTestNo,thisLink);
01295               }
01296           else rawDataHash.put(thisTestNo,"<a href="+link+">"+linkName+"</a>");
01297          }
01298       statement.close();
01299 // now look for plots
01300 
01301       sqlStat = new StringBuffer("SELECT tests.test_no,tests.ser_no,web_links.web_link_desc,web_links.url FROM tests,web_links,sct_tstdcsinfo");
01302       sqlStat.append(" WHERE tests.test_no=web_links.test_no AND tests.ser_no="+sn);
01303       sqlStat.append(testnames);
01304  
01305 // submit query
01306      statement = db.connection.createStatement();
01307     if(DEBUG) System.out.println(sqlStat.toString());
01308      resultSet = statement.executeQuery(sqlStat.toString());
01309 // now get the raw data
01310      Hashtable webLinkHash = new Hashtable();
01311      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01312           String thisTestNo = resultSet.getString(1);
01313           String thisSN = resultSet.getString(2);
01314           String urlDescription = resultSet.getString(3);
01315           String thisURLlink = resultSet.getString(4);
01316           boolean isPostscript = (thisURLlink.endsWith(".ps") || thisURLlink.endsWith(".ps.gz"));
01317           if(thisURLlink.indexOf("http://hepunx.rl.ac.uk/atlassct/cgibin/getfile.pl?file=")!=-1) thisURLlink+="&module="+thisSN;
01318           if(isPostscript) thisURLlink= "Type"+guiUtilities.HTMLViewer.URLTOPOSTSCRIPT+"&ref="+thisURLlink;
01319           if(webLinkHash.containsKey(thisTestNo)) {
01320               String thisLink = (String)webLinkHash.get(thisTestNo);
01321               thisLink += "<br><a href="+thisURLlink+">"+urlDescription+"</a>";
01322               webLinkHash.put(thisTestNo,thisLink);
01323               }
01324           else webLinkHash.put(thisTestNo,"<a href="+thisURLlink+">"+urlDescription+"</a>");
01325          }
01326       statement.close();
01327 // look for trim ranges
01328 
01329       sqlStat = new StringBuffer("SELECT tests.test_no,tr_type");
01330       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"tr_ntrim");
01331       sqlStat.append(" FROM tests,sct_tsthybtrim,sct_tstdcsinfo");
01332       sqlStat.append(" WHERE tests.test_no=sct_tsthybtrim.test_no AND tests.ser_no="+sn);
01333       sqlStat.append(" AND tests.test_name LIKE 'HybTrim'");
01334       sqlStat.append(testnames);
01335  
01336 // submit query
01337      statement = db.connection.createStatement();
01338     if(DEBUG) System.out.println(sqlStat.toString());
01339      resultSet = statement.executeQuery(sqlStat.toString());
01340 // now get the raw data
01341      Hashtable trimRangeHash = new Hashtable();
01342      Hashtable commentsHash = new Hashtable();
01343      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01344           String thisTestNo = resultSet.getString(1);
01345           String theRange = resultSet.getString(2);
01346           trimRangeHash.put(thisTestNo,theRange);
01347           int nMasked=0;
01348           for(int i=0;i<chipDBnames.length;i++) {
01349               String ntrim = resultSet.getString(3+i);
01350               int itrim = Integer.parseInt(ntrim);
01351               nMasked += (128-itrim);
01352               }
01353            if(nMasked>0) commentsHash.put(thisTestNo,Integer.toString(nMasked)+" channels masked");
01354          }
01355       statement.close();
01356 // look for strobe delays
01357 
01358       sqlStat = new StringBuffer("SELECT tests.test_no");
01359       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"DELAY");
01360       sqlStat.append(" FROM tests,sct_tsthybdelay,sct_tstdcsinfo");
01361       sqlStat.append(" WHERE tests.test_no=sct_tsthybdelay.test_no AND tests.ser_no="+sn);
01362       sqlStat.append(" AND tests.test_name LIKE 'HybDelay'");
01363       sqlStat.append(testnames);
01364  
01365 // submit query
01366      statement = db.connection.createStatement();
01367     if(DEBUG) System.out.println(sqlStat.toString());
01368      resultSet = statement.executeQuery(sqlStat.toString());
01369 // now get the raw data
01370 
01371      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01372           String thisTestNo = resultSet.getString(1);
01373           int strobeLow=1000;
01374           int strobeHigh=0;
01375           for(int i=0;i<chipDBnames.length;i++) {
01376               String nStrobe = resultSet.getString(2+i);
01377               int iStrobe = Integer.parseInt(nStrobe);
01378               if(iStrobe>strobeHigh) strobeHigh=iStrobe;
01379               if(iStrobe<strobeLow) strobeLow=iStrobe;
01380               }
01381           commentsHash.put(thisTestNo,"Delay from "+strobeLow+" to "+strobeHigh);
01382          }
01383       statement.close();
01384 // look for RC data
01385 
01386       sqlStat = new StringBuffer("SELECT tests.test_no");
01387       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"RC_MN_GAIN");
01388       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"RC_MN_ENC");
01389       sqlStat.append(" FROM tests,sct_tsthybrc,sct_tstdcsinfo");
01390       sqlStat.append(" WHERE tests.test_no=sct_tsthybrc.test_no AND tests.ser_no="+sn);
01391 //      sqlStat.append(" AND (tests.test_name LIKE 'Hyb3PGain' OR tests.test_name LIKE 'HybRC')");
01392       sqlStat.append(testnames);
01393  
01394 // submit query
01395      statement = db.connection.createStatement();
01396     if(DEBUG) System.out.println(sqlStat.toString());
01397      resultSet = statement.executeQuery(sqlStat.toString());
01398 // now get the raw data
01399 
01400      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01401           String thisTestNo = resultSet.getString(1);
01402           double gainLow=1000.;
01403           double gainHigh=0.;
01404           int ENCLow=99000;
01405           int ENCHigh=0;
01406           for(int i=0;i<chipDBnames.length;i++) {
01407               double iGain = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01408               if(iGain>gainHigh) gainHigh = iGain;
01409               if(iGain<gainLow) gainLow=iGain;
01410               }
01411          for(int i=0;i<chipDBnames.length;i++) {
01412               int iNoise = Integer.valueOf( resultSet.getString(14+i) ).intValue();
01413               if(iNoise>ENCHigh) ENCHigh=iNoise;
01414               if(iNoise<ENCLow) ENCLow=iNoise;
01415               }
01416          commentsHash.put(thisTestNo,"Gain from "+gainLow+" to "+gainHigh+"mV/fC<br>Noise from "+ENCLow+" to "+ENCHigh+" ENC");
01417          }
01418       statement.close();
01419 // Look for noise data
01420 
01421       sqlStat = new StringBuffer("SELECT tests.test_no");
01422       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"NO_MN_OCC");
01423       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"NO_NSE");
01424       sqlStat.append(" FROM tests,sct_tsthybnoise,sct_tstdcsinfo");
01425       sqlStat.append(" WHERE tests.test_no=sct_tsthybnoise.test_no AND tests.ser_no="+sn);
01426       sqlStat.append(" AND tests.test_name LIKE 'HybNoise'");
01427       sqlStat.append(testnames);
01428  
01429 // submit query
01430      statement = db.connection.createStatement();
01431     if(DEBUG) System.out.println(sqlStat.toString());
01432      resultSet = statement.executeQuery(sqlStat.toString());
01433 // now get the raw data
01434 
01435      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01436           String thisTestNo = resultSet.getString(1);
01437           double occLow=1000.;
01438           double occHigh=0.;
01439           int ENCLow=99000;
01440           int ENCHigh=0; 
01441           for(int i=0;i<chipDBnames.length;i++) {
01442               double iOcc = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01443               if(iOcc>occHigh) occHigh = iOcc;
01444               if(iOcc<occLow) occLow=iOcc;
01445               }
01446          for(int i=0;i<chipDBnames.length;i++) {
01447               int iNoise = Integer.valueOf( resultSet.getString(14+i) ).intValue();
01448               if(iNoise>ENCHigh) ENCHigh=iNoise;
01449               if(iNoise<ENCLow) ENCLow=iNoise;
01450               }
01451          DecimalFormat myFormatter = new DecimalFormat("0.##E0");
01452          String theOccLow = myFormatter.format(occLow);
01453          String theOccHigh = myFormatter.format(occHigh);
01454          commentsHash.put(thisTestNo,"Occupancy at 1fC from "+theOccLow+" to "+theOccHigh+"<brEstimated ENC from "+ENCLow+" to "+ENCHigh+" ENC");
01455          }
01456       statement.close();
01457 // finally.. the timewalk data
01458 
01459       sqlStat = new StringBuffer("SELECT tests.test_no");
01460       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"TW");
01461       sqlStat.append(" FROM tests,sct_tsthybTW,sct_tstdcsinfo");
01462       sqlStat.append(" WHERE tests.test_no=sct_tsthybtw.test_no AND tests.ser_no="+sn);
01463 //      sqlStat.append(" AND tests.test_name LIKE 'HybTwalk'");
01464       sqlStat.append(testnames);
01465  
01466 // submit query
01467      statement = db.connection.createStatement();
01468     if(DEBUG) System.out.println(sqlStat.toString());
01469      resultSet = statement.executeQuery(sqlStat.toString());
01470 // now get the raw data
01471      int ntw=0;
01472      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01473           String thisTestNo = resultSet.getString(1);
01474           double iTLow=1000;
01475           double iTHigh=0;
01476           ntw++;
01477           for(int i=0;i<chipDBnames.length;i++) {
01478               double iTW = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01479               if(iTW>iTHigh) iTHigh=iTW;
01480               if(iTW<iTLow) iTLow=iTW;
01481               }
01482          commentsHash.put(thisTestNo,"Timewalk from "+iTLow+" to "+iTHigh+" ns");
01483          }
01484       statement.close();
01485 
01486 // now the actual test data
01487       System.out.println("Retrieved all data, now compiling list...");
01488       sqlStat = new StringBuffer("SELECT tests.test_no,tests.test_name,tests.test_date,tests.locn_name,tests.pass,tests.problem,sct_tstdcsinfo.t0,sct_tstdcsinfo.t1");
01489       sqlStat.append(" FROM tests,sct_tstdcsinfo WHERE tests.test_no=sct_tstdcsinfo.test_no AND tests.ser_no="+sn);
01490       sqlStat.append(testnames);
01491       sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
01492 // submit query
01493      statement = db.connection.createStatement();
01494 //     System.out.println(sqlStat.toString());
01495      resultSet = statement.executeQuery(sqlStat.toString());
01496      int nCount=0;
01497 // now get the data
01498      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01499         if(nCount==0) {
01500           genTable.append("<table cellspacing=5 border=1>\n");
01501           for(int i=0;i<10;i++) genTable.append("<col width=*>\n");
01502           genTable.append("<tr><td valign=top align=left><b>Test</b></td><td valign=top align=left><b>Date</b></td><td valign=top align=left><b>Location</b></td><td valign=top align=left><b>Status</b></td><td valign=top align=left><b>T0</b></td><td valign=top align=left><b>T1</b></td><td valign=top align=left><b>Comments</b></td><td valign=top align=left><b>Summary</b></td><td valign=top align=left><b>Raw Data</b></td><td valign=top align=left><b>Plots</b></td></tr>\n");
01503           }
01504         String thisTestNo = resultSet.getString(1);
01505         String thisTestName = resultSet.getString(2);
01506         String colTestName = sctdaqTestNameHash.containsKey(thisTestName) ? (String)sctdaqTestNameHash.get(thisTestName) : thisTestName;
01507         if(trimRangeHash.containsKey(thisTestNo)) {
01508              colTestName += "Range "+(String)trimRangeHash.get(thisTestNo);
01509              }
01510         String thisDate = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
01511         String thisLocation = resultSet.getString(4);
01512         String passFlag = resultSet.getString(5);
01513         String problemFlag = resultSet.getString(6);
01514         String statusFlag="<font color=red>FAIL</font>";
01515         if(passFlag.equals("YES")) {
01516              statusFlag = problemFlag.equals("YES") ? "Problem" : "<font color=green>Pass</font>";
01517              } 
01518         String t0 = resultSet.getString(7);
01519         String t1 = resultSet.getString(8);
01520         String comments = "";
01521 
01522         if(commentsHash.containsKey(thisTestNo)) {
01523                if(!comments.equals("")) comments += "<br>";
01524                comments += (String)commentsHash.get(thisTestNo);
01525                }
01526         if(defectsHash.containsKey(thisTestNo)) {
01527                if(!comments.equals("")) comments += "<br>";
01528                comments += "<b>"+(String)defectsHash.get(thisTestNo)+" defect(s)</b>";
01529                }
01530         else {
01531              if(!comments.equals("")) comments += "<br>";
01532              comments += "No defects";
01533              }
01534         int testType=-1;
01535         if(sctdaqTestNumberHash.containsKey(thisTestName)) testType = ((Integer)sctdaqTestNumberHash.get(thisTestName)).intValue();
01536 
01537         String linkTestName = (colTestName.indexOf("TrimRange")!=-1) ? "TrimRange" : colTestName;
01538         String reports = (testType==-1) ? "" : "<a href=\"Type"+guiUtilities.HTMLViewer.SCTDAQTESTDATA+"&ref="+thisTestNo+"__"+Integer.toString(testType)+"\">Test Report</a>";
01539         if(!sctdaqTestNameHash.containsKey(thisTestName)) reports=""; // no report for non-sctdaq tests for now
01540 //        System.out.println("reportslink="+reports);
01541         String rawData = rawDataHash.containsKey(thisTestNo) ? (String)rawDataHash.get(thisTestNo) : "";
01542         String plots = webLinkHash.containsKey(thisTestNo) ? (String)webLinkHash.get(thisTestNo) : "";
01543         genTable.append("<tr><td valign=top align=left>"+colTestName+"</td><td valign=top align=left>"+thisDate+"</td><td valign=top align=left>"+thisLocation+"</td>");
01544         genTable.append("<td valign=top align=left>"+statusFlag+"</td><td valign=top align=left>"+t0+"</td><td valign=top align=left>"+t1+"</td><td valign=top align=left>"+comments+"</td>");
01545         genTable.append("<td valign=top align=left>"+reports+"</td><td valign=top align=left>"+rawData+"</td><td valign=top align=left>"+plots+"</td></tr>\n");
01546 
01547         nCount++;  
01548         }
01549       statement.close();
01550       if(nCount==0) {genTable.append("<p>No tests found for "+sn+"\n"); return genTable.toString();}
01551       else genTable.append("</table>\n");
01552 
01553 // last but not least, the defects:
01554       genTable.append("<p><font face=Arial color=NAVY size=+1>Defects</font>\n");
01555       sqlStat = new StringBuffer("SELECT tests.test_no,tests.test_name,tests.test_date,tests.locn_name,CHAN_1ST,CHAN_LAST,DEFECT_NAME FROM DEFECTS,tests,sct_tstdcsinfo WHERE tests.test_no=defects.test_no");
01556       sqlStat.append(" AND tests.ser_no="+sn);
01557       sqlStat.append(testnames);
01558       sqlStat.append(" ORDER by defects.chan_1st,tests.test_date,tests.test_no");
01559 
01560 // submit query
01561      statement = db.connection.createStatement();
01562      if(DEBUG) System.out.println(sqlStat.toString());
01563      resultSet = statement.executeQuery(sqlStat.toString());
01564 
01565 // now get the data
01566      int ntotal=0;
01567      nCount=0;
01568      int nMaxConChannels=0;
01569      int nMaxConNonTrimChannels=0;
01570     Hashtable nonTrimDefectHash = new Hashtable();
01571      Hashtable trimDefectHash = new Hashtable();
01572      Hashtable channelHash = new Hashtable();   // key = channel no, bit0: trim test defect, bit1: non-trim test defect
01573      Vector nonTrimDefectList = new Vector();
01574      Vector trimDefectList = new Vector();
01575      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01576           String thisTestNo = resultSet.getString(1);
01577           String thisTestName = resultSet.getString(2);
01578           thisTestName = sctdaqTestNameHash.containsKey(thisTestName) ? (String)sctdaqTestNameHash.get(thisTestName) : thisTestName;
01579           if(trimRangeHash.containsKey(thisTestNo)) {
01580              thisTestName += "Range "+(String)trimRangeHash.get(thisTestNo);
01581              }
01582           boolean isTrimTest = (thisTestName.indexOf("Trim")!=-1);
01583           String testDate = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
01584           String locn = resultSet.getString(4);
01585           String chan1 = resultSet.getString(5);
01586           String chan2 = resultSet.getString(6);
01587           int n1 = Integer.parseInt(chan1);
01588           int n2 = Integer.parseInt(resultSet.getString(6));
01589           String defectname = resultSet.getString(7);
01590 
01591           int iDiff = n2-n1;
01592           String defectChannel = (iDiff>0) ? chan1+"-"+chan2 : chan1;
01593           String thisDefectInfo = defectname+" ("+thisTestName+" at "+locn+" on "+testDate+")";
01594 
01595           for(int i=n1;i<=n2;i++) {
01596               String thisChannel = Integer.toString(i);
01597               if(!channelHash.containsKey(thisChannel)) {
01598                     int status= (isTrimTest) ? 1 : 2;
01599                     channelHash.put(thisChannel, new Integer(status));
01600                     }
01601               else {
01602                    Integer theStatus = (Integer)channelHash.get(thisChannel);
01603                    int status = theStatus.intValue();
01604                    if(isTrimTest) status |=1;
01605                    else status |= 2;
01606                    channelHash.put(thisChannel,new Integer(status));
01607                    }
01608               }
01609            if(iDiff>0) {
01610              iDiff++;
01611              nMaxConChannels = iDiff>nMaxConChannels ? iDiff : nMaxConChannels;
01612              nMaxConNonTrimChannels = (iDiff>nMaxConNonTrimChannels && !isTrimTest) ? iDiff : nMaxConNonTrimChannels;
01613              }
01614 
01615 // Non-Trim defects
01616           if(thisTestName.indexOf("Trim")==-1) {
01617              if(nonTrimDefectHash.containsKey(defectChannel)) {
01618                Vector thisDefectVector = (Vector)nonTrimDefectHash.get(defectChannel);
01619                if(!thisDefectVector.contains((String)thisDefectInfo)) thisDefectVector.addElement(thisDefectInfo);
01620                nonTrimDefectHash.put(defectChannel,(Vector)thisDefectVector);               
01621                }
01622              else {
01623                nonTrimDefectList.addElement(defectChannel);
01624                Vector thisDefectVector = new Vector();
01625                thisDefectVector.addElement(thisDefectInfo);
01626                nonTrimDefectHash.put(defectChannel,(Vector)thisDefectVector);
01627                }
01628              }
01629 // Trim defects
01630           else {
01631              if(trimDefectHash.containsKey(defectChannel)) {
01632                Vector thisDefectVector = (Vector)trimDefectHash.get(defectChannel);
01633                if(!thisDefectVector.contains((String)thisDefectInfo)) thisDefectVector.addElement(thisDefectInfo);
01634                trimDefectHash.put(defectChannel,(Vector)thisDefectVector);               
01635                }
01636              else {
01637                trimDefectList.addElement(defectChannel);
01638                Vector thisDefectVector = new Vector();
01639                thisDefectVector.addElement(thisDefectInfo);
01640                trimDefectHash.put(defectChannel,(Vector)thisDefectVector);
01641                }
01642            }
01643         }
01644       statement.close();
01645 
01646 // now generate the html tables
01647 // start with statistics
01648      int nDefectCount=0;
01649      int nTrimDefectCount=0;
01650      int nNonTrimDefectCount=0;
01651      int nBothCount=0;
01652 //
01653  for (Enumeration e = channelHash.elements() ; e.hasMoreElements() ;) {
01654          Integer theStatus = (Integer)e.nextElement();
01655          int status = theStatus.intValue();
01656          if(status>0) nDefectCount++;
01657          if((status & 1)>0) nTrimDefectCount++;
01658          if((status & 2)>0) nNonTrimDefectCount++;
01659          if((status & 3)==3) nBothCount++;
01660           }
01661         genTable.append("<br><br><b>Statistics</b>\n");
01662 //        genTable.append("<br>Found "+channelHash.size()+" defects containing "+nDefectCount+" channels.<br>");
01663         genTable.append("<br><table cellspacing=5 border=1>\n");
01664         genTable.append("<col width=*><col width=*>\n");
01665         genTable.append("<tr><td align=left>Channels with any defect(s)</td><td align=left>"+nDefectCount+"</td></tr>\n");
01666         genTable.append("<tr><td align=left>Channels with non-trim defect(s)</td><td align=left>"+nNonTrimDefectCount+"</td></tr>\n");
01667         genTable.append("<tr><td align=left>Channels with trim defect(s)</td><td align=left>"+nTrimDefectCount+"</td></tr>\n");
01668         genTable.append("<tr><td align=left>Channels with non-trim and trim defect(s)</td><td align=left>"+nBothCount+"</td></tr>\n");
01669         genTable.append("<tr><td align=left>Max consecutive bad channels (non-trim defects only)</td><td align=left>"+nMaxConNonTrimChannels+"</td></tr>\n");
01670         genTable.append("<tr><td align=left>Max consecutive bad channels (any defect)</td><td align=left>"+nMaxConChannels+"</td></tr>\n");
01671         genTable.append("</table>");
01672 // then list the non-trim defects         
01673         genTable.append("<br>");
01674         genTable.append("<br><b>Non-Trim Defects</b>");
01675         if(nonTrimDefectList.size()==0) genTable.append("<br>No defective channels");
01676         else {
01677             genTable.append("<table cellspacing=5 border=1>\n");
01678             genTable.append("<col width=*><col width=*>\n");
01679             genTable.append("<tr><td align=left><b>Channel(s)</b></td><td align=left><b>Non-Trim Defects</b></td></tr>");
01680             for(int i=0;i<nonTrimDefectList.size();i++) {
01681                String thisChan = (String)nonTrimDefectList.elementAt(i);
01682                Vector theList = (Vector)nonTrimDefectHash.get(thisChan);
01683                genTable.append("<tr><td align=left>"+thisChan+"</td><td align=left>");
01684                for(int j=0;j<theList.size();j++) {
01685                    if(j>0) genTable.append("<br>");
01686                    genTable.append((String)theList.elementAt(j));
01687                    }
01688                genTable.append("</td></tr>");
01689                }
01690             genTable.append("</table>");
01691             }
01692 // and finally the trim defects
01693         genTable.append("<br>");
01694         genTable.append("<br><b>Trim Defects</b>");
01695         if(trimDefectList.size()==0) genTable.append("<br>No defective channels");
01696         else {
01697             genTable.append("<table cellspacing=5 border=1>\n");
01698             genTable.append("<col width=*><col width=*>\n");
01699             genTable.append("<tr><td align=left><b>Channel(s)</b></td><td align=left><b>Trim Defects</b></td></tr>");
01700             for(int i=0;i<trimDefectList.size();i++) {
01701                String thisChan = (String)trimDefectList.elementAt(i);
01702                Vector theList = (Vector)trimDefectHash.get(thisChan);
01703                genTable.append("<tr><td align=left>"+thisChan+"</td><td align=left>");
01704                for(int j=0;j<theList.size();j++) {
01705                    if(j>0) genTable.append("<br>");
01706                    genTable.append((String)theList.elementAt(j));
01707                    }
01708                genTable.append("</td></tr>");
01709                }
01710             genTable.append("</table><br>");
01711             }
01712 
01713       return genTable.toString();
01714       }
01715 
01716 // ******************************************************************************************************
01717     public static String createVisualTestTable(String serno, String itemType) throws Exception {
01718       Hashtable testnoHash = new Hashtable();
01719       Vector testnoList = new Vector();
01720       Vector itemList = new Vector();
01721       Vector theLine = new Vector();
01722       String testnoKey = "TESTNO";
01723       String snKey = "SERIALNO";
01724       String dateKey = "DATE";
01725       String locationKey = "LOCN";
01726       String flagKey = "FLAG";
01727 
01728       StringBuffer genTable = new StringBuffer("<h3>Visual Inspections of "+itemType+"</h3>");
01729 
01730       SCTDBInterface db = SCTDBInterface.getInstance();
01731       Statement statement = db.connection.createStatement();
01732      StringBuffer sqlStat = new StringBuffer("SELECT ");
01733      sqlStat.append("tests.test_no,tests.ser_no,tests.test_date,tests.locn_name,tests.problem,tests.pass");
01734      sqlStat.append(" FROM tests");
01735      sqlStat.append(" WHERE tests.ser_no = "+serno);
01736      sqlStat.append(" AND tests.test_name='Visual_Inspection'");
01737      sqlStat.append(" ORDER BY tests.test_date, tests.test_no");
01738 
01739 
01740      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01741      int recordCount=0;
01742      Vector testNumberList = new Vector();
01743      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01744           Hashtable thisHash = new Hashtable();
01745           recordCount++;
01746 //          if(recordCount%100 == 0) System.out.println("Retrieved "+recordCount+" records so far...");
01747           String testno = resultSet.getString(1);
01748           thisHash.put(snKey,resultSet.getString(2));
01749           String date = resultSet.getString(3);
01750           thisHash.put(dateKey,guiUtilities.DaveUtils.extractDate(date));
01751           thisHash.put(locationKey,resultSet.getString(4));
01752           String problemFlag = resultSet.getString(5);
01753           String passFlag = resultSet.getString(6);
01754           String statusFlag; 
01755           if(passFlag.equals("YES")) {
01756              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Ok";
01757              }
01758           else statusFlag = "FAIL";
01759           thisHash.put(flagKey,statusFlag);
01760           testnoHash.put(testno,thisHash);   
01761           testnoList.addElement(testno);  
01762 
01763             }
01764 //      System.out.println("Retrieved "+recordCount+" records in total.");
01765       statement.close();
01766       if(recordCount==0) {
01767           genTable.append("None uploaded");
01768           return genTable.toString();
01769           }
01770 
01771 // now get the comments, if any
01772       String subQuery = sqlStat.toString();
01773       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("ORDER")-1);
01774       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
01775       Hashtable testImagesHash = GeneralUtilities.testImages(subQuery);
01776 
01777       genTable.append("<table border=1>\n");
01778       genTable.append("<tr><td>Date</td><td>Location</td><td>Status</td><td>Comments</td><td>Images</td></tr>\n");
01779 
01780       for(int i=0;i<testnoList.size();i++) {
01781             genTable.append("<tr>");
01782             String testno = (String)testnoList.elementAt(i); // this contains the testno's, ordered by serial no
01783             Hashtable tempHash = (Hashtable)testnoHash.get(testno);
01784 
01785             genTable.append("<td>"+tempHash.get(dateKey)+"</td>");                                    // 2nd column is the date
01786             genTable.append("<td>"+tempHash.get(locationKey)+"</td>");              
01787             genTable.append("<td>"+tempHash.get(flagKey)+"</td>");
01788             if(commentsHash.containsKey(testno)) genTable.append("<td>"+commentsHash.get(testno)+"</td>");
01789             else genTable.append("<td>None</td>");
01790             
01791             String ImageTitle = "Visual Inspection of "+serno+" at "+tempHash.get(locationKey)+" on "+tempHash.get(dateKey);
01792             if(testImagesHash.containsKey(testno)) {
01793                Vector imageList = (Vector)testImagesHash.get(testno);
01794                genTable.append("<td>");
01795                for(int j=0;j<imageList.size(); j++) {
01796                    if(j%2 !=0) continue;
01797                    if(j>0) genTable.append("<br>");
01798                    genTable.append("<a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDBIMAGE)+"&ref="+testno+ImageTitle+"\">"+(String)imageList.elementAt(j)+"</a>");
01799 //                   genTable.append((String)imageList.elementAt(j));
01800                    }
01801                genTable.append("</td>");
01802              }
01803              else genTable.append("<td></td>");
01804              genTable.append("</tr>\n");
01805              }
01806        genTable.append("</table>");
01807        return genTable.toString();
01808 
01809 
01810       }
01811 // ******************************************************************************************************
01812     public static String createModuleEvaluationTable(String serno) throws Exception {
01813       Hashtable testnoHash = new Hashtable();
01814       Vector testnoList = new Vector();
01815       Vector itemList = new Vector();
01816       Vector theLine = new Vector();
01817       String testnoKey = "TESTNO";
01818       String snKey = "SERIALNO";
01819       String dateKey = "DATE";
01820       String locationKey = "LOCN";
01821       String passKey = "PASS";
01822       String problemKey = "PROBLEM";
01823 
01824       StringBuffer genTable = new StringBuffer("<h3>Module Evaluation Data</h3>");
01825 
01826       SCTDBInterface db = SCTDBInterface.getInstance();
01827       Statement statement = db.connection.createStatement();
01828      StringBuffer sqlStat = new StringBuffer("SELECT ");
01829      sqlStat.append("tests.test_no,tests.ser_no,tests.test_date,tests.locn_name,tests.problem,tests.pass");
01830      sqlStat.append(" FROM tests");
01831      sqlStat.append(" WHERE tests.ser_no = "+serno);
01832      sqlStat.append(" AND tests.test_name='ModEvaluation'");
01833      sqlStat.append(" ORDER BY tests.test_date, tests.test_no");
01834 
01835 
01836      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01837      int recordCount=0;
01838      Vector testNumberList = new Vector();
01839      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01840           Hashtable thisHash = new Hashtable();
01841           recordCount++;
01842 //          if(recordCount%100 == 0) System.out.println("Retrieved "+recordCount+" records so far...");
01843           String testno = resultSet.getString(1);
01844           thisHash.put(snKey,resultSet.getString(2));
01845           String date = resultSet.getString(3);
01846           thisHash.put(dateKey,guiUtilities.DaveUtils.extractDate(date));
01847           thisHash.put(locationKey,resultSet.getString(4));
01848           thisHash.put(problemKey,resultSet.getString(5));
01849           thisHash.put(passKey,resultSet.getString(6));
01850           testnoHash.put(testno,thisHash);   
01851           testnoList.addElement(testno);
01852 
01853             }
01854 //      System.out.println("Retrieved "+recordCount+" records in total.");
01855       statement.close();
01856       if(recordCount==0) {
01857           genTable.append("None uploaded");
01858           return genTable.toString();
01859           }
01860 
01861 // now get the comments, if any
01862       String subQuery = sqlStat.toString();
01863       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("ORDER")-1);
01864       Hashtable commentsHash = GeneralUtilities.testComments(subQuery,true);
01865       Hashtable testImagesHash = GeneralUtilities.testImages(subQuery);
01866 
01867       genTable.append("<table border=1>\n");
01868       genTable.append("<tr><td>Date</td><td>Location</td><td>Pass</td><td>Problem</td><td>Comments</td><td>Images</td></tr>\n");
01869 
01870       for(int i=0;i<testnoList.size();i++) {
01871             genTable.append("<tr>");
01872             String testno = (String)testnoList.elementAt(i); // this contains the testno's, ordered by serial no
01873             Hashtable tempHash = (Hashtable)testnoHash.get(testno);
01874 
01875             genTable.append("<td>"+tempHash.get(dateKey)+"</td>");                                    // 2nd column is the date
01876             genTable.append("<td>"+tempHash.get(locationKey)+"</td>");
01877             genTable.append("<td>"+tempHash.get(passKey)+"</td>");
01878             genTable.append("<td>"+tempHash.get(problemKey)+"</td>");
01879             if(commentsHash.containsKey(testno)) genTable.append("<td>"+commentsHash.get(testno)+"</td>");
01880             else genTable.append("<td>None</td>");
01881 
01882             String ImageTitle = "Visual Inspection of "+serno+" at "+tempHash.get(locationKey)+" on "+tempHash.get(dateKey);
01883             if(testImagesHash.containsKey(testno)) {
01884                Vector imageList = (Vector)testImagesHash.get(testno);
01885                genTable.append("<td>");
01886                for(int j=0;j<imageList.size(); j++) {
01887                    if(j%2 !=0) continue;
01888                    if(j>0) genTable.append("<br>");
01889                    genTable.append("<a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDBIMAGE)+"&ref="+testno+ImageTitle+"\">"+(String)imageList.elementAt(j)+"</a>");
01890 //                   genTable.append((String)imageList.elementAt(j));
01891                    }
01892                genTable.append("</td>");
01893              }
01894              else genTable.append("<td></td>");
01895              genTable.append("</tr>\n");
01896              }
01897        genTable.append("</table>");
01898        return genTable.toString();
01899 
01900 
01901       }
01902 
01903 // *****************************************************************************************************************
01904    public static String createASICReWorkTable(String hybridSerialNo) throws Exception {
01905 
01906       StringBuffer genTable = new StringBuffer("<h3>ASIC Replacements</h3>\n");
01907       StringBuffer sqlStat = new StringBuffer("SELECT ser_no,locn_name,disassm_date,posn FROM DISASSMLOGS where ASSM_SER_NO='"+hybridSerialNo+"'");
01908       sqlStat.append(" AND ser_no NOT IN (SELECT ser_no FROM ASSM_ITEMS where assm_ser_no="+hybridSerialNo+")");
01909       sqlStat.append(" ORDER BY DISASSM_DATE");
01910 
01911 // submit query
01912      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01913      if(DEBUG) System.out.println(sqlStat.toString());
01914      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01915      int recordCount=0;
01916 
01917 // now get the data
01918      int ntotal=0;
01919      int nCount=0;
01920      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01921         if(nCount==0) {
01922           genTable.append("<table cellspacing=5 border=1>\n");
01923           for(int i=0;i<4;i++) genTable.append("<col width=*>\n");
01924           genTable.append("<tr><td valign=top align=left><b>Serial No</b></td><td valign=top align=left><b>Location</b></td><td valign=top align=left><b>Date</b></td><td valign=top align=left><b>Position</b></td></tr>\n");
01925           }
01926         nCount++;
01927         genTable.append("<tr><td>"+resultSet.getString(1)+"</td><td>"+resultSet.getString(2)+"</td><td>"+guiUtilities.DaveUtils.extractDate(resultSet.getString(3))+"</td><td>"+resultSet.getString(4)+"</td></tr>\n");
01928         }
01929       statement.close();
01930       if(nCount==0) genTable.append("None uploaded.\n");
01931       else genTable.append("</table>\n");
01932       return genTable.toString();
01933       }
01934 
01935 
01936 
01937 }

Generated on Mon Feb 6 14:12:12 2006 for SCT DAQ/DCS Software - Java by  doxygen 1.4.6