00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "StFmsTriggerDetector.h"
00039 #include "StTriggerData.h"
00040 #include "Stiostream.h"
00041 #include <stdio.h>
00042
00043 static const char rcsid[] = "$Id: StFmsTriggerDetector.cxx,v 2.9 2010/01/25 17:25:00 ullrich Exp $";
00044
00045 ClassImp(StFmsTriggerDetector)
00046
00047 StFmsTriggerDetector::StFmsTriggerDetector()
00048 {
00049
00050 memset(mBeg,0,mEnd-mBeg);
00051 mNumHeader=-1;
00052 mNumQTdata=0;
00053 }
00054
00055 StFmsTriggerDetector::StFmsTriggerDetector(const StTriggerData& t)
00056 {
00057
00058 const unsigned char *c=0;
00059 const unsigned short *s=0;
00060 const unsigned int *i=0;
00061
00062 memset(mBeg,0,mEnd-mBeg);
00063
00064 mNumHeader=-1;
00065 mNumQTdata = (int)t.nQTdata();
00066 if ( !(mMaxLine>=mNumQTdata)){
00067 {LOG_ERROR << "StFmsTriggerDetector::StFmsTriggerDetector() mMaxLine < mNumQTdata" << endm;}
00068 }
00069 else {
00070 i = t.QTdata(); if (i && mNumQTdata>0) memcpy(mQTdata,i, mNumQTdata*sizeof(int ));
00071 }
00072 c = t.getDsm_FMS() ; if (c) memcpy(mDSM ,c, sizeof(mDSM ));
00073 c = t.getDsm01_FMS(); if (c) memcpy(mDSM01 ,c, sizeof(mDSM01));
00074 c = t.getDsm02_FMS(); if (c) memcpy(mDSM02 ,c, sizeof(mDSM02));
00075 s = t.getDsm1_FMS() ; if (s) memcpy(mDSM1 ,s, sizeof(mDSM1 ));
00076 s = t.getDsm2_FMS() ; if (s) memcpy(mDSM2 ,s, sizeof(mDSM2 ));
00077
00078 }
00079
00080 StFmsTriggerDetector::~StFmsTriggerDetector() {}
00081
00082 void
00083 StFmsTriggerDetector::clearFlag() {
00084
00085 mNumHeader=-1;
00086 }
00087
00088 void
00089 StFmsTriggerDetector::decode()
00090 {
00091
00092 mNumHeader=0;
00093 if (mNumQTdata==0) return;
00094 memset(mADC,0,sizeof(mADC));
00095 memset(mTDC,0,sizeof(mTDC));
00096 int header=1, nline=0, iline;
00097 int crate=0, addr=0;
00098 for (int i=0; i<static_cast<int>(mNumQTdata-1); i++){
00099 unsigned int d = mQTdata[i];
00100 if (header==1){
00101 crate = getCRT(d);
00102 addr = getADR(d);
00103 nline = getNHT(d);
00104 if (crate-mOffsetCrate<0 || crate-mOffsetCrate>mMaxCrate){
00105 {LOG_ERROR << "StFmsTriggerDetector::decode() Wrong QT crate#=" <<crate<< endm;}
00106 }
00107 if (addr-mOffsetAddr<0 || addr-mOffsetAddr>mMaxAddr){
00108 {LOG_ERROR << "StFmsTriggerDetector::decode() Wrong QT Addr#=" <<addr<< endm;}
00109 }
00110 if (nline<0 || nline>32){
00111 {LOG_ERROR << "StFmsTriggerDetector::decode() Wrong QT # of lines=" <<nline<< endm;}
00112 }
00113 if (nline>0) {header=0; iline=0;}
00114 mNumHeader++;
00115 }
00116 else {
00117 iline++;
00118 unsigned short dcard = getQT8(d);
00119 unsigned short dch = getCHA(d);
00120 if (dcard>mMaxDCard){
00121 {LOG_ERROR << "StFmsTriggerDetector::decode() Wrong QT DCard=" <<dcard<< endm;}
00122 }
00123 if (dch>mMaxChan){
00124 {LOG_ERROR << "StFmsTriggerDetector::decode() Wrong QT DChan=" <<dch<< endm;}
00125 }
00126 int tst=(char*)&mADC[crate-mOffsetCrate][addr-mOffsetAddr][dcard][dch]
00127 -(char*)&mADC[0][0][0][0];
00128 if ( ! (tst>=0 && tst<(int)sizeof(mADC)) ){
00129 {LOG_ERROR << "StFmsTriggerDetector::decode() Sanity check failed in" << endm;}
00130 }
00131 else {
00132 mADC[crate-mOffsetCrate][addr-mOffsetAddr][dcard][dch]=getADC(d);
00133 mTDC[crate-mOffsetCrate][addr-mOffsetAddr][dcard][dch]=getTDC(d);
00134 }
00135 if (nline==iline) header=1;
00136 }
00137 }
00138 }
00139
00140 unsigned int
00141 StFmsTriggerDetector::hit(int line) const
00142 {
00143 if (line>=0 && line<mMaxLine && line<(int)mNumQTdata) return mQTdata[line];
00144 return 0;
00145 }
00146
00147 unsigned short
00148 StFmsTriggerDetector::adc(int crate, int addr, int dcard, int dch)
00149 {
00150 if (mNumHeader==-1) decode();
00151 crate -= mOffsetCrate;
00152 addr -= mOffsetAddr;
00153 if (crate >= 0 && crate < mMaxCrate &&
00154 addr >= 0 && addr < mMaxAddr &&
00155 dcard >= 0 && dcard < mMaxDCard &&
00156 dch >= 0 && dch < mMaxChan ){
00157 return mADC[crate][addr][dcard][dch];
00158 }
00159 else {
00160 {LOG_WARN << "StFmsTriggerDetector::adc() arguments out of range" << endm;}
00161 return 0;
00162 }
00163 }
00164
00165 unsigned short
00166 StFmsTriggerDetector::tdc(int crate, int addr, int dcard, int dch)
00167 {
00168 if (mNumHeader==-1) decode();
00169 crate -= mOffsetCrate;
00170 addr -= mOffsetAddr;
00171 if (crate >= 0 && crate < mMaxCrate &&
00172 addr >= 0 && addr < mMaxAddr &&
00173 dcard >= 0 && dcard < mMaxDCard &&
00174 dch >= 0 && dch < mMaxChan ){
00175 return mTDC[crate][addr][dcard][dch];
00176 }
00177 else {
00178 {LOG_WARN << "StFmsTriggerDetector::tdc() arguments out of range" << endm;}
00179 return 0;
00180 }
00181 }
00182
00183 void
00184 StFmsTriggerDetector::dump()
00185 {
00186 cout << "FMS data dump" << endl;
00187 cout << "mNumHeader = "<<mNumHeader<<endl;
00188 if (mNumHeader==-1) decode();
00189 cout << "Number of data lines = " << mNumQTdata << endl;
00190 if (mNumQTdata>0){
00191 printf("Number of header lines = %d\n", mNumHeader);
00192 printf("Last check line (should be 0xAC10) = %x\n",mQTdata[mNumQTdata-1]);
00193 printf("ADC\n");
00194 for(int crate=0; crate<mMaxCrate; crate++){
00195 for(int addr=0; addr<mMaxAddr; addr++){
00196 for(int dcard=0; dcard<mMaxDCard; dcard++){
00197 printf("Crate=%5d Addr=%5x DCard=%5d %4d %4d %4d %4d %4d %4d %4d %4d\n",
00198 crate+mOffsetCrate, addr+mOffsetAddr, dcard,
00199 mADC[crate][addr][dcard][0], mADC[crate][addr][dcard][1],
00200 mADC[crate][addr][dcard][2], mADC[crate][addr][dcard][3],
00201 mADC[crate][addr][dcard][4], mADC[crate][addr][dcard][5],
00202 mADC[crate][addr][dcard][6], mADC[crate][addr][dcard][7]);
00203 }
00204 }
00205 }
00206 printf("TDC\n");
00207 for(int crate=0; crate<mMaxCrate; crate++){
00208 for(int addr=0; addr<mMaxAddr; addr++){
00209 for(int dcard=0; dcard<mMaxDCard; dcard++){
00210 printf("Crate=%5d Addr=%5x DCard=%5d %4d %4d %4d %4d %4d %4d %4d %4d\n",
00211 crate+mOffsetCrate, addr+mOffsetAddr, dcard,
00212 mTDC[crate][addr][dcard][0], mTDC[crate][addr][dcard][1],
00213 mTDC[crate][addr][dcard][2], mTDC[crate][addr][dcard][3],
00214 mTDC[crate][addr][dcard][4], mTDC[crate][addr][dcard][5],
00215 mTDC[crate][addr][dcard][6], mTDC[crate][addr][dcard][7]);
00216 }
00217 }
00218 }
00219 }
00220 }