00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <string.h>
00010 #include "StEvent/StEvent.h"
00011 #include "StEvent/StEventTypes.h"
00012 #include "StEvent/StEventSummary.h"
00013 #include "StEvent/StEventInfo.h"
00014 #include "StEvent/StDetectorState.h"
00015
00016 #include "StEventUtilities/StuRefMult.hh"
00017 #include "StEventUtilities/StuFtpcRefMult.hh"
00018
00019 #include "StarClassLibrary/SystemOfUnits.h"
00020 #include "StarClassLibrary/StTimer.hh"
00021
00022 #include "StMuException.hh"
00023 #include "StMuEvent.h"
00024 #include "StMuTrack.h"
00025 #include "StMuL3EventSummary.h"
00026 #include "StMuCut.h"
00027 #include "StMuDebug.h"
00028 #include "StMuDst.h"
00029 #include "StMuPrimaryVertex.h"
00030 #include "StMuBTofHit.h"
00031
00032 #include "TClonesArray.h"
00033 #include "TObject.h"
00034 #include "TClass.h"
00035
00036 ClassImp(StMuEvent)
00037
00038
00039
00040
00041 StMuEvent::StMuEvent() : mTriggerData(0), mPrimaryVertexError(-999.,-999.,-999) {
00042 DEBUGMESSAGE("");
00043 int n = (char*)mReactionPlanePtWgt - (char*)&mRefMultPos+sizeof(mReactionPlanePtWgt);
00044 memset(&mRefMultPos,0,n);
00045 }
00046
00047
00048
00049 StMuEvent::StMuEvent(const StEvent* event) : mPrimaryVertexError(-999.,-999.,-999.) {
00050 try {
00051 fill(event);
00052 }
00053 catch (StMuException e) {
00054 throw e;
00055 }
00056 }
00057
00058
00059
00060 StMuEvent::~StMuEvent(){
00061 DEBUGMESSAGE("");
00062 }
00063
00064
00065
00066 void StMuEvent::clear(){
00067 DEBUGMESSAGE1("");
00068 }
00069
00070
00071
00072 void StMuEvent::fill(const StEvent* event){
00073 DEBUGMESSAGE("");
00074 if ( !event ) throw StMuExceptionNullPointer("no StEvent",__PRETTYF__);
00075 if ( !event->info() ) throw StMuExceptionNullPointer("no event info",__PRETTYF__);
00076 if ( !event->runInfo() ) throw StMuExceptionNullPointer("no run info",__PRETTYF__);
00077 if ( !event->summary() ) throw StMuExceptionNullPointer("no event summary",__PRETTYF__);
00078
00079
00080
00082 mRunInfo = *event->runInfo();
00083 mEventInfo = *event->info();
00084 mEventSummary = *event->summary();
00085 const StPrimaryVertex *p_vtx=event->primaryVertex();
00086 if (p_vtx) {
00087 mPrimaryVertexError=p_vtx->positionError();
00088 }
00089
00090 if ( !event->triggerDetectorCollection() ) {
00091 DEBUGVALUE2(event->type());
00092 DEBUGVALUE2(event->info()->time());
00093 DEBUGMESSAGE2("no trigger detector collection, creating dummy");
00094 }
00095 else {
00096 mVpdTriggerDetector = event->triggerDetectorCollection()->vpd();
00097 mMtdTriggerDetector = event->triggerDetectorCollection()->mtd();
00098 mCtbTriggerDetector = event->triggerDetectorCollection()->ctb();
00099 mZdcTriggerDetector = event->triggerDetectorCollection()->zdc();
00100 mBbcTriggerDetector = event->triggerDetectorCollection()->bbc();
00101 mEmcTriggerDetector = event->triggerDetectorCollection()->emc();
00102 mFpdTriggerDetector = event->triggerDetectorCollection()->fpd();
00103 mFmsTriggerDetector = event->triggerDetectorCollection()->fms();
00104 }
00105
00106 if (event->fpdCollection())
00107 mFpdCollection = *event->fpdCollection();
00108 if (event->l0Trigger())
00109 mL0Trigger = *event->l0Trigger();
00110 mL3EventSummary.fill(event);
00111
00112 mTriggerIdCollection.fill( event->triggerIdCollection() );
00113
00114
00115 mRefMultPos = uncorrectedNumberOfPositivePrimaries(*event);
00116 mRefMultNeg = uncorrectedNumberOfNegativePrimaries(*event);
00117 mRefMultFtpcEast = uncorrectedNumberOfFtpcEastPrimaries(*event);
00118 mRefMultFtpcWest = uncorrectedNumberOfFtpcWestPrimaries(*event);
00119
00120 if (event->triggerData())
00121 mL2Result.Set(event->triggerData()->l2ResultLength(),(const Int_t*) event->triggerData()->l2Result());
00122
00123
00124 mVpdEast = mVpdWest = 0;
00125 mVpdTstart = mVpdTdiff = 0.;
00126 if (event->tofCollection()) {
00127 mVpdEast = event->tofCollection()->vpdEast();
00128 mVpdWest = event->tofCollection()->vpdWest();
00129 mVpdTstart = event->tofCollection()->tstart();
00130 mVpdTdiff = event->tofCollection()->tdiff();
00131 mVpdVz = event->tofCollection()->vzVpd();
00132 }
00133
00134 mTriggerData = const_cast<StTriggerData*>(event->triggerData());
00135 if(mTriggerData!=0) mTriggerData->setDebug(0);
00136 }
00137
00138 unsigned short StMuEvent::refMultPos(int vtx_id) {
00139
00140 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1))
00141 return mRefMultPos;
00142 if (vtx_id == -1)
00143 vtx_id = StMuDst::currentVertexIndex();
00144 if (StMuDst::primaryVertex(vtx_id))
00145 return StMuDst::primaryVertex(vtx_id)->refMultPos();
00146 return 0;
00147 }
00148
00149 unsigned short StMuEvent::refMultNeg(int vtx_id) {
00150
00151 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1))
00152 return mRefMultNeg;
00153 if (vtx_id == -1)
00154 vtx_id = StMuDst::currentVertexIndex();
00155 if (StMuDst::primaryVertex(vtx_id))
00156 return StMuDst::primaryVertex(vtx_id)->refMultNeg();
00157 return 0;
00158 }
00159
00160 unsigned short StMuEvent::refMult(int vtx_id) {return refMultPos(vtx_id)+refMultNeg(vtx_id);}
00161
00162 unsigned short StMuEvent::refMultFtpcEast(int vtx_id) {
00163
00164 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1))
00165 return mRefMultFtpcEast;
00166 if (vtx_id == -1)
00167 vtx_id = StMuDst::currentVertexIndex();
00168 if (StMuDst::primaryVertex(vtx_id))
00169 return StMuDst::primaryVertex(vtx_id)->refMultFtpcEast();
00170 return 0;
00171 }
00172
00173 unsigned short StMuEvent::refMultFtpcWest(int vtx_id) {
00174
00175 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1))
00176 return mRefMultFtpcWest;
00177 if (vtx_id == -1)
00178 vtx_id = StMuDst::currentVertexIndex();
00179 if (StMuDst::primaryVertex(vtx_id))
00180 return StMuDst::primaryVertex(vtx_id)->refMultFtpcWest();
00181 return 0;
00182 }
00183
00184 unsigned short StMuEvent::refMultFtpc(int vtx_id) {return refMultFtpcEast(vtx_id)+refMultFtpcWest(vtx_id);}
00185
00186 StThreeVectorF StMuEvent::primaryVertexPosition(int vtx_id) {
00187 StThreeVectorF vz(-999,-999,-999);
00188
00189 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1)){
00190 if(fabs(mEventSummary.primaryVertexPosition().x()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().y()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().z()) < 1.e-5) return vz;
00191 else return mEventSummary.primaryVertexPosition();
00192 }
00193 if (vtx_id == -1)
00194 vtx_id = StMuDst::currentVertexIndex();
00195 if (StMuDst::primaryVertex(vtx_id))
00196 return StMuDst::primaryVertex(vtx_id)->position();
00197 return vz;
00198 }
00199 StThreeVectorF StMuEvent::primaryVertexErrors(int vtx_id) {
00200 StThreeVectorF vz(-999,-999,-999);
00201
00202 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1)){
00203 if(fabs(mEventSummary.primaryVertexPosition().x()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().y()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().z()) < 1.e-5) return vz;
00204 else return mPrimaryVertexError;
00205 }
00206 if (vtx_id == -1)
00207 vtx_id = StMuDst::currentVertexIndex();
00208 if (StMuDst::primaryVertex(vtx_id))
00209 return StMuDst::primaryVertex(vtx_id)->posError();
00210 return vz;
00211 }
00212
00213 unsigned short StMuEvent::grefmult(int vtx_id){
00214 unsigned short grefmult = 0;
00215 StMuTrack *glob;
00216
00217 if (StMuDst::numberOfPrimaryVertices()==0 && (vtx_id == 0 || vtx_id == -1)){
00218 if(!(fabs(mEventSummary.primaryVertexPosition().x()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().y()) < 1.e-5 && fabs(mEventSummary.primaryVertexPosition().z()) < 1.e-5)){
00219 for (int i=0;i<StMuDst::globalTracks()->GetEntries();i++){
00220 glob = StMuDst::globalTracks(i);
00221 if (fabs(glob->eta()) < 0.5 && fabs(glob->dcaGlobal().mag()) < 3 && glob->nHitsFit(kTpcId) >= 10) grefmult++;
00222 }
00223 return grefmult;
00224 }
00225 else return 0;
00226 }
00227
00228 if (vtx_id == -1)
00229 vtx_id = StMuDst::currentVertexIndex();
00230
00231 if (StMuDst::primaryVertex(vtx_id)){
00232 for (int i=0;i<StMuDst::globalTracks()->GetEntries();i++){
00233 glob = StMuDst::globalTracks(i);
00234 if (fabs(glob->eta()) < 0.5 && fabs(glob->dcaGlobal(vtx_id).mag()) < 3 && glob->nHitsFit(kTpcId) >= 10) grefmult++;
00235 }
00236 return grefmult;
00237 }
00238 else return 0;
00239 }
00240
00241 unsigned short StMuEvent::btofTrayMultiplicity(){
00242
00243 unsigned short btofmult = (unsigned short)StMuDst::numberOfBTofHit();
00244 for(unsigned int i=0;i< StMuDst::numberOfBTofHit();i++) if(StMuDst::btofHit(i)->tray() > 120) btofmult--;
00245 return btofmult;
00246
00247 }
00248
00249 float StMuEvent::nearestVertexZ(int vtx_id){
00250
00251 float dz = 999.0;
00252
00253 if (StMuDst::numberOfPrimaryVertices()==0) return dz;
00254 const int Nvert = StMuDst::primaryVertices()->GetEntries();
00255 if(Nvert < 2) return dz;
00256
00257 if (vtx_id == -1) vtx_id = StMuDst::currentVertexIndex();
00258 float z = primaryVertexPosition(vtx_id).z();
00259 for(int i=0;i<Nvert;i++){
00260 if(vtx_id!=i) {
00261 if(fabs(z-StMuDst::primaryVertex(i)->position().z()) < dz) dz = fabs(z-StMuDst::primaryVertex(i)->position().z());
00262 }
00263 }
00264 return dz;
00265 }
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366