00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <iostream>
00015 #include "StMessMgr.h"
00016 #include "StBTofSortRawHit.h"
00017 #include "StEvent.h"
00018 #include "StBTofCollection.h"
00019 #include "StBTofRawHit.h"
00020 #include "StBTofDaqMap.h"
00021 #include "tables/St_tofTrgWindow_Table.h"
00022 #include "tables/St_vpdDelay_Table.h"
00023
00024 StBTofSortRawHit::StBTofSortRawHit() {
00025 mDaqMap = 0;
00026 mDebug = kFALSE;
00027 Reset();
00028 }
00029
00030 StBTofSortRawHit::~StBTofSortRawHit() {
00031 Reset();
00032 }
00033
00034 void StBTofSortRawHit::Reset() {
00035 for(int i=0;i<mNTRAY;i++) mRawHitVec[i].clear();
00036 memset(mTriggerTime,0,sizeof(mTriggerTime));
00037 }
00038
00039 void StBTofSortRawHit::Init() {
00040 Reset();
00041 memset(mTriggerTimeWindow,0,sizeof(mTriggerTimeWindow));
00042 memset(mVpdDelay,0,sizeof(mVpdDelay));
00043 }
00044
00045 void StBTofSortRawHit::Init(StMaker *maker, StBTofDaqMap *daqMap) {
00046
00047 Init();
00048
00049
00051 LOG_INFO << "[StBTofSortRawHit] retrieving BTOF trigger time window cuts" << endm;
00052 TDataSet *mDbTOFDataSet = maker->GetDataBase("Calibrations/tof/tofTrgWindow");
00053 St_tofTrgWindow* tofTrgWindow = static_cast<St_tofTrgWindow*>(mDbTOFDataSet->Find("tofTrgWindow"));
00054 if(!tofTrgWindow) {
00055 LOG_ERROR << "unable to get tof Module map table" << endm;
00056 return;
00057 }
00058 tofTrgWindow_st* trgWin = static_cast<tofTrgWindow_st*>(tofTrgWindow->GetArray());
00059 for (Int_t i=0;i<mNTRAY;i++) {
00060 mTriggerTimeWindow[i][0] = (Float_t)trgWin[i].trgWindow_Min;
00061 mTriggerTimeWindow[i][1] = (Float_t)trgWin[i].trgWindow_Max;
00062 if(maker->Debug()) {
00063 LOG_DEBUG << " Tray = " << i+1 << " Trigger Window = " << mTriggerTimeWindow[i][0] << " " << mTriggerTimeWindow[i][1] << endm;
00064 }
00065 }
00066
00067 mDaqMap = daqMap;
00068
00069 if(maker->Debug()) mDebug = kTRUE;
00070
00071 LOG_INFO << "[StBTofSortRawHit] retrieving VPD delay settings" << endm;
00072 mDbTOFDataSet = maker->GetDataBase("Calibrations/tof/vpdDelay");
00073
00074
00075 if (mDbTOFDataSet){
00076 St_vpdDelay *vpdDelayTable = static_cast<St_vpdDelay*>(mDbTOFDataSet->Find("vpdDelay"));
00077 if (!vpdDelayTable) {
00078 LOG_ERROR << "unable to find vpdDelay table" << endm;
00079 return;
00080 }
00081 vpdDelay_st* vpdDelay = static_cast<vpdDelay_st*>(vpdDelayTable->GetArray());
00082 if (!vpdDelay) {
00083 LOG_ERROR << "unable to get vpdDelay data" << endm;
00084 return;
00085 }
00086 for (int i=0;i<2*mNVPD;i++){
00087 mVpdDelay[i] = vpdDelay->delay[i];
00088 }
00089 }
00090 else {
00091
00092
00093 LOG_WARN << "unable to find vpdDelay dataset: assuming Run-9 (200GeV) default values for vpdDelay" << endm;
00094 float delay[2*mNVPD]={
00095 0,-0.564753,-4.62291,-4.84402,-4.05943,6.32389,-9.4035,-10.3113,-17.0374,-17.3734,-6.04608,-11.9614,-12.7579,8.79609,3.8467,-17.2994,-17.6424,-21.4749,-22.9736,
00096 0,-2.1707, -4.8195, -6.5161, -4.3109, 6.3116, -8.8655,-10.1037,-16.5970,-17.9588,-5.2079, -12.1249,-12.2412,8.4001, 5.5702,-16.5936,-16.4152,-21.3076,-21.1452};
00097
00098 for (int i=0;i<2*mNVPD;i++){
00099 mVpdDelay[i] = delay[i];
00100 }
00101 }
00102
00103 return;
00104 }
00105
00106 void StBTofSortRawHit::setBTofCollection(StBTofCollection* tofColl) {
00107
00109 Reset();
00110
00111 if(tofColl && tofColl->tofHeader()) {
00112 for(int i=0;i<mNFIBER;i++) {
00113 mTriggerTime[i] = tofColl->tofHeader()->triggerTime(i);
00114 }
00115 if(mDebug) {
00116 LOG_INFO << " Trigger Time Stamps " << endm;
00117 LOG_INFO << mTriggerTime[0] << " " << mTriggerTime[1] << " " <<
00118 mTriggerTime[2] << " " << mTriggerTime[3] << endm;
00119 }
00120 }
00121
00122 if(tofColl && tofColl->rawHitsPresent()) {
00123
00124 StSPtrVecBTofRawHit &tofRawHits = tofColl->tofRawHits();
00125
00126
00127 if(mDebug) {
00128 LOG_INFO << " INPUT ...... " << endm;
00129 for(size_t i=0; i<tofRawHits.size(); i++) {
00130 LOG_INFO << " flag=" << tofRawHits[i]->flag()
00131 << " tray=" << tofRawHits[i]->tray() << " channel="
00132 << tofRawHits[i]->channel() << " tdc="
00133 << tofRawHits[i]->tdc() << endm;
00134 }
00135 }
00136
00137
00138 for(size_t i=0; i<tofRawHits.size(); i++) {
00139 if(!tofRawHits[i]->leadingEdge()) continue;
00140 int itray = tofRawHits[i]->tray();
00141 int ichan = tofRawHits[i]->channel();
00142 int ifiber = tofRawHits[i]->fiberId();
00143 if (itray<=0 || itray>mNTRAY || ichan<0 || ichan>=mNCHAN || ifiber<0 || ifiber>=mNFIBER ) {
00144 LOG_FATAL << " StBTofSortRawHit::setBTofCollection:: "
00145 << ": itray=" << itray
00146 << ": ichan=" << ichan
00147 << ": ifiber=" << ifiber
00148 << endm;
00149 continue;
00150 }
00151 bool iexist = kFALSE;
00152 for(size_t ii=0; ii<mRawHitVec[itray-1].size(); ii++) {
00153 if(itray==mRawHitVec[itray-1][ii].tray && ichan==mRawHitVec[itray-1][ii].channel) {
00154 iexist = kTRUE;
00155 break;
00156 }
00157 }
00158 if(iexist) continue;
00159 TOFRawHit aRawHit;
00160 aRawHit.fiberId = ifiber;
00161 aRawHit.tray = itray;
00162 aRawHit.channel = ichan;
00163 aRawHit.leadingTdc.push_back(tofRawHits[i]->tdc());
00164 for(size_t j=i+1;j<tofRawHits.size();j++) {
00165 if(tofRawHits[j]->leadingEdge() &&
00166 itray==tofRawHits[j]->tray() && ichan==tofRawHits[j]->channel()) {
00167 aRawHit.leadingTdc.push_back(tofRawHits[j]->tdc());
00168 }
00169 }
00170
00171
00172 if(itray<=120) {
00173 for(size_t j=0;j<tofRawHits.size();j++) {
00174 if(tofRawHits[j]->trailingEdge() &&
00175 itray==tofRawHits[j]->tray() && ichan==tofRawHits[j]->channel()) {
00176 aRawHit.trailingTdc.push_back(tofRawHits[j]->tdc());
00177 }
00178 }
00179 } else {
00180 if(!mDaqMap) {
00181 LOG_INFO << " No Daq Map for VPD, continue!" << endm;
00182 continue;
00183 }
00184 int iTube = (itray==121) ? mDaqMap->TDIGLeChan2WestPMT(ichan) : mDaqMap->TDIGLeChan2EastPMT(ichan);
00185 for(size_t j=0;j<tofRawHits.size();j++) {
00186 if(tofRawHits[j]->trailingEdge() && itray==tofRawHits[j]->tray()) {
00187 int techan = (int)(tofRawHits[j]->channel());
00188 int jTube = (itray==121) ? mDaqMap->TDIGTeChan2WestPMT(techan) : mDaqMap->TDIGTeChan2EastPMT(techan);
00189 if(iTube==jTube) {
00190 aRawHit.trailingTdc.push_back(tofRawHits[j]->tdc());
00191 }
00192 }
00193 }
00194 }
00195 if(aRawHit.trailingTdc.size()) mRawHitVec[itray-1].push_back(aRawHit);
00196 }
00197 } else {
00198 LOG_WARN << " No Tof Collection !!! " << endm;
00199 }
00200
00201 if(mDebug) {
00202 for(int i=0;i<122;i++) {
00203 for(size_t m=0;m<mRawHitVec[i].size();m++) {
00204 LOG_DEBUG << " tray = " << i+1 << " " << mRawHitVec[i][m].tray << " channel = " << mRawHitVec[i][m].channel << endm;
00205 LOG_DEBUG << " leading tdcs = ";
00206 for(size_t j=0;j<mRawHitVec[i][m].leadingTdc.size();j++) {
00207 LOG_DEBUG << " " << mRawHitVec[i][m].leadingTdc[j];
00208 }
00209 LOG_DEBUG << endm;
00210 LOG_DEBUG << " trailing tdcs = ";
00211 for(size_t j=0;j<mRawHitVec[i][m].trailingTdc.size();j++) {
00212 LOG_DEBUG << " " << mRawHitVec[i][m].trailingTdc[j];
00213 }
00214 LOG_DEBUG << endm;
00215 }
00216 }
00217 }
00218 }
00219
00220 IntVec StBTofSortRawHit::GetValidChannel(int tray) {
00221 IntVec chanVec;
00222 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00223 if( mRawHitVec[tray-1][i].tray == tray )
00224 chanVec.push_back(mRawHitVec[tray-1][i].channel);
00225 }
00226 return chanVec;
00227 }
00228
00229 UIntVec StBTofSortRawHit::GetLeadingTdc(int tray, int channel, bool triggerevent)
00230 {
00231 UIntVec leTdc;
00232 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00233 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00234 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00235 int fiberId = mRawHitVec[tray-1][i].fiberId;
00236 double ftime = -1e5;
00237 for(size_t j=0; j<mRawHitVec[tray-1][i].leadingTdc.size(); j++) {
00238 float trgTime = 25.*(mTriggerTime[fiberId] & 0xfff);
00239 float timeDiff = mRawHitVec[tray-1][i].leadingTdc[j]*25./1024 - trgTime;
00240 while(timeDiff<0) timeDiff += 51200;
00241 if(tray<=120){
00242 if(triggerevent){
00243 if(timeDiff>=mTriggerTimeWindow[tray-1][0]&&timeDiff<=mTriggerTimeWindow[tray-1][1])
00244 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00245 }
00246 else {
00247 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00248 }
00249 }
00250 else {
00251 if(triggerevent){
00252
00253
00254 int iTube = (tray==121) ? mDaqMap->TDIGLeChan2WestPMT(channel) : mDaqMap->TDIGLeChan2EastPMT(channel);
00255 timeDiff -= mVpdDelay[(tray-121)*mNVPD+(iTube-1)];
00256 while(timeDiff<0) timeDiff += 51200;
00257
00258 double stime = timeDiff;
00259 if(stime > ftime+300.){
00260 if(timeDiff>=mTriggerTimeWindow[tray-1][0]&&timeDiff<=mTriggerTimeWindow[tray-1][1])
00261 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00262 ftime = stime;
00263 }
00264 }
00265 else {
00266 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00267 }
00268 }
00269 }
00270 }
00271 return leTdc;
00272 }
00273
00274 UIntVec StBTofSortRawHit::GetTrailingTdc(int tray, int channel, bool triggerevent)
00275 {
00276 UIntVec teTdc;
00277 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00278 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00279 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00280 int fiberId = mRawHitVec[tray-1][i].fiberId;
00281 double ftime = -1e5;
00282 for(size_t j=0; j<mRawHitVec[tray-1][i].trailingTdc.size(); j++) {
00283 float trgTime = 25.*(mTriggerTime[fiberId] & 0xfff);
00284 float timeDiff = mRawHitVec[tray-1][i].trailingTdc[j]*25./1024 - trgTime;
00285 while(timeDiff<0) timeDiff += 51200;
00286 if(tray<=120){
00287 if(triggerevent){
00288 if(timeDiff>=mTriggerTimeWindow[tray-1][0]&&timeDiff<=mTriggerTimeWindow[tray-1][1]+25.)
00289 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00290 }
00291 else {
00292 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00293 }
00294 }
00295 else {
00296 if(triggerevent){
00297
00298
00299 int iTube = (tray==121) ? mDaqMap->TDIGLeChan2WestPMT(channel) : mDaqMap->TDIGLeChan2EastPMT(channel);
00300 timeDiff -= mVpdDelay[(tray-121)*mNVPD+(iTube-1)];
00301 while(timeDiff<0) timeDiff += 51200;
00302
00303 double stime = timeDiff;
00304 if(stime > ftime+300.){
00305 if(timeDiff>=mTriggerTimeWindow[tray-1][0]&&timeDiff<=mTriggerTimeWindow[tray-1][1]+25.)
00306 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00307 ftime = stime;
00308 }
00309 }
00310 else {
00311 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00312 }
00313 }
00314 }
00315 }
00316 return teTdc;
00317 }