X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliMagFMaps.cxx;h=c854dbb9973efc490ea7152bb05b565a4cea1587;hb=a7a1e1c78ae322eab47470ea787794dd56f7d83c;hp=94c11bcbcd6c497ae57fabcddf0e0ff197d3cb64;hpb=ee4f31cde112853932f0eeddc5988addb301b4a9;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliMagFMaps.cxx b/STEER/AliMagFMaps.cxx index 94c11bcbcd6..c854dbb9973 100644 --- a/STEER/AliMagFMaps.cxx +++ b/STEER/AliMagFMaps.cxx @@ -13,46 +13,49 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.6 2002/04/11 11:17:48 morsch -ReadField() used in Constructor. +/* $Id$ */ -Revision 1.5 2002/02/26 09:48:14 morsch -Extra argument in constructor for l3 map choice. - -Revision 1.4 2002/02/22 14:00:20 morsch -Protection against replication of fieldmap data in gAlice. - -Revision 1.3 2002/02/21 09:23:41 morsch -Create dummy field map for L3 in case no detailed map is needed. - -Revision 1.2 2002/02/19 16:14:35 morsch -Reading of 0.2 T solenoid field map enabled. - -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. - -*/ - -// +//------------------------------------------------------------------------ +// Magnetic field composed by 3 maps: the L3 magnet, extended region, and +// dipole magnet +// Used in the configuration macros (macros/Config.C, etc.) // Author: Andreas Morsch -// +//------------------------------------------------------------------------ +#include #include +#include #include + +#include "AliLog.h" #include "AliFieldMap.h" #include "AliMagFMaps.h" - ClassImp(AliMagFMaps) + + +//_______________________________________________________________________ +AliMagFMaps::AliMagFMaps(): + fSolenoid(0), + fSolenoidUser(0.), + fL3Option(0) +{ + // + // Default constructor + // + // + // Don't replicate field information in gAlice + fFieldMap[0] = fFieldMap[1] = fFieldMap[2] = 0; +} -//________________________________________ -AliMagFMaps::AliMagFMaps(const char *name, const char *title, const Int_t integ, - const Float_t factor, const Float_t fmax, const Int_t map, - const Int_t l3) - : AliMagF(name,title,integ,factor,fmax) +//_______________________________________________________________________ +AliMagFMaps::AliMagFMaps(const char *name, const char *title, Int_t integ, + Float_t factor, Float_t fmax, Int_t map, + Int_t l3): + AliMagFC(name,title,integ,factor,fmax), + fSolenoid(0), + fSolenoidUser(0), + fL3Option(l3) { // // Standard constructor @@ -61,18 +64,19 @@ AliMagFMaps::AliMagFMaps(const char *name, const char *title, const Int_t integ, fFieldMap[0] = 0; fMap = map; fL3Option = l3; - ReadField(); - fFieldRead = 1; -// -// Don't replicate field information in gAlice + // + // Don't replicate field information in gAlice for (Int_t i = 0; i < 3; i++) fFieldMap[i]->SetWriteEnable(0); -// - + // } -//________________________________________ -AliMagFMaps::AliMagFMaps(const AliMagFMaps &magf) +//_______________________________________________________________________ +AliMagFMaps::AliMagFMaps(const AliMagFMaps &magf): + AliMagFC(magf), + fSolenoid(0), + fSolenoidUser(0), + fL3Option(0) { // // Copy constructor @@ -80,185 +84,161 @@ AliMagFMaps::AliMagFMaps(const AliMagFMaps &magf) magf.Copy(*this); } +//_______________________________________________________________________ AliMagFMaps::~AliMagFMaps() { -// -// Destructor -// - delete fFieldMap[0]; - delete fFieldMap[1]; - delete fFieldMap[2]; + // + // Destructor + // + delete fFieldMap[0]; + delete fFieldMap[1]; + delete fFieldMap[2]; } +//_______________________________________________________________________ void AliMagFMaps::ReadField() { -// Read Field Map from file -// -// don't read twice -// - if (fFieldRead) return; - fFieldRead = 1; -// - char* fname; - TFile* file = 0; - if (fMap == k2kG) { - if (fL3Option) { - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B02.root"); - file = new TFile(fname); - fFieldMap[0] = (AliFieldMap*) file->Get("L3B02"); - file->Close(); - delete file; - } - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB02.root"); - file = new TFile(fname); - fFieldMap[1] = (AliFieldMap*) file->Get("DipB02"); - file->Close(); - delete file;; - - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB02.root"); - file = new TFile(fname); - fFieldMap[2] = (AliFieldMap*) file->Get("ExtB02"); - file->Close(); - delete file; - fSolenoid = 2.; - } else if (fMap == k4kG) { - if (fL3Option) { - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B04.root"); - file = new TFile(fname); - fFieldMap[0] = (AliFieldMap*) file->Get("L3B04"); - file->Close(); - delete file; - } - - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB04.root"); - file = new TFile(fname); - fFieldMap[1] = (AliFieldMap*) file->Get("DipB04"); - file->Close(); - delete file;; - - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB04.root"); - file = new TFile(fname); - fFieldMap[2] = (AliFieldMap*) file->Get("ExtB04"); - file->Close(); - delete file; - fSolenoid = 4.; - } else if (fMap == k5kG) { - if (fL3Option) { - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B05.root"); - file = new TFile(fname); - fFieldMap[0] = (AliFieldMap*) file->Get("L3B05"); - file->Close(); - delete file; - } - - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB05.root"); - file = new TFile(fname); - fFieldMap[1] = (AliFieldMap*) file->Get("DipB05"); - file->Close(); - delete file;; - - fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB05.root"); - file = new TFile(fname); - fFieldMap[2] = (AliFieldMap*) file->Get("ExtB05"); - file->Close(); - delete file; - - fSolenoid = 5.; - } + // Read Field Map from file + // + // don't read twice + // + if (!fReadField) return; + fReadField = kFALSE; + // + - if (!fL3Option) { -// -// Dummy L3 map - fFieldMap[0] = new AliFieldMap(); - fFieldMap[0] -> SetLimits(-800., 800., -800., 800., -700., 700.); - } -} + char* fname = 0; + TFile* file = 0; + if (fMap == k2kG) { + fSolenoid = 2.; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B02.root"); + file = new TFile(fname); + fFieldMap[0] = dynamic_cast(file->Get("L3B02")); + file->Close(); + delete file; + delete [] fname; // see documentation to expand filenam + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB02.root"); + file = new TFile(fname); + fFieldMap[1] = dynamic_cast(file->Get("DipB02")); + file->Close(); + delete file;; + delete [] fname; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB02.root"); + file = new TFile(fname); + fFieldMap[2] = dynamic_cast(file->Get("ExtB02")); + file->Close(); + delete file; + delete [] fname; + } else if (fMap == k4kG) { + fSolenoid = 4.; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B04.root"); + file = new TFile(fname); + fFieldMap[0] = dynamic_cast(file->Get("L3B04")); + file->Close(); + delete file; + delete [] fname; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB04.root"); + file = new TFile(fname); + fFieldMap[1] = dynamic_cast(file->Get("DipB04")); + file->Close(); + delete [] fname; + delete file; + + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB04.root"); + file = new TFile(fname); + fFieldMap[2] = dynamic_cast(file->Get("ExtB04")); + file->Close(); + delete [] fname; + delete file; + } else if (fMap == k5kG) { + fSolenoid = 5.; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B05.root"); + file = new TFile(fname); + fFieldMap[0] = dynamic_cast(file->Get("L3B05")); + file->Close(); + delete file; + delete [] fname; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB05.root"); + file = new TFile(fname); + fFieldMap[1] = dynamic_cast(file->Get("DipB05")); + file->Close(); + delete file; + delete [] fname; + fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB05.root"); + file = new TFile(fname); + fFieldMap[2] = dynamic_cast(file->Get("ExtB05")); + file->Close(); + delete file; + delete [] fname; + } + + if (!fL3Option) fSolenoidUser = fSolenoid; +} +//_______________________________________________________________________ Float_t AliMagFMaps::SolenoidField() const { -// -// Returns max. L3 (solenoid) field strength -// according to field map setting - - return fSolenoid; + // + // Returns max. L3 (solenoid) field strength + // according to field map setting + // + return -Factor()*fSolenoid; } - - -//________________________________________ -void AliMagFMaps::Field(Float_t *x, Float_t *b) +//_______________________________________________________________________ +void AliMagFMaps::Field(Float_t *x, Float_t *b) const { // // Method to calculate the magnetic field // // --- find the position in the grid --- - if (!fFieldRead) ReadField(); + + // if (!fFieldRead) ReadField(); + + // + // Field Maps have been calculated for the coordinate system in which + // the Muon Spectrometer is placed at z > 0 + // Transform coordinates corresponingly + // + b[0]=b[1]=b[2]=0; + Float_t xm[3]; + xm[0] = - x[0]; + xm[1] = x[1]; + xm[2] = - x[2]; + AliFieldMap* map = 0; - if (fFieldMap[0]->Inside(x[0], x[1], x[2])) { + if (fFieldMap[0]->Inside(xm[0], xm[1], xm[2])) { map = fFieldMap[0]; - if (!fL3Option) { -// -// Constant L3 field, if this option was selected -// - b[2] = fSolenoid; + Float_t r = TMath::Sqrt(xm[0] * xm[0] + xm[1] * xm[1]); + + if (!fL3Option && TMath::Abs(xm[2]) < 370. && r < 550.) { + // + // Constant L3 field , if this option was selected + // + b[2] = (- fSolenoid)*fFactor; return; - } - } else if (fFieldMap[1]->Inside(x[0], x[1], x[2])) { - map = fFieldMap[1]; - } else if (fFieldMap[2]->Inside(x[0], x[1], x[2])) { - map = fFieldMap[2]; + } + } else if (fFieldMap[1]->Inside(xm[0], xm[1], xm[2])) { + map = fFieldMap[1]; + } else if (fFieldMap[2]->Inside(xm[0], xm[1], xm[2])) { + map = fFieldMap[2]; } if(map){ - map->Field(x,b); + map->Field(xm,b); + b[0] = - b[0]; + b[2] = - b[2]; + } else { -//This is the ZDC part - Float_t rad2=x[0]*x[0]+x[1]*x[1]; - if(x[2]>kCORBEG2 && x[2]kZ1BEG && x[2]kZ2BEG && x[2]kZ3BEG && x[2]kZ4BEG && x[2]kD1BEG && x[2]kD2BEG && x[2]ReadBuffer(R__b, this); - fFieldRead = 0; - } else { - AliMagFMaps::Class()->WriteBuffer(R__b, this); - } + // Stream an object of class AliMagFMaps. + if (R__b.IsReading()) { + R__b.ReadClassBuffer(AliMagFMaps::Class(), this); + // + fReadField = kTRUE; + ReadField(); + } else { + R__b.WriteClassBuffer(AliMagFMaps::Class(), this); + } }