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
00049 int x_size = scanData.xAxis().bins();
00050
00051 int size = (x_size/2 + 2) * (nPoints + 2);
00052
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
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
00111
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
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
00244
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
00251
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 }