00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <arpa/inet.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007 #include <rts.h>
00008
00009 #include "daq_l3.h"
00010
00011
00012 inline float fswap(float swapped)
00013 {
00014 unsigned int* uintptr = (unsigned int*) &swapped;
00015 unsigned int uintvar = l2h32(*uintptr);
00016 float* floatvar = (float*)&uintvar;
00017 return *floatvar;
00018 }
00019
00020
00021 #ifdef RTS_LITTLE_ENDIAN
00022 #define l2hfloat(x) (x)
00023 #define b2hfloat(x) (fswap(x))
00024 #else
00025 #define l2hfloat(x) (fswap(x))
00026 #define b2hfloat(x) (x)
00027 #endif
00028
00029
00030 int l3_reader(char *m, struct l3_t *l3, u_int driver)
00031 {
00032 struct DATAP *datap = (struct DATAP *)m ;
00033 struct L3_P *l3p ;
00034 int len, off ;
00035 char *l3_gtd_start = 0 ;
00036 int fy09_format = 0 ;
00037
00038 l3->max_channels = 1280000 ;
00039 l3->channels = 0 ;
00040 l3->mode = 1 ;
00041
00042
00043
00044 l3->tracks_num = 0 ;
00045 l3->cluster_num = 0 ;
00046 l3->xVertex = -1000.0 ;
00047 l3->yVertex = -1000.0 ;
00048 l3->zVertex = -1000.0 ;
00049
00050
00051 if(datap == NULL) return 0 ;
00052
00053 if(driver) {
00054 l3_gtd_start = m ;
00055 fy09_format = 1 ;
00056
00057 l3->mode = 0 ;
00058 l3->channels = 0 ;
00059 }
00060 else {
00061
00062 len = ntohl(datap->det[L3_ID].len) * 4 ;
00063 if(len == 0) return 0 ;
00064
00065 off = ntohl(datap->det[L3_ID].off) ;
00066 if(off == 0) return 0 ;
00067
00068 l3p = (struct L3_P *)((u_int *)m+off) ;
00069
00070
00071 len = l3p->bh.length;
00072
00073
00074 LOG(DBG,"L3_P bytes %d",len,0,0,0) ;
00075
00076 if(checkBank(l3p->bh.bank_type,"L3_P") < 0) {
00077 return -1 ;
00078 }
00079
00080
00081 if(l3p->tracks.len && l3p->tracks.off){
00082 l3_gtd_start = ((char*)l3p + l2h32(l3p->tracks.off)*4) ;
00083 }
00084 }
00085
00086
00087 if(!l3_gtd_start) return 0 ;
00088
00089
00090
00091
00092 if(l3_gtd_start) {
00093 struct L3_GTD* l3gtd = (struct L3_GTD *) l3_gtd_start ;
00094
00095
00096 if(checkBank(l3gtd->bh.bank_type,"L3_GTD") < 0) {
00097 return -1 ;
00098 }
00099
00100 if(fy09_format) {
00101 l3->mode = l2h32(l3gtd->bh.crc) ;
00102 l3->channels = l2h32(l3gtd->bh.w9) ;
00103 }
00104
00105 l3->tracks_num = l2h32(l3gtd->nTracks);
00106 l3->cluster_num = l2h32(l3gtd->nHits);
00107 l3->xVertex = l2hfloat(l3gtd->xVert);
00108 l3->yVertex = l2hfloat(l3gtd->yVert);
00109 l3->zVertex = l2hfloat(l3gtd->zVert);
00110
00111
00112 if(l3->tracks_num >= L3_MAX_NR_TRACKS) {
00113 LOG(ERR,"L3 track number %d > %d! Maxing them out...",l3->tracks_num,L3_MAX_NR_TRACKS ,0,0,0) ;
00114 l3->tracks_num = L3_MAX_NR_TRACKS ;
00115 }
00116
00117
00118 for (unsigned int i=0; i<l3->tracks_num; i++) {
00119 global_track *tr = &(l3gtd->track[i]);
00120
00121 l3->track[i].id = l2h32(tr->id);
00122
00123 #ifndef UNIX_LITTLE_ENIDAN
00124 l3->track[i].flag = tr->flag;
00125 l3->track[i].innerMostRow = tr->innerMostRow;
00126 l3->track[i].outerMostRow = tr->outerMostRow;
00127
00128 l3->track[i].nHits = tr->nHits;
00129 l3->track[i].ndedx = tr->ndedx;
00130 l3->track[i].q = tr->q;
00131 #else
00132 l3->track[i].flag = ( ((unsigned short)tr->innerMostRow) |
00133 ((unsigned short)tr->outerMostRow)<<8);
00134 l3->track[i].innerMostRow = (char)( tr->flag & 0x00ff );
00135 l3->track[i].outerMostRow = (char)((tr->flag & 0xff00)>>8);
00136
00137 l3->track[i].nHits = (unsigned char)tr->q;
00138 l3->track[i].reserved = (char)tr->ndedx;
00139 l3->track[i].ndedx = (unsigned char)tr->reserved;
00140 l3->track[i].q = (char)tr->nHits;
00141 #endif
00142 l3->track[i].chi2[0] = l2hfloat(tr->chi2[0]);
00143 l3->track[i].chi2[1] = l2hfloat(tr->chi2[1]);
00144 l3->track[i].dedx = l2hfloat(tr->dedx);
00145 l3->track[i].pt = l2hfloat(tr->pt);
00146 l3->track[i].phi0 = l2hfloat(tr->phi0);
00147 l3->track[i].psi = l2hfloat(tr->psi);
00148 l3->track[i].r0 = l2hfloat(tr->r0);
00149 l3->track[i].tanl = l2hfloat(tr->tanl);
00150 l3->track[i].z0 = l2hfloat(tr->z0);
00151 l3->track[i].length = l2hfloat(tr->length);
00152 l3->track[i].dpt = l2hfloat(tr->dpt);
00153 l3->track[i].dpsi = l2hfloat(tr->dpsi);
00154 l3->track[i].dz0 = l2hfloat(tr->dz0);
00155 l3->track[i].dtanl = l2hfloat(tr->dtanl);
00156
00157 }
00158
00159
00160 }
00161
00162
00163 #ifdef SHOW_DEBUG_INFO
00164
00165 #ifdef UNIX_LITTLE_ENDIAN
00166 printf("Running on LITTLE endian machine\n");
00167 #else
00168 printf("Running on BIG endian machine\n");
00169 #endif
00170
00171 printf("\nVertex: (%6.2f/%6.2f/%6.2f)\n",
00172 l3->xVertex, l3->yVertex, l3->zVertex);
00173
00174 printf("Tracks: %5d Clusters %7d\n",
00175 l3->tracks_num, l3->cluster_num);
00176
00177 for (unsigned int i=0; i<l3->tracks_num; i++) {
00178 printf("%5d: pt=%5.3f z0=%7.2f q=%2d nHits=%2d ndedx=%2d ",
00179 i, l3->track[i].pt, l3->track[i].z0, l3->track[i].q,
00180 l3->track[i].nHits, l3->track[i].ndedx);
00181
00182 printf("flag=0x%04x iRow=%2d oRow=%2d\n",
00183 l3->track[i].flag, l3->track[i].innerMostRow,
00184 l3->track[i].outerMostRow);
00185 }
00186
00187 #endif
00188
00189 return 1 ;
00190
00191 }
00192