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

Generated on Fri Jan 14 12:49:57 2005 for SCT DAQ/DCS Software - Java by doxygen 1.3.5