00001 #ifndef DataFT_H
00002 #define DataFT_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <vector>
00014 #include <map>
00015 #include <algorithm>
00016
00017 #include "TVectorD.h"
00018 #include "TMatrixD.h"
00019
00020 #include "Algorithm/AlgConfig.h"
00021 #include "RecoBase/CandStripHandle.h"
00022 #include "Swimmer/SwimSwimmer.h"
00023
00024 #include "GeometryHelper.h"
00025 #include "ConstFT.h"
00026 #include "PlaneData.h"
00027 #include "TrackContext.h"
00028
00029
00030
00031 class DataFT {
00032
00033 public:
00034
00035 typedef Int_t Count_t;
00036 typedef UShort_t Mask_t;
00037 typedef std::vector<Mask_t> ViewMask_t;
00038
00039 private:
00040
00041 typedef std::vector<PlaneData> PlaneDataVec_t;
00042
00043 typedef PlaneDataVec_t::iterator PlaneDataItr;
00044 typedef PlaneDataVec_t::const_iterator PlaneDataCItr;
00045 typedef PlaneDataVec_t::const_reverse_iterator PlaneDataCRItr;
00046
00047 typedef PlaneData::Data_t (DataFT::*FGETTER)(Int_t) const;
00048 typedef void (DataFT::*FSETTER)(Int_t, PlaneData::Data_t);
00049 typedef bool (DataFT::*BGETTER)(Int_t) const;
00050
00051 typedef const CandStripHandle CSH;
00052 typedef CSH* CSHPtr;
00053 typedef std::vector<CSHPtr>::iterator CSHItr;
00054
00055 typedef std::multimap<Int_t, Reco::Strip_t> StripMap;
00056 typedef StripMap::iterator StripMapItr;
00057
00058
00059 public:
00060
00061 DataFT(const AlgConfig& ac, const TrackContext& tc);
00062
00063 ~DataFT();
00064
00065 Bool_t Init(const TrackContext& );
00066 Bool_t Fill(const TrackContext& );
00067
00068
00069 PlaneData& at(PlaneDataVec_t::size_type index) {
00070 #ifdef DEBUG
00071 return fPlanes.at(index);
00072 #else
00073 return fPlanes[index];
00074 #endif
00075 };
00076
00077 const PlaneData& at(PlaneDataVec_t::size_type index) const {
00078 #ifdef DEBUG
00079 return fPlanes.at(index);
00080 #else
00081 return fPlanes[index];
00082 #endif
00083 };
00084
00085
00086 Count_t GetNPlanes() const { return fPlanes.size();};
00087 Count_t GetNUPlanes() const ;
00088 Count_t GetNVPlanes() const ;
00089 Count_t GetNPlanesUsed() const { return fNPlanesUsed;};
00090 Count_t GetNPlanesMin(Count_t nhitsperview) const ;
00091
00092 PlaneData::Data_t GetU(Count_t i) const {return at(i).u;};
00093 PlaneData::Data_t GetSigmaU(Count_t i) const {return at(i).eu;};
00094 PlaneData::Data_t GetV(Count_t i) const {return at(i).v;};
00095 PlaneData::Data_t GetSigmaV(Count_t i) const {return at(i).ev;};
00096
00097 PlaneData::Data_t GetUMean() const;
00098 PlaneData::Data_t GetVMean() const;
00099
00100 Bool_t IsHitU(Count_t i) const { return at(i).uhit; };
00101 Bool_t IsHitV(Count_t i) const { return at(i).vhit; };
00102
00103
00104
00105
00106
00107
00108 Bool_t UHitUse(Count_t i) const { return fUHitUse[i]; };
00109 Bool_t VHitUse(Count_t i) const { return fVHitUse[i]; };
00110
00111 const ViewMask_t& GetUHitUse() const { return fUHitUse; };
00112 const ViewMask_t& GetVHitUse() const { return fVHitUse; };
00113
00114 void SetUHitUse(const ViewMask_t& usehitu) {fUHitUse = usehitu;};
00115 void SetVHitUse(const ViewMask_t& usehitv) {fVHitUse = usehitv;};
00116
00117 Int_t GetZdir() const { return fDir; };
00118
00119 PlaneData::Data_t GetZVtx() const { return fZVtx; };
00120 PlaneData::Data_t GetZ(Count_t i) const { return at(i).z;};
00121 PlaneData::Data_t GetdZSteel(Count_t i) const { return at(i).dz;};
00122 PlaneData::Data_t GetX0(Count_t i) const { return at(i).x0;};
00123
00124 Count_t GetNUHits() const ;
00125 Count_t GetNVHits() const ;
00126 Count_t GetNHits() const ;
00127 Count_t GetNUHitsUsed() const ;
00128 Count_t GetNVHitsUsed() const ;
00129 Count_t GetNHitsUsed() const ;
00130
00131 PlexPlaneId GetBegPlaneId() const { return fPlanes.begin()->plane; };
00132 PlexPlaneId GetEndPlaneId() const { return fPlanes.rbegin()->plane; };
00133 PlexPlaneId GetPlaneId(Count_t i) const { return at(i).plane;};
00134 Count_t GetPlane(Count_t i) const { return at(i).plane.GetPlane();};
00135
00136 Count_t GetBegHit() const ;
00137 Count_t GetEndHit() const ;
00138 Count_t GetBegHitUsed() const ;
00139 Count_t GetEndHitUsed() const ;
00140
00141
00142 void SetNPlanesUsed(Count_t n);
00143
00144 void SetU(Count_t i, PlaneData::Data_t u) { at(i).u = u; };
00145 void SetSigmaU(Count_t i, PlaneData::Data_t eu) { at(i).eu = eu; };
00146 void SetV(Count_t i, PlaneData::Data_t v) { at(i).v = v; };
00147 void SetSigmaV(Count_t i, PlaneData::Data_t ev) { at(i).ev = ev; };
00148
00149 void SetUHit(Count_t i) { at(i).uhit = 1; };
00150 void SetVHit(Count_t i) { at(i).vhit = 1; };
00151 void UnsetUHit(Count_t i) { at(i).uhit = 0; };
00152 void UnsetVHit(Count_t i) { at(i).vhit = 0; };
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 void SetUHitUse(Count_t i) { fUHitUse[i] = kTRUE; };
00163 void SetVHitUse(Count_t i) { fVHitUse[i] = kTRUE; };
00164 void UnsetUHitUse(Count_t i) { fUHitUse[i] = kFALSE; };
00165 void UnsetVHitUse(Count_t i) { fVHitUse[i] = kFALSE; };
00166
00167
00168 void SetZ(Count_t i, PlaneData::Data_t z) { at(i).z = z; };
00169 void SetdZSteel(Count_t i, PlaneData::Data_t dz) { at(i).dz = dz; };
00170 void SetX0(Count_t i, PlaneData::Data_t x0) { at(i).x0 = x0; };
00171 void SetPlane(Count_t i, PlexPlaneId plane) { at(i).plane = plane; };
00172
00173
00174
00175 PlaneData::Data_t GetUf(Count_t i) const { return at(i).uf; };
00176 PlaneData::Data_t GetDudz(Count_t i) const { return at(i).dudz; };
00177 PlaneData::Data_t GetVf(Count_t i) const { return at(i).vf; };
00178 PlaneData::Data_t GetDvdz(Count_t i) const { return at(i).dvdz; };
00179
00180 PlaneData::Data_t GetUlin(Count_t i) const {return at(i).ulin;};
00181 PlaneData::Data_t GetVlin(Count_t i) const {return at(i).vlin;};
00182 PlaneData::Data_t GetDudzlin(Count_t i) const {return at(i).dudzlin;};
00183 PlaneData::Data_t GetDvdzlin(Count_t i) const {return at(i).dvdzlin;};
00184
00185 PlaneData::Data_t GetInvP(Count_t i) const { return at(i).invp; };
00186 PlaneData::Data_t GetP(Count_t i) const { return 1./GetInvP(i); };
00187 PlaneData::Data_t GetS(Count_t i) const { return at(i).s; };
00188 PlaneData::Data_t GetR(Count_t i) const { return at(i).r; };
00189 PlaneData::Data_t GetCos(Count_t i) const { return at(i).cos;};
00190
00191 Int_t GetEMCharge() const;
00192
00193 TVectorD GetTrack() const { return fInitialTrack; };
00194
00195 void SetUf(Count_t i, PlaneData::Data_t uf) { at(i).uf = uf; };
00196 void SetDudz(Count_t i, PlaneData::Data_t dudz) { at(i).dudz = dudz; };
00197 void SetVf(Count_t i, PlaneData::Data_t vf) { at(i).vf = vf; };
00198 void SetDvdz(Count_t i, PlaneData::Data_t dvdz) { at(i).dvdz = dvdz; };
00199 void SetInvP(Count_t i, PlaneData::Data_t invp) { at(i).invp = invp; };
00200 void SetS(Count_t i, PlaneData::Data_t s) { at(i).s = s; };
00201 void SetR(Count_t i, PlaneData::Data_t r) { at(i).r = r; };
00202 void SetCos(Count_t i, PlaneData::Data_t cos) { at(i).cos = cos;};
00203
00204 void SetUlin(Count_t i, PlaneData::Data_t ulin) { at(i).ulin = ulin; };
00205 void SetVlin(Count_t i, PlaneData::Data_t vlin) { at(i).vlin = vlin; };
00206 void SetDudzlin(Count_t i, PlaneData::Data_t dudzlin)
00207 { at(i).dudzlin = dudzlin; };
00208 void SetDvdzlin(Count_t i, PlaneData::Data_t dvdzlin)
00209 { at(i).dvdzlin = dvdzlin; };
00210
00211 void SetInitial(const TVectorD& inittrack);
00212
00213 Count_t SetInitial(const TVectorD& inittrack, Count_t nplanesuse,
00214 SwimSwimmer& swimmer);
00215
00216
00217
00218
00219 void FillVectorC(TMatrixD& vC) const;
00220
00221
00222
00223
00224 Bool_t FillUArrays(Double_t zu[], Double_t u[], Int_t n);
00225
00226 Bool_t FillVArrays(Double_t zv[], Double_t v[], Int_t n);
00227
00228 Bool_t FillLinWithSpline();
00229
00230
00231
00232 void PrintData() const ;
00233
00234
00235 void FillVectorCF(TMatrixD& vC) const;
00236 void FillVectorRes(TMatrixD& vRes, PlaneData::Data_t cdata=1.,
00237 PlaneData::Data_t ctrack=-1.) const;
00238
00239 Count_t GetNPlanesPCut(PlaneData::Data_t pcut) const ;
00240
00241 Count_t SwimAsSwimmer(SwimSwimmer& swimmer);
00242 Count_t SwimAsSwimmer(Count_t nplanes, SwimSwimmer& swimmer);
00243
00244
00245
00246
00247 PlaneData::Data_t ThetaMCS(Count_t i) const ;
00248 PlaneData::Data_t T(Count_t i, Count_t n) const ;
00249
00250 void DumpTrack() const ;
00251 void PrintMomenta() const;
00252
00253 void Reset();
00254
00258 void Config(const AlgConfig& );
00259
00260 void SetHitCoords(Count_t planeIndex, PlaneData::Data_t tpos, PlaneData::Data_t error);
00261
00262 void OneStripPlane(Count_t i, StripMapItr it,
00263 const CandTrackHandle* cth);
00264 void TwoStripPlane(Count_t i, StripMapItr lower,
00265 StripMapItr upper, const CandTrackHandle* cth);
00266
00267 private:
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00291 Short_t fNPlanesUsed;
00292
00296 Short_t fDir;
00297
00301 TVectorD fInitialTrack;
00302
00306 PlaneData::Data_t fZVtx;
00307
00311 PlaneDataVec_t fPlanes;
00312
00316 ViewMask_t fUHitUse;
00317
00321 ViewMask_t fVHitUse;
00322
00326 GeometryHelper fGeo;
00327
00328
00329
00333 PlaneData::Data_t fMinStripCharge;
00334
00339 Bool_t fSetLPos;
00340
00344 Int_t fNHitsInViewMin;
00345
00346 bool fUseGeoSwimmer;
00347
00348 };
00349
00353 struct ByPlane : public std::binary_function<const CandStripHandle*,
00354 const CandStripHandle*, Bool_t>
00355 {
00356 Bool_t operator()(const CandStripHandle* a, const CandStripHandle* b) {
00357 return (a->GetPlane() < b->GetPlane());
00358 }
00359 };
00360
00361 #endif