00001 #include <assert.h>
00002 #include "StiPullEvent.h"
00003 #include "RVersion.h"
00004 #if ROOT_VERSION_CODE < 331013
00005 #include "TCL.h"
00006 #else
00007 #include "TCernLib.h"
00008 #endif
00009 #include "StEvent/StEnumerations.h"
00010 #include <assert.h>
00011
00012 ClassImp(StiPullTrk)
00013 ClassImp(StiPullHit)
00014 ClassImp(StiPullEvent)
00015
00016
00017 StiPullEvent::StiPullEvent()
00018 :mTrksG("StiPullTrk",100)
00019 ,mTrksP("StiPullTrk",100)
00020 ,mHitsG("StiPullHit",100)
00021 ,mHitsP("StiPullHit",100)
00022 ,mHitsR("StiPullHit",100)
00023 {
00024 mHitsG.SetOwner(0); mHitsP.SetOwner(0); mHitsR.SetOwner(0);
00025 Clear();
00026 };
00027
00028 void StiPullTrk::Clear(const char*)
00029 {
00030 memset(mBeg,0,mEnd-mBeg+1);
00031 }
00032
00033 StiPullTrk::StiPullTrk()
00034 {
00035 Clear();
00036 }
00037
00038 void StiPullTrk::Print(const char* option) const
00039 {
00040 if (!option) option="";
00041 printf("StiPullTrk::Print(%s)\n",option);
00042 }
00043
00044
00045
00046 void StiPullHit::Clear(const char*)
00047 {
00048 memset(mBeg,0,mEnd-mBeg+1);
00049 }
00050
00051 StiPullHit::StiPullHit()
00052 {
00053 Clear();
00054 }
00055
00056 void StiPullHit::Print(const char* option) const
00057 {
00058 if (!option) option="";
00059 printf("StiPullHit::Print(%s)\n",option);
00060 printf("mTrackNumber=%d mHardwarePosition=%u \n"
00061 ,mTrackNumber,mHardwarePosition);
00062 printf("mNormalRefAngle=%g mNormaYOffset=%g mZCenter=%g\n"
00063 ,mNormalRefAngle,mNormalYOffset,mZCenter);
00064
00065 printf("lXHit=%g \tlYHit %g(%g)\tlZHit %g(%g)\n"
00066 ,lXHit
00067 ,lYHit,lYHitErr
00068 ,lZHit,lZHitErr);
00069
00070 printf("lXFit=%g \tlYFit %g(%g)\tlZFit %g(%g)\n"
00071 ,lXFit
00072 ,lYFit,lYFitErr
00073 ,lZFit,lZFitErr);
00074
00075 printf("lYPul %g(%g)\tlZPul %g(%g)\n"
00076 ,lYPul,lYPulErr
00077 ,lZPul,lZPulErr);
00078
00079
00080 printf("gRHit=%g \tgPHit %g(%g)\tgZHit %g(%g)\n"
00081 ,gRHit
00082 ,gPHit,gPHitErr
00083 ,gZHit,gZHitErr);
00084
00085 printf("gRFit=%g \tgPFit %g(%g)\tgZFit %g(%g)\n"
00086 ,gRFit
00087 ,gPFit,gPFitErr
00088 ,gZFit,gZFitErr);
00089
00090 printf("gPPul %g(%g)\tgZPul %g(%g)\n"
00091 ,gPPul,gPPulErr
00092 ,gZPul,gZPulErr);
00093
00094
00095 }
00096
00097 int StiPullHit::TestIt()
00098 {
00099 return 0;
00100 }
00101
00102 void StiPullEvent::Add(StiPullHit &hit,int gloPrim)
00103 {
00104 TClonesArray *hits = &mHitsG+gloPrim;
00105 int iHit = hits->GetLast()+1;
00106 StiPullHit *kHit = (StiPullHit*)hits->New(iHit);
00107 *kHit = hit;
00108 if (gloPrim) return;
00109 if (!hit.mDetector) return;
00110 int i = 4;
00111 if (hit.mDetector==kTpcId) i=1;
00112 if (hit.mDetector==kSvtId) i=2;
00113 if (hit.mDetector==kSsdId) i=3;
00114 if (hit.mDetector==kPxlId) i=4;
00115 if (hit.mDetector==kIstId) i=5;
00116 if (!i || i>3)return;
00117 ++mNHits[i-1];
00118 }
00119
00120 void StiPullEvent::Add(StiPullTrk &trk,int gloPrim)
00121 {
00122 TClonesArray *trks = &mTrksG+gloPrim;
00123 int iTrk = trks->GetLast()+1;
00124 StiPullTrk *kTrk = (StiPullTrk*)trks->New(iTrk);
00125 *kTrk = trk;
00126 assert(trk.mTrackNumber);
00127 mNTrks[gloPrim]++;
00128 }
00129
00130
00131 const int *StiPullEvent::GetNHits() const
00132 {
00133 return mNHits;
00134 }
00135
00136 void StiPullEvent::Clear(const char*)
00137 {
00138 mHitsG.Clear();mHitsP.Clear();mHitsR.Clear();
00139 mTrksG.Clear();mTrksP.Clear();
00140 memset(mVtx,0,sizeof(mVtx));
00141 memset(mEtx,0,sizeof(mEtx));
00142 mRun=0; mEvt=0;
00143 memset(mNTrks,0,sizeof(mNTrks)+sizeof(mNHits));
00144
00145 }
00146
00147 void StiPullEvent::Finish()
00148 {
00149 static int nCall=0; nCall++;
00150 int iTkG=0,iTkP=0,iHiG=0,iHiP=0,idP=0,idG=0;
00151 StiPullTrk* trkG=0,*trkP =0;
00152 StiPullHit* hiG=0,*hiP =0;
00153 int nHiG = mHitsG.GetLast()+1;
00154 int nHiP = mHitsP.GetLast()+1;
00155 for (iTkG=0;iTkG<mNTrks[0];iTkG++) {
00156 trkG=(StiPullTrk*)mTrksG[iTkG]; idG = trkG->mTrackNumber;
00157 idP=-1; trkP=0;
00158 if (iTkP<mNTrks[1]) {
00159 trkP=(StiPullTrk*)mTrksP[iTkP]; idP = trkP->mTrackNumber;
00160 }
00161 int vertex = 0;
00162 if (idG==idP) {
00163 vertex = trkP->mVertex;
00164 int nHits=0;
00165 for(;iHiP<nHiP; iHiP ++) {
00166 hiP = (StiPullHit*)mHitsP[iHiP]; if (idP!=hiP->mTrackNumber) break;
00167 nHits++;
00168 hiP->mTrackNumber=iTkG+1; hiP->mVertex=vertex;
00169 }
00170 assert(nHits==trkP->nAllHits || nHits-1==trkP->nAllHits);
00171 trkP->mTrackNumber= iTkG+1; iTkP++;
00172 }
00173
00174 int nHits=0;
00175 for(;iHiG<nHiG; iHiG ++) {
00176 hiG = (StiPullHit*)mHitsG[iHiG]; if (idG!=hiG->mTrackNumber) break;
00177 nHits++;
00178 hiG->mTrackNumber=iTkG+1; hiG->mVertex=vertex;
00179 }
00180 assert(nHits==trkG->nAllHits);
00181 trkG->mVertex = vertex;
00182 trkG->mTrackNumber= iTkG+1;
00183 }
00184 }
00185
00186
00187