00001 package DisplayGUI;
00002
00003 import java.io.*;
00004 import java.util.*;
00005 import is.*;
00006 import Sct.Serializable;
00007 import Sct.IS.*;
00008
00009 import java.sql.*;
00010 import ProdDatabase.SCTDBInterface;
00011 import ProdDatabase.SCTDBInfo;
00012 import Sct_CalibrationController.TestData;
00013
00014
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
00050 if(SctNames.getISRepository().contains(objectName) && !refresh) {
00051 download=false;
00052 break;
00053 }
00054 }
00055
00056 if(testIndex==TEST_NMASK) download=false;
00057
00058 setPriority(Thread.MIN_PRIORITY);
00059
00060 }
00061
00062 public SCTDBTestDownloader(String runString, int testIndex, String location) {
00063
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
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%'");
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
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;
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
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());
00241
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
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
00272 tempHash.add(channels+" : "+defect);
00273 }
00274 statement.close();
00275
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
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
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
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;
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
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
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
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 }