Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

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      SignoffDataInterface signoffInfo=null;
00432      if(moduleInfo.isBarrelModule()) {
00433        signoffInfo = new SignoffDataInterface(serno,"FINALSIGNOFF");
00434        html.append("<h3>Module Signoff Information</h3>");
00435        Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00436        if(signoffDataHash.size()==0) html.append("None uploaded");
00437        else {
00438           html.append("<table border=1>");
00439           int count=1;
00440           for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00441               String location  = (String)e.nextElement();    
00442               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00443               html.append("<tr><td align=right><font color=navy>Overall category:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.CATEGORY,true)+"</td></tr>");
00444               if(signoffInfo.getString(location,ModuleSignoffData.CATEGORY,true).matches("FAIL|Fail")) {
00445                 html.append("<tr><td align=right><font color=navy>Reason for FAIL:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.FAILREASON,true)+"</td></tr>");
00446                 }
00447               html.append("<tr><td align=right><font color=navy>Barrel Asignment:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.BARREL,true)+"</td></tr>");
00448               if(signoffInfo.getString(location,ModuleSignoffData.BARREL,true).matches("[56]+")) {
00449                 html.append("<tr><td align=right>Reason for B5/6:</td><td>"+signoffInfo.getString(location,ModuleSignoffData.B56REASON,true)+"</td></tr>");
00450                 }
00451               html.append("<tr><td align=right><font color=navy>Comment:</font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.COMMENT,true)+"</td></tr>");
00452               count++;
00453               }
00454               html.append("</table>");
00455           }
00456        if(!signoffInfo.qualityInfoIsPresent()) signoffInfo = new SignoffDataInterface(serno,"SIGNOFF");
00457        }
00458 
00459      html.append("<h3>Assembly Information</h3>");
00460      html.append("<table border=1>");
00461      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");
00462      for(int i=0;i<moduleParts.length;i++) {
00463        if(moduleInfo.isForwardModule() && (i==SCTDBInfo.bmBB || i==SCTDBInfo.bmSB || i==SCTDBInfo.bmHPC)) continue;
00464        String sn = moduleInfo.getSerialNo(i);
00465        String testInfo = "n/a";
00466        if(moduleInfo.isBarrelModule()) {
00467           testInfo = moduleInfo.getDataSheetTestNo(i);
00468           if(testInfo==null) testInfo="Datasheet not available";
00469           else testInfo = "<a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.DATASHEET)+"&ref="+testInfo+"\">Datasheet</a>";
00470           }
00471        html.append("<tr><td>"+moduleParts[i]+"</td><td>"+sn+"</td><td>n/a</td><td colspan=2>"+testInfo+"</td></tr>\n");
00472        }
00473      Vector sensorList = moduleInfo.getSensorList();
00474      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");
00475      else {
00476         for(int i=0;i<sensorList.size();i++) {
00477            Hashtable tempHash = (Hashtable)sensorList.elementAt(i);
00478            String thisSN=(String)tempHash.get("SERIALNO");
00479            String posn = (String)tempHash.get("POSITION");
00480            String type = "Sensor";
00481            if(moduleInfo.isForwardModule()) {
00482              if(thisSN.matches("\\d{7}03\\d{5}")) type="W12 Sensor";
00483              else if(thisSN.matches("\\d{7}04\\d{5}")) type="W21 Sensor";
00484              else if(thisSN.matches("\\d{7}05\\d{5}")) type="W22 Sensor";
00485              else if(thisSN.matches("\\d{7}06\\d{5}")) type="W31 Sensor";
00486              else if(thisSN.matches("\\d{7}07\\d{5}")) type="W32 Sensor";
00487              }
00488            String link = "<a href=Type"+Integer.toString(guiUtilities.HTMLViewer.SENSORTESTDATA)+"&ref="+thisSN+">All Test Data</a>";
00489            html.append("<tr><td>"+type+"</td><td>"+thisSN+"</td><td>"+posn+"</td><td colspan=2>"+link+"</td></tr>\n");
00490            }
00491          }
00492      Vector asicList = moduleInfo.getAsicList();
00493      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");
00494      else {
00495         for(int i=0;i<asicList.size();i++) {
00496            String thisASIC = (String)asicList.elementAt(i);
00497            String thisASICInfo = moduleInfo.getASICInfo(thisASIC);
00498            String thisASICcorrFactor = moduleInfo.getASICcorrFactor(thisASIC);
00499            html.append("<tr><td>ASIC</td><td>"+thisASIC+"</td><td>"+Integer.toString(i+1)+"</td><td>"+thisASICInfo+"</td><td>cFactor "+thisASICcorrFactor+"</td></tr>\n");
00500            }
00501         }
00502      html.append("</table>");
00503 
00504      try {
00505       String hsn = moduleInfo.getHybridSerialNo();
00506       if(hsn!=null) html.append(createASICReWorkTable(hsn));
00507      }catch(Exception e0){System.err.println("Error retrieving dissam logs: "+e0.toString());}
00508 
00509      try {
00510       html.append(createVisualTestTable(serno,"Module"));
00511       html.append(createVisualTestTable(moduleInfo.getHybridSerialNo(),"Hybrid"));
00512      }catch(Exception e){System.err.println("Error downloading visual inspection info: "+e.toString());}
00513 
00514      System.out.println("Still working...");
00515 
00516      html.append("<h3>Metrology Data</h3>");
00517      if(moduleInfo.noMetrologyTests()==0) html.append("No data uploaded.");
00518      else {
00519         html.append("<table border=1>");
00520         html.append("<tr><td>Type</td><td>Event</td><td>Status</td><td>Location</td><td>Date</td><td>Data</td></tr>\n");
00521         for(int i=0;i<moduleInfo.noMetrologyTests();i++) {
00522          MetrologyTest met = moduleInfo.getMetrologyTest(i);
00523          int linkType = (met.getType().equals("XY")) ? guiUtilities.HTMLViewer.XYMETDATA : guiUtilities.HTMLViewer.ZMETDATA;
00524          String link = "<a href=Type"+Integer.toString(linkType)+"&ref="+met.getTestNo()+"\">Datasheet</a>";
00525          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>");
00526          }
00527         html.append("</table>");
00528      }
00529 
00530      html.append("<h3>IV Data</h3>");
00531      html.append("<table border=1>");
00532      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");
00533      ModuleIVInfo ivInfo = new ModuleIVInfo(serno,sensorList);
00534      html.append("<tr><td>Sensor Sum</td><td>"+ivInfo.getOrigin()+"</td><td> - </td>");
00535      double i150sensor = ivInfo.geti150SensorCurrent();
00536      double i350sensor = ivInfo.geti350SensorCurrent();
00537      double i500sensor = ivInfo.geti500SensorCurrent();
00538      html.append("<td>"+ivFormatter.format(i150sensor)+"</td><td>"+ivFormatter.format(i350sensor)+"</td><td>"+ivFormatter.format(i500sensor)+"</td><td>"+ivInfo.getTemperatureRange()+"</td><td> - </td></tr>");
00539      for(int i=0;i<ivInfo.noModuleIVs();i++) {
00540         ModuleIV mIV = ivInfo.getModuleIV(i);
00541         html.append("<tr><td>Module</td><td>"+mIV.getLocation()+"</td><td>"+mIV.getDate()+"</td>");
00542         double i150 = mIV.geti150();
00543         if(i150==0.) html.append("<td> - </td>");
00544         else {
00545           if(i150sensor>0. && i150>(i150sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i150)+"</td>");
00546           else html.append("<td>"+ivFormatter.format(i150)+"</td>");
00547           }
00548         double i350 = mIV.geti350();
00549         if(i350==0.) html.append("<td> - </td>");
00550         else {
00551           if(i350sensor>0. && i350>(i350sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i350)+"</td>");
00552           else html.append("<td>"+ivFormatter.format(i350)+"</td>");
00553           }
00554         double i500 = mIV.geti500();
00555         if(i500==0.) html.append("<td> - </td>");
00556         else {
00557           if(i500sensor>0. && i500>(i500sensor*1.25)) html.append("<td><font color=red>"+ivFormatter.format(i500)+"</font></td>");
00558           else html.append("<td>"+ivFormatter.format(i500)+"</td>");
00559           }
00560         html.append("<td>"+mIV.getTemperature()+"</td>");
00561         String plotLink = mIV.getLink();
00562         if(plotLink==null) html.append("<td> - </td>");
00563         else {
00564           boolean isPostscript = (plotLink.endsWith(".ps") || plotLink.endsWith(".ps.gz"));
00565           String link = isPostscript ?  "Type"+Integer.toString(guiUtilities.HTMLViewer.URLTOPOSTSCRIPT)+"&ref="+plotLink : plotLink;
00566           html.append("<td><a href=\""+link+"\">Plot</a></td>");
00567           }
00568         html.append("</tr>");
00569         }
00570      html.append("</table>");
00571 // now module quality - for barrels only
00572      if(moduleInfo.isBarrelModule()) {
00573        if(signoffInfo!=null) {
00574          html.append("<h3>IV Quality Information</h3>");
00575          Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00576          if(signoffDataHash.size()==0) html.append("<p>None uploaded");
00577          else {
00578             html.append("<table border=1>");
00579             int count=1;
00580             for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00581               String location  = (String)e.nextElement();      
00582               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00583               html.append("<tr><td align=right valign=top><font color=navy>Category: </font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.IVCATEGORY,true)+"</td></tr>");
00584               html.append("<tr><td align=right valign=top><font color=navy>Comments: </font></td><td>"+signoffInfo.getString(location,ModuleSignoffData.IVCOMMENT,true)+"</td></tr>");
00585               count++;
00586               }
00587             html.append("</table>");
00588            }
00589         }
00590       }
00591 
00592      ModuleSCTDAQInfo sctdaqInfo = new ModuleSCTDAQInfo(serno);
00593      html.append("<h3>SCTDAQ Characterisations</h3>\n");
00594 
00595      if(sctdaqInfo.noTests()>0) {
00596        html.append("<table border=1>\n");
00597        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");
00598        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");
00599        for(int i=0;i<sctdaqInfo.noTests();i++) {
00600          SCTDAQCharacterisation sctdaq = sctdaqInfo.getCharacterisation(i);
00601          String temperature = (sctdaq.getTemperature()>10.) ? "Warm" : "Cold";
00602          double deltaT = sctdaq.getDeltaT();
00603          String deltaTS = new java.text.DecimalFormat("#.###").format(deltaT);
00604          String dT = (Math.abs(deltaT)>=1.) ? "<font color=red>"+deltaTS+"</font>" : deltaTS;
00605          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>");
00606          html.append("<td valign=top>"+Integer.toString(sctdaq.nDefects(2))+"</td><td valign=top>"+Integer.toString(sctdaq.nDefects(3))+"</td>");
00607          html.append("<td valign=top>"+Integer.toString(sctdaq.nDefects(0))+"</td><td valign=top>"+Integer.toString(sctdaq.nDefects(1))+"</td>");
00608          String weblink = serno+"__"+sctdaq.getLocation()+"__"+sctdaq.getDate()+"__"+temperature;
00609          html.append("<td valign=top><a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDAQTESTLIST)+"&ref="+weblink+"\">Characterisation Report</a></td>");
00610          html.append("<td valign=top>");
00611          Set failedTests = sctdaq.getFailedTests();
00612          if(failedTests.size()==0) html.append(" - </td>");
00613          else {
00614              int count=0;
00615              for (Iterator k = failedTests.iterator(); k.hasNext(); ) {
00616                          if(count>0) html.append("<br>");
00617                          html.append((String)k.next());
00618                          count++;
00619                          }
00620              html.append("</td>");
00621            }
00622          html.append("</tr>\n");
00623          }    
00624        html.append("</table>"); 
00625        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.");
00626        }
00627      else html.append("None uploaded.<br>");
00628 // now module quality - for barrels only
00629      if(moduleInfo.isBarrelModule()) {
00630 //       if(!serno.startsWith("202203302")) signoffInfo = new SignoffDataInterface(serno,"SIGNOFF");
00631        html.append("<h3>Module Quality Information</h3>");
00632        Hashtable signoffDataHash = signoffInfo.getSignoffDataHash();
00633        if(signoffDataHash.size()==0) html.append("None uploaded");
00634        else {
00635           html.append("<table border=1>");
00636           int count=1;
00637           for (java.util.Enumeration e = signoffDataHash.keys() ; e.hasMoreElements() ;) {
00638               String location  = (String)e.nextElement();      
00639               html.append("<tr><td colspan=2><font color=navy>"+Integer.toString(count)+" - "+signoffInfo.getUploaderInfo(location)+"</font></td></tr>");
00640               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>");
00641               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>");     
00642               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>");
00643               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>");
00644               count++;
00645               }
00646            html.append("</table>");
00647          }
00648       }
00649      html.append(guiUtilities.DaveUtils.getHTMLFooter());
00650      return html.toString();
00651      }
00652 //*************************************************************************
00653    public static String getSensorMfrHTMLTable(Vector snList) throws Exception {
00654 
00655       StringBuffer genTable = new StringBuffer("<h3>General Wafer Properties</h3>\n");
00656 
00657       String serialNos = (String)snList.elementAt(0);
00658       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00659 
00660       StringBuffer sqlStat = new StringBuffer("SELECT ");
00661       sqlStat.append(" tests.ser_no,substr_orient,substr_origin,thickness,i_leak_150,i_leak_350,temperature FROM tests,tstdetmfrs");
00662       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00663       sqlStat.append(" ORDER BY tests.ser_no");
00664 
00665       Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00666       ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00667       int nCount=0;
00668 
00669      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00670         if(nCount==0) {
00671           genTable.append("<table cellspacing=5 border=1>\n");
00672           for(int i=0;i<4;i++) genTable.append("<col width=*>\n");
00673           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>");
00674           }
00675         nCount++;
00676         genTable.append("<tr>");
00677         for(int i=1;i<=4;i++) genTable.append("<td>"+resultSet.getString(i)+"</td>");
00678         genTable.append("</tr>\n");
00679         }
00680       statement.close();
00681       if(nCount==0) genTable.append("<p>No data available\n");
00682       else genTable.append("</table>");
00683       return genTable.toString();
00684       }
00685 //******************************************************************************************************************
00686    public static String getSensorIVHTMLTable(Vector snList) throws Exception {
00687       SCTDBInterface db = SCTDBInterface.getInstance();
00688       Hashtable tempHash;
00689       Hashtable atlasHash = new Hashtable();
00690       Vector tempList;
00691       Vector mfrList = new Vector();
00692       StringBuffer ivTable = new StringBuffer("<h3>IV Data</h3>\n");
00693       String serialNos = (String)snList.elementAt(0);
00694       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00695 
00696       StringBuffer sqlStat = new StringBuffer("SELECT ");
00697       sqlStat.append(" tests.ser_no,tests.locn_name,tests.test_date,i_leak_150,i_leak_350,temperature FROM tests,tstdetmfrs");
00698       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00699       sqlStat.append(" ORDER BY tests.ser_no");
00700 
00701       Statement statement = db.connection.createStatement();
00702 
00703      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00704      int nCount=0;
00705 
00706      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00707         String sn = resultSet.getString(1);
00708         tempHash = new Hashtable();
00709         tempHash.put("SERIALNO",sn);
00710         tempHash.put("NAME",resultSet.getString(2));
00711         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(3)));
00712         tempHash.put("I150",resultSet.getString(4));
00713         tempHash.put("I350",resultSet.getString(5));
00714         tempHash.put("TEMP",resultSet.getString(6));
00715         tempHash.put("STATUS","Pass");
00716         tempHash.put("COMNTS","None.");
00717         mfrList.addElement(tempHash);
00718         nCount++;
00719         }
00720      statement.close();
00721 
00722      sqlStat = new StringBuffer("SELECT ");
00723      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");
00724      sqlStat.append(" FROM tests,tstdetivs");
00725      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00726      sqlStat.append(" AND tests.test_name='DetIVscan'");
00727      sqlStat.append(" AND tstdetivs.test_no=tests.test_no");
00728      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00729 
00730      statement = db.connection.createStatement();
00731      resultSet = statement.executeQuery(sqlStat.toString());
00732 
00733      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00734         tempHash = new Hashtable();
00735         String sn = resultSet.getString(2);
00736         if(atlasHash.containsKey(sn)) tempList = (Vector)atlasHash.get(sn);
00737         else tempList = new Vector();
00738         tempHash.put("TESTNO",resultSet.getString(1));
00739         tempHash.put("SERIALNO",resultSet.getString(2));
00740         tempHash.put("NAME",resultSet.getString(3));
00741         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(4)));
00742         String problemFlag = resultSet.getString(5);
00743         String passFlag = resultSet.getString(6);
00744         String statusFlag; 
00745         if(passFlag.equals("YES")) {
00746              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Pass";
00747              }
00748         else statusFlag = "FAIL";
00749         tempHash.put("STATUS",statusFlag);
00750         tempHash.put("TEMP",resultSet.getString(7));
00751         tempHash.put("I150",resultSet.getString(8));
00752         tempHash.put("I350",resultSet.getString(9));
00753         tempList.addElement(tempHash);
00754         atlasHash.put(sn,tempList);
00755         nCount++;
00756         }
00757        statement.close();
00758 
00759 // now get the comments, if any
00760       String subQuery = sqlStat.toString();
00761       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("AND tstdetivs")-1);
00762       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
00763 
00764 // Now build the html table!!!
00765       for(int i=0;i<mfrList.size();i++) {
00766         if(i==0) {
00767           ivTable.append("<table cellspacing=5 border=1>\n");
00768           for(int j=0;j<8;j++) ivTable.append("<col width=*>\n");
00769           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");
00770            }
00771         ivTable.append("<tr>");
00772         tempHash = (Hashtable)mfrList.elementAt(i);
00773         String sn = (String)tempHash.get("SERIALNO");
00774         String locn = (String)tempHash.get("NAME");
00775         String date = (String)tempHash.get("DATE");
00776         String i150 = (String)tempHash.get("I150");
00777         String i350 = (String)tempHash.get("I350");
00778         String temp = (String)tempHash.get("TEMP");
00779         String status = (String)tempHash.get("STATUS");
00780         String remarks = (String)tempHash.get("COMNTS");
00781         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");
00782         if(atlasHash.containsKey(sn)) {
00783             tempList = (Vector)atlasHash.get(sn);
00784             for(int j=0;j<tempList.size();j++) {
00785               tempHash = (Hashtable)tempList.elementAt(j);
00786               String testno = (String)tempHash.get("TESTNO");
00787               sn = (String)tempHash.get("SERIALNO");
00788               locn = "<font color=green>"+(String)tempHash.get("NAME")+"</font>";
00789               date = (String)tempHash.get("DATE");
00790               i150 = (String)tempHash.get("I150");
00791               i350 = (String)tempHash.get("I350");
00792               temp = (String)tempHash.get("TEMP");
00793               status = (String)tempHash.get("STATUS");
00794               if(!status.equals("Pass")) status = "<font color=red>"+status+"</font>";
00795               remarks="None.";
00796               if(commentsHash.containsKey(testno)) remarks = (String)commentsHash.get(testno);
00797               if(!remarks.equals("None.")) remarks = "<font color=red>"+remarks+"</font>";
00798               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");
00799               }
00800           }
00801          }
00802       if(nCount==0) ivTable.append("<p>No data available\n");
00803       else ivTable.append("</table>");
00804       return ivTable.toString();
00805       }
00806 
00807 //******************************************************************************************************************
00808    public static String getSensorDepletionHTMLTable(Vector snList) throws Exception {
00809       SCTDBInterface db = SCTDBInterface.getInstance();
00810       Hashtable tempHash;
00811       Hashtable atlasHash = new Hashtable();
00812       Vector tempList;
00813       Vector mfrList = new Vector();
00814       StringBuffer ivTable = new StringBuffer("<h3>Depletion Voltages</h3>\n");
00815       String serialNos = (String)snList.elementAt(0);
00816       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00817 
00818       StringBuffer sqlStat = new StringBuffer("SELECT ");
00819       sqlStat.append(" tests.ser_no,tests.locn_name,tests.test_date,v_dep FROM tests,tstdetmfrs");
00820       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+") AND tests.test_name='DetMfrSheet' AND tstdetmfrs.test_no=tests.test_no");
00821       sqlStat.append(" ORDER BY tests.ser_no");
00822 
00823       Statement statement = db.connection.createStatement();
00824       ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00825       int nCount=0;
00826 
00827       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00828         String sn = resultSet.getString(1);
00829         tempHash = new Hashtable();
00830         tempHash.put("SERIALNO",sn);
00831         tempHash.put("NAME",resultSet.getString(2));
00832         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(3)));
00833         tempHash.put("VDEP",resultSet.getString(4));
00834         tempHash.put("STATUS","Pass");
00835         tempHash.put("COMNTS","None.");
00836         mfrList.addElement(tempHash);
00837         nCount++;
00838         }
00839 
00840      statement.close();
00841 
00842      sqlStat = new StringBuffer("SELECT ");
00843      sqlStat.append("tests.test_no,tests.ser_no,tests.locn_name,tests.test_date,tests.problem,tests.pass,tstdetopts.v_dep");
00844      sqlStat.append(" FROM tests,tstdetopts");
00845      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00846      sqlStat.append(" AND tests.test_name='DetVDep'");
00847      sqlStat.append(" AND tstdetopts.test_no=tests.test_no");
00848      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00849      statement = db.connection.createStatement();
00850      resultSet = statement.executeQuery(sqlStat.toString());
00851 
00852      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00853         tempHash = new Hashtable();
00854         String sn = resultSet.getString(2);
00855         if(atlasHash.containsKey(sn)) tempList = (Vector)atlasHash.get(sn);
00856         else tempList = new Vector();
00857         tempHash.put("TESTNO",resultSet.getString(1));
00858         tempHash.put("SERIALNO",resultSet.getString(2));
00859         tempHash.put("NAME",resultSet.getString(3));
00860         tempHash.put("DATE",guiUtilities.DaveUtils.extractDate(resultSet.getString(4)));
00861         String problemFlag = resultSet.getString(5);
00862         String passFlag = resultSet.getString(6);
00863         String statusFlag; 
00864         if(passFlag.equals("YES")) {
00865              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Pass";
00866              }
00867         else statusFlag = "FAIL";
00868         tempHash.put("STATUS",statusFlag);
00869         tempHash.put("VDEP",resultSet.getString(7));
00870         tempList.addElement(tempHash);
00871         atlasHash.put(sn,tempList);
00872         nCount++;
00873         }
00874       statement.close();
00875 
00876 // now get the comments, if any
00877       String subQuery = sqlStat.toString();
00878       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("AND tstdetopts")-1);
00879       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
00880 
00881 // Now build the html table!!!
00882       for(int i=0;i<mfrList.size();i++) {
00883         if(i==0) {
00884           ivTable.append("<table cellspacing=5 border=1>\n");
00885           for(int j=0;j<8;j++) ivTable.append("<col width=*>\n");
00886           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");
00887            }
00888         ivTable.append("<tr>");
00889         tempHash = (Hashtable)mfrList.elementAt(i);
00890         String sn = (String)tempHash.get("SERIALNO");
00891         String locn = (String)tempHash.get("NAME");
00892         String date = (String)tempHash.get("DATE");
00893         String vdep = (String)tempHash.get("VDEP");
00894         String status = (String)tempHash.get("STATUS");
00895         String remarks = (String)tempHash.get("COMNTS");
00896         ivTable.append("<td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+vdep+"</td><td>"+status+"</td><td>"+remarks+"</td></tr>\n");
00897         if(atlasHash.containsKey(sn)) {
00898             tempList = (Vector)atlasHash.get(sn);
00899             for(int j=0;j<tempList.size();j++) {
00900               tempHash = (Hashtable)tempList.elementAt(j);
00901               String testno = (String)tempHash.get("TESTNO");
00902               sn = (String)tempHash.get("SERIALNO");
00903               locn = "<font color=green>"+(String)tempHash.get("NAME")+"</font>";
00904               date = (String)tempHash.get("DATE");
00905               vdep = (String)tempHash.get("VDEP");
00906               status = (String)tempHash.get("STATUS");
00907               if(!status.equals("Pass")) status = "<font color=red>"+status+"</font>";
00908               remarks="None.";
00909               if(commentsHash.containsKey(testno)) remarks = (String)commentsHash.get(testno);
00910               if(!remarks.equals("None.")) remarks = "<font color=red>"+remarks+"</font>";
00911               ivTable.append("<tr><td>"+sn+"</td><td>"+locn+"</td><td>"+date+"</td><td>"+vdep+"</td><td>"+status+"</td><td nowrap>"+remarks+"</td></tr>\n");
00912               }
00913           }
00914          }
00915       if(nCount==0) ivTable.append("<p>No data available\n");
00916       else ivTable.append("</table>");
00917       return ivTable.toString();
00918       }
00919 
00920 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00921       public static String getSensorDefectHTMLTable(Vector snList) throws Exception {
00922       SCTDBInterface db = SCTDBInterface.getInstance();
00923       Vector itemList = new Vector();
00924       String serialNos = (String)snList.elementAt(0);
00925       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
00926       Vector dets = new Vector();
00927       Vector theLine;
00928       String[] defectNames = {"Pinhole","Oxide-Punchthrough","Short","Open","Implant-Open","Implant-Short","Resistor-Break"};
00929       Hashtable nameHash = new Hashtable();
00930       int ndefectTypes = defectNames.length;
00931       Hashtable[] defectCount = new Hashtable[ndefectTypes];
00932       Hashtable[] defectList = new Hashtable[ndefectTypes];
00933 
00934       StringBuffer ivTable = new StringBuffer("<h3>Defects Summary</h3>\n");
00935       for(int i=0;i<ndefectTypes;i++) {
00936            nameHash.put(defectNames[i],new Integer(i));
00937            defectCount[i] = new Hashtable();
00938            defectList[i] = new Hashtable();
00939            }
00940 
00941       Hashtable totalCount = new Hashtable();
00942       Hashtable serialNoHash = new Hashtable();
00943       Hashtable dateHash = new Hashtable();
00944       Hashtable locationHash = new Hashtable();
00945 
00946       String ser_no="",test_no="";
00947       String test_date,defect_name,chan1,chanlast;
00948 
00949 
00950 // first get a list of all the tests, so that we know what detectors have zero defects..
00951       StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,tests.ser_no,tests.test_date,tests.locn_name FROM tests");
00952       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00953       sqlStat.append(" AND ( tests.test_name='DetDefect' OR tests.test_name='DetMfrSheet')");
00954 // ordering by serial number only
00955       sqlStat.append(" ORDER BY tests.ser_no,tests.test_no"); 
00956       String string1 = sqlStat.toString();
00957 
00958 
00959  //     System.out.println(string1);
00960       Statement statement = db.connection.createStatement();
00961       ResultSet resultSet = statement.executeQuery(string1);
00962       int nCount=0;
00963       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00964           nCount++;
00965           ser_no = resultSet.getString(2);
00966           test_no = resultSet.getString(1);
00967           String date = resultSet.getString(3);
00968           date = guiUtilities.DaveUtils.extractDate(date);
00969           dateHash.put(test_no,date);
00970           String location_name = resultSet.getString(4);
00971           locationHash.put(test_no,location_name);
00972           for(int i=0;i<ndefectTypes;i++) {
00973              defectCount[i].put(test_no,new Integer(0));
00974              defectList[i].put(test_no,"");
00975              }
00976           totalCount.put(test_no,new Integer(0));
00977           serialNoHash.put(test_no,ser_no);
00978           dets.addElement(test_no);
00979           }
00980       statement.close();
00981       String subQuery = string1;
00982 
00983 // need a subquery so that we are looking at the same test numbers!
00984       int in1 = subQuery.indexOf("FROM");
00985       int in2 = subQuery.indexOf("ORDER")-1;
00986       subQuery = "SELECT tests.test_no "+subQuery.substring(in1,in2);
00987 
00988       sqlStat = new StringBuffer("SELECT tests.ser_no,tests.test_no,defect_name,chan_1st,chan_last");
00989       sqlStat.append(" FROM tests,defects");
00990       sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
00991       sqlStat.append(" AND defects.test_no=tests.test_no");
00992       sqlStat.append(" AND tests.test_no IN ("+subQuery+")");     
00993       sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
00994       String string2 = sqlStat.toString();
00995 
00996       statement = db.connection.createStatement();
00997       resultSet = statement.executeQuery(string2);
00998       String olddata;
00999       for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01000           nCount++;
01001           ser_no = resultSet.getString(1);
01002           test_no = resultSet.getString(2);
01003           defect_name = resultSet.getString(3);
01004           chan1 = resultSet.getString(4);
01005           chanlast = resultSet.getString(5);
01006           int i1 = Integer.parseInt(chan1);
01007           int i2 = Integer.parseInt(chanlast);
01008 
01009           if(nameHash.containsKey(defect_name)) {
01010              int idefect = ((Integer)nameHash.get(defect_name)).intValue();
01011 
01012              int defCount = ((Integer)defectCount[idefect].get(test_no)).intValue();
01013              int totalDefectCount = ((Integer)totalCount.get(test_no)).intValue();
01014              String defList = (String)defectList[idefect].get(test_no);
01015              for(int j=i1;j<=i2;j++) {
01016                   if(!defList.equals("")) defList+=",";
01017                   defList += Integer.toString(j);
01018                   defCount++;
01019                   totalDefectCount++;
01020                   }
01021              defectCount[idefect].put(test_no,new Integer(defCount));
01022              defectList[idefect].put(test_no,defList);
01023              totalCount.put(test_no,new Integer(totalDefectCount));
01024 
01025              }   
01026              else System.out.println("**WARNING** Strange defect declaration for "+ser_no+" was ignored: "+defect_name);          
01027             }
01028         statement.close();
01029  
01030         for(int i=0;i<dets.size();i++) {
01031           if(i==0) {
01032             ivTable.append("<table cellspacing=5 border=1>\n");
01033             for(int j=0;j<11;j++) ivTable.append("<col width=* nowrap>\n");
01034             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>");
01035             for(int j=0;j<ndefectTypes;j++) {
01036                     if(defectNames[j].equals("Oxide-Punchthrough")) ivTable.append("<td nowrap><b>Oxide-PT</b></td>");
01037                     else if(defectNames[j].equals("Implant-Open")) ivTable.append("<td nowrap><b>Implant-O</b></td>");
01038                     else if(defectNames[j].equals("Implant-Short")) ivTable.append("<td nowrap><b>Implant-S</b></td>");
01039                     else if(defectNames[j].equals("Resistor-Break")) ivTable.append("<td nowrap><b>Resistor</b></td>");
01040                     else ivTable.append("<td nowrap><b>"+defectNames[j]+"</b></td>");
01041                     }
01042              }
01043             ivTable.append("\n<tr>");
01044             theLine = new Vector();
01045             String testno = (String)dets.elementAt(i); // this contains the testno's, ordered by serial no
01046             String serialno = (String)serialNoHash.get(testno);
01047             ivTable.append("<td>"+serialno+"</td>");
01048             String locn = (String)locationHash.get(testno);
01049             if(!locn.equals("Hamamatsu") && !locn.equals("CiS")) locn = "<font color=green>"+locn+"</font>";
01050             ivTable.append("<td>"+locn+"</td>");                               // 2nd column is test location
01051             ivTable.append("<td>"+(String)dateHash.get(testno)+"</td>");       // date
01052             ivTable.append("<td>"+((Integer)totalCount.get(testno)).toString()+"</td>");  // 4th column is total # defects
01053             for(int j=0;j<ndefectTypes;j++) {
01054                 String defList = (String)defectList[j].get(testno);
01055                 if(!defList.equals("")) defList=" ("+defList+")";
01056                 ivTable.append("<td nowrap>"+((Integer)defectCount[j].get(testno)).toString()+defList+"</td>");
01057                 }
01058             ivTable.append("</tr>");
01059            }
01060       if(nCount==0) ivTable.append("No data available...");
01061       else ivTable.append("\n</table>");
01062 
01063       return ivTable.toString();
01064         }
01065 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
01066     public static String getSensorVisualTestHTMLTable(Vector snList) throws Exception {
01067       String testnoKey = "TESTNO";
01068       String snKey = "SERIALNO";
01069       String dateKey = "DATE";
01070       String locationKey = "LOCN";
01071       String flagKey = "FLAG";
01072       Hashtable testnoHash = new Hashtable();
01073       Vector testnoList = new Vector();
01074       String serialNos = (String)snList.elementAt(0);
01075       for(int i=1;i<snList.size();i++) serialNos+=","+snList.elementAt(i);
01076 
01077       StringBuffer ivTable = new StringBuffer("<h3>Visual Inspection Results</h3>\n");
01078 
01079      StringBuffer sqlStat = new StringBuffer("SELECT ");
01080      sqlStat.append("tests.test_no,tests.ser_no,tests.test_date,tests.locn_name,tests.problem,tests.pass");
01081      sqlStat.append(" FROM tests");
01082      sqlStat.append(" WHERE tests.ser_no IN ("+serialNos+")");
01083      sqlStat.append(" AND tests.test_name='Visual_Inspection'");
01084      sqlStat.append(" ORDER BY tests.ser_no,tests.test_no");
01085 
01086      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01087      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01088      int nCount=0;
01089      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01090           Hashtable thisHash = new Hashtable();
01091           nCount++;
01092           String testno = resultSet.getString(1);
01093           thisHash.put(snKey,resultSet.getString(2));
01094           String date = resultSet.getString(3);
01095           thisHash.put(dateKey,guiUtilities.DaveUtils.extractDate(date));
01096           thisHash.put(locationKey,"<font color=green>"+resultSet.getString(4)+"</font>");
01097           String problemFlag = resultSet.getString(5);
01098           String passFlag = resultSet.getString(6);
01099           String statusFlag; 
01100           if(passFlag.equals("YES")) {
01101              statusFlag = (problemFlag.equals("YES")) ? "<font color=red>PROBLEM</font>" : "Pass";
01102              }
01103           else statusFlag = "<font color=red>FAIL</font>";
01104           thisHash.put(flagKey,statusFlag);
01105           testnoHash.put(testno,thisHash);   
01106           testnoList.addElement(testno);  
01107 
01108             }
01109 
01110       statement.close();
01111 
01112 // now get the comments, if any
01113       String subQuery = sqlStat.toString();
01114       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("ORDER")-1);
01115       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
01116       Hashtable testImagesHash = GeneralUtilities.testImages(subQuery);
01117 
01118       StringBuffer picList = new StringBuffer("\n<h3>Image List:</h3>\n");
01119       int imageCount=0;
01120       for(int i=0;i<testnoList.size();i++) {
01121           if(i==0) {
01122             ivTable.append("<table cellspacing=5 border=1>\n");
01123             for(int j=0;j<6;j++) ivTable.append("<col width=* nowrap>\n");
01124             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>");           
01125             }
01126             ivTable.append("\n<tr>");
01127 
01128 
01129             String testno = (String)testnoList.elementAt(i); // this contains the testno's, ordered by serial no
01130             Hashtable tempHash = (Hashtable)testnoHash.get(testno);
01131             ivTable.append("<td>"+(String)tempHash.get(snKey)+"</td>");;                  // first column is serial number
01132             ivTable.append("<td>"+(String)tempHash.get(locationKey)+"</td>");              
01133             ivTable.append("<td>"+(String)tempHash.get(dateKey)+"</td>");                                    // 3rd column is the date
01134 
01135             ivTable.append("<td>"+(String)tempHash.get(flagKey)+"</td>");
01136             if(commentsHash.containsKey(testno)) ivTable.append("<td nowrap>"+(String)commentsHash.get(testno)+"</td>");
01137             else ivTable.append("<td></td>");
01138             if(testImagesHash.containsKey(testno)) {
01139                Vector imageList = (Vector)testImagesHash.get(testno);
01140 
01141                for(int j=0;j<imageList.size()/2; j++) {
01142                    imageCount++;
01143                    String imageCaption = (String)imageList.elementAt(2*j);  
01144                    String imageName = (String)imageList.elementAt((2*j)+1);
01145                    File theImageFile = new File(PreferencesInterface.getInstance().getPreference(PreferencesInterface.SCRATCH_DIR),imageName);
01146                    GeneralUtilities.saveImage(testno,imageName,theImageFile);
01147                    picList.append("\n<p>"+imageCaption+":");
01148                    picList.append("\n<p><img src="+imageName+">");
01149                    if(j==0) {
01150                               ivTable.append("<td nowrap>"+imageCaption+"</td></tr>");
01151                               }
01152                    else {
01153 
01154                               ivTable.append("\n<tr>");
01155                               ivTable.append("<td>"+(String)tempHash.get(snKey)+"</td>");
01156                               ivTable.append("<td></td>");
01157                               ivTable.append("<td></td>");
01158                               ivTable.append("<td></td>");
01159                               ivTable.append("<td></td>");
01160                               ivTable.append("<td nowrap>"+imageCaption+"</td>");  
01161                               ivTable.append("</tr>");                     
01162                           }
01163 
01164                       }
01165             }
01166             else ivTable.append("<td></td></tr>");
01167             }
01168       if(nCount==0) ivTable.append("No data available ...");
01169       else ivTable.append("</table>");
01170       if(imageCount>0) ivTable.append(picList);
01171       return ivTable.toString();
01172 
01173 
01174       }
01175 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
01176     public static String getImageHTMLTable(String testno) throws Exception {
01177 
01178       StringBuffer ivTable = new StringBuffer("<h3>Images</h3>\n");
01179 
01180      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01181      ResultSet resultSet = statement.executeQuery("SELECT title,name FROM test_images WHERE test_no ="+testno);
01182      Vector imageList = new Vector();
01183      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01184           String title = resultSet.getString(1);
01185           String name = resultSet.getString(2);
01186           imageList.addElement(title);
01187           imageList.addElement(name);
01188           }
01189 
01190       statement.close();
01191 
01192       if(imageList.size()==0) {
01193         ivTable.append("None uploaded.");
01194         return ivTable.toString();
01195         }
01196 
01197 
01198       for(int j=0;j<imageList.size()/2; j++) {
01199 
01200          String imageCaption = (String)imageList.elementAt(2*j);  
01201          String imageName = (String)imageList.elementAt((2*j)+1);
01202          File theImageFile = new File(PreferencesInterface.getInstance().getPreference(PreferencesInterface.SCRATCH_DIR),imageName);
01203          GeneralUtilities.saveImage(testno,imageName,theImageFile);
01204          ivTable.append("\n<p>"+imageCaption+":");
01205          ivTable.append("\n<p><img src="+imageName+">");
01206          }
01207  
01208       return ivTable.toString();
01209 
01210 
01211       }
01212 
01213 //***********************************************************************************
01214    public static String getHTMLModuleSummaryData(String ref) throws Exception {
01215 
01216       fillHashes();
01217 
01218       String location=null;
01219       String date=null;
01220       boolean isWarm=false;
01221       boolean isCold=false;
01222       
01223       String[] info = ref.split("__");
01224       String sn = info[0];
01225       System.out.println("Downloading full sctdaq report for "+sn+". Be patient...");
01226       if(info.length==4) {
01227         location = info[1];
01228         date = info[2];
01229         isWarm = (info[3].equals("Warm"));
01230         isCold = (info[3].equals("Cold"));
01231         }
01232 
01233       SCTDBInterface db = SCTDBInterface.getInstance();
01234       StringBuffer testnames = new StringBuffer(" AND (tests.test_name LIKE 'Hyb%' OR tests.test_name LIKE 'DetModIV')");
01235       if(location!=null && date!=null) testnames.append(" AND tests.locn_name='"+location+"' AND tests.test_date='"+date+"'");
01236       if(isWarm) testnames.append(" AND sct_tstdcsinfo.t0>10 AND sct_tstdcsinfo.test_no=tests.test_no");
01237       else if(isCold) testnames.append(" AND sct_tstdcsinfo.t0<=10 AND sct_tstdcsinfo.test_no=tests.test_no");
01238       else testnames.append(" AND sct_tstdcsinfo.test_no=tests.test_no");
01239       StringBuffer genTable = new StringBuffer("<h3>Test Data</h3>\n");
01240 // first look for defects
01241       StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,defects.CHAN_1ST,defects.CHAN_LAST FROM tests,DEFECTS,sct_tstdcsinfo");
01242       sqlStat.append(" WHERE tests.test_no=defects.test_no AND tests.ser_no="+sn);
01243       sqlStat.append(testnames);
01244 
01245 // submit query
01246      Statement statement = db.connection.createStatement();
01247     if(DEBUG) System.out.println(sqlStat.toString());
01248      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01249 
01250 // now get the data
01251      Hashtable defectsHash = new Hashtable();
01252      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01253           String thisTestNo = resultSet.getString(1);
01254           int n1 = Integer.parseInt(resultSet.getString(2));
01255           int n2 = Integer.parseInt(resultSet.getString(3));
01256           int ntotal=0;
01257           for(int i=n1;i<=n2;i++) ntotal++;
01258           if(defectsHash.containsKey(thisTestNo)) {
01259               String thisTotal = (String)defectsHash.get(thisTestNo);
01260               int ntot = Integer.parseInt(thisTotal);
01261               ntot+=ntotal;
01262               defectsHash.put(thisTestNo,(String)Integer.toString(ntot));
01263               }
01264           else defectsHash.put(thisTestNo,(String)Integer.toString(ntotal));
01265          }
01266       statement.close();
01267 // now look for raw data files
01268       sqlStat = new StringBuffer("SELECT tests.test_no,tests.test_name,test_rawdata.filename FROM tests,test_rawdata,sct_tstdcsinfo");
01269       sqlStat.append(" WHERE tests.test_no=test_rawdata.test_no AND tests.ser_no="+sn);
01270       sqlStat.append(testnames);
01271  
01272 // submit query
01273      statement = db.connection.createStatement();
01274 //    System.out.println("Interrogating raw_data table ...");
01275     if(DEBUG) System.out.println(sqlStat.toString());
01276      resultSet = statement.executeQuery(sqlStat.toString());
01277 // now get the raw data
01278      Hashtable rawDataHash = new Hashtable();
01279      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01280           String thisTestNo = resultSet.getString(1);
01281           String testname = resultSet.getString(2);
01282           String thisFilename = resultSet.getString(3);
01283           String linkName = "Raw Data";
01284           if(testname.equals("Hyb3PGain") || testname.equals("HybRC")) linkName="RC";
01285           if(testname.equals("HybTrim")) linkName = "Trim/Mask";
01286           String link="Type"+guiUtilities.HTMLViewer.RAWDATA+"&ref="+thisTestNo;
01287           if(rawDataHash.containsKey(thisTestNo)) {
01288               String thisLink = (String)rawDataHash.get(thisTestNo);
01289               thisLink += "<br><a href="+link+">"+linkName+"</a>";
01290               rawDataHash.put(thisTestNo,thisLink);
01291               }
01292           else rawDataHash.put(thisTestNo,"<a href="+link+">"+linkName+"</a>");
01293          }
01294       statement.close();
01295 // now look for plots
01296 
01297       sqlStat = new StringBuffer("SELECT tests.test_no,tests.ser_no,web_links.web_link_desc,web_links.url FROM tests,web_links,sct_tstdcsinfo");
01298       sqlStat.append(" WHERE tests.test_no=web_links.test_no AND tests.ser_no="+sn);
01299       sqlStat.append(testnames);
01300  
01301 // submit query
01302      statement = db.connection.createStatement();
01303     if(DEBUG) System.out.println(sqlStat.toString());
01304      resultSet = statement.executeQuery(sqlStat.toString());
01305 // now get the raw data
01306      Hashtable webLinkHash = new Hashtable();
01307      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01308           String thisTestNo = resultSet.getString(1);
01309           String thisSN = resultSet.getString(2);
01310           String urlDescription = resultSet.getString(3);
01311           String thisURLlink = resultSet.getString(4);
01312           boolean isPostscript = (thisURLlink.endsWith(".ps") || thisURLlink.endsWith(".ps.gz"));
01313           if(thisURLlink.indexOf("http://hepunx.rl.ac.uk/atlassct/cgibin/getfile.pl?file=")!=-1) thisURLlink+="&module="+thisSN;
01314           if(isPostscript) thisURLlink= "Type"+guiUtilities.HTMLViewer.URLTOPOSTSCRIPT+"&ref="+thisURLlink;
01315           if(webLinkHash.containsKey(thisTestNo)) {
01316               String thisLink = (String)webLinkHash.get(thisTestNo);
01317               thisLink += "<br><a href="+thisURLlink+">"+urlDescription+"</a>";
01318               webLinkHash.put(thisTestNo,thisLink);
01319               }
01320           else webLinkHash.put(thisTestNo,"<a href="+thisURLlink+">"+urlDescription+"</a>");
01321          }
01322       statement.close();
01323 // look for trim ranges
01324 
01325       sqlStat = new StringBuffer("SELECT tests.test_no,tr_type");
01326       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"tr_ntrim");
01327       sqlStat.append(" FROM tests,sct_tsthybtrim,sct_tstdcsinfo");
01328       sqlStat.append(" WHERE tests.test_no=sct_tsthybtrim.test_no AND tests.ser_no="+sn);
01329       sqlStat.append(" AND tests.test_name LIKE 'HybTrim'");
01330       sqlStat.append(testnames);
01331  
01332 // submit query
01333      statement = db.connection.createStatement();
01334     if(DEBUG) System.out.println(sqlStat.toString());
01335      resultSet = statement.executeQuery(sqlStat.toString());
01336 // now get the raw data
01337      Hashtable trimRangeHash = new Hashtable();
01338      Hashtable commentsHash = new Hashtable();
01339      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01340           String thisTestNo = resultSet.getString(1);
01341           String theRange = resultSet.getString(2);
01342           trimRangeHash.put(thisTestNo,theRange);
01343           int nMasked=0;
01344           for(int i=0;i<chipDBnames.length;i++) {
01345               String ntrim = resultSet.getString(3+i);
01346               int itrim = Integer.parseInt(ntrim);
01347               nMasked += (128-itrim);
01348               }
01349            if(nMasked>0) commentsHash.put(thisTestNo,Integer.toString(nMasked)+" channels masked");
01350          }
01351       statement.close();
01352 // look for strobe delays
01353 
01354       sqlStat = new StringBuffer("SELECT tests.test_no");
01355       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"DELAY");
01356       sqlStat.append(" FROM tests,sct_tsthybdelay,sct_tstdcsinfo");
01357       sqlStat.append(" WHERE tests.test_no=sct_tsthybdelay.test_no AND tests.ser_no="+sn);
01358       sqlStat.append(" AND tests.test_name LIKE 'HybDelay'");
01359       sqlStat.append(testnames);
01360  
01361 // submit query
01362      statement = db.connection.createStatement();
01363     if(DEBUG) System.out.println(sqlStat.toString());
01364      resultSet = statement.executeQuery(sqlStat.toString());
01365 // now get the raw data
01366 
01367      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01368           String thisTestNo = resultSet.getString(1);
01369           int strobeLow=1000;
01370           int strobeHigh=0;
01371           for(int i=0;i<chipDBnames.length;i++) {
01372               String nStrobe = resultSet.getString(2+i);
01373               int iStrobe = Integer.parseInt(nStrobe);
01374               if(iStrobe>strobeHigh) strobeHigh=iStrobe;
01375               if(iStrobe<strobeLow) strobeLow=iStrobe;
01376               }
01377           commentsHash.put(thisTestNo,"Delay from "+strobeLow+" to "+strobeHigh);
01378          }
01379       statement.close();
01380 // look for RC data
01381 
01382       sqlStat = new StringBuffer("SELECT tests.test_no");
01383       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"RC_MN_GAIN");
01384       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"RC_MN_ENC");
01385       sqlStat.append(" FROM tests,sct_tsthybrc,sct_tstdcsinfo");
01386       sqlStat.append(" WHERE tests.test_no=sct_tsthybrc.test_no AND tests.ser_no="+sn);
01387 //      sqlStat.append(" AND (tests.test_name LIKE 'Hyb3PGain' OR tests.test_name LIKE 'HybRC')");
01388       sqlStat.append(testnames);
01389  
01390 // submit query
01391      statement = db.connection.createStatement();
01392     if(DEBUG) System.out.println(sqlStat.toString());
01393      resultSet = statement.executeQuery(sqlStat.toString());
01394 // now get the raw data
01395 
01396      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01397           String thisTestNo = resultSet.getString(1);
01398           double gainLow=1000.;
01399           double gainHigh=0.;
01400           int ENCLow=99000;
01401           int ENCHigh=0;
01402           for(int i=0;i<chipDBnames.length;i++) {
01403               double iGain = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01404               if(iGain>gainHigh) gainHigh = iGain;
01405               if(iGain<gainLow) gainLow=iGain;
01406               }
01407          for(int i=0;i<chipDBnames.length;i++) {
01408               int iNoise = Integer.valueOf( resultSet.getString(14+i) ).intValue();
01409               if(iNoise>ENCHigh) ENCHigh=iNoise;
01410               if(iNoise<ENCLow) ENCLow=iNoise;
01411               }
01412          commentsHash.put(thisTestNo,"Gain from "+gainLow+" to "+gainHigh+"mV/fC<br>Noise from "+ENCLow+" to "+ENCHigh+" ENC");
01413          }
01414       statement.close();
01415 // Look for noise data
01416 
01417       sqlStat = new StringBuffer("SELECT tests.test_no");
01418       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"NO_MN_OCC");
01419       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"NO_NSE");
01420       sqlStat.append(" FROM tests,sct_tsthybnoise,sct_tstdcsinfo");
01421       sqlStat.append(" WHERE tests.test_no=sct_tsthybnoise.test_no AND tests.ser_no="+sn);
01422       sqlStat.append(" AND tests.test_name LIKE 'HybNoise'");
01423       sqlStat.append(testnames);
01424  
01425 // submit query
01426      statement = db.connection.createStatement();
01427     if(DEBUG) System.out.println(sqlStat.toString());
01428      resultSet = statement.executeQuery(sqlStat.toString());
01429 // now get the raw data
01430 
01431      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01432           String thisTestNo = resultSet.getString(1);
01433           double occLow=1000.;
01434           double occHigh=0.;
01435           int ENCLow=99000;
01436           int ENCHigh=0; 
01437           for(int i=0;i<chipDBnames.length;i++) {
01438               double iOcc = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01439               if(iOcc>occHigh) occHigh = iOcc;
01440               if(iOcc<occLow) occLow=iOcc;
01441               }
01442          for(int i=0;i<chipDBnames.length;i++) {
01443               int iNoise = Integer.valueOf( resultSet.getString(14+i) ).intValue();
01444               if(iNoise>ENCHigh) ENCHigh=iNoise;
01445               if(iNoise<ENCLow) ENCLow=iNoise;
01446               }
01447          DecimalFormat myFormatter = new DecimalFormat("0.##E0");
01448          String theOccLow = myFormatter.format(occLow);
01449          String theOccHigh = myFormatter.format(occHigh);
01450          commentsHash.put(thisTestNo,"Occupancy at 1fC from "+theOccLow+" to "+theOccHigh+"<brEstimated ENC from "+ENCLow+" to "+ENCHigh+" ENC");
01451          }
01452       statement.close();
01453 // finally.. the timewalk data
01454 
01455       sqlStat = new StringBuffer("SELECT tests.test_no");
01456       for(int i=0;i<chipDBnames.length;i++) sqlStat.append(","+chipDBnames[i]+"TW");
01457       sqlStat.append(" FROM tests,sct_tsthybTW,sct_tstdcsinfo");
01458       sqlStat.append(" WHERE tests.test_no=sct_tsthybtw.test_no AND tests.ser_no="+sn);
01459 //      sqlStat.append(" AND tests.test_name LIKE 'HybTwalk'");
01460       sqlStat.append(testnames);
01461  
01462 // submit query
01463      statement = db.connection.createStatement();
01464     if(DEBUG) System.out.println(sqlStat.toString());
01465      resultSet = statement.executeQuery(sqlStat.toString());
01466 // now get the raw data
01467      int ntw=0;
01468      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01469           String thisTestNo = resultSet.getString(1);
01470           double iTLow=1000;
01471           double iTHigh=0;
01472           ntw++;
01473           for(int i=0;i<chipDBnames.length;i++) {
01474               double iTW = Double.valueOf( resultSet.getString(2+i) ).doubleValue();
01475               if(iTW>iTHigh) iTHigh=iTW;
01476               if(iTW<iTLow) iTLow=iTW;
01477               }
01478          commentsHash.put(thisTestNo,"Timewalk from "+iTLow+" to "+iTHigh+" ns");
01479          }
01480       statement.close();
01481 
01482 // now the actual test data
01483       System.out.println("Retrieved all data, now compiling list...");
01484       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");
01485       sqlStat.append(" FROM tests,sct_tstdcsinfo WHERE tests.test_no=sct_tstdcsinfo.test_no AND tests.ser_no="+sn);
01486       sqlStat.append(testnames);
01487       sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
01488 // submit query
01489      statement = db.connection.createStatement();
01490 //     System.out.println(sqlStat.toString());
01491      resultSet = statement.executeQuery(sqlStat.toString());
01492      int nCount=0;
01493 // now get the data
01494      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01495         if(nCount==0) {
01496           genTable.append("<table cellspacing=5 border=1>\n");
01497           for(int i=0;i<10;i++) genTable.append("<col width=*>\n");
01498           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");
01499           }
01500         String thisTestNo = resultSet.getString(1);
01501         String thisTestName = resultSet.getString(2);
01502         String colTestName = sctdaqTestNameHash.containsKey(thisTestName) ? (String)sctdaqTestNameHash.get(thisTestName) : thisTestName;
01503         if(trimRangeHash.containsKey(thisTestNo)) {
01504              colTestName += "Range "+(String)trimRangeHash.get(thisTestNo);
01505              }
01506         String thisDate = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
01507         String thisLocation = resultSet.getString(4);
01508         String passFlag = resultSet.getString(5);
01509         String problemFlag = resultSet.getString(6);
01510         String statusFlag="<font color=red>FAIL</font>";
01511         if(passFlag.equals("YES")) {
01512              statusFlag = problemFlag.equals("YES") ? "Problem" : "<font color=green>Pass</font>";
01513              } 
01514         String t0 = resultSet.getString(7);
01515         String t1 = resultSet.getString(8);
01516         String comments = "";
01517 
01518         if(commentsHash.containsKey(thisTestNo)) {
01519                if(!comments.equals("")) comments += "<br>";
01520                comments += (String)commentsHash.get(thisTestNo);
01521                }
01522         if(defectsHash.containsKey(thisTestNo)) {
01523                if(!comments.equals("")) comments += "<br>";
01524                comments += "<b>"+(String)defectsHash.get(thisTestNo)+" defect(s)</b>";
01525                }
01526         else {
01527              if(!comments.equals("")) comments += "<br>";
01528              comments += "No defects";
01529              }
01530         int testType=-1;
01531         if(sctdaqTestNumberHash.containsKey(thisTestName)) testType = ((Integer)sctdaqTestNumberHash.get(thisTestName)).intValue();
01532 
01533         String linkTestName = (colTestName.indexOf("TrimRange")!=-1) ? "TrimRange" : colTestName;
01534         String reports = (testType==-1) ? "" : "<a href=\"Type"+guiUtilities.HTMLViewer.SCTDAQTESTDATA+"&ref="+thisTestNo+"__"+Integer.toString(testType)+"\">Test Report</a>";
01535         if(!sctdaqTestNameHash.containsKey(thisTestName)) reports=""; // no report for non-sctdaq tests for now
01536 //        System.out.println("reportslink="+reports);
01537         String rawData = rawDataHash.containsKey(thisTestNo) ? (String)rawDataHash.get(thisTestNo) : "";
01538         String plots = webLinkHash.containsKey(thisTestNo) ? (String)webLinkHash.get(thisTestNo) : "";
01539         genTable.append("<tr><td valign=top align=left>"+colTestName+"</td><td valign=top align=left>"+thisDate+"</td><td valign=top align=left>"+thisLocation+"</td>");
01540         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>");
01541         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");
01542 
01543         nCount++;  
01544         }
01545       statement.close();
01546       if(nCount==0) {genTable.append("<p>No tests found for "+sn+"\n"); return genTable.toString();}
01547       else genTable.append("</table>\n");
01548 
01549 // last but not least, the defects:
01550       genTable.append("<p><font face=Arial color=NAVY size=+1>Defects</font>\n");
01551       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");
01552       sqlStat.append(" AND tests.ser_no="+sn);
01553       sqlStat.append(testnames);
01554       sqlStat.append(" ORDER by defects.chan_1st,tests.test_date,tests.test_no");
01555 
01556 // submit query
01557      statement = db.connection.createStatement();
01558      if(DEBUG) System.out.println(sqlStat.toString());
01559      resultSet = statement.executeQuery(sqlStat.toString());
01560 
01561 // now get the data
01562      int ntotal=0;
01563      nCount=0;
01564      int nMaxConChannels=0;
01565      int nMaxConNonTrimChannels=0;
01566     Hashtable nonTrimDefectHash = new Hashtable();
01567      Hashtable trimDefectHash = new Hashtable();
01568      Hashtable channelHash = new Hashtable();   // key = channel no, bit0: trim test defect, bit1: non-trim test defect
01569      Vector nonTrimDefectList = new Vector();
01570      Vector trimDefectList = new Vector();
01571      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01572           String thisTestNo = resultSet.getString(1);
01573           String thisTestName = resultSet.getString(2);
01574           thisTestName = sctdaqTestNameHash.containsKey(thisTestName) ? (String)sctdaqTestNameHash.get(thisTestName) : thisTestName;
01575           if(trimRangeHash.containsKey(thisTestNo)) {
01576              thisTestName += "Range "+(String)trimRangeHash.get(thisTestNo);
01577              }
01578           boolean isTrimTest = (thisTestName.indexOf("Trim")!=-1);
01579           String testDate = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
01580           String locn = resultSet.getString(4);
01581           String chan1 = resultSet.getString(5);
01582           String chan2 = resultSet.getString(6);
01583           int n1 = Integer.parseInt(chan1);
01584           int n2 = Integer.parseInt(resultSet.getString(6));
01585           String defectname = resultSet.getString(7);
01586 
01587           int iDiff = n2-n1;
01588           String defectChannel = (iDiff>0) ? chan1+"-"+chan2 : chan1;
01589           String thisDefectInfo = defectname+" ("+thisTestName+" at "+locn+" on "+testDate+")";
01590 
01591           for(int i=n1;i<=n2;i++) {
01592               String thisChannel = Integer.toString(i);
01593               if(!channelHash.containsKey(thisChannel)) {
01594                     int status= (isTrimTest) ? 1 : 2;
01595                     channelHash.put(thisChannel, new Integer(status));
01596                     }
01597               else {
01598                    Integer theStatus = (Integer)channelHash.get(thisChannel);
01599                    int status = theStatus.intValue();
01600                    if(isTrimTest) status |=1;
01601                    else status |= 2;
01602                    channelHash.put(thisChannel,new Integer(status));
01603                    }
01604               }
01605            if(iDiff>0) {
01606              iDiff++;
01607              nMaxConChannels = iDiff>nMaxConChannels ? iDiff : nMaxConChannels;
01608              nMaxConNonTrimChannels = (iDiff>nMaxConNonTrimChannels && !isTrimTest) ? iDiff : nMaxConNonTrimChannels;
01609              }
01610 
01611 // Non-Trim defects
01612           if(thisTestName.indexOf("Trim")==-1) {
01613              if(nonTrimDefectHash.containsKey(defectChannel)) {
01614                Vector thisDefectVector = (Vector)nonTrimDefectHash.get(defectChannel);
01615                if(!thisDefectVector.contains((String)thisDefectInfo)) thisDefectVector.addElement(thisDefectInfo);
01616                nonTrimDefectHash.put(defectChannel,(Vector)thisDefectVector);               
01617                }
01618              else {
01619                nonTrimDefectList.addElement(defectChannel);
01620                Vector thisDefectVector = new Vector();
01621                thisDefectVector.addElement(thisDefectInfo);
01622                nonTrimDefectHash.put(defectChannel,(Vector)thisDefectVector);
01623                }
01624              }
01625 // Trim defects
01626           else {
01627              if(trimDefectHash.containsKey(defectChannel)) {
01628                Vector thisDefectVector = (Vector)trimDefectHash.get(defectChannel);
01629                if(!thisDefectVector.contains((String)thisDefectInfo)) thisDefectVector.addElement(thisDefectInfo);
01630                trimDefectHash.put(defectChannel,(Vector)thisDefectVector);               
01631                }
01632              else {
01633                trimDefectList.addElement(defectChannel);
01634                Vector thisDefectVector = new Vector();
01635                thisDefectVector.addElement(thisDefectInfo);
01636                trimDefectHash.put(defectChannel,(Vector)thisDefectVector);
01637                }
01638            }
01639         }
01640       statement.close();
01641 
01642 // now generate the html tables
01643 // start with statistics
01644      int nDefectCount=0;
01645      int nTrimDefectCount=0;
01646      int nNonTrimDefectCount=0;
01647      int nBothCount=0;
01648 //
01649  for (Enumeration e = channelHash.elements() ; e.hasMoreElements() ;) {
01650          Integer theStatus = (Integer)e.nextElement();
01651          int status = theStatus.intValue();
01652          if(status>0) nDefectCount++;
01653          if((status & 1)>0) nTrimDefectCount++;
01654          if((status & 2)>0) nNonTrimDefectCount++;
01655          if((status & 3)==3) nBothCount++;
01656           }
01657         genTable.append("<br><br><b>Statistics</b>\n");
01658 //        genTable.append("<br>Found "+channelHash.size()+" defects containing "+nDefectCount+" channels.<br>");
01659         genTable.append("<br><table cellspacing=5 border=1>\n");
01660         genTable.append("<col width=*><col width=*>\n");
01661         genTable.append("<tr><td align=left>Channels with any defect(s)</td><td align=left>"+nDefectCount+"</td></tr>\n");
01662         genTable.append("<tr><td align=left>Channels with non-trim defect(s)</td><td align=left>"+nNonTrimDefectCount+"</td></tr>\n");
01663         genTable.append("<tr><td align=left>Channels with trim defect(s)</td><td align=left>"+nTrimDefectCount+"</td></tr>\n");
01664         genTable.append("<tr><td align=left>Channels with non-trim and trim defect(s)</td><td align=left>"+nBothCount+"</td></tr>\n");
01665         genTable.append("<tr><td align=left>Max consecutive bad channels (non-trim defects only)</td><td align=left>"+nMaxConNonTrimChannels+"</td></tr>\n");
01666         genTable.append("<tr><td align=left>Max consecutive bad channels (any defect)</td><td align=left>"+nMaxConChannels+"</td></tr>\n");
01667         genTable.append("</table>");
01668 // then list the non-trim defects         
01669         genTable.append("<br>");
01670         genTable.append("<br><b>Non-Trim Defects</b>");
01671         if(nonTrimDefectList.size()==0) genTable.append("<br>No defective channels");
01672         else {
01673             genTable.append("<table cellspacing=5 border=1>\n");
01674             genTable.append("<col width=*><col width=*>\n");
01675             genTable.append("<tr><td align=left><b>Channel(s)</b></td><td align=left><b>Non-Trim Defects</b></td></tr>");
01676             for(int i=0;i<nonTrimDefectList.size();i++) {
01677                String thisChan = (String)nonTrimDefectList.elementAt(i);
01678                Vector theList = (Vector)nonTrimDefectHash.get(thisChan);
01679                genTable.append("<tr><td align=left>"+thisChan+"</td><td align=left>");
01680                for(int j=0;j<theList.size();j++) {
01681                    if(j>0) genTable.append("<br>");
01682                    genTable.append((String)theList.elementAt(j));
01683                    }
01684                genTable.append("</td></tr>");
01685                }
01686             genTable.append("</table>");
01687             }
01688 // and finally the trim defects
01689         genTable.append("<br>");
01690         genTable.append("<br><b>Trim Defects</b>");
01691         if(trimDefectList.size()==0) genTable.append("<br>No defective channels");
01692         else {
01693             genTable.append("<table cellspacing=5 border=1>\n");
01694             genTable.append("<col width=*><col width=*>\n");
01695             genTable.append("<tr><td align=left><b>Channel(s)</b></td><td align=left><b>Trim Defects</b></td></tr>");
01696             for(int i=0;i<trimDefectList.size();i++) {
01697                String thisChan = (String)trimDefectList.elementAt(i);
01698                Vector theList = (Vector)trimDefectHash.get(thisChan);
01699                genTable.append("<tr><td align=left>"+thisChan+"</td><td align=left>");
01700                for(int j=0;j<theList.size();j++) {
01701                    if(j>0) genTable.append("<br>");
01702                    genTable.append((String)theList.elementAt(j));
01703                    }
01704                genTable.append("</td></tr>");
01705                }
01706             genTable.append("</table><br>");
01707             }
01708 
01709       return genTable.toString();
01710       }
01711 
01712 // ******************************************************************************************************
01713     public static String createVisualTestTable(String serno, String itemType) throws Exception {
01714       Hashtable testnoHash = new Hashtable();
01715       Vector testnoList = new Vector();
01716       Vector itemList = new Vector();
01717       Vector theLine = new Vector();
01718       String testnoKey = "TESTNO";
01719       String snKey = "SERIALNO";
01720       String dateKey = "DATE";
01721       String locationKey = "LOCN";
01722       String flagKey = "FLAG";
01723 
01724       StringBuffer genTable = new StringBuffer("<h3>Visual Inspections of "+itemType+"</h3>");
01725 
01726       SCTDBInterface db = SCTDBInterface.getInstance();
01727       Statement statement = db.connection.createStatement();
01728      StringBuffer sqlStat = new StringBuffer("SELECT ");
01729      sqlStat.append("tests.test_no,tests.ser_no,tests.test_date,tests.locn_name,tests.problem,tests.pass");
01730      sqlStat.append(" FROM tests");
01731      sqlStat.append(" WHERE tests.ser_no = "+serno);
01732      sqlStat.append(" AND tests.test_name='Visual_Inspection'");
01733      sqlStat.append(" ORDER BY tests.test_date, tests.test_no");
01734 
01735 
01736      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01737      int recordCount=0;
01738      Vector testNumberList = new Vector();
01739      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01740           Hashtable thisHash = new Hashtable();
01741           recordCount++;
01742 //          if(recordCount%100 == 0) System.out.println("Retrieved "+recordCount+" records so far...");
01743           String testno = resultSet.getString(1);
01744           thisHash.put(snKey,resultSet.getString(2));
01745           String date = resultSet.getString(3);
01746           thisHash.put(dateKey,guiUtilities.DaveUtils.extractDate(date));
01747           thisHash.put(locationKey,resultSet.getString(4));
01748           String problemFlag = resultSet.getString(5);
01749           String passFlag = resultSet.getString(6);
01750           String statusFlag; 
01751           if(passFlag.equals("YES")) {
01752              statusFlag = (problemFlag.equals("YES")) ? "PROBLEM" : "Ok";
01753              }
01754           else statusFlag = "FAIL";
01755           thisHash.put(flagKey,statusFlag);
01756           testnoHash.put(testno,thisHash);   
01757           testnoList.addElement(testno);  
01758 
01759             }
01760 //      System.out.println("Retrieved "+recordCount+" records in total.");
01761       statement.close();
01762       if(recordCount==0) {
01763           genTable.append("None uploaded");
01764           return genTable.toString();
01765           }
01766 
01767 // now get the comments, if any
01768       String subQuery = sqlStat.toString();
01769       subQuery = subQuery.substring(subQuery.indexOf("WHERE"),subQuery.indexOf("ORDER")-1);
01770       Hashtable commentsHash = GeneralUtilities.testComments(subQuery);
01771       Hashtable testImagesHash = GeneralUtilities.testImages(subQuery);
01772 
01773       genTable.append("<table border=1>\n");
01774       genTable.append("<tr><td>Date</td><td>Location</td><td>Status</td><td>Comments</td><td>Images</td></tr>\n");
01775 
01776       for(int i=0;i<testnoList.size();i++) {
01777             genTable.append("<tr>");
01778             String testno = (String)testnoList.elementAt(i); // this contains the testno's, ordered by serial no
01779             Hashtable tempHash = (Hashtable)testnoHash.get(testno);
01780 
01781             genTable.append("<td>"+tempHash.get(dateKey)+"</td>");                                    // 2nd column is the date
01782             genTable.append("<td>"+tempHash.get(locationKey)+"</td>");              
01783             genTable.append("<td>"+tempHash.get(flagKey)+"</td>");
01784             if(commentsHash.containsKey(testno)) genTable.append("<td>"+commentsHash.get(testno)+"</td>");
01785             else genTable.append("<td>None</td>");
01786             
01787             String ImageTitle = "Visual Inspection of "+serno+" at "+tempHash.get(locationKey)+" on "+tempHash.get(dateKey);
01788             if(testImagesHash.containsKey(testno)) {
01789                Vector imageList = (Vector)testImagesHash.get(testno);
01790                genTable.append("<td>");
01791                for(int j=0;j<imageList.size(); j++) {
01792                    if(j%2 !=0) continue;
01793                    if(j>0) genTable.append("<br>");
01794                    genTable.append("<a href=\"Type"+Integer.toString(guiUtilities.HTMLViewer.SCTDBIMAGE)+"&ref="+testno+ImageTitle+"\">"+(String)imageList.elementAt(j)+"</a>");
01795 //                   genTable.append((String)imageList.elementAt(j));
01796                    }
01797                genTable.append("</td>");
01798              }
01799              else genTable.append("<td></td>");
01800              genTable.append("</tr>\n");
01801              }
01802        genTable.append("</table>");
01803        return genTable.toString();
01804 
01805 
01806       }
01807 
01808 // *****************************************************************************************************************
01809    public static String createASICReWorkTable(String hybridSerialNo) throws Exception {
01810 
01811       StringBuffer genTable = new StringBuffer("<h3>ASIC Replacements</h3>\n");
01812       StringBuffer sqlStat = new StringBuffer("SELECT ser_no,locn_name,disassm_date,posn FROM DISASSMLOGS where ASSM_SER_NO='"+hybridSerialNo+"'");
01813       sqlStat.append(" AND ser_no NOT IN (SELECT ser_no FROM ASSM_ITEMS where assm_ser_no="+hybridSerialNo+")");
01814       sqlStat.append(" ORDER BY DISASSM_DATE");
01815 
01816 // submit query
01817      Statement statement = SCTDBInterface.getInstance().connection.createStatement();
01818      if(DEBUG) System.out.println(sqlStat.toString());
01819      ResultSet resultSet = statement.executeQuery(sqlStat.toString());
01820      int recordCount=0;
01821 
01822 // now get the data
01823      int ntotal=0;
01824      int nCount=0;
01825      for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
01826         if(nCount==0) {
01827           genTable.append("<table cellspacing=5 border=1>\n");
01828           for(int i=0;i<4;i++) genTable.append("<col width=*>\n");
01829           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");
01830           }
01831         nCount++;
01832         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");
01833         }
01834       statement.close();
01835       if(nCount==0) genTable.append("None uploaded.\n");
01836       else genTable.append("</table>\n");
01837       return genTable.toString();
01838       }
01839 
01840 
01841 
01842 }

Generated on Thu Jul 15 09:55:43 2004 for SCT DAQ/DCS Software - Java by doxygen 1.3.5