Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 6986)
+++ trunk/MagicSoft/Mars/Changelog	(revision 6987)
@@ -28,4 +28,26 @@
      - set as time a time which represents the starting point
        of the calculation interval in all cases
+
+   * star.rc, mmuon/MMuonCalibParCalc.cc, mmuon/MMuonSetup.[h,cc]:
+     - fixed wrong units of thresholds for muon analysis
+
+   * mmuon/MHSingleMuon.cc:
+     - removed obsolete conversion factor in error calculation
+     - FindeCreateObj called for MMuonSetup
+     - get NDF from fit
+     - optimized FindRangeAboveThreshold
+     - handle special case when arcphi is 360deg
+
+   * star.cc:
+     - replaced ProcessFile by Process
+
+   * mjobs/MJSpectrum.cc:
+     - renamed second MHAlpha tab to MHAlphaOn to be able to
+       access each tab uniquely
+     - fixed a bug calling SetStats which could cause crashes
+
+   * mjobs/MJStar.[h,cc]:
+     - preliminary implementation of the muon analysis
+     - reanamed ProcessFile to Process
 
 
Index: trunk/MagicSoft/Mars/mjobs/MJSpectrum.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJSpectrum.cc	(revision 6986)
+++ trunk/MagicSoft/Mars/mjobs/MJSpectrum.cc	(revision 6987)
@@ -344,5 +344,5 @@
 
     MFillH fill1("MHAlphaOff [MHAlpha]", "MHillasSrc", "FillAlphaOff");
-    MFillH fill2("MHAlpha",              "MHillasSrc", "FillAlphaOn");
+    MFillH fill2("MHAlphaOn  [MHAlpha]", "MHillasSrc", "FillAlphaOn");
 
     MFDataMember f0("DataType.fVal", '<', 0.5, "FilterOffData");
@@ -381,8 +381,8 @@
     }
 
-    const MHAlpha *halpha = (MHAlpha *)plist.FindObject("MHAlpha");
+    const MHAlpha *halpha = (MHAlpha *)plist.FindObject("MHAlphaOn");
     if (!halpha)
     {
-        *fLog << err << GetDescriptor() << ": MHAlpha not found... abort." << endl;
+        *fLog << err << GetDescriptor() << ": MHAlphaOn [MHAlpha] not found... abort." << endl;
         return kFALSE;
     }
@@ -615,5 +615,5 @@
     cout << "Searching..." << endl;
 
-    TH1D *excess = (TH1D*)arr.FindObjectInCanvas("Excess", "TH1D", "MHAlpha");
+    TH1 *excess = (TH1D*)arr.FindObjectInCanvas("Excess", "TH1D", "MHAlpha");
     if (!excess)
         return kFALSE;
@@ -633,18 +633,27 @@
 
     excess->SetTitle("Number of excess events vs Size (data, mc/blue)");
+    excess->Scale(1./excess->Integral());
+    excess = excess->DrawCopy();
+    // Don't do this on the original object!
     excess->SetStats(kFALSE);
-    excess->Scale(1./excess->Integral());
-    excess->DrawCopy();
+
+    cout << "ExcessSize..." << endl;
 
     TObject *o=0;
     if ((o=plist.FindObject("ExcessSize")))
     {
-        TH1F *histsel = (TH1F*)o->FindObject("");
-        histsel->SetStats(kFALSE);
-        histsel->Scale(1./histsel->Integral());
-        histsel->SetLineColor(kBlue);
-        histsel->SetBit(kCanDelete);
-        histsel->DrawCopy("same");
-    }
+        TH1 *histsel = (TH1F*)o->FindObject("");
+        if (histsel)
+        {
+            histsel->Scale(1./histsel->Integral());
+            histsel->SetLineColor(kBlue);
+            histsel->SetBit(kCanDelete);
+            histsel = histsel->DrawCopy("same");
+            // Don't do this on the original object!
+            histsel->SetStats(kFALSE);
+        }
+    }
+
+    cout << "Dist..." << endl;
 
     // -------------- Comparison of Image Parameters --------------
