X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliMagF.cxx;h=70eea8dfa43f772e32c6543b89099a1be5a1c9c6;hb=3b5284bda596770407077f834d1e145bdc870190;hp=9435ae7d4a0442e4d5d574b73a9a50bd3fe1acfd;hpb=e3eadfac9951a76a9aec9fd0a3f23c3931a7b31f;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliMagF.cxx b/STEER/AliMagF.cxx index 9435ae7d4a0..70eea8dfa43 100644 --- a/STEER/AliMagF.cxx +++ b/STEER/AliMagF.cxx @@ -26,8 +26,7 @@ ClassImp(AliMagF) const Double_t AliMagF::fgkSol2DipZ = -700.; -const UShort_t AliMagF::fgkPolarityConvention = kConvLHC; - +const UShort_t AliMagF::fgkPolarityConvention = AliMagF::kConvLHC; /* Explanation for polarity conventions: these are the mapping between the current signs and main field components in L3 (Bz) and Dipole (Bx) (in Alice frame) @@ -44,6 +43,25 @@ const UShort_t AliMagF::fgkPolarityConvention = kConvLHC; Note: only "negative Bz(L3) with postive Bx(Dipole)" and its inverse was mapped in 2005. Hence the GRP Manager will reject the runs with the current combinations (in the convention defined by the static Int_t AliMagF::GetPolarityConvention()) which do not lead to such field polarities. + + ----------------------------------------------- + + Explanation on integrals in the TPC region + GetTPCInt(xyz,b) and GetTPCRatInt(xyz,b) give integrals from point (x,y,z) to point (x,y,0) + (irrespectively of the z sign) of the following: + TPCInt: b contains int{bx}, int{by}, int{bz} + TPCRatInt: b contains int{bx/bz}, int{by/bz}, int{(bx/bz)^2+(by/bz)^2} + + The same applies to integral in cylindrical coordinates: + GetTPCIntCyl(rphiz,b) + GetTPCIntRatCyl(rphiz,b) + They accept the R,Phi,Z coordinate (-piExpandPathName(GetDataFileName()); TFile* file = TFile::Open(fname); if (!file) { - AliError(Form("Failed to open magnetic field data file %s\n",fname)); - return kFALSE; + AliFatal(Form("Failed to open magnetic field data file %s\n",fname)); } // fMeasuredMap = dynamic_cast(file->Get(GetParamName())); if (!fMeasuredMap) { - AliError(Form("Did not find field %s in %s\n",GetParamName(),fname)); - return kFALSE; + AliFatal(Form("Did not find field %s in %s\n",GetParamName(),fname)); } file->Close(); delete file; @@ -357,7 +368,7 @@ void AliMagF::MachineField(const Double_t *x, Double_t *b) const //_______________________________________________________________________ void AliMagF::GetTPCInt(const Double_t *xyz, Double_t *b) const { - // Method to calculate the integral of magnetic integral from xyz to nearest cathode plane + // Method to calculate the integral_0^z of br,bt,bz b[0]=b[1]=b[2]=0.0; if (fMeasuredMap) { fMeasuredMap->GetTPCInt(xyz,b); @@ -365,10 +376,21 @@ void AliMagF::GetTPCInt(const Double_t *xyz, Double_t *b) const } } +//_______________________________________________________________________ +void AliMagF::GetTPCRatInt(const Double_t *xyz, Double_t *b) const +{ + // Method to calculate the integral_0^z of bx/bz,by/bz and (bx/bz)^2+(by/bz)^2 + b[0]=b[1]=b[2]=0.0; + if (fMeasuredMap) { + fMeasuredMap->GetTPCRatInt(xyz,b); + b[2] /= 100; + } +} + //_______________________________________________________________________ void AliMagF::GetTPCIntCyl(const Double_t *rphiz, Double_t *b) const { - // Method to calculate the integral of magnetic integral from point to nearest cathode plane + // Method to calculate the integral_0^z of br,bt,bz // in cylindrical coordiates ( -piGetTPCRatIntCyl(rphiz,b); + b[2] /= 100; + } +} + //_______________________________________________________________________ void AliMagF::SetFactorSol(Float_t fc) { @@ -423,7 +457,7 @@ Double_t AliMagF::GetFactorDip() const //_____________________________________________________________________________ AliMagF* AliMagF::CreateFieldMap(Float_t l3Cur, Float_t diCur, Int_t convention, Bool_t uniform, - Float_t sqrts, const Char_t *beamtype, const Char_t *path) + Float_t beamenergy, const Char_t *beamtype, const Char_t *path) { //------------------------------------------------ // The magnetic field map, defined externally... @@ -440,7 +474,7 @@ AliMagF* AliMagF::CreateFieldMap(Float_t l3Cur, Float_t diCur, Int_t convention, const Float_t tolerance=0.03; // relative current tolerance const Float_t zero=77.; // "zero" current (A) // - BMap_t map; + BMap_t map = k5kG; double sclL3,sclDip; // Float_t l3Pol = l3Cur > 0 ? 1:-1; @@ -452,8 +486,7 @@ AliMagF* AliMagF::CreateFieldMap(Float_t l3Cur, Float_t diCur, Int_t convention, if (TMath::Abs((sclDip=diCur/diNominalCurrent)-1.) > tolerance && !uniform) { if (diCur <= zero) sclDip = 0.; // some small current.. -> Dipole OFF else { - AliErrorGeneral("AliMagF",Form("Wrong dipole current (%f A)!",diCur)); - return 0; + AliFatalGeneral("AliMagF",Form("Wrong dipole current (%f A)!",diCur)); } } // @@ -466,19 +499,17 @@ AliMagF* AliMagF::CreateFieldMap(Float_t l3Cur, Float_t diCur, Int_t convention, else { if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent1)-1.) < tolerance) map = k5kG; else if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent2)-1.) < tolerance) map = k2kG; - else if (l3Cur <= zero) { sclL3 = 0; map = k5kGUniform;} + else if (l3Cur <= zero && diCur<=zero) { sclL3=0; sclDip=0; map = k5kGUniform;} else { - AliErrorGeneral("AliMagF",Form("Wrong L3 current (%f A)!",l3Cur)); - return 0; + AliFatalGeneral("AliMagF",Form("Wrong L3 current (%f A)!",l3Cur)); } } // - if (sclDip!=0 && (map==k5kG || map==k2kG) && - ((convention==kConvLHC && l3Pol!=diPol) || - (convention==kConvDCS2008 && l3Pol==diPol)) ) { - AliErrorGeneral("AliMagF",Form("Wrong combination for L3/Dipole polarities (%c/%c) for convention %d", - l3Pol>0?'+':'-',diPol>0?'+':'-',GetPolarityConvention())); - return 0; + if (sclDip!=0 && map!=k5kGUniform) { + if ( (l3Cur<=zero) || ((convention==kConvLHC && l3Pol!=diPol) || (convention==kConvDCS2008 && l3Pol==diPol)) ) { + AliFatalGeneral("AliMagF",Form("Wrong combination for L3/Dipole polarities (%c/%c) for convention %d", + l3Pol>0?'+':'-',diPol>0?'+':'-',GetPolarityConvention())); + } } // if (l3Pol<0) sclL3 = -sclL3; @@ -493,13 +524,13 @@ AliMagF* AliMagF::CreateFieldMap(Float_t l3Cur, Float_t diCur, Int_t convention, else if (btypestr.Contains(protonBeam)) btype = kBeamTypepp; else AliInfoGeneral("AliMagF",Form("Assume no LHC magnet field for the beam type %s, ",beamtype)); char ttl[80]; - sprintf(ttl,"L3: %+5d Dip: %+4d kA; %s | Polarities in %s convention",(int)TMath::Sign(l3Cur,float(sclL3)), + snprintf(ttl,79,"L3: %+5d Dip: %+4d kA; %s | Polarities in %s convention",(int)TMath::Sign(l3Cur,float(sclL3)), (int)TMath::Sign(diCur,float(sclDip)),uniform ? " Constant":"", convention==kConvLHC ? "LHC":"DCS2008"); // LHC and DCS08 conventions have opposite dipole polarities if ( GetPolarityConvention() != convention) sclDip = -sclDip; // - return new AliMagF("MagneticFieldMap", ttl,sclL3,sclDip,map,btype,sqrts/2,2,10.,path); + return new AliMagF("MagneticFieldMap", ttl,sclL3,sclDip,map,btype,beamenergy,2,10.,path); // } @@ -517,3 +548,19 @@ const char* AliMagF::GetBeamTypeText() const } } +//_____________________________________________________________________________ +void AliMagF::Print(Option_t *opt) const +{ + // print short or long info + TString opts = opt; opts.ToLower(); + AliInfo(Form("%s:%s",GetName(),GetTitle())); + AliInfo(Form("Solenoid (%+.2f*)%.0f kG, Dipole %s (%+.2f) %s", + GetFactorSol(),(fMapType==k5kG||fMapType==k5kGUniform)?5.:2., + fDipoleOFF ? "OFF":"ON",GetFactorDip(),fMapType==k5kGUniform?" |Constant Field!":"")); + if (opts.Contains("a")) { + AliInfo(Form("Machine B fields for %s beam (%.0f GeV): QGrad: %.4f Dipole: %.4f", + fBeamType==kBeamTypeAA ? "A-A":(fBeamType==kBeamTypepp ? "p-p":"OFF"), + fBeamEnergy,fQuadGradient,fDipoleField)); + AliInfo(Form("Uses %s of %s",GetParamName(),GetDataFileName())); + } +}