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
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00137
00138
00139
00141 #ifndef StMagUtilities_H
00142 #define StMagUtilities_H
00143
00144 #include <math.h>
00145 #include <stdio.h>
00146 #include <stdlib.h>
00147 #include <Stiostream.h>
00148
00149 #include "TSystem.h"
00150 #include "TROOT.h"
00151 #include "TMatrix.h"
00152
00153 enum EBField { kUndefined = 0, kConstant = 1, kMapped = 2, kChain = 3 } ;
00154 enum Prime { IsPrimary = 0 , IsGlobal = 1 } ;
00155
00156
00157
00158 enum DistortSelect
00159 {
00160 kBMap = 0x08,
00161 kPadrow13 = 0x10,
00162 kTwist = 0x20,
00163 kClock = 0x40,
00164 kMembrane = 0x80,
00165 kEndcap = 0x100,
00166 kIFCShift = 0x200,
00167 kSpaceCharge = 0x400,
00168 kSpaceChargeR2 = 0x800,
00169 kShortedRing = 0x1000,
00170 kFast2DBMap = 0x2000,
00171 kGridLeak = 0x4000,
00172 k3DGridLeak = 0x8000,
00173 kGGVoltError = 0x10000,
00174 kSectorAlign = 0x20000
00175 } ;
00176 enum EBMapSizes
00177 {
00178 BMap_nZ = 57,
00179 BMap_nR = 28,
00180 BMap_nPhi = 37,
00181 EMap_nZ = 224,
00182 EMap_nR = 82,
00183 EMap_nPhi = 13
00184 } ;
00185
00186
00187
00188
00189
00190
00191
00192
00193 class StTpcDb ;
00194 class TDataSet ;
00195 class St_tpcHVPlanesC;
00196 #include "StDetectorDbMaker/StDetectorDbSpaceCharge.h"
00197 #include "StDetectorDbMaker/StDetectorDbTpcVoltages.h"
00198 #include "StDetectorDbMaker/StDetectorDbTpcOmegaTau.h"
00199 #include "StDetectorDbMaker/StDetectorDbGridLeak.h"
00200
00201
00202
00203 class StMagUtilities {
00204
00205
00206 private:
00207 static StMagUtilities *fgInstance;
00208
00209 StTpcDb* thedb ;
00210 TDataSet* thedb2 ;
00211 StDetectorDbSpaceCharge* fSpaceCharge ;
00212 StDetectorDbSpaceChargeR2* fSpaceChargeR2 ;
00213 StDetectorDbTpcVoltages* fTpcVolts ;
00214 StDetectorDbTpcOmegaTau* fOmegaTau ;
00215 StDetectorDbGridLeak* fGridLeak ;
00216 St_tpcHVPlanesC* fHVPlanes ;
00217
00218 virtual void SetDb( StTpcDb* dbin , TDataSet* dbin2 ) ;
00219 virtual void GetMagFactor () ;
00220 virtual void GetTPCParams () ;
00221 virtual void GetTPCVoltages () ;
00222 virtual void GetSpaceCharge () ;
00223 virtual void GetSpaceChargeR2 () ;
00224 virtual void GetShortedRing () ;
00225 virtual void GetOmegaTau () ;
00226 virtual void GetGridLeak() ;
00227 virtual void GetHVPlanes() ;
00228
00229 virtual void CommonStart ( Int_t mode ) ;
00230 virtual void ReadField ( ) ;
00231 virtual void Search ( const Int_t N, const Float_t Xarray[], const Float_t x, Int_t &low ) ;
00232 virtual Int_t IsPowerOfTwo (Int_t i) ;
00233 virtual void SectorNumber ( Int_t& Sector , const Float_t x[] ) ;
00234 virtual void SectorNumber ( Int_t& Sector , Float_t phi, const Float_t z ) ;
00235 virtual Float_t LimitZ (Int_t& Sector, const Float_t x[] ) ;
00236 virtual Float_t Interpolate ( const Float_t Xarray[], const Float_t Yarray[],
00237 const Int_t ORDER, const Float_t x ) ;
00238 virtual Float_t Interpolate2DTable ( const Int_t ORDER, const Float_t x, const Float_t y, const Int_t nx, const Int_t ny,
00239 const Float_t XV[], const Float_t YV[], const TMatrix &Array ) ;
00240 virtual Float_t Interpolate3DTable ( const Int_t ORDER, const Float_t x, const Float_t y, const Float_t z,
00241 const Int_t nx, const Int_t ny, const Int_t nz,
00242 const Float_t XV[], const Float_t YV[], const Float_t ZV[],
00243 TMatrix **ArrayofArrays ) ;
00244 virtual void Interpolate2DBfield ( const Float_t r, const Float_t z,
00245 Float_t &Br_value, Float_t &Bz_value ) ;
00246 virtual void Interpolate3DBfield ( const Float_t r, const Float_t z, const Float_t phi,
00247 Float_t &Br_value, Float_t &Bz_value, Float_t &Bphi_value ) ;
00248 virtual void Interpolate2DEdistortion ( const Int_t ORDER, const Float_t r, const Float_t z,
00249 const Float_t Er[EMap_nZ][EMap_nR], Float_t &Er_value ) ;
00250 virtual void Interpolate3DEdistortion ( const Int_t ORDER, const Float_t r, const Float_t phi, const Float_t z,
00251 const Float_t Er[EMap_nZ][EMap_nPhi][EMap_nR], const Float_t Ephi[EMap_nZ][EMap_nPhi][EMap_nR],
00252 Float_t &Er_value, Float_t &Ephi_value ) ;
00253 virtual void PoissonRelaxation ( TMatrix &ArrayV, TMatrix &Charge, TMatrix &EroverEz,
00254 const Int_t ITERATIONS ) ;
00255
00256 virtual void Poisson3DRelaxation( TMatrix **ArrayofArrayV, TMatrix **ArrayofCharge, TMatrix **ArrayofEroverEz,
00257 TMatrix **ArrayofEPhioverEz,
00258 const Int_t PHISLICES, const Float_t DeltaPhi,
00259 const Int_t ITERATIONS, const Int_t SYMMETRY) ;
00260
00261 Int_t mDistortionMode;
00262
00263 Float_t StarDriftV ;
00264 Float_t TPC_Z0 ;
00265 Float_t XTWIST ;
00266 Float_t YTWIST ;
00267 Double_t CathodeV ;
00268 Double_t GG ;
00269 Float_t EASTCLOCKERROR ;
00270 Float_t WESTCLOCKERROR ;
00271 Float_t IFCRadius ;
00272 Float_t OFCRadius ;
00273 Float_t GAPRADIUS ;
00274 Float_t GAP13_14 ;
00275 Float_t StarMagE ;
00276 Float_t IFCShift ;
00277 Float_t TensorV1 ;
00278 Float_t TensorV2 ;
00279 Float_t Const_0, Const_1, Const_2 ;
00280 Float_t SpaceChargeEWRatio ;
00281 Double_t SpaceCharge, SpaceChargeR2 ;
00282 Double_t InnerGridLeakStrength ;
00283 Double_t InnerGridLeakRadius ;
00284 Double_t InnerGridLeakWidth ;
00285 Double_t MiddlGridLeakStrength ;
00286 Double_t MiddlGridLeakRadius ;
00287 Double_t MiddlGridLeakWidth ;
00288 Double_t OuterGridLeakStrength ;
00289 Double_t OuterGridLeakRadius ;
00290 Double_t OuterGridLeakWidth ;
00291 Float_t GLWeights[25] ;
00292 Int_t ShortTableRows ;
00293 Int_t Side[10] ;
00294 Int_t Cage[10] ;
00295 Float_t Ring[10] ;
00296 Float_t MissingResistance[10] ;
00297 Float_t Resistor[10] ;
00298 Float_t deltaVGGEast ;
00299 Float_t deltaVGGWest ;
00300 Bool_t useManualSCForPredict ;
00301
00302
00303 Float_t Bz[BMap_nZ][BMap_nR], Br[BMap_nZ][BMap_nR] ;
00304 Float_t Radius[BMap_nR], ZList[BMap_nZ] ;
00305 Float_t Bz3D[BMap_nPhi][BMap_nZ][BMap_nR], Br3D[BMap_nPhi][BMap_nZ][BMap_nR], Bphi3D[BMap_nPhi][BMap_nZ][BMap_nR] ;
00306 Float_t R3D[BMap_nR], Z3D[BMap_nZ], Phi3D[BMap_nPhi] ;
00307
00308
00309 Float_t shiftEr[EMap_nZ][EMap_nR] ;
00310 Float_t spaceEr[EMap_nZ][EMap_nR] ;
00311 Float_t spaceR2Er[EMap_nZ][EMap_nR] ;
00312 Float_t shortEr[EMap_nZ][EMap_nR] ;
00313 Float_t GGVoltErrorEr[EMap_nZ][EMap_nR] ;
00314
00315 static Float_t ePhiList[EMap_nPhi] ;
00316 static Float_t eRList[EMap_nR] ;
00317 static Float_t eZList[EMap_nZ] ;
00318
00319 public:
00320
00321 StMagUtilities () ;
00322 StMagUtilities ( StTpcDb* dbin, TDataSet* dbin2, Int_t mode = 0 ) ;
00323 StMagUtilities ( const EBField map, const Float_t factor, Int_t mode = 0 ) ;
00324 virtual ~StMagUtilities () { fgInstance = 0; }
00325 static StMagUtilities* Instance() { return fgInstance; }
00326
00327 virtual void BField ( const Float_t x[], Float_t B[] ) ;
00328 virtual void BrBzField( const Float_t r, const Float_t z, Float_t &Br_value, Float_t &Bz_value ) ;
00329 virtual void B3DField ( const Float_t x[], Float_t B[] ) ;
00330 virtual void BrBz3DField ( const Float_t r, const Float_t z, const Float_t phi,
00331 Float_t &Br_value, Float_t &Bz_value, Float_t &Bphi_value ) ;
00332 virtual void DoDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00333 virtual void UndoDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00334 virtual void UndoBDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00335 virtual void Undo2DBDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00336 virtual void FastUndoBDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00337 virtual void FastUndo2DBDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00338 virtual void UndoPad13Distortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00339 virtual void UndoTwistDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00340 virtual void UndoClockDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00341 virtual void UndoMembraneDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00342 virtual void UndoEndcapDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00343 virtual void UndoSpaceChargeDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00344 virtual void UndoSpaceChargeR2Distortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00345 virtual void UndoGridLeakDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00346 virtual void Undo3DGridLeakDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00347 virtual void UndoIFCShiftDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00348 virtual void UndoShortedRingDistortion ( const Float_t x[], Float_t Xprime[] , Int_t Sector = -1 ) ;
00349 virtual void UndoGGVoltErrorDistortion ( const Float_t x[], Float_t Xprime[], Int_t Sector = -1 ) ;
00350 virtual void UndoSectorAlignDistortion ( const Float_t x[], Float_t Xprime[], Int_t Sector = -1 ) ;
00351
00352 virtual void FixSpaceChargeDistortion ( const Int_t Charge, const Float_t x[3], const Float_t p[3],
00353 const Prime PrimaryOrGlobal,
00354 Float_t x_new[3], Float_t p_new[3],
00355 const unsigned int RowMask1 = 0xFFFFFF00 ,
00356 const unsigned int RowMask2 = 0x1FFFFF,
00357 const Float_t VertexError = 0.0200 ) ;
00358
00359 virtual void ApplySpaceChargeDistortion ( const Double_t sc, const Int_t Charge,
00360 const Float_t x[3], const Float_t p[3],
00361 const Prime PrimaryOrGlobal, Int_t &new_Charge,
00362 Float_t x_new[3], Float_t p_new[3],
00363 const unsigned int RowMask1 = 0xFFFFFF00 ,
00364 const unsigned int RowMask2 = 0x1FFFFF,
00365 const Float_t VertexError = 0.0200 ) ;
00366
00367 virtual Int_t PredictSpaceChargeDistortion ( Int_t Charge,
00368 Float_t Pt,
00369 Float_t VertexZ,
00370 Float_t PseudoRapidity,
00371 Float_t DCA,
00372 const unsigned int RowMask1,
00373 const unsigned int RowMask2,
00374 Float_t &pSpace ) ;
00375
00376 virtual Int_t PredictSpaceChargeDistortion ( Int_t Charge,
00377 Float_t Pt,
00378 Float_t VertexZ,
00379 Float_t PseudoRapidity,
00380 Float_t Phi,
00381 Float_t DCA,
00382 const unsigned int RowMask1,
00383 const unsigned int RowMask2,
00384 Float_t RowMaskErrorR[64],
00385 Float_t RowMaskErrorRPhi[64],
00386 Float_t &pSpace ) ;
00387
00388 virtual void ManualShortedRing ( Int_t EastWest, Int_t InnerOuter,
00389 Float_t RingNumber, Float_t MissingRValue, Float_t ExtraRValue) ;
00390
00391 virtual Int_t GetSpaceChargeMode();
00392 virtual void ManualSpaceCharge(Double_t SpcChg) { SpaceCharge = SpcChg ; fSpaceCharge = 0 ; }
00393 virtual void ManualSpaceChargeR2(Double_t SpcChg, Float_t EWRatio = 1.0 ) { SpaceChargeR2 = SpcChg ; fSpaceChargeR2 = 0 ;
00394 SpaceChargeEWRatio = EWRatio ; }
00395 virtual void ManualGridLeakStrength(Double_t inner, Double_t middle, Double_t outer);
00396 virtual void ManualGridLeakRadius (Double_t inner, Double_t middle, Double_t outer);
00397 virtual void ManualGridLeakWidth (Double_t inner, Double_t middle, Double_t outer);
00398 virtual void AutoSpaceCharge() {GetSpaceCharge() ; }
00399 virtual void AutoSpaceChargeR2() {GetSpaceChargeR2(); }
00400 virtual Double_t CurrentSpaceCharge() {return SpaceCharge ;}
00401 virtual Double_t CurrentSpaceChargeR2() {return SpaceChargeR2;}
00402 virtual Float_t CurrentSpaceChargeEWRatio() { return SpaceChargeEWRatio ; }
00403 virtual Bool_t UpdateShortedRing();
00404 virtual void UseManualSCForPredict(Bool_t flag=kTRUE) { useManualSCForPredict=flag; };
00405 virtual void ManualGGVoltError(Double_t east, Double_t west);
00406
00407 ClassDef(StMagUtilities,1)
00408
00409 };
00410
00411 #endif
00412
00413
00414
00415
00416
00417
00418
00419