00001 #include <iostream>
00002 #include "StMessMgr.h"
00003 #include "StSortTofRawData.h"
00004 #include "StEvent.h"
00005 #include "StTofCollection.h"
00006 #include "StTofRawData.h"
00007 #include "StTofrDaqMap.h"
00008
00009 StSortTofRawData::StSortTofRawData() {
00010 Reset();
00011 }
00012
00016 StSortTofRawData::StSortTofRawData(StTofCollection *tofColl) {
00017 Reset();
00018 Init(tofColl);
00019 }
00023 StSortTofRawData::StSortTofRawData(StTofCollection *tofColl, StTofrDaqMap *daqMap) {
00024 Reset();
00025 SetVPDMap(daqMap);
00026 InitRun8(tofColl);
00027 }
00028
00029 StSortTofRawData::~StSortTofRawData() {
00030 Reset();
00031 }
00032
00033 void StSortTofRawData::Reset() {
00034 for(unsigned int i=0;i<mNTRAY;i++) mRawHitVec[i].clear();
00035 }
00036
00037 void StSortTofRawData::Init(StTofCollection *tofColl) {
00038 if(tofColl && tofColl->rawdataPresent()) {
00039 StSPtrVecTofRawData &tofRawData = tofColl->tofRawData();
00040 for(size_t i=0; i<tofRawData.size(); i++) {
00041 if(tofRawData[i]->leteFlag()!=1) continue;
00042
00043 int itray = 93;
00044 int ichan = tofRawData[i]->channel();
00045 bool iexist = kFALSE;
00046 for(size_t ii=0; ii<mRawHitVec[0].size(); ii++) {
00047 if(itray==mRawHitVec[itray-1][ii].tray && ichan==mRawHitVec[itray-1][ii].channel) {
00048 iexist = kTRUE;
00049 break;
00050 }
00051 }
00052 if(iexist) continue;
00053 TOFRawHit aRawHit;
00054 aRawHit.tray = itray;
00055 aRawHit.channel = ichan;
00056 aRawHit.leadingTdc.push_back((int)(tofRawData[i]->tdc()));
00057 for(size_t j=i+1;j<tofRawData.size();j++) {
00058 if(tofRawData[j]->leteFlag()==1 &&
00059 itray==93 && ichan==tofRawData[j]->channel()) {
00060 aRawHit.leadingTdc.push_back((int)(tofRawData[j]->tdc()));
00061 }
00062 }
00063
00064
00065 for(size_t j=0;j<tofRawData.size();j++) {
00066 if(tofRawData[j]->leteFlag()==2 &&
00067 itray==93 && ichan==tofRawData[j]->channel()) {
00068 aRawHit.trailingTdc.push_back((int)(tofRawData[j]->tdc()));
00069 }
00070 }
00071 if(aRawHit.trailingTdc.size()) mRawHitVec[itray-1].push_back(aRawHit);
00072 }
00073 } else {
00074 gMessMgr->Warning("","OS") << " No Tof Collection !!! " << endm;
00075 }
00076 }
00077
00078 void StSortTofRawData::InitRun8(StTofCollection *tofColl) {
00079 if(tofColl && tofColl->rawdataPresent()) {
00080
00081
00082
00083 for(unsigned int i=0;i<mNTRAY;i++){
00084 for(int j=0;j<2;j++) mTimeWindow[i][j] = 0.;
00085 if(i>=75&&i<80){
00086 mTimeWindow[i][0] = 3270;
00087 mTimeWindow[i][1] = 3390;
00088 }
00089 if(i==120){
00090 mTimeWindow[i][0] = 3230;
00091 mTimeWindow[i][1] = 3340;
00092 }
00093 if(i==121){
00094 mTimeWindow[i][0] = 3290;
00095 mTimeWindow[i][1] = 3400;
00096 }
00097 }
00098
00099 StSPtrVecTofRawData &tofRawData = tofColl->tofRawData();
00100 for(size_t i=0; i<tofRawData.size(); i++) {
00101 if(tofRawData[i]->leteFlag()!=1) continue;
00102 int itray = tofRawData[i]->tray();
00103 int ichan = tofRawData[i]->channel();
00104 bool iexist = kFALSE;
00105 for(size_t ii=0; ii<mRawHitVec[itray-1].size(); ii++) {
00106 if(itray==mRawHitVec[itray-1][ii].tray && ichan==mRawHitVec[itray-1][ii].channel) {
00107 iexist = kTRUE;
00108 break;
00109 }
00110 }
00111 if(iexist) continue;
00112 TOFRawHit aRawHit;
00113 aRawHit.tray = itray;
00114 aRawHit.channel = ichan;
00115 aRawHit.triggertime = tofRawData[i]->triggertime();
00116 aRawHit.leadingTdc.push_back((int)(tofRawData[i]->tdc()));
00117 for(size_t j=i+1;j<tofRawData.size();j++) {
00118 if(tofRawData[j]->leteFlag()==1 &&
00119 itray==tofRawData[j]->tray() && ichan==tofRawData[j]->channel()) {
00120 aRawHit.leadingTdc.push_back((int)(tofRawData[j]->tdc()));
00121 }
00122 }
00123
00124
00125 if(itray<=120) {
00126 for(size_t j=0;j<tofRawData.size();j++) {
00127 if(tofRawData[j]->leteFlag()==2 &&
00128 itray==tofRawData[j]->tray() && ichan==tofRawData[j]->channel()) {
00129 aRawHit.trailingTdc.push_back((int)(tofRawData[j]->tdc()));
00130 }
00131 }
00132 } else {
00133 int iTube = (itray==121) ? mTDIGLeChan2WestPMT[ichan] : mTDIGLeChan2EastPMT[ichan];
00134 for(size_t j=0;j<tofRawData.size();j++) {
00135 if(tofRawData[j]->leteFlag()==2 && itray== tofRawData[j]->tray()) {
00136 int jTube = (itray==121) ? mTDIGTeChan2WestPMT[tofRawData[j]->channel()] : mTDIGTeChan2EastPMT[tofRawData[j]->channel()];
00137 if(iTube==jTube) {
00138 aRawHit.trailingTdc.push_back((int)(tofRawData[j]->tdc()));
00139 }
00140 }
00141 }
00142 }
00143 if(aRawHit.trailingTdc.size()) mRawHitVec[itray-1].push_back(aRawHit);
00144 }
00145 } else {
00146 gMessMgr->Warning("","OS") << " No Tof Collection !!! " << endm;
00147 }
00148 }
00149
00150 IntVec StSortTofRawData::GetValidChannel() {
00151 IntVec chanVec;
00152 for(size_t k=0 ; k<mNTRAY; k++){
00153 for(size_t i=0 ; i<mRawHitVec[k].size() ; i++) {
00154 chanVec.push_back(mRawHitVec[k][i].channel);
00155 }
00156 }
00157 return chanVec;
00158 }
00159
00160 IntVec StSortTofRawData::GetLeadingTdc(int channel) {
00161 IntVec leTdc;
00162 for(size_t k=0 ; k<mNTRAY; k++){
00163 for(size_t i=0 ; i<mRawHitVec[k].size() ; i++) {
00164 if(mRawHitVec[k][i].channel!=channel) continue;
00165 leTdc = mRawHitVec[k][i].leadingTdc;
00166 }
00167 }
00168 return leTdc;
00169 }
00170
00171 IntVec StSortTofRawData::GetTrailingTdc(int channel) {
00172 IntVec teTdc;
00173 for(size_t k=0 ; k<mNTRAY; k++){
00174 for(size_t i=0 ; i<mRawHitVec[k].size() ; i++) {
00175 if(mRawHitVec[k][i].channel!=channel) continue;
00176 teTdc = mRawHitVec[k][i].trailingTdc;
00177 }
00178 }
00179 return teTdc;
00180 }
00181
00182 IntVec StSortTofRawData::GetValidChannel(int tray) {
00183 IntVec chanVec;
00184 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00185 if( mRawHitVec[tray-1][i].tray == tray )
00186 chanVec.push_back(mRawHitVec[tray-1][i].channel);
00187 }
00188 return chanVec;
00189 }
00190
00191 IntVec StSortTofRawData::GetLeadingTdc(int tray, int channel)
00192 {
00193 IntVec leTdc;
00194 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00195 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00196 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00197 leTdc = mRawHitVec[tray-1][i].leadingTdc;
00198 }
00199 return leTdc;
00200 }
00201
00202 IntVec StSortTofRawData::GetLeadingTdc(int tray, int channel, bool triggerevent)
00203 {
00204 IntVec leTdc;
00205 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00206 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00207 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00208 double ftime = -1e5;
00209 for(size_t j=0; j<mRawHitVec[tray-1][i].leadingTdc.size(); j++) {
00210 float trgTime = 25.*(mRawHitVec[tray-1][i].triggertime & 0xfff) - 2775.;
00211 float timeDiff = mRawHitVec[tray-1][i].leadingTdc[j]*25./1024 - trgTime;
00212 while(timeDiff<0) timeDiff += 51200;
00213 if(tray<=120){
00214 if(triggerevent){
00215 if(timeDiff>=mTimeWindow[tray-1][0]&&timeDiff<=mTimeWindow[tray-1][1])
00216 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00217 }
00218 else {
00219 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00220 }
00221 }
00222 else {
00223 if(triggerevent){
00224 double stime = timeDiff;
00225 if(stime > ftime+300.){
00226 if(timeDiff>=mTimeWindow[tray-1][0]&&timeDiff<=mTimeWindow[tray-1][1])
00227 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00228 ftime = stime;
00229 }
00230 }
00231 else {
00232 leTdc.push_back(mRawHitVec[tray-1][i].leadingTdc[j]);
00233 }
00234 }
00235 }
00236 }
00237 return leTdc;
00238 }
00239
00240 IntVec StSortTofRawData::GetTrailingTdc(int tray, int channel) {
00241 IntVec teTdc;
00242 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00243 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00244 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00245 teTdc = mRawHitVec[tray-1][i].trailingTdc;
00246 }
00247 return teTdc;
00248 }
00249
00250 IntVec StSortTofRawData::GetTrailingTdc(int tray, int channel, bool triggerevent)
00251 {
00252 IntVec teTdc;
00253 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00254 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00255 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00256 double ftime = -1e5;
00257 for(size_t j=0; j<mRawHitVec[tray-1][i].trailingTdc.size(); j++) {
00258 float trgTime = 25.*(mRawHitVec[tray-1][i].triggertime & 0xfff) - 2775.;
00259 float timeDiff = mRawHitVec[tray-1][i].trailingTdc[j]*25./1024 - trgTime;
00260 while(timeDiff<0) timeDiff += 51200;
00261 if(tray<=120){
00262 if(triggerevent){
00263 if(timeDiff>=mTimeWindow[tray-1][0]&&timeDiff<=mTimeWindow[tray-1][1])
00264 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00265 }
00266 else {
00267 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00268 }
00269 }
00270 else {
00271 if(triggerevent){
00272 double stime = timeDiff;
00273 if(stime > ftime+300.){
00274 if(timeDiff>=mTimeWindow[tray-1][0]&&timeDiff<=mTimeWindow[tray-1][1])
00275 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00276 ftime = stime;
00277 }
00278 }
00279 else {
00280 teTdc.push_back(mRawHitVec[tray-1][i].trailingTdc[j]);
00281 }
00282 }
00283 }
00284 }
00285 return teTdc;
00286 }
00287
00288 Int_t StSortTofRawData::GetTriggerTime(int tray, int channel) {
00289 Int_t triggertime;
00290 for(size_t i=0 ; i<mRawHitVec[tray-1].size() ; i++) {
00291 if(mRawHitVec[tray-1][i].tray!=tray) continue;
00292 if(mRawHitVec[tray-1][i].channel!=channel) continue;
00293 triggertime = mRawHitVec[tray-1][i].triggertime;
00294 }
00295 return triggertime;
00296 }
00297
00298 void StSortTofRawData::SetVPDMap(StTofrDaqMap* daqMap) {
00299 for(int i=0;i<mNTOF;i++) {
00300 mTDIGLeChan2WestPMT[i] = daqMap->TDIGLeChan2WestPMT(i);
00301 mTDIGTeChan2WestPMT[i] = daqMap->TDIGTeChan2WestPMT(i);
00302 mTDIGLeChan2EastPMT[i] = daqMap->TDIGLeChan2EastPMT(i);
00303 mTDIGTeChan2EastPMT[i] = daqMap->TDIGTeChan2EastPMT(i);
00304 }
00305 return;
00306 }