X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMD3.cxx;h=8d2a3901ffe74fb99087fa32c9a73cc71214f018;hb=6372097972838a630d04b75fe1e20575494d7f5a;hp=c422c2731a0242b8397619a63c962e7aad21368d;hpb=c2fc12580f7bb903a1f061ae3d60882098e8a988;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMD3.cxx b/FMD/AliFMD3.cxx index c422c2731a0..8d2a3901ffe 100644 --- a/FMD/AliFMD3.cxx +++ b/FMD/AliFMD3.cxx @@ -26,11 +26,16 @@ // This has 2 rings. // The support of the FMD3 is a carbon-fibre cone, attached to the ITS // support via flanges. The cone also supports the beam-pipe. +// The support is a special cone of carbon-fibre made by a Danish +// Yacht company. // + +#include // ROOT_TMath + #include "AliFMD3.h" // ALIFMD3_H -#include "AliLog.h" // ALILOG_H +#include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H #include "AliFMDRing.h" // ALIFMDRING_H -#include // ROOT_TMath +#include //==================================================================== ClassImp(AliFMD3) @@ -40,24 +45,52 @@ ClassImp(AliFMD3) //____________________________________________________________________ AliFMD3::AliFMD3(AliFMDRing* inner, AliFMDRing* outer) - : AliFMDDetector(3, inner, outer) + : AliFMDDetector(3, inner, outer), + // fNoseZ(16.54667) + fNoseZ(18.13 - inner->GetModuleDepth()-inner->GetModuleSpacing()/2), // From drawing + fFlangeDepth(0), + fFlangeHighR(49.25), // From drawing + fFlangeLength(0), + fFlangeWidth(6), // From drawing + fFiducialRadius(.25), + fConeInnerAngle(0), + fConeOuterAngle(0), + fHoleOffset(6.9), // From drawing + fHoleDepth(2), // What's needed + fHoleLength(31.2), // From drawing + fHoleLowWidth(3), // 4), // What's needed + fHoleHighWidth(18.5), // 17.5), // 18), // What's needed + fBoltLength(1), // Guessed + fBoltRadius(0.15), // Estimate + fConeRadii(6), + fFiducialHoles(4) { // Constructor. - SetInnerZ(-62.8); - SetOuterZ(-75.2); - SetNoseZ(); - SetNoseLowR(); - SetNoseHighR(); - SetNoseLength(); - SetBackLowR(); - SetBackHighR(); - SetBackLength(); - SetBeamThickness(); - SetBeamWidth(); - SetConeLength(); - SetFlangeR(); - SetNBeam(); - SetNFlange(); + Double_t off = 0; // -0.39615-0.10185; // -0.25; + if (off != 0) + AliWarning(Form("Z position of FMD3 rings may be off by %fcm!", off)); + + SetInnerZ(-62.8+off); // By design + SetOuterZ(-75.2+off); // By design + + SetInnerHoneyLowR(4.18207); // From drawing + SetInnerHoneyHighR(19.74922); // From drawing + SetOuterHoneyLowR(13.4776); // From drawing + SetOuterHoneyHighR(31.01964); // From drawing + + // These are from the drawings + fConeRadii.Add(new TVector3( 0, 5.55, 6.25)); + fConeRadii.Add(new TVector3( 2.35, 5.55, 6.25)); + fConeRadii.Add(new TVector3( 2.9935, 5.55, 6.88479)); + fConeRadii.Add(new TVector3(28.9435, 31.50, 32.75850)); + fConeRadii.Add(new TVector3(29.5, 31.50, 33.4)); + fConeRadii.Add(new TVector3(30.9, 31.50, 33.4)); + + // These are from the drawings + fFiducialHoles.Add(new TVector2(29.666, 32.495)); + fFiducialHoles.Add(new TVector2(31.082, 33.910)); + fFiducialHoles.Add(new TVector2(32.674, 35.503)); + fFiducialHoles.Add(new TVector2(33.403, 34.818)); } //____________________________________________________________________ @@ -66,16 +99,24 @@ AliFMD3::Init() { // Initialize AliFMDDetector::Init(); - SetInnerHoneyHighR(GetOuterHoneyHighR()); - Double_t zdist = fConeLength - fBackLength - fNoseLength; - Double_t tdist = fBackHighR - fNoseHighR; - Double_t innerZh = fInnerZ - fInner->GetRingDepth() - fHoneycombThickness; - Double_t outerZh = fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness; - Double_t minZ = TMath::Min(fNoseZ - fConeLength, outerZh); - fAlpha = tdist / zdist; - fZ = fNoseZ + (minZ - fNoseZ) / 2; - fInnerHoneyHighR = ConeR(innerZh + fHoneycombThickness,"O") - 1; - fOuterHoneyHighR = GetBackLowR(); + // TVector3& v0 = *(static_cast(fConeRadii.At(0))); + TVector3& v1 = *(static_cast(fConeRadii.At(1))); + TVector3& v2 = *(static_cast(fConeRadii.At(2))); + TVector3& v3 = *(static_cast(fConeRadii.At(3))); + TVector3& v4 = *(static_cast(fConeRadii.At(4))); + TVector3& v5 = *(static_cast(fConeRadii.At(5))); + + fFlangeDepth = v5.X() - v4.X(); + fFlangeLength = fFlangeHighR - v5.Y(); + + fConeInnerAngle = TMath::ATan2(v4.Z()-v1.Z(), v4.X()-v1.X()); + fConeOuterAngle = TMath::ATan2(v3.Y()-v2.Y(), v3.X()-v2.X()); + +#if 0 + Double_t hz1 = -fHoleOffset+fInnerZ+fNoseZ; + fHoleLength = TMath::Sqrt(TMath::Power(v4.Z()-ConeR(hz1),2) + + TMath::Power(v4.X()-fHoleOffset,2)); +#endif } //____________________________________________________________________ @@ -83,25 +124,33 @@ Double_t AliFMD3::ConeR(Double_t z, Option_t* opt) const { // Calculate the cone radius at Z - if (fAlpha < 0) { - AliWarning(Form("alpha not set: %lf", fAlpha)); - return -1; - } - if (z > fNoseZ) { - AliWarning(Form("z=%lf is before start of cone %lf", z, fNoseZ)); + // TVector3& v0 = *(static_cast(fConeRadii.At(0))); + TVector3& v1 = *(static_cast(fConeRadii.At(1))); + TVector3& v2 = *(static_cast(fConeRadii.At(2))); + TVector3& v3 = *(static_cast(fConeRadii.At(3))); + TVector3& v4 = *(static_cast(fConeRadii.At(4))); + TVector3& v5 = *(static_cast(fConeRadii.At(5))); + + if (z > fInnerZ + fNoseZ) { + AliWarning(Form("z=%lf is before start of cone %lf", z, fInnerZ + fNoseZ)); return -1; } - if (z < fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness) { + if (z < fInnerZ + fNoseZ - v5.Z()) { AliWarning(Form("z=%lf is after end of cone %lf", z, - fOuterZ - fOuter->GetRingDepth() - fHoneycombThickness)); + fInnerZ + fNoseZ - v5.Z())); return -1; } - Double_t e = fBeamThickness / TMath::Cos(TMath::ATan(fAlpha)); - if (opt[0] == 'I' || opt[1] == 'i') e *= -1; - if (z > fNoseZ - fNoseLength) return fNoseHighR + e; - if (z < fNoseZ - fConeLength + fBackLength) return fBackHighR + e; - Double_t r = fNoseHighR + fAlpha * TMath::Abs(z - fNoseZ + fNoseLength) + e; - return r; + Double_t rz = -(z-fInnerZ-fNoseZ); + Bool_t inner = opt[0] == 'I' || opt[1] == 'i'; + if (inner && rz <= v2.X()) return v2.Y(); + if (!inner && rz <= v1.X()) return v1.Z(); + if (inner && rz > v3.X()) return v3.Y(); + if (!inner && rz > v4.X()) return v4.Z(); + + rz -= (inner ? v2.X() : v1.X()); + Double_t sr = (inner ? v2.Y() : v1.Z()); + Double_t ang = (inner ? fConeInnerAngle : fConeOuterAngle); + return sr + rz * TMath::Tan(ang); }