00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 #include "TFile.h"
00086 #include <algorithm>
00087 #include "StTrackFitTraits.h"
00088 #include "StParticleTypes.hh"
00089 #include "StParticleTable.hh"
00090 #include "TClass.h"
00091 #if !defined(ST_NO_NAMESPACES)
00092 using std::fill_n;
00093 using std::copy;
00094 #endif
00095
00096 ClassImp(StTrackFitTraits)
00097
00098 static const char rcsid[] = "$Id: StTrackFitTraits.cxx,v 2.22 2012/05/06 02:28:51 perev Exp $";
00099
00100
00101 StTrackFitTraits::StTrackFitTraits()
00102 {
00103 mPidHypothesis = 0;
00104 mNumberOfFitPoints = 0x8000;
00105 mNumberOfFitPointsTpc = 0;
00106 mNumberOfFitPointsFtpcWest = 0;
00107 mNumberOfFitPointsFtpcEast = 0;
00108 mNumberOfFitPointsSvt = 0;
00109 mNumberOfFitPointsSsd = 0;
00110 mNumberOfFitPointsPxl = 0;
00111 mNumberOfFitPointsIst = 0;
00112 mPrimaryVertexUsedInFit = false;
00113 fill_n(mChi2, 2, 0);
00114 }
00115
00116
00117
00118 StTrackFitTraits::StTrackFitTraits(unsigned short pid, unsigned short nfp,
00119 float chi[2], float cov[15])
00120 {
00121 mPidHypothesis = pid;
00122 mNumberOfFitPoints = nfp|0x8000;
00123 copy(chi, chi+2, mChi2);
00124 mCovariantMatrix.Set(15, cov);
00125 mNumberOfFitPointsTpc = 0;
00126 mNumberOfFitPointsFtpcWest = 0;
00127 mNumberOfFitPointsFtpcEast = 0;
00128 mNumberOfFitPointsSvt = 0;
00129 mNumberOfFitPointsSsd = 0;
00130 mNumberOfFitPointsPxl = 0;
00131 mNumberOfFitPointsIst = 0;
00132 mPrimaryVertexUsedInFit = false;
00133 }
00134
00135
00136 StTrackFitTraits::~StTrackFitTraits() {}
00137
00138
00139 unsigned short StTrackFitTraits::numberOfFitPoints() const
00140 {
00141 int result;
00142
00143
00144 result = numberOfFitPoints(kTpcId) +
00145 numberOfFitPoints(kFtpcWestId) +
00146 numberOfFitPoints(kFtpcEastId) +
00147 numberOfFitPoints(kSvtId) +
00148 numberOfFitPoints(kSsdId) +
00149 numberOfFitPoints(kPxlId) +
00150 numberOfFitPoints(kIstId);
00151 if (mNumberOfFitPoints&0x8000) result += (mNumberOfFitPoints&0x7FFF);
00152 if (mPrimaryVertexUsedInFit) result++;
00153 return (unsigned short)result;
00154 }
00155
00156
00157 unsigned short StTrackFitTraits::numberOfFitPoints(StDetectorId det) const
00158 {
00159
00160
00161
00162 if (mNumberOfFitPoints && (mNumberOfFitPoints<0x8000)) {
00163
00164 switch (det) {
00165 case kFtpcWestId:
00166 case kFtpcEastId:
00167 case kTpcId:
00168 return mNumberOfFitPoints%1000;
00169 break;
00170 case kSvtId:
00171 return (mNumberOfFitPoints%10000)/1000;
00172 break;
00173 case kSsdId:
00174 return mNumberOfFitPoints/10000;
00175 break;
00176 default:
00177 return 0;
00178 }
00179 }
00180
00181
00182
00183 else {
00184 switch (det) {
00185 case kFtpcWestId:
00186 return mNumberOfFitPointsFtpcWest;
00187 break;
00188 case kFtpcEastId:
00189 return mNumberOfFitPointsFtpcEast;
00190 break;
00191 case kTpcId:
00192 return mNumberOfFitPointsTpc;
00193 break;
00194 case kSvtId:
00195 return mNumberOfFitPointsSvt;
00196 break;
00197 case kSsdId:
00198 return mNumberOfFitPointsSsd;
00199 break;
00200 case kPxlId:
00201 return mNumberOfFitPointsPxl;
00202 break;
00203 case kIstId:
00204 return mNumberOfFitPointsIst;
00205 break;
00206 default:
00207 return mNumberOfFitPoints&0x7FFF;
00208 }
00209 }
00210 }
00211
00212
00213 StParticleDefinition* StTrackFitTraits::pidHypothesis() const
00214 {
00215 return StParticleTable::instance()->findParticleByGeantId(mPidHypothesis);
00216 }
00217
00218
00219 double StTrackFitTraits::chi2(unsigned int i) const
00220 {
00221 if (i < 2)
00222 return mChi2[i];
00223 else
00224 return 0;
00225 }
00226
00227
00228 StMatrixF StTrackFitTraits::covariantMatrix() const
00229 {
00230 StMatrixF m(5,5);
00231 if (mCovariantMatrix.GetSize() == 15) {
00232 #define mCovariantMatrix ((TArrayF&)mCovariantMatrix) //temporary HACK VP
00233 m(1,1) = mCovariantMatrix[0];
00234 m(1,2) = m(2,1) = mCovariantMatrix[1];
00235 m(1,3) = m(3,1) = mCovariantMatrix[2];
00236 m(1,4) = m(4,1) = mCovariantMatrix[3];
00237 m(1,5) = m(5,1) = mCovariantMatrix[4];
00238 m(2,2) = mCovariantMatrix[5];
00239 m(2,3) = m(3,2) = mCovariantMatrix[6];
00240 m(2,4) = m(4,2) = mCovariantMatrix[7];
00241 m(2,5) = m(5,2) = mCovariantMatrix[8];
00242 m(3,3) = mCovariantMatrix[9];
00243 m(3,4) = m(4,3) = mCovariantMatrix[10];
00244 m(3,5) = m(5,3) = mCovariantMatrix[11];
00245 m(4,4) = mCovariantMatrix[12];
00246 m(4,5) = m(5,4) = mCovariantMatrix[13];
00247 m(5,5) = mCovariantMatrix[14];
00248 #undef mCovariantMatrix //temporary HACK VP
00249 }
00250 return m;
00251 }
00252
00253
00254 bool StTrackFitTraits::primaryVertexUsedInFit() const
00255 { return mPrimaryVertexUsedInFit;}
00256
00257
00258 void StTrackFitTraits::clearCovariantMatrix() {mCovariantMatrix.Set(0);}
00259
00260
00261 void StTrackFitTraits::setNumberOfFitPoints(unsigned char val, StDetectorId det)
00262 {
00263 mNumberOfFitPoints|= 0x8000;
00264 switch (det) {
00265 case kFtpcWestId:
00266 mNumberOfFitPointsFtpcWest = val;
00267 break;
00268 case kFtpcEastId:
00269 mNumberOfFitPointsFtpcEast = val;
00270 break;
00271 case kTpcId:
00272 mNumberOfFitPointsTpc = val;
00273 break;
00274 case kSvtId:
00275 mNumberOfFitPointsSvt = val;
00276 break;
00277 case kSsdId:
00278 mNumberOfFitPointsSsd = val;
00279 break;
00280 case kPxlId:
00281 mNumberOfFitPointsPxl = val;
00282 break;
00283 case kIstId:
00284 mNumberOfFitPointsIst = val;
00285 break;
00286 default:
00287 mNumberOfFitPoints += val|0x8000;
00288 break;
00289 }
00290 }
00291
00292
00293 void StTrackFitTraits::setPrimaryVertexUsedInFit(bool val)
00294 {mPrimaryVertexUsedInFit = val;}
00295
00296
00297 void StTrackFitTraits::setPidHypothesis(unsigned short val)
00298 {
00299 mPidHypothesis = val;
00300 }
00301
00302
00303 void StTrackFitTraits::setChi2(float val, unsigned int i)
00304 {
00305 if (i<2) mChi2[i] = val;
00306 }
00307
00308
00309 void StTrackFitTraits::setCovariantMatrix(float val[15])
00310 {
00311 mCovariantMatrix.Set(15, val);
00312 }
00313
00314
00315 void StTrackFitTraits::Streamer(TBuffer &R__b)
00316 {
00317
00318
00319 if (R__b.IsReading()) {
00320 UInt_t R__s, R__c;
00321 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
00322 if (R__v > 4) {
00323 Class()->ReadBuffer(R__b, this, R__v, R__s, R__c);
00324 return;
00325 }
00326 StObject::Streamer(R__b);
00327
00328 R__b >> (unsigned short&)mPidHypothesis;
00329 R__b >> (unsigned short&)mNumberOfFitPoints;
00330
00331 if (R__v==2 && gFile && gFile->GetVersion()%100000<30000)
00332 { Int_t dumy; R__b >> dumy;}
00333
00334 R__b.ReadFastArray(mChi2,2);
00335 mCovariantMatrix.Streamer(R__b);
00336
00337 } else {
00338 Class()->WriteBuffer(R__b,this);
00339 }
00340 }