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

ModuleInfo.java

00001 package ProdDatabase;
00002 /*
00003  * @author robinson
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+).*"); // miss out the non-LOT info, eg Z39993-W12 X1 Y2
00024 
00025    public ModuleInfo(String moduleSerialNo)  {
00026        this.moduleSerialNo=moduleSerialNo;
00027        metrologyList = new Vector();
00028        sensorList = new Vector();          // list of sensors, in order of position
00029        asicList = new Vector();            // list of asics, in order of position
00030        snHash = new Hashtable();           // maps component name to serial no
00031        testDataHash = new Hashtable();     // maps datasheet testname to DB testno
00032        asicMfrHash = new Hashtable();      // maps sn to mfr_sn for asics
00033        correctionHash = new Hashtable();   // maps lot no to cal corr factor for asics
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: //endcap
00095              sensorList = getSensorList(moduleSerialNo);
00096              if(hybridSerialNo!=null) {
00097                 getChipInfo(hybridSerialNo);   
00098                 snHash.put(moduleParts[bmHASIC],hybridSerialNo);   
00099                 }      
00100              break;
00101            default: // barrel
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 //****************************************************************************8
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      // first get the bmSB
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 //*************************************************************************8
00180 public Vector getSensorList(String serialNo) throws Exception {
00181 // supplied serialNo is moduleSerialNo for endcap, bmSB serial number of barrels
00182      // first get the bmSB
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 // now get the chips in the assembly table
00208 // construct the hash with position as Key and LotNumber as value
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 //     System.out.println("now get chips ...");
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 //          System.out.println("chipno="+chipno+", posn="+posn+", mfr_sn="+mfr_sn);
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 //            System.out.println("chipno="+chipno+", posn="+posn+", mfr_sn="+mfr_sn);
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 // ok, now go through the chips to get the cal correction factors
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 //              System.out.println("Putting "+thisFactor+" into chip position "+thisPosn);
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 // exclusivity of midyf and stereo for categories PASS2 and SPARE
00296 // if one is SPARE, then the other must be equal or less to next tightest cut, ie PASS2
00297 // otherwise FAIL
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 }

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