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

RawScanResult.java

00001 package SctData;
00002 
00003 import hep.aida.*;
00004 import hep.aida.ref.histogram.*;
00005 import Sct.*;
00006 
00015 public class RawScanResult extends ScanResult {
00016     public RawScanResult(ResultHeader header, ModuleConfiguration moduleConfig, ScanPoints points, IHistogram2D scanData) {
00017         super(header, moduleConfig, points);
00018         this.scanData = scanData;
00019     }
00020 
00021     public String getClassName() {
00022         return "SctData.RawScanResult";
00023     }
00024 
00025     public String getUniqueID() {
00026         return "RawScanResult." + header.getUniqueID();
00027     }
00028 
00029     public static String getUniqueID(ResultHeader header) {
00030         return "RawScanResult." + header.getUniqueID();
00031     }
00032 
00034     public IHistogram2D getData() {
00035         return scanData;
00036     }
00037 
00040     public static RawScanResult read(IStream s, ObjectManager o) throws java.io.IOException {
00041         return new RawScanResult(s, o);
00042     }
00043     
00044     public void write(OStream s, ObjectManager o) throws java.io.IOException {
00045         super.write(s, o);
00046         
00047         int nPoints = getPoints().getNPoints();
00048         //System.out.println("Write n points = "+nPoints);
00049         int x_size  = scanData.xAxis().bins();
00050         //System.out.println("Write x_size = "+x_size);
00051         int size = (x_size/2 + 2) * (nPoints + 2);
00052         //System.out.println("Write size = "+size);
00053         s.writeInt("Size", size, false);
00054         s.writeShort("Type", ROOTHIST, false);
00055         s.writeShort("Width", WIDTH_64BIT, false);
00056 
00058         s.writeShort("OriginalType", originalType, false);
00059         
00060         //Copy data into arrays as necessary for Root format.  Ignore under and overflow bins
00061         double[] link0Data = new double[size];
00062         double[] link1Data = new double[size];
00063         
00064         for (int i=0; i<x_size/2; ++i) {
00065             for (int j=0; j<nPoints; ++j) {
00066                 link0Data[(x_size/2+2)*(j+1)+i+1] = scanData.binHeight(i, j);                
00067             }
00068         }
00069         for (int i=0; i<x_size/2; ++i) {
00070             for (int j=0; j<nPoints; ++j) {
00071                 link1Data[(x_size/2+2)*(j+1)+i+1] = scanData.binHeight(i+x_size/2, j);
00072             }
00073         }
00074         
00075         s.writeDoubleArray("Link0Data", link0Data);
00076         s.writeDoubleArray("Link1Data", link1Data);
00077     }
00078     
00079     private RawScanResult(IStream s, ObjectManager o) throws java.io.IOException {
00080         super(s, o);
00081         readData(s);
00082     }
00083     
00084     private void readData(IStream s) throws java.io.IOException {
00085         int size = s.readInt("Size");
00086         short type = s.readShort("Type");
00087         short width = s.readShort("Width");     
00088 
00089         originalType=type;
00090         
00091         switch (type) {
00092             case SLICE:
00093                 readSliceData(s, size, width);
00094                 return;
00095                 
00096             case ROOTHIST:
00097                 readRootData(s, size, width);
00098                 return;
00099 
00100            case RAWHIST:
00101                readRawData(s, size, width);
00102                return;
00103                 
00104             default:
00105                 throw new java.io.StreamCorruptedException("Unsupported raw data type: " + type);
00106         }
00107     }
00108 
00109     Histogram2D setHistSize(int x_size){
00110         // need to set x_size of histogram here!
00111         //System.out.println("Set hist size "+x_size);
00112         FixedAxis xAxis = new FixedAxis(x_size, -0.5, x_size+0.5);
00113         Histogram2D data = new Histogram2D(getUniqueID(), getUniqueID(), xAxis, getPoints().getAxis());
00114         scanData = data;
00115         return data;
00116     }
00117 
00118     private int getWidthMultiplier(short width){
00119         //System.out.println("Width = " + width);
00120         switch (width) {
00121         case WIDTH_16BIT: return 1;
00122         case WIDTH_32BIT: return 2;
00123         case WIDTH_64BIT: return 4;
00124         default: return 0;
00125         }
00126     }
00127         
00128     private void readRawData(IStream s, int size, short width) throws java.io.IOException {
00129         int nPoints = getPoints().getNPoints();
00130         int quotient = getWidthMultiplier(width) * nPoints;
00131         if (quotient==0 || size % quotient != 0 ) throw new java.io.StreamCorruptedException("Data size  = " + size + " but trying to divide by " + quotient);
00132         int x_size = size/quotient;
00133         Histogram2D scan_data = setHistSize(x_size);
00134         boolean ascending=getPoints().ascending();
00135 
00136         switch (width) {
00137         case WIDTH_16BIT:{
00138             short[] data = s.readShortArray("16BitSliceData");
00139             if (data.length != size) {                  
00140                 throw new java.io.StreamCorruptedException("Incorrect data size.  Got: " + data.length + " but header says: " + size);
00141             }
00142             double [][] heights = new double[x_size+2][nPoints+2];
00143             double [][] errors = new double[x_size+2][nPoints+2];
00144             for (int i=0; i<x_size; ++i) {
00145                 for (int j=0; j<nPoints; ++j) {
00146                     int jpt=0;
00147                     if (ascending) {jpt=j; }else{jpt=nPoints-j-1;}
00148                     heights[i+1][j+1] = data[jpt*x_size + i];
00149                     errors[i+1][j+1] = Math.sqrt(heights[i+1][j+1]);
00150                 }
00151             }
00152             scan_data.setContents(heights, errors, null, null, null, null, null);
00153         }
00154             return;
00155         case WIDTH_32BIT:{
00156             int[] data = s.readIntArray("32BitSliceData");
00157             if (data.length != size) {                  
00158                 throw new java.io.StreamCorruptedException("Incorrect data size.  Got: " + data.length + " but header says: " + size);
00159             }
00160             double [][] heights = new double[x_size+2][nPoints+2];
00161             double [][] errors = new double[x_size+2][nPoints+2];
00162             for (int i=0; i<x_size; ++i) {
00163                 for (int j=0; j<nPoints; ++j) {
00164                     int jpt=0;
00165                     if (ascending) {jpt=j; }else{jpt=nPoints-j-1;}
00166                     heights[i+1][j+1] = data[jpt*x_size + i];
00167                     errors[i+1][j+1] = Math.sqrt(heights[i+1][j+1]);
00168                 }
00169             }
00170             scan_data.setContents(heights, errors, null, null, null, null, null);
00171         }
00172             return;
00173 
00174         }
00175     }
00176 
00177     private void readSliceData(IStream s, int size, short width) throws java.io.IOException {
00178             int nPoints = getPoints().getNPoints();
00179             long expectedSize=2048 * nPoints;
00180                 
00181             Histogram2D scan_data = setHistSize(Parameters.nChannelModule);
00182 
00183             if (size != expectedSize)
00184                 throw new java.io.StreamCorruptedException("Incorrect data size. Have a size of: " + size + " but have " + nPoints + 
00185                                                            "scan points which implies a size of: " + expectedSize);         
00186             
00187             boolean ascending=getPoints().ascending();
00188             switch (width) {
00189                 case WIDTH_16BIT:{
00190                     short[] data = s.readShortArray("16BitSliceData");
00191                                     
00192                     if (data.length != expectedSize) {                  
00193                         throw new java.io.StreamCorruptedException("Incorrect data size.  Got: " + data.length + " but expected: " + expectedSize);
00194                     }
00195                     
00196                     double [][] heights = new double[Parameters.nChannelModule+2][nPoints+2];
00197                     double [][] errors = new double[Parameters.nChannelModule+2][nPoints+2];
00198                                     
00199                     for (int i=0; i<Parameters.nChannelLink; ++i) {
00200                         for (int j=0; j<nPoints; ++j) {
00201                             int jpt=0;
00202                             if (ascending) {jpt=j; }else{jpt=nPoints-j-1;}
00203                             heights[i+1][j+1] = data[jpt*2048 + i];
00204                             errors[i+1][j+1] = Math.sqrt(heights[i+1][j+1]);
00205                             
00206                             heights[i+Parameters.nChannelLink+1][j+1] = data[jpt*2048 + i+1024];
00207                             errors[i+Parameters.nChannelLink+1][j+1] = Math.sqrt(heights[i+Parameters.nChannelLink+1][j+1]);
00208                         }
00209                     }
00210                     
00211                     scan_data.setContents(heights, errors, null, null, null, null, null);
00212                 }
00213                 return;
00214                 
00215                 case WIDTH_32BIT: {
00216                     int[] data = s.readIntArray("32BitSliceData");
00217                                     
00218                     if (data.length != expectedSize) {                  
00219                         throw new java.io.StreamCorruptedException("Incorrect data size.  Got: " + data.length + " but expected: " + expectedSize);
00220                     }
00221                     
00222                     double [][] heights = new double[Parameters.nChannelModule+2][nPoints+2];
00223                     double [][] errors = new double[Parameters.nChannelModule+2][nPoints+2];
00224                                     
00225                     for (int i=0; i<Parameters.nChannelLink; ++i) {
00226                         for (int j=0; j<nPoints; ++j) {
00227                             int jpt=0;
00228                             if (ascending) {jpt=j; }else{jpt=nPoints-j-1;}
00229                             heights[i+1][j+1] = data[jpt*2048 + i];
00230                             errors[i+1][j+1] = Math.sqrt(heights[i+1][j+1]);
00231                             
00232                             heights[i+Parameters.nChannelLink+1][j+1] = data[j*2048 + i+1024];
00233                             errors[i+Parameters.nChannelLink+1][j+1] = Math.sqrt(heights[i+Parameters.nChannelLink+1][j+1]);
00234                         }
00235                     }
00236                     
00237                     scan_data.setContents(heights, errors, null, null, null, null, null);
00238                 }
00239                 return;
00240             }
00241     }
00242     
00243     //Read in ROOT data - copy into arrays for internal rep
00244     //Ignore under and overflow bins.
00245     private void readRootData(IStream s, int size, short width) throws java.io.IOException {
00246         
00247         originalType = s.readShort("OriginalType");
00248 
00249         int nPoints = getPoints().getNPoints();
00250         //System.out.println(" READ n points = "+nPoints);
00251         //System.out.println(" READ size = "+size);
00252 
00253         int quotient = (nPoints+2);
00254         if (quotient==0 || size % quotient != 0 ){
00255             throw new java.io.StreamCorruptedException("Cannot divide data of size " + 
00256                        size + " into " + quotient + " bins!");
00257         }
00258         int x_size = (size / quotient - 2)*2;
00259         Histogram2D scan_data = setHistSize(x_size);
00260 
00261         double [] link0Data = s.readDoubleArray("Link0Data");
00262         double [] link1Data = s.readDoubleArray("Link1Data");
00263         
00264         if (link0Data.length != link1Data.length || link0Data.length != (x_size/2 + 2) * (nPoints+2) ) {
00265             throw new java.io.StreamCorruptedException("Data arrays are not correct length.  Expected: " + 
00266                       (x_size/2 + 2) * (nPoints+2) + " Link0Data length: " + 
00267                       link0Data.length + " Link1Data length: " + link1Data.length);
00268         }
00269         
00270         double [][] heights = new double[x_size+2][nPoints+2];
00271         double [][] errors = new double[x_size+2][nPoints+2];
00272 
00273         IAxis xAxis = scanData.xAxis();
00274         IAxis yAxis = scanData.yAxis();
00275         
00276         for (int i=0; i<x_size; ++i) {
00277             for (int j=0; j<nPoints; ++j) {
00278                 heights[i+1][j+1] = i<x_size/2 ? link0Data[(j+1)*(x_size/2+2)+i            + 1] : 
00279                                                  link1Data[(j+1)*(x_size/2+2)+i%(x_size/2) + 1];
00280                 errors[i+1][j+1] = Math.sqrt(heights[i+1][j+1]);
00281             }
00282         }
00283                 
00284         scan_data.setContents(heights, errors, null, null, null, null, null);
00285     }
00286     
00287     private static final short SLICE = (short)2;
00288     private static final short SCURVE = (short)4;
00289     private static final short SLICE_COMPRESSED = (short)6;
00290     private static final short SCURVE_COMPRESSED = (short)8;
00291     private static final short FIT = (short)10;
00292     private static final short HITS_PER_EVENT = (short)12;
00293     private static final short ROOTHIST = (short)14;
00294     private static final short RAWHIST = (short)16;
00295     
00296     private static final short WIDTH_64BIT = (short)64;
00297     private static final short WIDTH_32BIT = (short)32;
00298     private static final short WIDTH_16BIT = (short)16;
00299     
00300     private IHistogram2D scanData;
00301     private short originalType;
00302 }

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