00001 #include <stdio.h>
00002 #include <cmath>
00003 #include <StMessMgr.h>
00004
00005 #include "TrackData.h"
00006 #include "VertexData.h"
00007
00008
00009
00010 TrackData::TrackData() {
00011 ctbBin=-1;
00012 bemcBin=-1;
00013 eemcBin=-1;
00014 vertexID=0;
00015 gPt=0;
00016 anyMatch=anyVeto=false;
00017 mBtof=mCtb=mBemc=mEemc=mTpc=0;
00018 weight=1;
00019 zDca=ezDca=rxyDca=0;
00020 mother=0;
00021 }
00022
00023
00024
00025
00026 bool
00027 TrackData::matchVertex(VertexData &V, float dzMax) {
00028
00029 float dz=zDca-V.r.z();
00030 bool ret= fabs(dz) < dzMax+ezDca;
00031 if(ret) LOG_DEBUG<< Form("PPV::matchTr2Ver VerID=%d weight=%.2f anyM=%d anyV=%d m: ctb=%d bemc=%d eemc=%d tpc=%d dz=%.2f +/- %.2f\n",V.id,weight,anyMatch,anyVeto,mCtb,mBemc,mEemc,mTpc,dz,ezDca)<<endm;
00032 return ret;
00033 }
00034
00035
00036
00037
00038 void
00039 TrackData::scanNodes(vector<int> &hit, int jz0){
00040
00041
00042
00043
00044
00045
00046 const int minCenter=4 , minMiss=6;
00047 const int mxDev=2;
00048
00049
00050
00051 int nPatt[2];
00052 int i;
00053 bool vetoL=false, vetoR=false, matchL=false, matchR=false;
00054
00055
00056 memset(nPatt,0,sizeof(nPatt));
00057 for(i=0;i<(int)hit.size();i++) {
00058
00059 nPatt[hit[i]]++;
00060 if(nPatt[1]>mxDev) break;
00061 if(nPatt[0]<minMiss) continue;
00062 vetoL=true;
00063 break;
00064 }
00065
00066
00067
00068
00069 memset(nPatt,0,sizeof(nPatt));
00070 for(i=hit.size()-1; i>=0;i--) {
00071
00072 nPatt[hit[i]]++;
00073 if(nPatt[1]>mxDev) break;
00074 if(nPatt[0]<minMiss) continue;
00075 vetoR=true;
00076 break;
00077 }
00078
00079
00080
00081 if(jz0>minCenter && jz0<(int)hit.size()-minCenter) {
00082
00083 memset(nPatt,0,sizeof(nPatt));
00084 for(i=jz0-1; i>=0;i--) {
00085
00086 nPatt[hit[i]]++;
00087 if(nPatt[0]>mxDev) break;
00088 if(nPatt[1]<minCenter) continue;
00089 matchL=true;
00090 break;
00091 }
00092
00093
00094
00095
00096
00097 memset(nPatt,0,sizeof(nPatt));
00098 for(i=jz0;i<(int)hit.size();i++) {
00099
00100 nPatt[hit[i]]++;
00101 if(nPatt[0]>mxDev) break;
00102 if(nPatt[1]<minCenter) continue;
00103 matchR=true;
00104 break;
00105 }
00106
00107
00108
00109 }
00110
00111 bool match= matchL && matchR;
00112 bool veto=(vetoL || vetoR) && !match;
00113
00114
00115 updateAnyMatch(match,veto,mTpc);
00116 weight*=getTpcWeight();
00117 }
00118
00119
00120
00121 void
00122 TrackData::updateAnyMatch(bool match, bool veto, int & mXXX){
00123 if(match) {
00124 anyMatch=true;
00125 anyVeto=false;
00126 mXXX=1;
00127
00128 } else if(veto && (!match) ) {
00129 anyVeto=true;
00130 mXXX=-1;
00131 } else {
00132 mXXX=0;
00133 }
00134 }
00135
00136
00137
00138 float
00139 TrackData:: getTpcWeight(){
00140 const float Wdunno=1, Wmatch=5, Wveto=0.2;
00141 if(mTpc>0) return Wmatch;
00142 if(mTpc<0) return Wveto;
00143 return Wdunno;
00144 }