@@ -652,12 +661,20 @@
     PlotSame(arr, plist, "Dist",   "HilSrc",  "MHHilSrcMCPost");
 
+    cout << "Length..." << endl;
+
     c.cd(3);
     PlotSame(arr, plist, "Length", "PostCut", "MHHillasMCPost");
 
+    cout << "M3l..." << endl;
+
     c.cd(4);
     PlotSame(arr, plist, "M3l",    "HilExt",  "MHHilExtMCPost");
 
+    cout << "Conc1..." << endl;
+
     c.cd(5);
     PlotSame(arr, plist, "Conc1",  "NewPar",  "MHNewParMCPost");
+
+    cout << "Width..." << endl;
 
     c.cd(6);
Index: trunk/MagicSoft/Mars/mjobs/MJStar.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJStar.cc	(revision 6986)
+++ trunk/MagicSoft/Mars/mjobs/MJStar.cc	(revision 6987)
@@ -53,4 +53,5 @@
 #include "MReadReports.h"
 #include "MReadMarsFile.h"
+#include "MF.h"
 #include "MFDeltaT.h"
 #include "MFSoftwareTrigger.h"
@@ -61,4 +62,7 @@
 #include "MSrcPosCalc.h"
 #include "MHillasCalc.h"
+#include "../mmuon/MMuonSearchParCalc.h"
+#include "../mmuon/MMuonCalibParCalc.h"
+#include "../mmuon/MMuonSetup.h"
 #include "MFillH.h"
 #include "MWriteRootFile.h"
@@ -108,5 +112,5 @@
 }
 
