//__________________________________________________________________
//
// Utility class to help implement collection of FMD modules into
-// rings. This is used by AliFMDDetector and AliFMDGeometry.
-//
+// rings. This is used by AliFMDDetector and AliFMDGeometry.
// The AliFMDGeometry object owns the AliFMDRing objects, and the
// AliFMDDetector objects reference these. That is, the AliFMDRing
// objects are share amoung the AliFMDDetector objects.
// Latest changes by Christian Holm Christensen
//
+#include <TMath.h> // ROOT_TMath
+#include <TVector2.h> // ROOT_TVector2
+
// #include <AliLog.h> // ALILOG_H
#include "AliFMDRing.h" // ALIFMDRING_H
-// #include <TMath.h> // ROOT_TMath
-#include <TVector2.h> // ROOT_TVector2
//====================================================================
ClassImp(AliFMDRing)
AliFMDRing::AliFMDRing(Char_t id)
: TNamed(Form("FMD%c", id), "Forward multiplicity ring"),
fId(id),
- fVerticies(0)
+ fBondingWidth(0),
+ fWaferRadius(0),
+ fSiThickness(0),
+ fLowR(0),
+ fHighR(0),
+ fMinR(0),
+ fMaxR(0),
+ fTheta(0),
+ fNStrips(0),
+ fRingDepth(0),
+ fLegRadius(0),
+ fLegLength(0),
+ fLegOffset(0),
+ fModuleSpacing(0),
+ fPrintboardThickness(0),
+ fCopperThickness(0),
+ fChipThickness(0),
+ fSpacing(0),
+ fHoneycombThickness(0.),
+ fAlThickness(0.),
+ fVerticies(0),
+ fSensorVerticies(0),
+ fHybridVerticies(0),
+ fFeetPositions(0)
{
// CTOR
SetBondingWidth();
SetCopperThickness();
SetChipThickness();
SetSpacing();
+ SetHoneycombThickness();
+ SetAlThickness();
if (fId == 'I' || fId == 'i') {
SetLowR(4.3);
SetHighR(17.2);
SetTheta(36/2);
SetNStrips(512);
+ Double_t base = 0; // 4.1915;
+ fFeetPositions.Add(new TVector2( 0.0551687, 8.0534-base));
+ fFeetPositions.Add(new TVector2( 2.9993, 12.9457-base));
+ fFeetPositions.Add(new TVector2(-2.9062, 12.9508-base));
+
+ fHybridVerticies.Add(new TVector2(0.0000, 4.1700));
+ fHybridVerticies.Add(new TVector2(1.0574, 4.1700));
+ fHybridVerticies.Add(new TVector2(4.6614, 15.2622));
+ fHybridVerticies.Add(new TVector2(0.9643, 17.4000));
+ fHybridVerticies.Add(new TVector2(0.0000, 17.4000));
+
+ fSensorVerticies.Add(new TVector2(0.0000, 4.1915));
+ fSensorVerticies.Add(new TVector2(1.5793, 4.1915));
+ fSensorVerticies.Add(new TVector2(5.2293, 15.4251));
+ fSensorVerticies.Add(new TVector2(1.9807, 17.3035));
+ fSensorVerticies.Add(new TVector2(0.0000, 17.3035));
+
+ fVerticies.Add(new TVector2(0.0000, 4.3000));
+ fVerticies.Add(new TVector2(1.3972, 4.3000));
+ fVerticies.Add(new TVector2(4.9895, 15.3560));
+ fVerticies.Add(new TVector2(1.8007, 17.2000));
+ fVerticies.Add(new TVector2(0.0000, 17.2000));
}
else if (fId == 'O' || fId == 'o') {
SetLowR(15.6);
SetHighR(28.0);
SetTheta(18/2);
SetNStrips(256);
+ Double_t base = 0; // 14.9104;
+ fFeetPositions.Add(new TVector2(-1.72540000, 20.6267-base));
+ fFeetPositions.Add(new TVector2( 1.72900000, 20.6267-base));
+ fFeetPositions.Add(new TVector2( 0.00177616, 26.6007-base));
+
+ fHybridVerticies.Add(new TVector2(0.0000, 14.9104));
+ fHybridVerticies.Add(new TVector2(2.0783, 14.9104));
+ fHybridVerticies.Add(new TVector2(3.9202, 26.5395));
+ fHybridVerticies.Add(new TVector2(0.6784, 28.2500));
+ fHybridVerticies.Add(new TVector2(0.0000, 28.2500));
+
+ fSensorVerticies.Add(new TVector2(0.0000, 15.0104));
+ fSensorVerticies.Add(new TVector2(2.5799, 15.0104));
+ fSensorVerticies.Add(new TVector2(4.4439, 26.7766));
+ fSensorVerticies.Add(new TVector2(1.8350, 28.1500));
+ fSensorVerticies.Add(new TVector2(0.0000, 28.1500));
+
+ fVerticies.Add(new TVector2(0.0000, 15.2104));
+ fVerticies.Add(new TVector2(2.4091, 15.2104));
+ fVerticies.Add(new TVector2(4.2231, 26.6638));
+ fVerticies.Add(new TVector2(1.8357, 27.9500));
+ fVerticies.Add(new TVector2(0.0000, 27.9500));
}
}
AliFMDRing::Init()
{
// Initialize
+#if 0
Double_t tanTheta = TMath::Tan(fTheta * TMath::Pi() / 180.);
Double_t tanTheta2 = TMath::Power(tanTheta,2);
Double_t r2 = TMath::Power(fWaferRadius,2);
fVerticies.AddAt(new TVector2(fHighR, yB), 3);
fVerticies.AddAt(new TVector2(xC, yC), 4);
fVerticies.AddAt(new TVector2(fLowR, yA), 5);
+#endif
// A's length. Corresponds to distance from nominal beam line to the
// cornor of the active silicon element.
- fMinR = GetVertex(5)->Mod();
+ fMinR = GetVertex(1)->Mod(); // GetVertex(5)->Mod();
// A's length. Corresponds to distance from nominal beam line to the
// cornor of the active silicon element.
fMaxR = fHighR;
return static_cast<TVector2*>(fVerticies.At(i));
}
+//____________________________________________________________________
+TVector2*
+AliFMDRing::GetSensorVertex(Int_t i) const
+{
+ // Get the i'th vertex of polygon shape
+ return static_cast<TVector2*>(fSensorVerticies.At(i));
+}
+
+//____________________________________________________________________
+TVector2*
+AliFMDRing::GetHybridVertex(Int_t i) const
+{
+ // Get the i'th vertex of polygon shape
+ return static_cast<TVector2*>(fHybridVerticies.At(i));
+}
+
+//____________________________________________________________________
+TVector2*
+AliFMDRing::GetFootPosition(Int_t i) const
+{
+ // Get the i'th vertex of polygon shape
+ return static_cast<TVector2*>(fFeetPositions.At(i));
+}
+
//____________________________________________________________________
Double_t
AliFMDRing::GetStripRadius(UShort_t strip) const
return (strip + .5) * dstrip + stripoff; // fLowR
}
+//____________________________________________________________________
+Double_t
+AliFMDRing::GetModuleDepth() const
+{
+ return (GetSiThickness()
+ + GetSpacing()
+ + GetPrintboardThickness()
+ + GetCopperThickness()
+ + GetChipThickness()
+ + GetLegLength());
+
+}
+
+//____________________________________________________________________
+Double_t
+AliFMDRing::GetFullDepth() const
+{
+ return (GetModuleDepth()
+ + GetModuleSpacing()
+ + GetHoneycombThickness()
+ + GetFMDDPrintboardThickness()
+ + GetFMDDCopperThickness()
+ + GetFMDDChipThickness()
+ + 0.5);
+}
+
//____________________________________________________________________
void
AliFMDRing::Detector2XYZ(UShort_t sector,
sector = sec;
return kTRUE;
}
-
-
+//____________________________________________________________________
+Float_t
+AliFMDRing::GetStripLength(UShort_t strip) const
+{
+ if(strip >= GetNStrips())
+ Error("GetStripLength", "Invalid strip number %d (>=%d)",
+ strip, GetNStrips(), fId);
+
+ Float_t rad = GetMaxR()-GetMinR();
+
+ Float_t segment = rad / GetNStrips();
+
+ TVector2* corner1 = GetVertex(2);
+ TVector2* corner2 = GetVertex(3);
+
+ Float_t slope = (corner1->Y() - corner2->Y()) / (corner1->X() - corner2->X());
+ Float_t constant = (corner2->Y()*corner1->X()-(corner2->X()*corner1->Y())) / (corner1->X() - corner2->X());
+ Float_t radius = GetMinR() + strip*segment;
+
+ Float_t d = TMath::Power(TMath::Abs(radius*slope),2) + TMath::Power(radius,2) - TMath::Power(constant,2);
+
+ Float_t arclength = GetBaseStripLength(strip);
+ if(d>0) {
+
+ Float_t x = (-1*TMath::Sqrt(d) -slope*constant) / (1+TMath::Power(slope,2));
+ Float_t y = slope*x + constant;
+ Float_t theta = TMath::ATan2(x,y);
+
+ if(x < corner1->X() && y > corner1->Y()) {
+ arclength = radius*theta; //One sector since theta is by definition half-hybrid
+
+ }
+
+ }
+
+ return arclength;
+
+
+}
+//____________________________________________________________________
+Float_t
+AliFMDRing::GetBaseStripLength(UShort_t strip) const
+{
+ Float_t rad = GetMaxR()-GetMinR();
+ Float_t segment = rad / GetNStrips();
+ Float_t basearc = 2*TMath::Pi() / (0.5*GetNSectors()); // One hybrid: 36 degrees inner, 18 outer
+ Float_t radius = GetMinR() + strip*segment;
+ Float_t basearclength = 0.5*basearc * radius; // One sector
+
+ return basearclength;
+}
//
// EOF
//