00001 package ProdDatabase;
00002
00003
00004
00005 import java.sql.*;
00006 import java.io.*;
00007 import java.util.*;
00008
00009 public class ModuleInfo implements SCTDBInfo, barrelMetrologyData, endcapMetrologyData {
00010 Statement statement;
00011 ResultSet resultSet;
00012 StringBuffer sqlStat;
00013
00014 private Vector sensorList, asicList, metrologyList;
00015 private Hashtable testDataHash, asicMfrHash, correctionHash;
00016 private Hashtable metrologyHash;
00017 private Hashtable snHash;
00018 int recordCount;
00019 String moduleSerialNo,hybridSerialNo;
00020 int deviceType;
00021 boolean DEBUG=false;
00022
00023 java.util.regex.Pattern lotNoPattern = java.util.regex.Pattern.compile("(Z\\d+-W\\d+).*");
00024
00025 public ModuleInfo(String moduleSerialNo) {
00026 this.moduleSerialNo=moduleSerialNo;
00027 metrologyList = new Vector();
00028 sensorList = new Vector();
00029 asicList = new Vector();
00030 snHash = new Hashtable();
00031 testDataHash = new Hashtable();
00032 asicMfrHash = new Hashtable();
00033 correctionHash = new Hashtable();
00034 metrologyHash = new Hashtable();
00035 try {
00036 getDeviceType();
00037 if(!isModule()) return;
00038 fillSNHash();
00039 getDataSheetInfo();
00040 if(isBarrelModule()) getBarrelMetrologyData();
00041 if(isForwardModule()) getEndCapMetrologyData();
00042 }catch(Exception e){System.err.println(e.toString());}
00043
00044 }
00045
00046 public String getSerialNo(int component) {
00047 if(snHash.containsKey(moduleParts[component])) return (String)snHash.get(moduleParts[component]);
00048 else return "Not Uploaded.";
00049 }
00050 public String getHybridSerialNo() {
00051 return hybridSerialNo;
00052 }
00053 public Vector getSensorList() {
00054 return sensorList;
00055 }
00056 public Vector getAsicList() {
00057 return asicList;
00058 }
00059 public int noMetrologyTests() {
00060 return metrologyList.size();
00061 }
00062 public MetrologyTest getMetrologyTest(int index) {
00063 String testno = (String)metrologyList.elementAt(index);
00064 return (MetrologyTest)metrologyHash.get(testno);
00065 }
00066
00067 public String getDataSheetTestNo(int component) {
00068 if(testDataHash.containsKey(dataSheetTestDBNames[component])) return (String)testDataHash.get(dataSheetTestDBNames[component]);
00069 else return null;
00070 }
00071
00072 public String getASICInfo(String sn) {
00073 if(!asicMfrHash.containsKey(sn)) return null;
00074 else return (String)asicMfrHash.get(sn);
00075 }
00076 public String getASICcorrFactor(String sn) {
00077 String mfrNo;
00078 if(!asicMfrHash.containsKey(sn)) return null;
00079 mfrNo = new String((String)asicMfrHash.get(sn));
00080 java.util.regex.Matcher matcher = lotNoPattern.matcher(mfrNo);
00081 if(matcher.matches()) {
00082 String lotNo = mfrNo.substring(matcher.start(1),matcher.end(1));
00083 if(correctionHash.containsKey(lotNo)) return (String)correctionHash.get(lotNo);
00084 else return null;
00085 }
00086 return null;
00087 }
00088 private void fillSNHash() {
00089 String bmHASICserialNo;
00090 snHash.put(moduleParts[bmMODULE],moduleSerialNo);
00091 try {
00092 hybridSerialNo = getHybridSN(moduleSerialNo);
00093 switch(deviceType) {
00094 case 1:
00095 sensorList = getSensorList(moduleSerialNo);
00096 if(hybridSerialNo!=null) {
00097 getChipInfo(hybridSerialNo);
00098 snHash.put(moduleParts[bmHASIC],hybridSerialNo);
00099 }
00100 break;
00101 default:
00102 if(hybridSerialNo!=null) {
00103 snHash.put(moduleParts[bmHASIC],hybridSerialNo);
00104 snHash.put(moduleParts[bmHPC],moduleSerialNo.substring(0,7)+"7"+moduleSerialNo.substring(8));
00105 getChipInfo(hybridSerialNo);
00106 }
00107 String bmSBsn;
00108 if((bmSBsn=getSensorBaseboardSN(moduleSerialNo))!=null) {
00109 sensorList = getSensorList(bmSBsn);
00110 snHash.put(moduleParts[bmSB],bmSBsn);
00111 snHash.put(moduleParts[bmBB],bmSBsn.substring(0,7)+"8"+bmSBsn.substring(8));
00112 }
00113 }
00114 }catch(Exception e1){System.err.println(e1.toString());}
00115
00116 }
00117
00118
00119 public void getDeviceType() throws Exception {
00120 sqlStat = new StringBuffer("SELECT ctype from ITEMS WHERE ser_no="+moduleSerialNo);
00121 statement = SCTDBInterface.getInstance().connection.createStatement();
00122 if(DEBUG) System.out.println(sqlStat.toString());
00123 resultSet = statement.executeQuery(sqlStat.toString());
00124 deviceType=-1;
00125 String ctype=null;
00126 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00127 ctype=resultSet.getString(1);
00128 }
00129 statement.close();
00130 if(ctype==null) return;
00131 if(ctype.matches("bmModule")) deviceType=0;
00132 else if(ctype.matches(".*fmModule.*")) deviceType=1;
00133 }
00134
00135 public boolean isModule() {
00136 return (deviceType>=0);
00137 }
00138 public boolean isBarrelModule() {
00139 return (deviceType==0);
00140 }
00141 public boolean isForwardModule() {
00142 return (deviceType==1);
00143 }
00144
00145
00146 public String getHybridSN(String moduleSerialNo) throws Exception {
00147 sqlStat = new StringBuffer("SELECT ");
00148 sqlStat.append("ser_no, posn from ASSM_ITEMS WHERE assm_ser_no="+moduleSerialNo+" AND (ctype LIKE 'fhHybrid%' OR ctype LIKE 'bmHASIC') ORDER BY posn");
00149 statement = SCTDBInterface.getInstance().connection.createStatement();
00150 if(DEBUG) System.out.println(sqlStat.toString());
00151 resultSet = statement.executeQuery(sqlStat.toString());
00152 recordCount=0;
00153 String sn = null;
00154
00155 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00156 sn = resultSet.getString(1);
00157 }
00158 statement.close();
00159 return sn;
00160 }
00161
00162 public String getSensorBaseboardSN(String moduleSerialNo) throws Exception {
00163
00164 sqlStat = new StringBuffer("SELECT ");
00165 sqlStat.append("ser_no, posn from ASSM_ITEMS WHERE assm_ser_no="+moduleSerialNo+" AND ctype LIKE 'bmSB' ORDER BY posn");
00166 statement = SCTDBInterface.getInstance().connection.createStatement();
00167 if(DEBUG) System.out.println(sqlStat.toString());
00168 resultSet = statement.executeQuery(sqlStat.toString());
00169 recordCount=0;
00170 String sn = null;
00171
00172 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00173 sn = resultSet.getString(1);
00174 }
00175
00176 statement.close();
00177 return sn;
00178 }
00179
00180 public Vector getSensorList(String serialNo) throws Exception {
00181
00182
00183 Vector sensorList = new Vector();
00184 sqlStat = new StringBuffer("SELECT ");
00185 sqlStat.append("ser_no, posn from ASSM_ITEMS WHERE assm_ser_no="+serialNo+" AND ctype LIKE '%SiDetector%' ORDER BY posn");
00186 statement = SCTDBInterface.getInstance().connection.createStatement();
00187 if(DEBUG) System.out.println(sqlStat.toString());
00188 resultSet = statement.executeQuery(sqlStat.toString());
00189 recordCount=0;
00190 String sn;
00191
00192 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00193 Hashtable tempHash = new Hashtable();
00194 tempHash.put("SERIALNO",resultSet.getString(1));
00195 tempHash.put("POSITION",resultSet.getString(2));
00196 sensorList.addElement(tempHash);
00197 }
00198
00199 statement.close();
00200 return sensorList;
00201 }
00202
00203 public void getChipInfo(String hybridSN) throws Exception {
00204
00205 Hashtable thisHash = new Hashtable();
00206
00207
00208
00209 sqlStat = new StringBuffer("SELECT ");
00210 sqlStat.append("ASSM_ITEMS.ser_no,ASSM_ITEMS.posn,items.mfr_ser_no from ASSM_ITEMS,items WHERE assm_ser_no="+hybridSN);
00211 sqlStat.append(" AND items.ser_no=assm_items.ser_no AND assm_items.ctype = 'chABCD3T'");
00212 sqlStat.append(" ORDER BY ASSM_ITEMS.posn");
00213
00214
00215 if(DEBUG) System.out.println(sqlStat.toString());
00216 statement = SCTDBInterface.getInstance().connection.createStatement();
00217 resultSet = statement.executeQuery(sqlStat.toString());
00218
00219 int chipno=0;
00220 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00221 String chipSN = resultSet.getString(1);
00222 String posn = resultSet.getString(2);
00223 String mfr_sn = resultSet.getString(3);
00224 asicMfrHash.put(chipSN,mfr_sn);
00225 java.util.regex.Matcher matcher = lotNoPattern.matcher(mfr_sn);
00226 asicList.addElement(chipSN);
00227 int thePosition = Integer.parseInt(posn);
00228 thePosition--;
00229 posn = Integer.toString(thePosition);
00230
00231 if(matcher.matches()) {
00232 mfr_sn = mfr_sn.substring(matcher.start(1),matcher.end(1));
00233 if(posn.length()<2) posn="0"+posn;
00234 thisHash.put(posn,mfr_sn);
00235
00236 }
00237 chipno++;
00238 }
00239 statement.close();
00240 if(thisHash.size()!=12) {
00241 System.out.println("No asic assembly data for hybrid "+hybridSN);
00242 return;
00243 }
00244
00245 int ifactors=0;
00246 for (Enumeration e = thisHash.keys() ; e.hasMoreElements() ;) {
00247 String thisPosn = (String)e.nextElement();
00248 String thisLotNo = (String)thisHash.get(thisPosn);
00249 if(!correctionHash.containsKey(thisLotNo)) {
00250 String factor = WaferUtilities.getCalCorrFactor(thisLotNo);
00251 if(!factor.equals("")) correctionHash.put(thisLotNo,factor);
00252 }
00253 if(correctionHash.containsKey(thisLotNo)) {
00254 String thisFactor = (String)correctionHash.get(thisLotNo);
00255 thisHash.put(thisPosn,thisFactor);
00256
00257 ifactors++;
00258 }
00259 }
00260 ifactors = 12 - ifactors;
00261 if(ifactors>0) System.out.println("WARNING: CalCorr factors not found for "+ifactors+" chips");
00262
00263 }
00264
00265 public void getDataSheetInfo() {
00266 String bmSBserialNo = (snHash.containsKey(moduleParts[bmSB])) ? (String)snHash.get(moduleParts[bmSB]) : null;
00267 try {
00268 testDataHash = BarrelUtilities.getDataSheetStatus(moduleSerialNo,bmSBserialNo);
00269 }catch(Exception e){System.err.println(e.toString());}
00270 }
00271
00272 public void getBarrelMetrologyData() throws Exception {
00273 SCTDBInterface db = SCTDBInterface.getInstance();
00274 StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,tests.LOCN_NAME,tests.test_date,SCT_TSTBMSURVEYXY.event,tests.pass,tests.problem");
00275 for(int i=0;i<xyMetrologyParameters.length-2;i++) sqlStat.append(","+xyMetrologyParameters[i]);
00276 sqlStat.append(" FROM tests,SCT_TSTBMSURVEYXY WHERE tests.ser_no ="+moduleSerialNo+" AND SCT_TSTBMSURVEYXY.test_no=tests.test_no");
00277 sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
00278 if(DEBUG) System.out.println(sqlStat.toString());
00279 statement = db.connection.createStatement();
00280 resultSet = statement.executeQuery(sqlStat.toString());
00281 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00282 String testno = resultSet.getString(1);
00283 String location = resultSet.getString(2);
00284 String date = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
00285 String event = resultSet.getString(4);
00286 String pass = resultSet.getString(5);
00287 String problem = resultSet.getString(6);
00288
00289 int ncat = event.equals("SB") ? 13 : xyMetrologyParameters.length-2;
00290 int[] icategory= new int[ncat];
00291 for(int i=0;i<icategory.length;i++) {
00292 icategory[i] = BarrelUtilities.getXYStatus(i,resultSet.getString(7+i));
00293 }
00294 int category=0;
00295
00296
00297
00298 if(icategory[7]>=2 && icategory[12]>=2) {
00299 if(icategory[7]>icategory[12]) category=icategory[7];
00300 else if(icategory[7]<icategory[12]) category=icategory[12];
00301 else category=4;
00302 }
00303 for(int i=0;i<icategory.length;i++) {if(icategory[i]>category) category=icategory[i];}
00304
00305 String cColor;
00306 switch(category) {
00307 case 1:
00308 case 2:
00309 cColor="purple";
00310 break;
00311 case 3:
00312 case 4:
00313 cColor="red";
00314 break;
00315 default:
00316 cColor="green";
00317 }
00318
00319
00320 MetrologyTest met = new MetrologyTest(testno, location, date, event, "XY", "<font color="+cColor+">"+categories[category]+"</font>");
00321 metrologyHash.put(testno,met);
00322 metrologyList.addElement(testno);
00323 }
00324 statement.close();
00325
00326
00327 sqlStat = new StringBuffer("SELECT tests.test_no,tests.LOCN_NAME,tests.test_date,SCT_TSTBMSURVEYZ.event,tests.pass,tests.problem");
00328 for(int i=0;i<zBarrelDBParameters.length-2;i++) sqlStat.append(","+zBarrelDBParameters[i]);
00329 sqlStat.append(" FROM tests,SCT_TSTBMSURVEYZ WHERE tests.ser_no ="+moduleSerialNo+" AND SCT_TSTBMSURVEYZ.test_no=tests.test_no");
00330 sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
00331 if(DEBUG) System.out.println(sqlStat.toString());
00332 statement = SCTDBInterface.getInstance().connection.createStatement();
00333 resultSet = statement.executeQuery(sqlStat.toString());
00334 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00335 String testno = resultSet.getString(1);
00336 String location = resultSet.getString(2);
00337 String date = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
00338 String event = resultSet.getString(4);
00339 String pass = resultSet.getString(5);
00340 String problem = resultSet.getString(6);
00341
00342 int ncat = zMetrologyParameters.length-2;
00343 int[] icategory= new int[ncat];
00344 for(int i=0;i<icategory.length;i++) {
00345 icategory[i] = BarrelUtilities.getZStatus(i,resultSet.getString(7+i));
00346 }
00347 int category=0;
00348 for(int i=0;i<icategory.length;i++) {if(icategory[i]>category) category=icategory[i];}
00349
00350 String cColor;
00351 switch(category) {
00352 case 1:
00353 case 2:
00354 cColor="purple";
00355 break;
00356 case 3:
00357 case 4:
00358 cColor="red";
00359 break;
00360 default:
00361 cColor="green";
00362 }
00363
00364 MetrologyTest met = new MetrologyTest(testno, location, date, event, "Z", "<font color="+cColor+">"+categories[category]+"</font>");
00365 metrologyHash.put(testno,met);
00366 metrologyList.addElement(testno);
00367 }
00368 statement.close();
00369 }
00370
00371
00372 public void getEndCapMetrologyData() throws Exception {
00373 SCTDBInterface db = SCTDBInterface.getInstance();
00374 StringBuffer sqlStat = new StringBuffer("SELECT tests.test_no,tests.LOCN_NAME,tests.test_date,tests.pass,tests.problem");
00375 sqlStat.append(" FROM tests,TSTMODXY WHERE tests.ser_no ="+moduleSerialNo+" AND TSTMODXY.test_no=tests.test_no");
00376 sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
00377 if(DEBUG) System.out.println(sqlStat.toString());
00378 statement = db.connection.createStatement();
00379 resultSet = statement.executeQuery(sqlStat.toString());
00380 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00381 String testno = resultSet.getString(1);
00382 String location = resultSet.getString(2);
00383 String date = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
00384 String pass = resultSet.getString(4);
00385 String problem = resultSet.getString(5);
00386
00387 int category = (pass.equals("NO")) ? 2 : ( (problem.equals("NO"))? 0 : 1);
00388
00389 String cColor;
00390 switch(category) {
00391 case 1:
00392 cColor="purple";
00393 break;
00394 case 2:
00395 cColor="red";
00396 break;
00397 default:
00398 cColor="green";
00399 }
00400 MetrologyTest met = new MetrologyTest(testno, location, date, "n/a", "XY", "<font color="+cColor+">"+endCapStatus[category]+"</font>");
00401 metrologyHash.put(testno,met);
00402 metrologyList.addElement(testno);
00403 }
00404 statement.close();
00405
00406
00407 sqlStat = new StringBuffer("SELECT tests.test_no,tests.LOCN_NAME,tests.test_date,tests.pass,tests.problem");
00408 sqlStat.append(" FROM tests,TSTMODZ WHERE tests.ser_no ="+moduleSerialNo+" AND TSTMODZ.test_no=tests.test_no");
00409 sqlStat.append(" ORDER BY tests.test_date,tests.test_no");
00410 if(DEBUG) System.out.println(sqlStat.toString());
00411 statement = SCTDBInterface.getInstance().connection.createStatement();
00412 resultSet = statement.executeQuery(sqlStat.toString());
00413 for(boolean n = resultSet.next() ; n==true ; n=resultSet.next() ){
00414 String testno = resultSet.getString(1);
00415 String location = resultSet.getString(2);
00416 String date = guiUtilities.DaveUtils.extractDate(resultSet.getString(3));
00417 String pass = resultSet.getString(4);
00418 String problem = resultSet.getString(5);
00419
00420 int category = (pass.equals("NO")) ? 2 : ( (problem.equals("NO"))? 0 : 1);
00421
00422 String cColor;
00423 switch(category) {
00424 case 1:
00425 cColor="purple";
00426 break;
00427 case 2:
00428 cColor="red";
00429 break;
00430 default:
00431 cColor="green";
00432 }
00433
00434
00435 MetrologyTest met = new MetrologyTest(testno, location, date, "n/a", "Z", "<font color="+cColor+">"+endCapStatus[category]+"</font>");
00436 metrologyHash.put(testno,met);
00437 metrologyList.addElement(testno);
00438 }
00439 statement.close();
00440 }
00441
00442 }