X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliFieldMap.cxx;h=97a37b6eb954b23e273a35f3d28cc5c496faf2ee;hb=b0702f40fd1955b672c9efa6a4c604b300f1fd12;hp=b3b6d45deb8a75e7b13f4fbdb5414632463e495b;hpb=7b6cddfa0032215933b9781ae6df2abd7a7c8907;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliFieldMap.cxx b/STEER/AliFieldMap.cxx index b3b6d45deb8..97a37b6eb95 100644 --- a/STEER/AliFieldMap.cxx +++ b/STEER/AliFieldMap.cxx @@ -13,55 +13,110 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.1 2002/02/14 11:41:28 morsch -Magnetic field map for ALICE for L3+muon spectrometer stored in 3 seperate -root files. - -*/ +/* $Id$ */ +//----------------------------------------------------------------------- // +// Class to handle the field +// I/O and interpolation +// of the field map to return the value +// of the magnetic field in an arbitrary position // Author: Andreas Morsch // +//----------------------------------------------------------------------- -#include +#include +#include +#include + +#include "AliLog.h" #include "AliFieldMap.h" -#include "TSystem.h" ClassImp(AliFieldMap) -//________________________________________ -AliFieldMap::AliFieldMap() +//_______________________________________________________________________ +AliFieldMap::AliFieldMap(): + fXbeg(0), + fYbeg(0), + fZbeg(0), + fXend(0), + fYend(0), + fZend(0), + fXdel(0), + fYdel(0), + fZdel(0), + fXdeli(0), + fYdeli(0), + fZdeli(0), + fXn(0), + fYn(0), + fZn(0), + fWriteEnable(0), + fB(0) { // // Standard constructor // - fB = 0; SetWriteEnable(); } -AliFieldMap::AliFieldMap(const char *name, const char *title) - : TNamed(name,title) +//_______________________________________________________________________ +AliFieldMap::AliFieldMap(const char *name, const char *title): + TNamed(name,title), + fXbeg(0), + fYbeg(0), + fZbeg(0), + fXend(0), + fYend(0), + fZend(0), + fXdel(0), + fYdel(0), + fZdel(0), + fXdeli(0), + fYdeli(0), + fZdeli(0), + fXn(0), + fYn(0), + fZn(0), + fWriteEnable(0), + fB(0) { // // Standard constructor // - fB = 0; ReadField(); SetWriteEnable(); } +//_______________________________________________________________________ AliFieldMap::~AliFieldMap() { -// -// Destructor -// + // + // Destructor + // delete fB; } -//________________________________________ -AliFieldMap::AliFieldMap(const AliFieldMap &map) +//_______________________________________________________________________ +AliFieldMap::AliFieldMap(const AliFieldMap &map): + TNamed(map), + fXbeg(0), + fYbeg(0), + fZbeg(0), + fXend(0), + fYend(0), + fZend(0), + fXdel(0), + fYdel(0), + fZdel(0), + fXdeli(0), + fYdeli(0), + fZdeli(0), + fXn(0), + fYn(0), + fZn(0), + fWriteEnable(0), + fB(0) { // // Copy constructor @@ -69,21 +124,21 @@ AliFieldMap::AliFieldMap(const AliFieldMap &map) map.Copy(*this); } -//________________________________________ +//_______________________________________________________________________ void AliFieldMap::ReadField() { // // Method to read the magnetic field map from file // FILE* magfile; -// FILE* endf = fopen("end.table", "r"); -// FILE* out = fopen("out", "w"); + // FILE* endf = fopen("end.table", "r"); + // FILE* out = fopen("out", "w"); Int_t ix, iy, iz, ipx, ipy, ipz; Float_t bx, by, bz; char *fname = 0; - printf("%s: Reading Magnetic Field Map %s from file %s\n", - ClassName(),fName.Data(),fTitle.Data()); + AliInfo(Form("Reading Magnetic Field Map %s from file %s", + fName.Data(),fTitle.Data())); fname = gSystem->ExpandPathName(fTitle.Data()); magfile = fopen(fname,"r"); @@ -101,7 +156,7 @@ void AliFieldMap::ReadField() Int_t nDim = fXn*fYn*fZn; -// Float_t x,y,z,b; + // Float_t x,y,z,b; fB = new TVector(3*nDim); if (magfile) { @@ -155,31 +210,32 @@ void AliFieldMap::ReadField() } // if mafile } -void AliFieldMap::Field(Float_t *x, Float_t *b) +//_______________________________________________________________________ +void AliFieldMap::Field(Float_t *x, Float_t *b) const { -// -// Use simple interpolation to obtain field at point x -// + // + // Use simple interpolation to obtain field at point x + // Double_t ratx, raty, ratz, hix, hiy, hiz, ratx1, raty1, ratz1, bhyhz, bhylz, blyhz, blylz, bhz, blz, xl[3]; const Double_t kone=1; Int_t ix, iy, iz; b[0]=b[1]=b[2]=0; -// + // - xl[0]=TMath::Abs(x[0])-fXbeg; - xl[1]=TMath::Abs(x[1])-fYbeg; - xl[2]=x[2]-fZbeg; + xl[0] = x[0] - fXbeg; + xl[1] = x[1] - fYbeg; + xl[2] = x[2] - fZbeg; - hix=xl[0]*fXdeli; + hix=TMath::Max(0.,TMath::Min(xl[0]*fXdeli,fXn-1.0001)); ratx=hix-int(hix); ix=int(hix); - hiy=xl[1]*fYdeli; + hiy=TMath::Max(0.,TMath::Min(xl[1]*fYdeli,fYn-1.0001)); raty=hiy-int(hiy); iy=int(hiy); - hiz=xl[2]*fZdeli; + hiz=TMath::Max(0.,TMath::Min(xl[2]*fZdeli,fZn-1.0001)); ratz=hiz-int(hiz); iz=int(hiz); @@ -187,6 +243,8 @@ void AliFieldMap::Field(Float_t *x, Float_t *b) raty1=kone-raty; ratz1=kone-ratz; + if (!fB) return; + bhyhz = Bx(ix ,iy+1,iz+1)*ratx1+Bx(ix+1,iy+1,iz+1)*ratx; bhylz = Bx(ix ,iy+1,iz )*ratx1+Bx(ix+1,iy+1,iz )*ratx; blyhz = Bx(ix ,iy ,iz+1)*ratx1+Bx(ix+1,iy ,iz+1)*ratx; @@ -212,32 +270,36 @@ void AliFieldMap::Field(Float_t *x, Float_t *b) b[2] = blz *ratz1+bhz *ratz; } -//________________________________________ -void AliFieldMap::Copy(AliFieldMap & /* magf */) const +//_______________________________________________________________________ +void AliFieldMap::Copy(TObject & /* magf */) const { // // Copy *this onto magf -- Not implemented // - Fatal("Copy","Not implemented!\n"); + AliFatal("Not implemented!"); } -//________________________________________ +//_______________________________________________________________________ AliFieldMap & AliFieldMap::operator =(const AliFieldMap &magf) { magf.Copy(*this); return *this; } +//_______________________________________________________________________ void AliFieldMap::Streamer(TBuffer &R__b) { // Stream an object of class AliFieldMap. - if (R__b.IsReading()) { - AliFieldMap::Class()->ReadBuffer(R__b, this); - } else { - if (!fWriteEnable) { - delete fB; - fB = 0; - } - AliFieldMap::Class()->WriteBuffer(R__b, this); - } + TVector* save = 0; + + if (R__b.IsReading()) { + AliFieldMap::Class()->ReadBuffer(R__b, this); + } else { + if (!fWriteEnable) { + save = fB; + fB = 0; + } + AliFieldMap::Class()->WriteBuffer(R__b, this); + if (!fWriteEnable) fB = save; + } }