/* This code module converts between MIDAS and GANIL data formats */ #include #include #include extern unsigned short OutputBuffer[]; extern int OutputBufferLen; extern unsigned short EventBuffer[] ; /* in units of short */ extern int EventBufferLen;; extern unsigned int TimeStampL; extern unsigned int TimeStampM; extern unsigned int TimeStampH; extern unsigned int EvNumberH; extern unsigned int EvNumberL; extern unsigned short EventNumberMSW; extern unsigned short EventNumberLSW; extern unsigned int QLong; extern unsigned int QShort; extern unsigned int TimeTagMSW; extern unsigned int TimeTagLSW; extern unsigned int TimeTagEXW; extern unsigned int FineTime; extern int Started; extern int Verbose; extern void xfer_event(int); int V1495IDBase=0x2000; int V1751IDBase=0x2200; int V1290IDBase=0x2400; int V1495GroupBase=4; int V1751GroupBase=64; int V1290GroupBase=224; /* --------------------------------------------------------------------- */ int convertMIDAStoGANIL (unsigned short * dataBuffer , int dataBufferLen) { unsigned short * databuffer16; unsigned short * p16; int len; int offset; unsigned int module, group, item, chan; int i, j; unsigned short data, header; int eventlength; int count; int tracelen; if((Verbose & 0x0004) == 0x0004) { databuffer16 = dataBuffer; len = dataBufferLen; printf("convertMIDAStoGANIL: data buffer: length %d >>>\n",len); if (len == 0) {return 0;} if (len > 64) len=64; while (len > 0) {printf("0x%x ",*databuffer16++); len--;} printf("\n\n"); } databuffer16 = dataBuffer; len = dataBufferLen; /* len in units of short */ if (len == 0) {return 0;} /* empty event */ if((Verbose & 0x0008) == 0x0008) printf("convertMIDAStoGANIL: len=%d\n",len); offset = 0; while (len > 0) { header = *databuffer16++; if (header != 0xffff) { /* ne event header */ printf("len %d; data buffer offset %d; missing event header; 0x%x\n", len, offset, header); databuffer16 = databuffer16-32; len=64; while (len > 0) {printf("0x%x ",*databuffer16++); len--;} printf("\n\n"); return 0; } len--; offset++; eventlength = *databuffer16++; len--; offset++; if((Verbose & 0x0010) == 0x0010) printf("convert.1: len=%d; header=0x%x 0x%x %d\n",len,header,eventlength,eventlength/2); if (eventlength == 0) { if((Verbose & 0x0020) == 0x0020) printf("convert: EOB reached\n"); return 0; } eventlength = eventlength/2 - 2; /* units of short */ while (eventlength > 0) { header = *databuffer16++; len--; offset++; eventlength--; if((Verbose & 0x0040) == 0x0040) printf("convert.2: len=%d; header=0x%x %d; offset %d\n",len,header,eventlength,offset); switch ((header >> 14 ) & 3) { case 2: /* extended group format used for digital trace */ count = header & 0x3fff; group = *databuffer16++; len--; offset++; eventlength--; if((Verbose & 0x0080) == 0x0080) printf("convert.3: %d %d\n",count,group); group = group - 256; if (group < 16) { /* V1495 data buffer consists of 6 words TimeStampH TimeStampM TimeStampL EvNumberH EvNumberL spare */ if((Verbose & 0x0100) == 0x0100) printf ("V1495 group=%d count=%d %d %d\n",group,count,len,offset); /* V1495 data is the first thing to be read in an event */ if (EventBufferLen > 0) { if((Verbose & 0x0200) == 0x0200) printf ("V1495 item received - sending current event buffer length %d\n",EventBufferLen); xfer_event(0); if ((Verbose & 0x0200) == 0x0200) printf ("Send %d to server\n", EventBufferLen); } for (item = 0; item < 6; item++) { data = *databuffer16++; len--; offset++; eventlength--; switch (item) { case 0: TimeStampH = data; break; case 1: TimeStampM = data; break; case 2: TimeStampL = data; break; case 3: EvNumberH = data; break; case 4: EvNumberL = data; break; case 5: default: break; } /* end of switch item */ } /* end of loop over item */ /* put 1495 data into event buffer */ item = 0; EventBuffer[EventBufferLen] = V1495IDBase + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeStampH; EventBufferLen++; EventBuffer[EventBufferLen] = V1495IDBase + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeStampM; EventBufferLen++; EventBuffer[EventBufferLen] = V1495IDBase + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeStampL; EventBufferLen++; EventBuffer[EventBufferLen] = V1495IDBase + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = EvNumberH; EventBufferLen++; EventBuffer[EventBufferLen] = V1495IDBase + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = EvNumberL; EventBufferLen++; if((Verbose & 0x0400) == 0x0400) printf ("V1495 group=%d count=%d len=%d offset=%d EventBufferLen=%d\n",group,count,len,offset,EventBufferLen); Started = 1; /* now looking for event data */ } else { /* for the V1751 module + PSD the first 8 words of the buffer contain Charge and Timestamp etc Charge (long gate) - Item 0 Charge (short gate) - Item = 1 TimeTag (MSW) - Item = 2 TimeTag (LSW) - Item = 3 TimeTag (EXW) - Item = 4 FineTime - Item = 5 Spare - Item = 6 Spare - Item = 7 */ module = (group-V1751GroupBase)/8; chan = group - V1751GroupBase - (module*8); if((Verbose & 0x0800) == 0x0800) printf ("V1751.1 module= %d group=%d count=%d %d %d %d\n",module,group,count,len,offset,eventlength); for (item = 0; item < 8; item++) { data = *databuffer16++; len--; offset++; eventlength--; switch (item) { case 0: QLong = data; break; case 1: QShort = data; break; case 2: TimeTagMSW = data; break; case 3: TimeTagLSW = data; break; case 4: TimeTagEXW = data; break; case 5: FineTime = data; break; case 6: case 7: default: break; } /* end of switch item */ } /* end of loop over item */ /* put 1751 data into event buffer */ if (Started) { /* only if 1495 received */ item = 0; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = QLong; EventBufferLen++; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = QShort; EventBufferLen++; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeTagMSW; EventBufferLen++; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeTagLSW; EventBufferLen++; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = TimeTagEXW; EventBufferLen++; EventBuffer[EventBufferLen] = V1751IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; item++; EventBuffer[EventBufferLen] = FineTime; EventBufferLen++; } if((Verbose & 0x0800) == 0x0800) printf ("V1751.2 module=%d group=%d count=%d %d %d %d %d\n",module,group,count,len,offset,eventlength,EventBufferLen); } break; case 1: /* standard group format */ /* V1290 */ count = (header >> 8) & 0x3f; group = header & 255; /* group number - contains module + adc */ module = (group-V1290GroupBase)/32; chan = group - V1290GroupBase - (module*32); if((Verbose & 0x1000) == 0x1000) printf ("V1290.1 module=%d group=%d count=%d %d\n",module,group,count,EventBufferLen); /* put 1290 data into event buffer */ item = 0; for (i = 0; i < count; i++) { data = *databuffer16++; len--; offset++; eventlength--; if (Started) { EventBuffer[EventBufferLen] = V1290IDBase + (module << 6) + (chan << 3) + item; EventBufferLen++; EventBuffer[EventBufferLen] = data; EventBufferLen++; } item++; } if((Verbose & 0x1000) == 0x1000) printf ("V1290.2 module=%d group=%d count=%d %d %d %d %d\n",module,group,count,len,offset,eventlength,EventBufferLen); break; case 0: /* simple item form is not used */ case 3: default: break; } /* end of switch */ } /* end of eventlength > 2 */ } /* end of len > 0 */ } /* --------------------------------------------------------------------- */