protected:
- base::H1handle FrameLength;
- base::H1handle NumHeaders;
- base::H1handle NumTrailers;
- base::H1handle NumHTDiff;
- base::H1handle RegionHeaders;
- base::H1handle Columns;
- base::H1handle ErrorFlags;
+ base::H1handle FrameLength;
+ base::H1handle NumHeaders;
+ base::H1handle NumTrailers;
+ base::H1handle NumHTDiff;
+ base::H1handle RegionHeaders;
+ base::H1handle Columns;
+ base::H1handle ErrorFlags;
base::H2handle Matrix;
+ base::H2handle MatrixCurrent;
+ base::H2handle MatrixLast;
base::H2handle FrameLengthDist;
base::H2handle LengthvsError;
+ base::H1handle PixelMultiplicity;
+ base::H1handle PixelMultiplicityTotal;
+ base::H1handle PixelMultiplicityA;
+ base::H1handle PixelMultiplicityB;
+ base::H1handle PixelMultiplicityC;
+ base::H1handle PixelMultiplicityD;
+ base::H1handle PixelMultiplicityATotal;
+ base::H1handle PixelMultiplicityBTotal;
+ base::H1handle PixelMultiplicityCTotal;
+ base::H1handle PixelMultiplicityDTotal;
uint32_t length = 0;
uint32_t region = 0;
-
+ int frameCounter = 0;
+ int lastRegion = 0;
+ unsigned sensor=0;
+
+
virtual bool DecodePixel(uint16_t word, uint32_t* column, uint32_t* row) {
uint32_t pixelcode = (word >> 6) & 0x3ff;
uint32_t side = 0;
side = 1;
if((pixelcode&3) == 0x3 || (pixelcode&3) == 0x2)
topdown = 1;
-
+
*row = (pixelcode>>2)*2 + topdown;
*column = (((word>>3)&0x7) + region*8)*2 + side;
return true;
}
-
+
public:
MimosisProcessor(TrbProcessor* trb, unsigned subid);
Columns = MakeH1("Columns", "Hits per Column", 1024, 0, 1024, "#");
ErrorFlags = MakeH1("ErrorFlags", "", 9, 0, 9, "Bit");
Matrix = MakeH2("Matrix", "", 1024,0,1024,508,0,508);
+ MatrixCurrent = MakeH2("MatrixCurrent", "", 1024,0,1024,508,0,508);
+ MatrixLast = MakeH2("MatrixLast", "", 1024,0,1024,508,0,508);
FrameLengthDist = MakeH2("FrameLengthDist", "", 1024,0,1024,1024,0,1024,"this frame ; last frame");
LengthvsError = MakeH2("LengthvsError", "", 1024,0,1024,2,0,2,"frame size; limit marker");
+ PixelMultiplicity = MakeH1("PixelMultiplicity", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityTotal = MakeH1("PixelMultiplicityTotal", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityA = MakeH1("PixelMultiplicityA", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityB = MakeH1("PixelMultiplicityB", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityC = MakeH1("PixelMultiplicityC", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityD = MakeH1("PixelMultiplicityD", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityATotal = MakeH1("PixelMultiplicityATotal", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityBTotal = MakeH1("PixelMultiplicityBTotal", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityCTotal = MakeH1("PixelMultiplicityCTotal", "", 10000, 0, 1, "Hit probability");
+ PixelMultiplicityDTotal = MakeH1("PixelMultiplicityDTotal", "", 10000, 0, 1, "Hit probability");
+ sensor = subid-0xa000;
}
bool hadaq::MimosisProcessor::FirstBufferScan(const base::Buffer &buf)
unsigned len = buf.datalen()/4;
uint32_t* arr = (uint32_t*) buf.ptr();
uint32_t column, row;
+ uint32_t lastcolumn =-1, lastrow=-1;
uint32_t headers = 0, trailers = 0;
unsigned n=0;
unsigned headersnow = 0;
}
else if((data & 0xFF000000) == 0xFF000000) {
trailers++;
-/* if (headersnow && headersnow != 4) {
- printf("%i\t%i\n",headersnow,n);
- if(n>6) {
- printf("%08x %08x %08x %08x %08x %08x %08x %08x\n",arr[n-7],arr[n-6],arr[n-5],arr[n-4],arr[n-3],arr[n-2],arr[n-1],arr[n]);
+ frameCounter++;
+ FillH2(MatrixCurrent,-1,-1);
+ if(frameCounter == 10000) {
+
+ ((TH2F*) MatrixCurrent)->Copy(*((TH2F*) MatrixLast));
+
+ ((TH1*)PixelMultiplicityTotal)->Add((TH1*)PixelMultiplicityTotal, (TH1*)PixelMultiplicity);
+
+ ((TH1*)PixelMultiplicityATotal)->Add((TH1*)PixelMultiplicityATotal, (TH1*)PixelMultiplicityA);
+ ((TH1*)PixelMultiplicityBTotal)->Add((TH1*)PixelMultiplicityBTotal, (TH1*)PixelMultiplicityB);
+ ((TH1*)PixelMultiplicityCTotal)->Add((TH1*)PixelMultiplicityCTotal, (TH1*)PixelMultiplicityC);
+ ((TH1*)PixelMultiplicityDTotal)->Add((TH1*)PixelMultiplicityDTotal, (TH1*)PixelMultiplicityD);
+
+ ClearH2(PixelMultiplicity);
+ for(int x = 1; x<=1024; x++)
+ for(int y = 1; y<=508; y++) {
+ double_t pixelcount = ((TH2F*)MatrixCurrent)->GetBinContent(x,y);
+ if(pixelcount > 0)
+ FillH1(PixelMultiplicity,(pixelcount+0.5)/frameCounter);
}
+
+ ClearH2(PixelMultiplicityA);
+ for(int x = 1; x<=128; x++)
+ for(int y = 1; y<=508; y++) {
+ double_t pixelcount = ((TH2F*)MatrixCurrent)->GetBinContent(x,y);
+ if(pixelcount > 0)
+ FillH1(PixelMultiplicityA,(pixelcount+0.5)/frameCounter);
+ }
+
+ ClearH2(PixelMultiplicityB);
+ for(int x = 129; x<=512; x++)
+ for(int y = 1; y<=508; y++) {
+ double_t pixelcount = ((TH2F*)MatrixCurrent)->GetBinContent(x,y);
+ if(pixelcount > 0)
+ FillH1(PixelMultiplicityB,(pixelcount+0.5)/frameCounter);
+ }
+
+ ClearH2(PixelMultiplicityC);
+ for(int x = 513; x<=896; x++)
+ for(int y = 1; y<=508; y++) {
+ double_t pixelcount = ((TH2F*)MatrixCurrent)->GetBinContent(x,y);
+ if(pixelcount > 0)
+ FillH1(PixelMultiplicityC,(pixelcount+0.5)/frameCounter);
+ }
+
+ ClearH2(PixelMultiplicityD);
+ for(int x = 897; x<=1024; x++)
+ for(int y = 1; y<=508; y++) {
+ double_t pixelcount = ((TH2F*)MatrixCurrent)->GetBinContent(x,y);
+ if(pixelcount > 0)
+ FillH1(PixelMultiplicityD,(pixelcount+0.5)/frameCounter);
+ }
+
+ frameCounter = 0;
+ ClearH2(MatrixCurrent);
}
-*/
headersnow = 0;
FillH1(FrameLength,length);
if(lastlength != -1)
FillH2(FrameLengthDist, length, lastlength);
- lastlength = length;
+ lastlength = length;
FillH2(LengthvsError,length,(data & 0x00080000)?1:0);
-
+
if(data & 0x00010000) FillH1(ErrorFlags,0);
if(data & 0x00020000) FillH1(ErrorFlags,1);
if(data & 0x00040000) FillH1(ErrorFlags,2);
if(!(data & 0x00FF0000)) FillH1(ErrorFlags,8);
}
else {
-/* if (headersnow && headersnow != 4) {
- printf("%i\t%i\n",headersnow,n);
- if(n>6) {
- printf("%08x %08x %08x %08x %08x %08x %08x %08x\n",arr[n-7],arr[n-6],arr[n-5],arr[n-4],arr[n-3],arr[n-2],arr[n-1],arr[n]);
- }
- }*/
+
headersnow = 0;
if((data & 0xFF000000) == 0xFD000000) {
- region = (data>>16) & 0xff;
+ lastRegion = region;
+ int tmp = (data>>16) & 0xff;
+// if(tmp >63) {
+// printf("%08x %08x %08x %i %i %i %i\n",arr[n-1],arr[n],arr[n+1],tmp, lastRegion, sensor, n%4);
+// }
+ if(tmp > 63) continue;
+ region = tmp;
FillH1(RegionHeaders,region);
}
else {
DecodePixel(data>>16,&column,&row);
FillH1(Columns,column);
+// if(column > 1023 || row > 507) {
+// printf("1: %i %i\n",column,row);
+// }
FillH2(Matrix,column,row);
+ FillH2(MatrixCurrent,column,row);
+
+// if(lastrow != -1 && lastcolumn/2 == column/2 && lastrow > row) {
+// printf("%i %i -> %i %i / %08x %08x %08x %i \n",lastcolumn,lastrow,column,row,arr[n-1],arr[n],arr[n+1],length);
+// }
+ lastcolumn = column; lastrow = row;
}
if ((data & 0x0000FF00) != 0x0000FC00) {
DecodePixel(data&0xffff,&column,&row);
+// if(column > 1023 || row > 507) {
+// printf("2: %i %i\n",column,row);
+// }
FillH1(Columns,column);
FillH2(Matrix,column,row);
+ FillH2(MatrixCurrent,column,row);
+
+// if(lastrow != -1 && lastcolumn/2 == column/2 && lastrow > row) {
+// printf("%i %i -> %i %i / %08x %08x %08x %i *\n",lastcolumn,lastrow,column,row,arr[n-1],arr[n],arr[n+1],length);
+// }
+
+ lastcolumn = column; lastrow = row;
}
}
-
+
}