Ignore:
Timestamp:
03/30/10 14:47:27 (15 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/msimreflector
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/msimreflector/MMirror.cc

    r9371 r9565  
    9999using namespace std;
    100100
     101void MMirror::SetShape(Char_t c)
     102{
     103    switch (toupper(c))
     104    {
     105    case 'S':
     106        fShape = 0;
     107        break;
     108
     109    case 'P':
     110        fShape = 1;
     111        break;
     112
     113    default:
     114        fShape = 0;
     115    }
     116}
     117
    101118// --------------------------------------------------------------------------
    102119//
  • trunk/MagicSoft/Mars/msimreflector/MMirror.h

    r9564 r9565  
    2525    Double_t  fSigmaPSF;
    2626
     27    Int_t fShape; // Spherical=0, Parabolic=1
     28
    2729    //    MMirror *fNeighbors[964];
    2830
    2931public:
    30     MMirror() : fSigmaPSF(-1)
     32    MMirror() : fSigmaPSF(-1), fShape(0)
    3133    {
    3234    }
     
    4850        fTilt.Rotate(-n.Theta(), TVector3(-n.Y(), n.X(), 0));
    4951    }
     52    void SetShape(Char_t c);
    5053
    5154    void SetZ(Double_t z) { fPos.SetZ(z); }
     
    9598    }
    9699    */
    97     ClassDef(MMirror, 1) // Base class to describe a mirror
     100    ClassDef(MMirror, 2) // Base class to describe a mirror
    98101};
    99102
  • trunk/MagicSoft/Mars/msimreflector/MReflector.cc

    r9518 r9565  
    162162                        atof(arr[5]->GetName()));
    163163
    164     const Double_t F = atof(arr[6]->GetName());
    165 
    166     const TString val = arr[7]->GetName();
     164    UInt_t n = 6;
     165
     166    TString six = arr[n]->GetName();
     167
     168    Char_t shape = 'S';
     169    if (!six.IsFloat())
     170    {
     171        shape = six[0];
     172        n++;
     173    }
     174
     175    const Double_t F = atof(arr[n++]->GetName());
     176
     177    const TString val = arr[n++]->GetName();
    167178
    168179    const Double_t psf = val.IsFloat() ? val.Atof() : -1;
    169180
    170     const UInt_t n = val.IsFloat() ? 9 : 8;
     181    n += val.IsFloat() ? 1 : 0;
    171182
    172183    TString type = arr[n-1]->GetName();
     
    201212    }
    202213
    203     m->SetFocalLength(F);
    204214    m->SetPosition(pos);
    205215    m->SetNorm(norm);
     216    m->SetShape(shape);
     217    m->SetFocalLength(F);
    206218    m->SetSigmaPSF(psf>=0 ? psf : defpsf);
    207219
     
    223235//     x y z nx ny nz F [psf] Type ...
    224236//
    225 //  x:      x-coordinate of the mirror's center
    226 //  y:      y-coordinate of the mirror's center
    227 //  z:      z-coordinate of the mirror's center
    228 //  nx:     x-component of the normal vecor in the mirror center
    229 //  ny:     y-component of the normal vecor in the mirror center
    230 //  nz:     z-component of the normal vecor in the mirror center
    231 //  F:      Focal distance of a spherical mirror
    232 //  [psf]:  This number is the psf given in the units of x,y,z and
    233 //          defined at the focal distance F. It can be used to overwrite
    234 //          the second argument given in ReadFile for individual mirrors.
    235 //  Type:   A instance of a mirrot of the class Type MMirrorType is created
    236 //          (Type can be, for example, Hex for for MMirrorHex).
    237 //  ...:    Additional arguments as defined in MMirrorType::ReadM
     237//  x:         x-coordinate of the mirror's center
     238//  y:         y-coordinate of the mirror's center
     239//  z:         z-coordinate of the mirror's center
     240//  nx:        x-component of the normal vecor in the mirror center
     241//  ny:        y-component of the normal vecor in the mirror center
     242//  nz:        z-component of the normal vecor in the mirror center
     243//  [shape]:   S for spherical <default>, P for parabolic
     244//  F:         Focal distance of a spherical mirror
     245//  [psf]:     This number is the psf given in the units of x,y,z and
     246//             defined at the focal distance F. It can be used to overwrite
     247//             the second argument given in ReadFile for individual mirrors.
     248//  Type:      A instance of a mirrot of the class Type MMirrorType is created
     249//             (Type can be, for example, Hex for for MMirrorHex).
     250//  ...:       Additional arguments as defined in MMirrorType::ReadM
    238251//
    239252//
  • trunk/MagicSoft/Mars/msimreflector/MSimReflector.cc

    r9564 r9565  
    1818!   Author(s): Thomas Bretz,  1/2009 <mailto:tbretz@astro.uni-wuerzburg.de>
    1919!
    20 !   Copyright: CheObs Software Development, 2000-2009
     20!   Copyright: CheObs Software Development, 2000-2010
    2121!
    2222!
     
    3333//  obsolete except they can later be "moved" inside the detector, e.g.
    3434//  if you use MSimPSF to emulate a PSF by moving photons randomly
    35 //  on the focal plane.
     35//  on the focal plane. To switch off this check set detector margin to -1.
    3636//
    3737//////////////////////////////////////////////////////////////////////////////
     
    206206//    Focal length: F=R/2                        |  Focal length: F = 1/4p
    207207//                                               |
    208 //   r^2 + (z-2*F)^2 = (2*F)^2                   |            z = F/4*r^2
     208//   r^2 + (z-2*F)^2 = (2*F)^2                   |           z = r^2/4F
    209209//                                               |
    210210//          z        = -sqrt(4*F*F - r*r) + 2*F  |
    211211//          z-2*F    = -sqrt(4*F*F - r*r)        |
    212212//         (z-2*F)^2 = 4*F*F - r*r               |
    213 //   z^2-4*F*z+4*F^2 = 4*F*F - r*r  (4F^2-r^2>0) |  z - F/4*r^2 = 0
     213//   z^2-4*F*z+4*F^2 = 4*F*F - r*r  (4F^2-r^2>0) |  z - r^2/4F = 0
    214214//   z^2-4*F*z+r^2   = 0
    215215//
     
    223223// ------------------
    224224//
    225 //   z^2*(1+|v|^2) - 2*z*(2*F+q*v) + |q|^2 =  0  |  z^2*|v|^2 - 2*(2/F+q*v)*z + |q|^2 = 0
     225//   z^2*(1+|v|^2) - 2*z*(2*F+q*v) + |q|^2 =  0  |  z^2*|v|^2 - 2*z*(2*F+q*v) + |q|^2 = 0
    226226//
    227227//                                   z = (-b +- sqrt(b*b - 4ac))/(2*a)
    228228//
    229229//              a =   1+|v|^2                    |             a = |v|^2
    230 //              b = - 2*(2*F+q*v)                |             b = - 2*(2/F+q*v)
     230//              b = - 2*b'  with  b' = 2*F+q*v   |             b = - 2*b'  with  b' = 2*F+q*v
    231231//              c =   |q|^2                      |             c = |q|^2
    232232//                                               |
     
    234234//                                        substitute b := 2*b'
    235235//
    236 //                            z = (-2*b' +- 2*sqrt(b'*b' - ac))/(2*a)
    237 //                            z = (-  b' +-   sqrt(b'*b' - ac))/a
    238 //                            z = (-b'/a +-   sqrt(b'*b' - ac))/a
     236//                            z = (2*b' +- 2*sqrt(b'*b' - ac))/(2*a)
     237//                            z = (  b' +-   sqrt(b'*b' - ac))/a
     238//                            z = (b'/a +-   sqrt(b'*b' - ac))/a
    239239//
    240240//                                        substitute f := b'/a
    241241//
    242 //                                      z = (-f +- sqrt(f^2 - c/a)
     242//                                      z = f +- sqrt(f^2 - c/a)
    243243//
    244244// =======================================================================================
     
    265265
    266266    // Find the incident point of the vector to the mirror
    267     // u corresponds to downwaqrd going particles, thus we use -u here
     267    // u corresponds to downward going particles, thus we use -u here
    268268    const Double_t b = G - q*v;
    269269    const Double_t a = v.Mod2();
     
    271271
    272272    // Solution for q spherical (a+1) (parabolic mirror (a) instead of (a+1))
    273     const Double_t f = b/(a+1);
    274     const Double_t g = c/(a+1);
     273    const Double_t A = fShape ? a : a+1;
     274
     275    const Double_t f = b/A;
     276    const Double_t g = c/A;
    275277
    276278    // Solution of second order polynomial (transformed: a>0)
    277279    // (The second solution can be omitted, it is the intersection
    278280    //  with the upper part of the sphere)
    279     //    const Double_t dz = a==0 ? c/(2*b) : f - TMath::Sqrt(f*f - g);
    280     const Double_t z = f - TMath::Sqrt(f*f - g);
     281    const Double_t z = a==0 ? c/(2*b) : f - TMath::Sqrt(f*f - g);
    281282
    282283    // Move the photon along its trajectory to the x/y plane of the
     
    293294
    294295    // Get normal vector for reflection by calculating the derivatives
    295     // of a spherical mirror along x and y
    296     const Double_t d = TMath::Sqrt(G*G - p.R2());
    297 
    298     // This is a normal vector at the incident point
     296    // of a the mirror's surface along x and y
     297    const Double_t d = fShape ? G : TMath::Sqrt(G*G - p.R2());
     298
     299    // The solution for the normal vector is
     300    //    TVector3 n(-p.X()/d, -p.Y()/d, 1));
     301    // Since the normal vector doesn't need to be of normal
     302    // length we can avoid an obsolete division
    299303    TVector3 n(p.X(), p.Y(), -d);
    300     // This is the obvious solution for the normal vector
    301     //  TVector3 n(-p.X()/d, -p.Y()/d, 1));
    302304
    303305    if (fSigmaPSF>0)
     
    540542        // It is detector specific not reflector specific
    541543        // Discard all photons which definitly can not hit the detector surface
    542         if (!fGeomCam->HitDetector(p, fDetectorMargin))
     544        if (fDetectorMargin>=0 && !fGeomCam->HitDetector(p, fDetectorMargin))
    543545            continue;
    544546
  • trunk/MagicSoft/Mars/msimreflector/MSimReflector.h

    r9564 r9565  
    4949    void SetNameReflector(const char *name="MReflector") { fNameReflector = name; }
    5050
     51    void SetDetectorMargin(Double_t m=0) { fDetectorMargin = m; }
     52
    5153    ClassDef(MSimReflector, 0) // Task to calculate reflection on a mirror
    5254};
Note: See TracChangeset for help on using the changeset viewer.