Index: trunk/Mars/msimreflector/MMirrorHex.cc
===================================================================
--- trunk/Mars/msimreflector/MMirrorHex.cc	(revision 14149)
+++ trunk/Mars/msimreflector/MMirrorHex.cc	(revision 14150)
@@ -201,4 +201,83 @@
 // The action should coincide with what is painted in Paint()
 //
+Bool_t MMirrorHex15::HasHit(const MQuaternion &p) const
+{
+    // p is the incident point in the mirror in the mirror's
+    // coordinate frame
+
+    // Black spot in the mirror center (here we can fairly ignore
+    // the distance from the plane to the mirror surface, as long
+    // as the black spot does not become too large)
+//    if (p.R2()<0.5*0.5)
+//        return kFALSE;
+
+    static const TVector2 rot(cos(-15*TMath::DegToRad()), sin(-15*TMath::DegToRad()));
+
+    const TVector2 &v = p.XYvector();
+
+    const Double_t x = v^rot;
+    const Double_t y = v*rot;
+
+    //
+    // Now check if point is outside of hexagon; just check x coordinate
+    // in three coordinate systems: the default one, in which two sides of
+    // the hexagon are paralel to the y axis (see camera displays) and two 
+    // more, rotated with respect to that one by +- 60 degrees.
+    //
+    if (TMath::Abs(x)>fD)
+        return kFALSE;
+
+    const Double_t dxc = x*fgCos60;
+    const Double_t dys = y*fgSin60;
+
+    if (TMath::Abs(dxc+dys)>fD)
+        return kFALSE;
+
+    if (TMath::Abs(dxc-dys)>fD)
+        return kFALSE;
+
+    return kTRUE;
+}
+
+// ------------------------------------------------------------------------
+//
+// Paint the mirror in x/y.
+//
+// The graphic should coincide with the action in HasHit
+//
+void MMirrorHex15::Paint(Option_t *opt)
+{
+    MHexagon h;
+    TEllipse e;
+    h.SetFillColor(18);
+    if (!TString(opt).Contains("line", TString::kIgnoreCase))
+    {
+        h.SetFillColor(17);
+        h.SetLineStyle(0);
+        e.SetLineStyle(0);
+        e.SetFillColor(gPad->GetFillColor());
+    }
+
+    if (TString(opt).Contains("same", TString::kIgnoreCase))
+    {
+        h.SetFillStyle(0);
+        e.SetFillStyle(0);
+    }
+
+    h.PaintHexagon(X(), Y(), fD*2, 15*TMath::DegToRad());
+
+    if (!TString(opt).Contains("border", TString::kIgnoreCase))
+        e.PaintEllipse(X(), Y(), 0.5, 0.5, 0, 360, 0);
+}
+
+// ------------------------------------------------------------------------
+//
+// Check if the given position coincides with the mirror. The position
+// is assumed to be the incident point on the mirror's surface.
+//
+// The coordinates are in the mirrors coordinate frame.
+//
+// The action should coincide with what is painted in Paint()
+//
 Bool_t MMirrorHex90::HasHit(const MQuaternion &p) const
 {
@@ -215,5 +294,5 @@
     // Now check if point is outside of hexagon; just check x coordinate
     // in three coordinate systems: the default one, in which two sides of
-    // the hexagon are paralel to the y axis (see camera displays) and two 
+    // the hexagon are parallel to the y axis (see camera displays) and two
     // more, rotated with respect to that one by +- 60 degrees.
     //
@@ -263,2 +342,3 @@
         e.PaintEllipse(X(), Y(), 0.5, 0.5, 0, 360, 0);
 }
+
Index: trunk/Mars/msimreflector/MMirrorHex.h
===================================================================
--- trunk/Mars/msimreflector/MMirrorHex.h	(revision 14149)
+++ trunk/Mars/msimreflector/MMirrorHex.h	(revision 14150)
@@ -53,3 +53,17 @@
 };
 
+class MMirrorHex15 : public MMirrorHex
+{
+public:
+    MMirrorHex15() : MMirrorHex() { }
+
+    // MMirror
+    Bool_t HasHit(const MQuaternion &p) const;
+
+    // TObject
+    void Paint(Option_t *);
+
+    ClassDef(MMirrorHex15, 1) // A spherical hexagon type mirror (MMirrorHex rotated by 15deg)
+};
+
 #endif
