Changeset 9332 for trunk/MagicSoft


Ignore:
Timestamp:
02/13/09 17:46:02 (16 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/Changelog

    r9330 r9332  
    1818
    1919                                                 -*-*- END OF LINE -*-*-
     20 2009/02/13 Thomas Bretz
     21
     22   * mcorsika/MCorsikaEvtHeader.h:
     23     - added some comments on the coordinate system
     24
     25   * ceres.rc:
     26     - added some comments
     27     - setup a psf for the dwarf mirror
     28
     29   * mcorsika/MCorsikaRunHeader.h:
     30     - added some comments
     31
     32   * mjobs/MJSimulation.cc:
     33     - added some histogram titles
     34     - fixed the x, y coordinates of the impact histogram
     35     - write "ElectronicNoise"
     36
     37   * mjobs/MJStar.cc:
     38     - don't force writing of containers which are not filles by ceres
     39     - updated rule to support files without date
     40
     41   * mpedestal/MPedestalPix.[h,cc]:
     42     - added Print() function
     43
     44   * mraw/MRawFileRead.cc:
     45     - added a comment
     46
     47   * msim/MPhotonData.h:
     48     - added comments about coordinate system
     49
     50   * msimcamera/MSimGeomCam.cc:
     51     - when looking for the pixels convert from ceres-coordinates
     52       to GeomCam camera-coordinates
     53
     54   * msimreflector/MMirror.h:
     55     - added Setter for SigmaPSF
     56
     57   * msimreflector/MMirrorDisk.cc, msimreflector/MMirrorHex.cc,
     58     msimreflector/MMirrorSquare.cc:
     59     - now start counting in ReadM with 0
     60
     61   * msimreflector/MReflector.[h,cc]:
     62     - added some documentation
     63     - added function to set psf of all mirrors
     64     - added psf optional to input file
     65     - remove already evaluated tokens from TObjArray
     66     - added reading of a default psf from the input file
     67
     68
     69
     70
    2071 2009/02/12 Thomas Bretz
    2172
  • trunk/MagicSoft/Mars/ceres.rc

    r9328 r9332  
    7474# -------------------------------------------------------------------------
    7575Reflector.Constructor: MReflector
     76
     77# For the file definition see MReflector::ReadFile
     78
    7679#Reflector.FileName: mreflector/reflector-magic.def
     80# ~0.020°
     81#Reflector.SetSigmaPSF: 6.0
     82# ~0.025°
     83#Reflector.SetSigmaPSF: 7.5
     84
    7785Reflector.FileName: mreflector/reflector-dwarf.def
     86# ~0.02°
     87#Reflector.SetSigmaPSF: 1.8
     88# ~0.03°
     89Reflector.SetSigmaPSF: 2.6
     90
    7891
    7992# --- DWARF ---
     
    8699#paraboloid_focal   488.87
    87100
     101# Hex cones maximum D=8mm
    88102GeomCones.Constructor:  MGeomCamDwarf(209.5, 7.5, 4.8887);
    89103MGeomCam.Constructor:   MGeomCamDwarf(209.5, 15,  4.8887);
  • trunk/MagicSoft/Mars/mcorsika/MCorsikaRunHeader.h

    r9313 r9332  
    3333    Float_t  fZdMin;                  // [rad] Zenith distance
    3434    Float_t  fZdMax;                  // [rad] Zenith distance
    35     Float_t  fAzMin;                  // [rad] Azimuth (north=0; west=90)
    36     Float_t  fAzMax;                  // [rad] Azimuth (north=0; west=90)
     35    Float_t  fAzMin;                  // [rad] Azimuth (north=0; east=90)
     36    Float_t  fAzMax;                  // [rad] Azimuth (north=0; east=90) (north denotes the magnet north which is defined to be in the geografic north!)
    3737
    3838    Float_t fWavelengthMin;           // [nm] Wavelength bandwidth lo edge
  • trunk/MagicSoft/Mars/mjobs/MJSimulation.cc

    r9328 r9332  
    184184    hist.SetLog(kTRUE, kTRUE, kFALSE);
    185185
    186     hist.AddHist("MCorsikaEvtHeader.fX/100","MCorsikaEvtHeader.fY/100");
     186    hist.AddHist("-MCorsikaEvtHeader.fX/100","-MCorsikaEvtHeader.fY/100");
    187187    hist.SetDrawOption("colz");
    188188    hist.InitName("Impact;Impact;Impact");
     
    361361    mhew.SetTitle("Time between first and last photon hitting a detector");
    362362
    363     MFillH fillh1(&mhn1, "", "FillH1");
     363    MFillH fillh1(&mhn1, "", "FillCorsika");
    364364    MFillH fillh2(&mhn2, "", "FillH2");
    365365    MFillH fillh3(&mhn3, "", "FillH3");
    366366    MFillH filltp(&mhtp, "", "FillTriggerPos");
    367367    MFillH fillew(&mhew, "", "FillEvtWidth");
    368     fillh1.SetNameTab("H1", "Distribution of Muons as simulated");
    369     fillh2.SetNameTab("H2", "Distribution of Muons as available after all");
    370     fillh3.SetNameTab("H3", "Distribution after trigger");
    371     filltp.SetNameTab("TrigPos", "TriggerPosition w.r.t the first photon");
    372     fillew.SetNameTab("EvtWidth", "Time between first and last photon hitting a detector");
     368    fillh1.SetNameTab("Corsika",    "Distribution as simulated by Corsika");
     369    fillh2.SetNameTab("Detectable", "Distribution of events hit the detector");
     370    fillh3.SetNameTab("Triggered",  "Distribution of triggered events");
     371    filltp.SetNameTab("TrigPos",    "TriggerPosition w.r.t the first photon");
     372    fillew.SetNameTab("EvtWidth",   "Time between first and last photon hitting a detector");
    373373
    374374    MHPhotonEvent planeG(1);     // Get from MaxImpact
     
    457457    write3a.AddContainer("MMcRunHeader",        "RunHeaders");
    458458    write3a.AddContainer("MMcCorsikaRunHeader", "RunHeaders", kFALSE);
     459    write3a.AddContainer("ElectronicNoise",     "RunHeaders", kFALSE);
    459460    write3a.AddContainer("MMcEvt",              "Events",     kFALSE);
    460461
     
    511512    // -------------------------------------------------------------------
    512513
     514    // FIXME: Remove isolated pixels
    513515    MImgCleanStd clean(7, 4.5);
    514516    clean.SetMethod(MImgCleanStd::kAbsolute);
     
    613615    if (fCamera)
    614616    {
     617        // FIXME: MHCollectionArea Trigger Area!
    615618        if (header.IsDataRun())
    616619            tasks.AddToList(&fillh3);
  • trunk/MagicSoft/Mars/mjobs/MJStar.cc

    r9292 r9332  
    300300    // Effective on-time need its own not to be skipped by (eg) image cleaning
    301301    // Muons needs its own to have a unique SetReadyToSave
    302     const TString rule(Form("s/([0-9]+(_M[12])?_[0-9.]+)_Y_(.*[.]root)$/%s\\/$1_I_$3/", Esc(fPathOut).Data()));
     302    const TString rule(Form("s/(([0-9]+_)?(M[12]_)?[0-9.]+)_Y_(.*[.]root)$/%s\\/$1_I_$4/", Esc(fPathOut).Data()));
    303303    MWriteRootFile write( 2, rule, fOverwrite?"RECREATE":"NEW", "Image parameters");
    304304    MWriteRootFile writet(2, rule, fOverwrite?"RECREATE":"NEW", "Image parameters"); // EffectiveOnTime
     
    333333        // Monte Carlo Data
    334334        write.AddContainer("MMcEvt",                "Events");
    335         write.AddContainer("MMcTrig",               "Events");
     335        write.AddContainer("MMcTrig",               "Events", kFALSE);
    336336        // Monte Carlo Run Headers
    337337        write.AddContainer("MMcRunHeader",          "RunHeaders");
    338         write.AddContainer("MMcTrigHeader",         "RunHeaders");
    339         write.AddContainer("MMcFadcHeader",         "RunHeaders");
    340         write.AddContainer("MMcConfigRunHeader",    "RunHeaders");
     338        write.AddContainer("MMcTrigHeader",         "RunHeaders", kFALSE);
     339        write.AddContainer("MMcFadcHeader",         "RunHeaders", kFALSE);
     340        write.AddContainer("MMcConfigRunHeader",    "RunHeaders", kFALSE);
    341341        write.AddContainer("MMcCorsikaRunHeader",   "RunHeaders");
    342342    }
     
    368368        // Monte Carlo Data
    369369        writem.AddContainer("MMcEvt",               "Muons");
    370         writem.AddContainer("MMcTrig",              "Muons");
     370        writem.AddContainer("MMcTrig",              "Muons", kFALSE);
    371371    }
    372372
  • trunk/MagicSoft/Mars/mpedestal/MPedestalPix.cc

    r8912 r9332  
    9595}
    9696
     97void MPedestalPix::Print(Option_t *) const
     98{
     99    *fLog << all << "P=" << fPedestal;
     100    if (fPedestalRms>=0)
     101        *fLog << " RMS=" << fPedestalRms;
     102    if (fPedestalABoffset>=0)
     103        *fLog << " AB=" << fPedestalABoffset;
     104    if (fNumEvents>0)
     105        *fLog << " (N=" << fNumEvents << ")";
     106    *fLog << endl;
     107}
     108
    97109// ------------------------------------------------------------------------
    98110//
  • trunk/MagicSoft/Mars/mpedestal/MPedestalPix.h

    r8911 r9332  
    1919    void Clear(Option_t *o="");
    2020    void Copy(TObject &object) const;
     21    void Print(Option_t *o="") const;
    2122   
    2223    // Using histograms
  • trunk/MagicSoft/Mars/mraw/MRawFileRead.cc

    r9178 r9332  
    202202        if (fDisplay)
    203203        {
     204            // Show the new file name and the event number after which
     205            // the new file has been opened
    204206            TString txt = GetFileName();
    205207            txt += " @ ";
  • trunk/MagicSoft/Mars/msim/MPhotonData.h

    r9308 r9332  
    2424class MCorsikaRunHeader;
    2525
    26 class MPhotonData : public TObject //MParContainer
     26class MPhotonData : public TObject
    2727{
    2828private:
    29     Float_t fPosX;                       // [cm] X (north) at observation level
    30     Float_t fPosY;                       // [cm] Y (west) at observation level
     29    Float_t fPosX;                       // [cm] "+west"    "-east"  (both at observation level)
     30    Float_t fPosY;                       // [cm] "+south"   "-north" (north denotes the magnet north which is defined to be in the geografic north!)
    3131
    3232    Float_t fCosU;                       // [cos x] U direction cosine to x-axis
  • trunk/MagicSoft/Mars/msimcamera/MSimGeomCam.cc

    r9308 r9332  
    148148        {
    149149            // FIXME: Improve search algorithm (2D Binary search?)
    150             if (!(*fGeom)[idx].IsInside(ph.GetPosX()*10, ph.GetPosY()*10))
     150            // Here we convert the photons from the ceres-coordinate
     151            // system which is viewed from the camera to the mirror
     152            // into the camera coordinates which are viewed from
     153            // the mirror to the camera.
     154            // (x on the right, y upwards, right-handed)
     155            if (!(*fGeom)[idx].IsInside(-ph.GetPosX()*10, ph.GetPosY()*10))
    151156                continue;
    152157
  • trunk/MagicSoft/Mars/msimreflector/MMirror.cc

    r9312 r9332  
    126126    psf /= 2;                        // The factor two because of the doubleing of the angle in the reflection
    127127    psf /= F;                        // Scale the Gauss to the size of the PSF
    128     psf *= n.Z();                    // Normalize the addon vector to the normal vector
    129     //psf *= n.Mag();                // Alternative! (Gaussian projected on the surface of a sphere)
     128    //psf *= n.Z();                  //
     129    psf *= n.Mag();                  // This means that the PSF is measured in the focal distance
    130130
    131131    TVector3 dn(gx*psf, gy*psf, 0);  // Instead of psf/F also atan(psf/F) might make sense
     
    136136}
    137137
     138// --------------------------------------------------------------------------
     139//
    138140void MMirror::Print(Option_t *o) const
    139141{
     
    141143    gLog << fNorm.X() << " " << fNorm.Y() << " " << fNorm.Z() << " ";
    142144    gLog << fFocalLength << " ";
     145    if (fSigmaPSF>0)
     146        gLog << fSigmaPSF << " ";
    143147
    144148    const TString n = ClassName();
  • trunk/MagicSoft/Mars/msimreflector/MMirror.h

    r9312 r9332  
    3636    TVector2 operator-(const MMirror &m) const;// { return TVector2(X()-m.X(), Y()-m.Y()); }
    3737
     38    void SetSigmaPSF(Double_t psf) { fSigmaPSF = psf; }
     39    void SetFocalLength(Double_t f) { fFocalLength = f; }
    3840    void SetPosition(const TVector3 &v) { fPos = v; }
    3941    void SetNorm(const TVector3 &n) {
     
    5456    const TVector3 &GetNorm() const { return fNorm; }
    5557
     58    Double_t GetFocalLength() const { return fFocalLength; }
     59    Double_t GetSigmaPSF() const { return fSigmaPSF; }
     60
    5661    Double_t GetDist() const { return fPos.Perp(); }
    5762
     
    6368
    6469    // ----- Basic function for parabolic mirror -----
    65     void SetFocalLength(Double_t f) { fFocalLength = f; }
    66     Double_t GetFocalLength() const { return fFocalLength; }
    67 
    6870    Bool_t ExecuteReflection(MQuaternion &p, MQuaternion &u) const;
    6971
  • trunk/MagicSoft/Mars/msimreflector/MMirrorDisk.cc

    r9322 r9332  
    144144Int_t MMirrorDisk::ReadM(const TObjArray &tok)
    145145{
    146     if (tok.GetSize()<9)
     146    if (tok.GetEntries()!=1)
    147147        return -1;
    148148
    149     Double_t r = atof(tok[8]->GetName());
     149    Double_t r = atof(tok[0]->GetName());
    150150
    151151    if (r<=0)
  • trunk/MagicSoft/Mars/msimreflector/MMirrorHex.cc

    r9324 r9332  
    163163Int_t MMirrorHex::ReadM(const TObjArray &tok)
    164164{
    165     if (tok.GetSize()<9)
     165    if (tok.GetEntries()!=1)
    166166        return -1;
    167167
    168     const Double_t d = atof(tok[8]->GetName());
     168    const Double_t d = atof(tok[0]->GetName());
    169169
    170170    if (d<=0)
  • trunk/MagicSoft/Mars/msimreflector/MMirrorSquare.cc

    r9322 r9332  
    160160Int_t MMirrorSquare::ReadM(const TObjArray &tok)
    161161{
    162     if (tok.GetSize()<9)
     162    if (tok.GetEntries()!=1)
    163163        return -1;
    164164
    165     Double_t l = atof(tok[8]->GetName());
     165    Double_t l = atof(tok[0]->GetName());
    166166
    167167    if (l<=0)
  • trunk/MagicSoft/Mars/msimreflector/MReflector.cc

    r9313 r9332  
    6565// --------------------------------------------------------------------------
    6666//
     67// Set the SigmaPSF of all mirrors currently stored.
     68//
     69void MReflector::SetSigmaPSF(Double_t psf)
     70{
     71    fMirrors.ForEach(MMirror, SetSigmaPSF)(psf);
     72}
     73
     74// --------------------------------------------------------------------------
     75//
    6776// Calculate the maximum radius of th ereflector. This is not meant as
    6877// a precise number but as a rough estimate e.g. to bin a histogram.
     
    118127// --------------------------------------------------------------------------
    119128//
     129// I/O helper for ReadFile to avoid calling "delete arr" before every return
     130//
     131MMirror *MReflector::EvalTokens(TObjArray &arr, Double_t defpsf) const
     132{
     133    if (arr.GetEntries()<9)
     134    {
     135        *fLog << err << "ERROR - Not enough arguments..." << endl;
     136        return 0;
     137    }
     138
     139    const TVector3 pos(atof(arr[0]->GetName()),
     140                       atof(arr[1]->GetName()),
     141                       atof(arr[2]->GetName()));
     142
     143    const TVector3 norm(atof(arr[3]->GetName()),
     144                        atof(arr[4]->GetName()),
     145                        atof(arr[5]->GetName()));
     146
     147    const Double_t F = atof(arr[6]->GetName());
     148
     149    const TString val = arr[7]->GetName();
     150
     151    const Double_t psf = val.IsFloat() ? val.Atof() : -1;
     152
     153    const UInt_t n = val.IsFloat() ? 9 : 8;
     154
     155    TString type = arr[n-1]->GetName();
     156    type.Prepend("MMirror");
     157
     158    for (UInt_t i=0; i<n; i++)
     159        delete arr.RemoveAt(i);
     160    arr.Compress();
     161
     162    TString msg;
     163    TClass *cls = MParContainer::GetClass(type);
     164    if (!cls)
     165    {
     166        *fLog << err << "ERROR - Class " << type << " not in dictionary." << endl;
     167        return 0;
     168    }
     169
     170    if (!cls->InheritsFrom(MMirror::Class()))
     171    {
     172        *fLog << err << "ERROR - Cannot create new instance of class " << type << ": " << endl;
     173        *fLog << "Class doesn't inherit from MMirror." << endl;
     174        return 0;
     175    }
     176
     177    MMirror *m = static_cast<MMirror*>(cls->New());
     178    if (!m)
     179    {
     180        *fLog << err << "ERROR - Cannot create new instance of class " << type << ": " << endl;
     181        *fLog << " - Class has no default constructor." << endl;
     182        *fLog << " - An abstract member functions of a base class is not overwritten." << endl;
     183        return 0;
     184    }
     185
     186    m->SetFocalLength(F);
     187    m->SetPosition(pos);
     188    m->SetNorm(norm);
     189    m->SetSigmaPSF(psf>=0 ? psf : defpsf);
     190
     191    if (m->ReadM(arr)>=0)
     192        return m;
     193
     194    *fLog << err << "ERROR - " << type << "::ReadM failed." << endl;
     195
     196    delete m;
     197    return 0;
     198}
     199
     200// --------------------------------------------------------------------------
     201//
    120202// Read a reflector setup from a file. This needs improvemtn.
    121 // FIXME: Documentation missing!
    122 //
    123 Bool_t MReflector::ReadFile(TString fname)
     203//
     204// The file structur is like:
     205//
     206//     x y z nx ny nz F [psf] Type ...
     207//
     208//  x:      x-coordinate of the mirror's center
     209//  y:      y-coordinate of the mirror's center
     210//  z:      z-coordinate of the mirror's center
     211//  nx:     x-component of the normal vecor in the mirror center
     212//  ny:     y-component of the normal vecor in the mirror center
     213//  nz:     z-component of the normal vecor in the mirror center
     214//  F:      Focal distance of a spherical mirror
     215//  [psf]:  This number is the psf given in the units of x,y,z and
     216//          defined at the focal distance F. It can be used to overwrite
     217//          the second argument given in ReadFile for individual mirrors.
     218//  Type:   A instance of a mirrot of the class Type MMirrorType is created
     219//          (Type can be, for example, Hex for for MMirrorHex).
     220//  ...:    Additional arguments as defined in MMirrorType::ReadM
     221//
     222//
     223// Coordinate System:
     224//  The coordinate system is local in the reflectors frame.
     225//  It is defined viewing from the back side of the reflector
     226//  towards the camera. (x "right", y "up", z from reflector to camera)
     227//  Note, that it is left-handed!
     228//
     229Bool_t MReflector::ReadFile(TString fname, Double_t defpsf)
    124230{
    125231    SetTitle(fname);
     
    145251    */
    146252
     253    Int_t cnt = 0;
     254
    147255    while (1)
    148256    {
     
    152260            break;
    153261
     262        // Count lines
     263        cnt++;
     264
     265        // Skip comments
    154266        if (line.BeginsWith("#"))
    155         {
    156             //cout << line << endl;
    157267            continue;
    158         }
    159 
     268
     269        // Remove leading and trailing whitespaces
    160270        line=line.Strip(TString::kBoth);
    161271
     272        // Skip empty lines
    162273        if (line.IsNull())
    163274            continue;
    164275
     276        // Tokenize line
    165277        TObjArray *arr = line.Tokenize(' ');
    166278
    167         if (arr->GetSize()<8)
     279        // Evaluate tokens
     280        MMirror *m = EvalTokens(*arr, defpsf);
     281
     282        // Delete now obsolete array
     283        delete arr;
     284
     285        // Check if a new mirror could be created successfully
     286        if (!m)
    168287        {
    169             cout << "Skip3: " <<line << endl;
    170             delete arr;
    171             continue;
    172         }
    173 
    174         const TVector3 pos(atof((*arr)[0]->GetName()),
    175                            atof((*arr)[1]->GetName()),
    176                            atof((*arr)[2]->GetName()));
    177 
    178         const TVector3 norm(atof((*arr)[3]->GetName()),
    179                             atof((*arr)[4]->GetName()),
    180                             atof((*arr)[5]->GetName()));
    181 
    182         const Double_t F = atof((*arr)[6]->GetName());
    183 
    184         TString type = (*arr)[7]->GetName();
    185         type.Prepend("MMirror");
    186 
    187         TString msg;
    188         TClass *cls = MParContainer::GetClass(type);
    189         if (!cls)
    190         {
    191             *fLog << err << dbginf << "ERROR - Class " << type << " not in dictionary." << endl;
     288            *fLog << err << "Error in line " << cnt << ": " << line << endl;
    192289            return kFALSE;
    193290        }
    194291
    195         if (!cls->InheritsFrom(MMirror::Class()))
    196         {
    197             *fLog << err << dbginf << "Cannot create new instance of class " << type << ": " << endl;
    198             *fLog << "Class doesn't inherit from MMirror." << endl;
    199             return kFALSE;
    200         }
    201 
    202         MMirror *m = (MMirror*)cls->New();
    203         if (!m)
    204         {
    205             *fLog << err << dbginf << "Cannot create new instance of class " << type << ": " << endl;
    206             *fLog << " - Class has no default constructor." << endl;
    207             *fLog << " - An abstract member functions of a base class is not overwritten." << endl;
    208             return kFALSE;
    209         }
    210 
    211         m->SetFocalLength(F);
    212         m->SetPosition(pos);
    213         m->SetNorm(norm);
    214 
    215         Int_t n = m->ReadM(*arr);
    216         if (n<=0)
    217         {
    218             *fLog << err << dbginf << "ERROR - ReadM failed." << endl;
    219             return kFALSE;
    220         }
    221 
     292        // Add new mirror to array
    222293        fMirrors.Add(m);
    223 
    224         //maxr = TMath::Max(maxr, TMath::Hypot(pos[i].X()+24.75, pos[i].Y()+24.75));
    225         //maxr = TMath::Max(maxr, TMath::Hypot(pos.X()+24.75, pos.Y()+24.75));
    226 
    227         delete arr;
    228294    }
    229295
     
    285351// --------------------------------------------------------------------------
    286352//
     353// SigmaPSF: -1
    287354// FileName: reflector.txt
    288355//
     356// SigmaPSF can be used to set a default for the psf of the mirrors
     357// read from the file. Note, that this can be overwritten for individual
     358// mirrors in the file.
     359//
     360// For details on the file structure see MReflector::ReadFile
     361//
    289362Int_t MReflector::ReadEnv(const TEnv &env, TString prefix, Bool_t print)
    290363{
    291364    Bool_t rc = kFALSE;
     365
     366    Double_t psf = -1;
     367    if (IsEnvDefined(env, prefix, "SetSigmaPSF", print))
     368    {
     369        rc = kTRUE;
     370        psf = GetEnvValue(env, prefix, "SetSigmaPSF", -1);
     371    }
     372
    292373    if (IsEnvDefined(env, prefix, "FileName", print))
    293374    {
    294375        rc = kTRUE;
    295         if (!ReadFile(GetEnvValue(env, prefix, "FileName", "")))
     376        if (!ReadFile(GetEnvValue(env, prefix, "FileName", ""), psf))
    296377            return kERROR;
    297378    }
  • trunk/MagicSoft/Mars/msimreflector/MReflector.h

    r9312 r9332  
    2828    void InitMaxR();
    2929
     30    // Helper for I/O
     31    MMirror *EvalTokens(TObjArray &arr, Double_t defpsf) const;
     32
    3033    // MParContainer
    3134    Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print);
     
    3942    const MMirror *GetMirror(UInt_t idx) const { return idx>=GetNumMirrors()?0:*(GetFirstPtr()+idx); }
    4043
    41     Bool_t ReadFile(TString fname);
     44    Bool_t ReadFile(TString fname, Double_t defpsf=-1);
    4245
    4346    Double_t GetMaxR() const { return fMaxR; }
     
    4649
    4750    Int_t ExecuteReflector(MQuaternion &p, MQuaternion &u) const;
     51
     52    void SetSigmaPSF(Double_t psf);
    4853
    4954    // TObject
Note: See TracChangeset for help on using the changeset viewer.