-Bool_t MJStar::ProcessFile(Bool_t ismc)
+Bool_t MJStar::Process(Bool_t ismc)
 {
     if (!fSequence.IsValid())
@@ -156,4 +160,22 @@
     MObservatory obs;
     plist.AddToList(&obs);
+
+    MMuonSetup muonsetup;
+    plist.AddToList(&muonsetup);
+
+    // Setup binnings for muon analysis
+    MBinning bins1("BinningRadius");
+    MBinning bins2("BinningArcWidth");
+    MBinning bins3("BinningRingBroadening");
+    MBinning bins4("BinningSizeVsArcRadius");
+    MBinning bins5("BinningMuonWidth");
+    MBinning bins6("BinningArcPhi");
+    plist.AddToList(&bins1);
+    plist.AddToList(&bins2);
+    plist.AddToList(&bins3);
+    plist.AddToList(&bins4);
+    plist.AddToList(&bins5);
+    plist.AddToList(&bins6);
+
 
     // Setup Tasklist
@@ -276,4 +298,11 @@
     write.AddContainer("MObservatory",  "RunHeaders");
 
+    // Muon Setup
+    write.AddContainer("BinningRadius",          "RunHeaders");
+    write.AddContainer("BinningArcWidth",        "RunHeaders");
+    write.AddContainer("BinningRingBroadening",  "RunHeaders");
+    write.AddContainer("BinningSizeVsArcRadius", "RunHeaders");
+    write.AddContainer("MMuonSetup",             "RunHeaders");
+
     if (ismc)
     {
@@ -327,4 +356,40 @@
     tlist2.AddToList(&fill4);
     tlist2.AddToList(&fill5);
+
+    // *********************************************************
+    MMuonSetup setup;
+    plist.AddToList(&setup);
+
+    MF fmuon1("MHillas.fSize>150", "MuonPreCut");
+
+    MF fmuon2("(MMuonSearchPar.fRadius>180) &&"
+              "(MMuonSearchPar.fRadius<400) &&"
+              "(MMuonSearchPar.fDeviation<45)", "MuonSearchCut");
+    fmuon2.SetFilter(&fmuon1);
+
+    MF fmuon3("(MMuonCalibPar.fArcPhi>175)  &&"
+              "(MMuonSearchPar.fDeviation<37)", "MuonFinalCut");
+
+    MMuonSearchParCalc muscalc;
+    muscalc.SetFilter(&fmuon1);
+
+    MMuonCalibParCalc mcalc;
+    mcalc.SetFilter(&fmuon2);
+
+    MFillH fill11("MHSingleMuon", "", "FillMuon");
+    MFillH fill10("MHMuonPar",    "", "FillMuonPar");
+    fill11.SetFilter(&fmuon2);
+    fill10.SetFilter(&fmuon3);
+
+    tlist2.AddToList(&fmuon1);
+    tlist2.AddToList(&muscalc);
+    tlist2.AddToList(&fmuon2);
+    tlist2.AddToList(&fill11);
+    tlist2.AddToList(&mcalc);
+    tlist2.AddToList(&fmuon3);
+    tlist2.AddToList(&fill10);
+
+    // *********************************************************
+
     //tlist2.AddToList(&fill6);
     //tlist2.AddToList(&fill7);
Index: trunk/MagicSoft/Mars/mjobs/MJStar.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJStar.h	(revision 6986)
+++ trunk/MagicSoft/Mars/mjobs/MJStar.h	(revision 6987)
@@ -14,5 +14,5 @@
     MJStar(const char *name=NULL, const char *title=NULL);
 
-    Bool_t ProcessFile(Bool_t ismc=kFALSE);
+    Bool_t Process(Bool_t ismc=kFALSE);
 
     ClassDef(MJStar, 0) // Tool to create a pedestal file (MPedestalCam)
Index: trunk/MagicSoft/Mars/mmuon/MHSingleMuon.cc
===================================================================
--- trunk/MagicSoft/Mars/mmuon/MHSingleMuon.cc	(revision 6986)
+++ trunk/MagicSoft/Mars/mmuon/MHSingleMuon.cc	(revision 6987)
@@ -221,6 +221,9 @@
     {
         const Float_t val = h.GetBinContent(i%n + 1);
-        if (val<thres && last<0)
+        if (val<thres)
+        {
             last = i%n+1;
+            break;
+        }
     }
 
@@ -230,6 +233,9 @@
     {
         const Float_t val = h.GetBinContent(i%n + 1);
-        if (val<thres && first<0)
+        if (val<thres)
+        {
             first = i%n+1;
+            break;
+        }
     }
 
@@ -245,4 +251,7 @@
 Bool_t MHSingleMuon::CalcPhi(Double_t thres, Double_t &peakphi, Double_t &arcphi) const
 {
+    if (fHistPhi.GetMaximum()<thres)
+        return kFALSE;
+
     peakphi = 180.-fHistPhi.GetBinCenter(fHistPhi.GetMaximumBin());
 
@@ -250,15 +259,17 @@
     Int_t first, last;
 
-    if (!FindRangeAboveThreshold(fHistPhi, thres, first, last))
-        return kFALSE;
-
-    //cout << "P: " << first << " " << last << " " << last-first << endl;
+    FindRangeAboveThreshold(fHistPhi, thres, first, last);
+
+    const Int_t n    = fHistPhi.GetNbinsX();
+    const Int_t edge = fHistPhi.GetMaximumBin()+n/2;
+    if (first<0)
+        first = (edge-1)%n+1;
+    if (last<0)
+        last  = edge%n+1;;
 
     const Float_t startfitval = fHistPhi.GetBinLowEdge(first+1);
     const Float_t endfitval   = fHistPhi.GetBinLowEdge(last);
 
-    //Int_t effbinnum = TMath::Nint((endfitval-startfitval)/convbin2val);
-
-    arcphi = last<first ? 360+(endfitval-startfitval) : endfitval-startfitval;
+    arcphi = last-1<first ? 360+(endfitval-startfitval) : endfitval-startfitval;
 
     //if (fEnableImpactCalc)
Index: trunk/MagicSoft/Mars/star.cc
===================================================================
--- trunk/MagicSoft/Mars/star.cc	(revision 6986)
+++ trunk/MagicSoft/Mars/star.cc	(revision 6987)
@@ -225,5 +225,5 @@
         // job.SetPathIn(kInpath); // not yet needed
 
-        if (!job.ProcessFile(kIsMC))
+        if (!job.Process(kIsMC))
         {
             gLog << err << "Calculation of image parameters failed." << endl << endl;
