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
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
00053 if(SctNames.getISRepository().contains(objectName) && !refresh) {
00054 download=false;
00055 break;
00056 }
00057 }
00058
00059 if(testIndex==TEST_NMASK) download=false;
00060
00061 setPriority(Thread.MIN_PRIORITY);
00062
00063 }
00064
00065 public SCTDBTestDownloader(String runString, int testIndex, String location) {
00066
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
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%'");
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;
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
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());
00252
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
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
00283 tempHash.add(channels+" : "+defect);
00284 }
00285 statement.close();
00286
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
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
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
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;
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
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
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
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 }