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

SCTDBTestDownloader.java

00001 package DisplayGUI;
00002 
00003 import java.io.*;
00004 import java.util.*;
00005 import is.*;
00006 import Sct.Serializable;
00007 import Sct.IS.*;
00008 //import SctControl.*;
00009 import java.sql.*;
00010 import ProdDatabase.SCTDBInterface;
00011 import ProdDatabase.SCTDBInfo;
00012 import Sct_CalibrationController.TestData;
00013 /*
00014  * SCTDBTestDownloader.java
00015  *
00016  */
00017 
00022 public class SCTDBTestDownloader extends Thread implements SCTDBInfo, DisplayGUI.TestDataInfo {
00023     Vector listOfModules;
00024     int testIndex;
00025     String location;
00026     boolean isWarm;
00027     boolean refresh;
00028     boolean download;
00029 
00030     String runString;
00031     boolean isSCTDAQData;
00032 
00033     public static final double NODATA = -9999.;
00034 
00035     public SCTDBTestDownloader(Vector listOfModules, int testIndex, String location, boolean isWarm, boolean refresh) {
00036          super("SCTDB_DOWNLOAD");
00037          this.listOfModules=listOfModules;
00038          this.testIndex=testIndex;
00039          this.location=location;
00040          this.isWarm=isWarm;
00041          this.refresh=refresh;
00042 
00043          download=true;
00044          isSCTDAQData=true;
00045 
00046          for(int i=listOfModules.size()-1;i>=0;i--) {
00047             String module = (String)listOfModules.elementAt(i);
00048             String objectName = "SCTDBData."+testNames[testIndex]+"."+location+"."+(String)listOfModules.elementAt(i);
00049             // if ANY sctdb test object exists, and not requested a 'refresh' then don't download anything
00050             if(SctNames.getISRepository().contains(objectName) && !refresh) {
00051                 download=false;
00052                 break;
00053                 }
00054             }
00055 
00056          if(testIndex==TEST_NMASK) download=false; // no such sctdaq test
00057 
00058          setPriority(Thread.MIN_PRIORITY);
00059 
00060          }
00061 
00062     public SCTDBTestDownloader(String runString, int testIndex, String location) {
00063 // download SctRodDaq data
00064          super("SCTDB_DOWNLOAD");
00065          this.runString=runString;
00066          this.testIndex=testIndex;
00067          this.location=location;
00068          refresh=true;
00069 
00070          download=true;
00071          isSCTDAQData=false;
00072 
00073          setPriority(Thread.MIN_PRIORITY);
00074 
00075          }
00076 
00077 
00078     public boolean downloadsRequired() {
00079          return download;
00080          }
00081     public boolean isOkToStart() {
00082          Thread[] allThreads = new Thread[Thread.activeCount()];
00083          Thread.enumerate(allThreads);
00084          for(int i=0;i<allThreads.length;i++) {
00085             if(allThreads[i]!=null && allThreads[i].getName().equals("SCTDB_DOWNLOAD") && allThreads[i].isAlive()) {
00086                   javax.swing.JOptionPane.showMessageDialog(null,"A download from the SCT database is already in progress.\nPlease wait for this to complete before requesting another download.");
00087                   return false;
00088                   }
00089             }
00090          return true;
00091          }
00092 
00093     public void run() {
00094             
00095          Map snHash = new HashMap();
00096          Map testnoHash = new HashMap();
00097          Map dcsHash = new HashMap();
00098 
00099          Statement statement;
00100          ResultSet resultSet;
00101 
00102          String run=null;
00103          String scan=null;
00104          if(!isSCTDAQData) {
00105               java.util.regex.Pattern runP = java.util.regex.Pattern.compile("(\\d+)[-]?(\\d+)?");
00106               java.util.regex.Matcher matcher = runP.matcher(runString);
00107               if(matcher.matches()) {
00108                 run = runString.substring(matcher.start(1),matcher.end(1));
00109                 if(matcher.groupCount()==2) scan = runString.substring(matcher.start(2),matcher.end(2));
00110                 else scan = "0";
00111                 }
00112               else {
00113                 System.err.println("SctGUI::SCTDBTestDownloader - Unrecognised run and scan number");
00114                 return;
00115                 }
00116               }
00117 
00118          StringBuffer moduleList = new StringBuffer();
00119          if(isSCTDAQData) {
00120           for(int i=0;i<listOfModules.size();i++) {
00121               if(i>0) moduleList.append(",");
00122               String module = (String)listOfModules.elementAt(i);
00123               if(module.equals("SCTTestAPI_PseudoModule")) moduleList.append("20220330200020");
00124               else moduleList.append(module);
00125               }
00126            System.out.println("SctGUI::SCTDBTestDownloader - Downloading "+listOfModules.size()+" module "+testNames[testIndex]+" tests.");
00127            }
00128          else System.out.println("SctGUI::SCTDBTestDownloader - Downloading SctRodDaq "+testNames[testIndex]+" data for Run "+runString);
00129 
00130          StringBuffer sqlStat = new StringBuffer();
00131 // if this is SctRodDaq data, then first we must publish the control object
00132          if(!isSCTDAQData) {
00133              if(!publishControlObject(run,scan)) return;
00134              }
00135 
00136 
00137           sqlStat = new StringBuffer("SELECT tests.ser_no,tests.pass,tests.problem,tests.TEST_no,tests.locn_name,tests.TEST_date");
00138           sqlStat.append(",SCT_TSTDAQINFO.host,SCT_TSTDAQINFO.version,SCT_TSTDAQINFO.test_time");
00139           switch(testIndex) {
00140                     case SCTDB_TEST_RESET:
00141                     case SCTDB_TEST_REDUNDANCY:
00142                     case SCTDB_TEST_LONGTERM:
00143                     case SCTDB_TEST_IV:
00144                         break;
00145                     default:
00146                         for(int y=0;y<chipDBnames.length;y++) {
00147                            for(int paramIndex=0;paramIndex<DBChipParameterNames[testIndex].length;paramIndex++) {
00148                                   sqlStat.append(","+chipDBnames[y]+DBChipParameterNames[testIndex][paramIndex]);
00149                                   }
00150                           }
00151 
00152                      }
00153          sqlStat.append(" FROM "+sctdaqDBTableNames[testIndex]+",tests,SCT_TSTDAQINFO");
00154          if(isSCTDAQData) sqlStat.append(",sct_tstdcsinfo");
00155 
00156          sqlStat.append(" WHERE tests.TEST_name = '"+sctdaqDBTestNames[testIndex]+"'");
00157          if(isSCTDAQData) sqlStat.append(" AND tests.ser_no IN ("+moduleList.toString()+")");
00158          if(!location.equals("Any")) sqlStat.append(" AND tests.locn_name LIKE '"+location+"'");
00159          sqlStat.append(" AND tests.TEST_no = "+sctdaqDBTableNames[testIndex]+".TEST_no");
00160          sqlStat.append(" AND tests.test_no = SCT_TSTDAQINFO.test_no");
00161          if(isSCTDAQData) {
00162               sqlStat.append(" AND SCT_TSTDAQINFO.version NOT LIKE 'SctRodDaq%'");  // SCTDAQ data only
00163               if(isWarm) sqlStat.append(" AND sct_tstdcsinfo.t0>10 AND sct_tstdcsinfo.TEST_no=tests.TEST_no"); 
00164               else  sqlStat.append(" AND sct_tstdcsinfo.t0<=10 AND sct_tstdcsinfo.TEST_no=tests.TEST_no"); 
00165                }
00166          else sqlStat.append(" AND tests.run_no = '"+runString+"' AND SCT_TSTDAQINFO.version LIKE 'SctRodDaq%'");
00167          sqlStat.append(" ORDER BY tests.TEST_date DESC,tests.TEST_no DESC");
00168 
00169          try {
00170 
00171          statement = SCTDBInterface.getInstance().connection.createStatement();
00172 //         System.out.println(sqlStat.toString());
00173          resultSet = statement.executeQuery(sqlStat.toString());
00174          for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00175             int rc=1;
00176 
00177             String sn = resultSet.getString(rc++);
00178             if(snHash.containsKey(sn)) continue;
00179             int status = (resultSet.getString(rc++).equals("YES")) ? 0 : 2;
00180             if(status==0 && resultSet.getString(rc++).equals("YES")) status = 1;
00181 
00182             SCTDB_Data sctdbData = new SCTDB_Data(); 
00183             sctdbData.status=status; // 0: pass, 1: problem, 2: fail
00184             sctdbData.testIndex=testIndex;
00185             sctdbData.testNumber = resultSet.getString(rc++);
00186             String location = resultSet.getString(rc++);;
00187             sctdbData.testLocation = location;
00188             String date = guiUtilities.DaveUtils.extractDate(resultSet.getString(rc++));
00189             sctdbData.testDate=date;
00190 
00191             sctdbData.daqInfo = new String[5];
00192             for(int i=0;i<3;i++) {
00193                  String value = resultSet.getString(rc++);
00194                  sctdbData.daqInfo[i] = (value==null) ? "Unknown" : value;
00195                  }
00196             sctdbData.daqInfo[3]=date;
00197             sctdbData.daqInfo[4]=location;
00198 
00199             System.out.println("SctGUI::SCTDBTestDownloader - Downloading "+testNames[testIndex]+" for "+sn+" taken by "+sctdbData.testLocation+" on "+sctdbData.testDate);
00200 
00201             sctdbData.data_m0 = new double[DBChipParameterNames[testIndex].length];
00202             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_m0[r]=getData(resultSet.getString(rc++));
00203             sctdbData.data_s1 = new double[DBChipParameterNames[testIndex].length];
00204             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s1[r]=getData(resultSet.getString(rc++));
00205             sctdbData.data_s2 = new double[DBChipParameterNames[testIndex].length];
00206             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s2[r]=getData(resultSet.getString(rc++));
00207             sctdbData.data_s3 = new double[DBChipParameterNames[testIndex].length];
00208             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s3[r]=getData(resultSet.getString(rc++));
00209             sctdbData.data_s4 = new double[DBChipParameterNames[testIndex].length];
00210             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s4[r]=getData(resultSet.getString(rc++));
00211             sctdbData.data_e5 = new double[DBChipParameterNames[testIndex].length];
00212             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_e5[r]=getData(resultSet.getString(rc++));
00213             sctdbData.data_m8 = new double[DBChipParameterNames[testIndex].length];
00214             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_m8[r]=getData(resultSet.getString(rc++));
00215             sctdbData.data_s9 = new double[DBChipParameterNames[testIndex].length];
00216             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s9[r]=getData(resultSet.getString(rc++));
00217             sctdbData.data_s10 = new double[DBChipParameterNames[testIndex].length];
00218             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s10[r]=getData(resultSet.getString(rc++));
00219             sctdbData.data_s11 = new double[DBChipParameterNames[testIndex].length];
00220             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s11[r]=getData(resultSet.getString(rc++));
00221             sctdbData.data_s12 = new double[DBChipParameterNames[testIndex].length];
00222             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_s12[r]=getData(resultSet.getString(rc++));
00223             sctdbData.data_e13 = new double[DBChipParameterNames[testIndex].length];
00224             for(int r=0;r<DBChipParameterNames[testIndex].length;r++) sctdbData.data_e13[r]=getData(resultSet.getString(rc++));
00225 
00226 // painful conversion from number of good channels to number of bad channels
00227             int index=0;
00228             switch(testIndex) {
00229                case SCTDB_TEST_PIPELINE:
00230                  convertData(sctdbData,0);
00231                  break;
00232                case SCTDB_TEST_TRIM:
00233                  convertData(sctdbData,2);
00234                  break;
00235                default:
00236                }
00237 
00238 
00239             snHash.put(sn,sctdbData);
00240             testnoHash.put(sctdbData.testNumber,new ArrayList()); // to be filled with the no of defects in next query
00241 //            dcsHash.put(sctdbData.testNumber,new HashMap()); // to be filled with the no of defects in next query
00242             }
00243         statement.close();
00244 
00245         if(snHash.size()==0) {
00246             System.out.println("SctGUI::SCTDBTestDownloader - No Data available from SCTDB");
00247             return;
00248             }
00249         StringBuffer temp = new StringBuffer();
00250         int count=0;
00251         for (java.util.Iterator i = testnoHash.keySet().iterator(); i.hasNext(); ) {
00252             if(count>0) temp.append(",");
00253             count++;
00254             temp.append((String)i.next());
00255             }
00256         sqlStat = new StringBuffer();
00257         sqlStat.append("SELECT defects.TEST_no,defects.chan_1st,defects.chan_last,defects.defect_name");
00258         sqlStat.append(" FROM defects");
00259         sqlStat.append(" WHERE defects.TEST_no IN ("+temp.toString()+")");
00260 
00261 
00262         statement = SCTDBInterface.getInstance().connection.createStatement();
00263 //         System.out.println(sqlStat.toString());
00264         resultSet = statement.executeQuery(sqlStat.toString());
00265 
00266         for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){ 
00267             String thisTestNo = resultSet.getString(1);
00268             List tempHash = (List)testnoHash.get(thisTestNo);
00269             String channels = resultSet.getString(2)+"-"+resultSet.getString(3);
00270             String defect = resultSet.getString(4);
00271 //            System.out.println("defects: "+channels+" : "+defect);
00272             tempHash.add(channels+" : "+defect);
00273             }
00274         statement.close();
00275 // now dcs data
00276         sqlStat = new StringBuffer();
00277         sqlStat.append("SELECT vdet,idet,t0,t1,vcc,icc,vdd,idd,test_no");
00278         sqlStat.append(" FROM SCT_TSTDCSINFO");
00279         sqlStat.append(" WHERE TEST_no IN ("+temp.toString()+")");
00280 
00281 
00282         statement = SCTDBInterface.getInstance().connection.createStatement();
00283 //         System.out.println(sqlStat.toString());
00284         resultSet = statement.executeQuery(sqlStat.toString());
00285 
00286         for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){ 
00287             SummaryReader.DCSInfo dcs = new SummaryReader.DCSInfo();
00288             dcs.put(SummaryReader.DCSInfo.VDET,Double.parseDouble(resultSet.getString(1)));
00289             dcs.put(SummaryReader.DCSInfo.IDET,Double.parseDouble(resultSet.getString(2)));
00290             dcs.put(SummaryReader.DCSInfo.T0,Double.parseDouble(resultSet.getString(3)));
00291             dcs.put(SummaryReader.DCSInfo.T1,Double.parseDouble(resultSet.getString(4)));
00292             dcs.put(SummaryReader.DCSInfo.VCC,Double.parseDouble(resultSet.getString(5)));
00293             dcs.put(SummaryReader.DCSInfo.ICC,Double.parseDouble(resultSet.getString(6)));
00294             dcs.put(SummaryReader.DCSInfo.VDD,Double.parseDouble(resultSet.getString(7)));
00295             dcs.put(SummaryReader.DCSInfo.IDD,Double.parseDouble(resultSet.getString(8)));
00296             String testno=resultSet.getString(9);
00297             dcsHash.put(testno,dcs);
00298             }
00299         statement.close();
00300 
00301         for (java.util.Iterator i = snHash.keySet().iterator(); i.hasNext(); ) {
00302             String sn = (String)i.next();
00303             SCTDB_Data sctdbData = (SCTDB_Data)snHash.get(sn);
00304             List defectlist = (List)testnoHash.get(sctdbData.testNumber);
00305 // defects
00306             sctdbData.noDefectChannels = defectlist.size();   
00307             sctdbData.defectList = new String[defectlist.size()];
00308             for(int y=0;y<defectlist.size();y++) sctdbData.defectList[y]=(String)defectlist.get(y);
00309 // dcs
00310             sctdbData.dcsinfo = new double[8];
00311             if(dcsHash.containsKey(sctdbData.testNumber)) {
00312               SummaryReader.DCSInfo dcs = (SummaryReader.DCSInfo)dcsHash.get(sctdbData.testNumber);
00313               if(dcs==null) for(int j=0;j<8;j++) sctdbData.dcsinfo[j]=NODATA;
00314               else {
00315                 for(int j=0;j<8;j++) {
00316                   Double dcsValue = (Double)dcs.get(j);
00317                   if(dcsValue!=null) sctdbData.dcsinfo[j]=dcsValue.doubleValue();
00318                   else {
00319                    System.err.println("SctGUI::SCTDBTestDownloader - Null dcs data for parameter "+j);
00320                    sctdbData.dcsinfo[j]=NODATA;
00321                    }
00322                   }
00323                 }
00324             }
00325             else for(int j=0;j<8;j++) sctdbData.dcsinfo[j]=NODATA;
00326         
00327            
00328             String objectName = isSCTDAQData ? "SCTDBData."+testNames[testIndex]+"."+location+"."+sn : "SCTDBData."+location+".Summary."+run+"."+scan+"."+sn;
00329             
00330             if(SctNames.getISRepository().contains(objectName)) {
00331                 if(!refresh) continue;
00332                 SctNames.getISRepository().remove(objectName);
00333                 }
00334             SctNames.getISRepository().insert(objectName, sctdbData);  
00335             System.out.println("SctGUI::SCTDBTestDownloader - SCTDB Object published as "+objectName);        
00336             }
00337 
00338 
00339         if(isSCTDAQData) {
00340           int notDownloaded = listOfModules.size()-snHash.size();
00341           if(notDownloaded>0) {
00342            for(int i=0;i<listOfModules.size();i++) {
00343               String module = (String)listOfModules.elementAt(i);
00344               if(!snHash.containsKey(module)) System.out.println("SctGUI::SCTDBTestDownloader - No "+testNames[testIndex]+" data available for "+(String)listOfModules.elementAt(i));
00345               }
00346            }
00347          }
00348 
00349         }catch(Exception e) {System.out.println("SctGUI::SCTDBTestDownloader - Failed to publish SCTDB Data: "+e.toString());}
00350 
00351 
00352    }
00353 
00354    private boolean publishControlObject(String run, String scan) {
00355          List mList = new ArrayList();
00356          StringBuffer sqlStat = new StringBuffer();
00357          String testno=null;
00358          String version = null;
00359 
00360          try {
00361 
00362          String controlObjectName = "SCTDBData.ControlData.TestData."+run+"."+scan;
00363          if(SctNames.getISRepository().contains(controlObjectName)) return true; // already there
00364 
00365          sqlStat = new StringBuffer("SELECT tests.test_no,tests.ser_no,SCT_TSTDAQINFO.version FROM tests,SCT_TSTDAQINFO WHERE tests.run_no = '"+runString+"' AND SCT_TSTDAQINFO.version LIKE 'SctRodDaq%'");
00366          sqlStat.append(" AND tests.test_no = SCT_TSTDAQINFO.test_no AND tests.locn_name LIKE '"+location+"'");
00367          sqlStat.append(" AND tests.TEST_name = '"+sctdaqDBTestNames[testIndex]+"'");
00368          Statement statement = SCTDBInterface.getInstance().connection.createStatement();
00369 //         System.out.println(sqlStat.toString());
00370          ResultSet resultSet = statement.executeQuery(sqlStat.toString());
00371          for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00372               testno = resultSet.getString(1);
00373               mList.add(resultSet.getString(2));
00374               version = resultSet.getString(3);
00375               }
00376          statement.close();
00377 
00378          if(mList.size()==0) {
00379               System.err.println("SctGUI::SCTDBTestDownloader - no modules found for run-scan "+runString);
00380               return false;
00381               }
00382 
00383          int noPoints=-1;
00384          String[] pointValues = new String[16];
00385          if(testno!=null) {
00386              sqlStat = new StringBuffer("SELECT POINT_TYPE,N_POINTS");
00387              for(int i=0;i<16;i++) sqlStat.append(",POINT_"+i);
00388              sqlStat.append(" FROM SCT_TSTSCANINFO WHERE TEST_NO="+testno); 
00389              statement = SCTDBInterface.getInstance().connection.createStatement();
00390 //           System.out.println(sqlStat.toString());
00391              resultSet = statement.executeQuery(sqlStat.toString());
00392  
00393              for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00394                String point_type = resultSet.getString(1);
00395                String nPoints = resultSet.getString(2);
00396                noPoints = Integer.parseInt(nPoints);
00397                for(int i=0;i<16;i++) pointValues[i]=resultSet.getString(i+3);
00398                }
00399               statement.close();
00400               }
00401             TestData testData = new TestData();
00402             testData.testName = testNames[testIndex];
00403             testData.runNumber = Integer.parseInt(run);
00404             testData.nScans = (noPoints!=-1) ? noPoints : 1;
00405             testData.startScanNumber = Integer.parseInt(scan);
00406             testData.testVariable = 0;
00407             if(noPoints!=-1) {
00408               testData.testPoints = new double[noPoints];
00409               for(int i=0;i<noPoints;i++) testData.testPoints[i] = Double.parseDouble(pointValues[i]);
00410               }
00411             else {
00412               testData.testPoints = new double[1];
00413               testData.testPoints[0]=0.;
00414               }
00415             testData.status=TestData.COMPLETED;
00416             testData.startTime = "";
00417             testData.endTime = "";
00418             testData.modules = new String[mList.size()];
00419             for(int i=0;i<mList.size();i++) testData.modules[i] = new String((String)mList.get(i));
00420             testData.version = 0;
00421 // publish the control object!
00422             SctNames.getISRepository().insert(controlObjectName, testData);  
00423             System.out.println("SctGUI::SCTDBTestDownloader - Published control object "+controlObjectName);
00424             }catch(Exception e) {
00425               System.err.println("SctGUI::SCTDBTestDownloader - Exception creating control object - "+e.toString());
00426               return false;
00427               }
00428             return true;
00429             }
00430 
00431 
00432 
00433    private void convertData(SCTDB_Data sctdbData, int index) {
00434                sctdbData.data_m0[index]=128.-sctdbData.data_m0[index];
00435                sctdbData.data_s1[index]=128.-sctdbData.data_s1[index];
00436                sctdbData.data_s2[index]=128.-sctdbData.data_s2[index];
00437                sctdbData.data_s3[index]=128.-sctdbData.data_s3[index];
00438                sctdbData.data_s4[index]=128.-sctdbData.data_s4[index];
00439                sctdbData.data_e5[index]=128.-sctdbData.data_e5[index];
00440                sctdbData.data_m8[index]=128.-sctdbData.data_m8[index];
00441                sctdbData.data_s9[index]=128.-sctdbData.data_s9[index];
00442                sctdbData.data_s10[index]=128.-sctdbData.data_s10[index];
00443                sctdbData.data_s11[index]=128.-sctdbData.data_s11[index];
00444                sctdbData.data_s12[index]=128.-sctdbData.data_s12[index];
00445                sctdbData.data_e13[index]=128.-sctdbData.data_e13[index];
00446                }
00447    private double getData(String dataString) {
00448         double data = -1.;
00449            try {
00450                data = Double.parseDouble(dataString);
00451            }catch(Exception e) {
00452                dataString = dataString.toLowerCase();
00453                if(dataString.equals("not tested")) data=0.;
00454                else if(dataString.equals("minimal tested")) data=1.;
00455                else System.err.println("Unrecognised data from SCT database: "+dataString);
00456                }
00457          return data;
00458          }
00459        
00460 
00461 
00462 }

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