Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 6077)
+++ trunk/MagicSoft/Mars/Changelog	(revision 6078)
@@ -32,4 +32,6 @@
        the loop.
 
+
+
  2005/01/28 Thomas Bretz
 
@@ -44,4 +46,31 @@
      - added comment for obsolete resources as discussed yesterday
        evening: TimeUpperLimit
+
+   * mbase/MMath.[h,cc], manalysis/MCerPhotPix.[h,cc], 
+     mpedestal/MPedPhotPix.h:
+     - replaced TruncatePrecision by ReducePrecision (its simply a better
+       name)
+
+   * mbase/MParList.cc:
+     - added a check to make 200%(!) sure that the container added
+       to the list is a MParContainer (everything else could crash
+       almost everything in Mars!)
+
+   * mjobs/MJCalibrateSignal.cc, mjobs/MJCalibration.[h,cc],
+     mjobs/MJPedestal.cc:
+     - simplified the code in the WriteResult functions by using
+       the new WriteContainer in MJob
+     - removed the TObjArray from the MParList! It is NOT a MParContainer
+       there are a lot of circumstance how this can crash Mars. I don't
+       know why the compiler allowed for this.
+     - unified WriteResult and WriteHists
+     - split GetOutputFile into two functions for simplification
+
+   * mjobs/MJCalibration.h:
+     - copy the extractorcam name when copying the contents
+
+   * mjobs/MJob.[h,cc]:
+     - new member function WriteContainer to simplify code in derived
+       classes
 
 
Index: trunk/MagicSoft/Mars/manalysis/MCerPhotPix.cc
===================================================================
--- trunk/MagicSoft/Mars/manalysis/MCerPhotPix.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/manalysis/MCerPhotPix.cc	(revision 6078)
@@ -78,6 +78,6 @@
     fIsSaturated(kFALSE), fIsHGSaturated(kFALSE)
 {
-    MMath::TruncatePrecision(fPhot);
-    MMath::TruncatePrecision(fErrPhot);
+    MMath::ReducePrecision(fPhot);
+    MMath::ReducePrecision(fErrPhot);
 } 
 
Index: trunk/MagicSoft/Mars/manalysis/MCerPhotPix.h
===================================================================
--- trunk/MagicSoft/Mars/manalysis/MCerPhotPix.h	(revision 6077)
+++ trunk/MagicSoft/Mars/manalysis/MCerPhotPix.h	(revision 6078)
@@ -48,7 +48,7 @@
     Bool_t  IsPixelCore() const         { return fIsCore;  }
 
-    void    SetNumPhotons(Float_t f)    { MMath::TruncatePrecision(f); fPhot     = f; }
-    void    SetErrorPhot(Float_t f)     { MMath::TruncatePrecision(f); fErrPhot = f; }
-    void    Set(Float_t np, Float_t ep) { MMath::TruncatePrecision(np); MMath::TruncatePrecision(ep);  fPhot = np; fErrPhot = ep; }
+    void    SetNumPhotons(Float_t f)    { MMath::ReducePrecision(f); fPhot     = f; }
+    void    SetErrorPhot(Float_t f)     { MMath::ReducePrecision(f); fErrPhot = f; }
+    void    Set(Float_t np, Float_t ep) { MMath::ReducePrecision(np); MMath::ReducePrecision(ep);  fPhot = np; fErrPhot = ep; }
 
     void    SetPixelSaturated()         { fIsSaturated = kTRUE; }
Index: trunk/MagicSoft/Mars/mbase/MMath.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 6078)
@@ -137,10 +137,10 @@
 // --------------------------------------------------------------------------
 //
-// This function truncates the precision to roughly 0.5% of a Float_t by
+// This function reduces the precision to roughly 0.5% of a Float_t by
 // changing its bit-pattern (Be carefull, in rare cases this function must
 // be adapted to different machines!). This is usefull to enforce better
 // compression by eg. gzip.
 //
-void MMath::TruncatePrecision(Float_t &val)
+void MMath::ReducePrecision(Float_t &val)
 {
     UInt_t &f = (UInt_t&)val;
Index: trunk/MagicSoft/Mars/mbase/MMath.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.h	(revision 6077)
+++ trunk/MagicSoft/Mars/mbase/MMath.h	(revision 6078)
@@ -18,5 +18,5 @@
     Double_t SignificanceLiMaSigned(Double_t s, Double_t b, Double_t alpha=1);
 
-    void TruncatePrecision(Float_t &val);
+    void ReducePrecision(Float_t &val);
 
     TVector3 GetParab(const TVector3 &x, const TVector3 &y);
Index: trunk/MagicSoft/Mars/mbase/MParList.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MParList.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mbase/MParList.cc	(revision 6078)
@@ -216,4 +216,10 @@
     }
 
+    if (!cont->InheritsFrom(MParContainer::Class()))
+    {
+        *fLog << dbginf << "Error: Cantainer MUST derive from MParContainer!" << endl;
+        return kFALSE;
+    }
+
     *fLog << inf << "Adding " << name << " to " << GetName() << "... " << flush;
 
Index: trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc	(revision 6078)
@@ -126,25 +126,6 @@
 Bool_t MJCalibrateSignal::WriteResult(TObjArray &cont)
 {
-    if (fPathOut.IsNull())
-    {
-        *fLog << inf << "No output path specified via SetPathOut - no output written." << endl;
-        return kTRUE;
-    }
-
-    const TString oname = Form("%s/signal%08d.root", (const char*)fPathOut, fSequence.GetSequence());
-
-    *fLog << inf << "Writing to file: " << oname << endl;
-
-    TFile file(oname, "RECREATE");
-
-    *fLog << inf << " - MStatusDisplay..." << flush;
-    if (fDisplay && fDisplay->Write()<=0)
-    {
-        *fLog << err << "Unable to write MStatusDisplay to " << oname << endl;
-        return kFALSE;
-    }
-    *fLog << inf << "ok." << endl;
-
-    return fIsInterlaced ? WriteContainer(cont) : kTRUE;
+    const TString name(Form("signal%08d.root", fSequence.GetSequence()));
+    return WriteContainer(cont, name);
 }
 
@@ -272,21 +253,8 @@
     MBadPixelsIntensityCam              ibdcam;
 
-    TObjArray interlacedcont;
-    interlacedcont.Add(&ichcam);
-    interlacedcont.Add(&iqecam);
-    interlacedcont.Add(&iblcam);
-    interlacedcont.Add(&itmcam);
-    interlacedcont.Add(&ibdcam);
-
     MHCalibrationChargeCam      hchacam;
     MHCalibrationChargeBlindCam hbndcam;
     MHCalibrationChargePINDiode hpndiod;
     MHCalibrationRelTimeCam     hrelcam;
-
-    interlacedcont.Add(&hchacam);
-    interlacedcont.Add(&hbndcam);
-    interlacedcont.Add(&hpndiod);
-    if (fIsRelTimesUpdate)
-      interlacedcont.Add(&hrelcam);
 
     MCalibrationChargeCam      calcam;
@@ -297,7 +265,4 @@
     MCalibrationHiLoCam        hilcam;
 
-    if (fIsHiLoCalibration)
-      interlacedcont.Add(&hilcam);      
-
     MBadPixelsCam              badpix;
 
@@ -351,7 +316,4 @@
     plist.AddToList(&calibcont);
     plist.AddToList(&hilcam);
-
-    if (fIsInterlaced)
-      plist.AddToList(&interlacedcont);
 
     // Setup Tasklist
@@ -739,4 +701,21 @@
     DisplayResult(plist);
 
+    TObjArray interlacedcont;
+    if (fIsInterlaced)
+    {
+        interlacedcont.Add(&ichcam);
+        interlacedcont.Add(&iqecam);
+        interlacedcont.Add(&iblcam);
+        interlacedcont.Add(&itmcam);
+        interlacedcont.Add(&ibdcam);
+        interlacedcont.Add(&hchacam);
+        interlacedcont.Add(&hbndcam);
+        interlacedcont.Add(&hpndiod);
+        if (fIsRelTimesUpdate)
+            interlacedcont.Add(&hrelcam);
+        if (fIsHiLoCalibration)
+            interlacedcont.Add(&hilcam);
+    }
+
     if (!WriteResult(interlacedcont))
         return kFALSE;
Index: trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 6078)
@@ -1346,10 +1346,19 @@
 const char* MJCalibration::GetOutputFile() const
 {
+    const TString name(GetOutputFileName());
+    if (name.IsNull())
+        return "";
+
+    return Form("%s/%s", fPathOut.Data(), name.Data());
+}
+
+const char* MJCalibration::GetOutputFileName() const
+{
     if (fSequence.IsValid())
-        return Form("%s/calib%08d.root", (const char*)fPathOut, fSequence.GetSequence());
+        return Form("calib%08d.root", fSequence.GetSequence());
     if (!fRuns)
         return "";
 
-    return Form("%s/%s-F1.root", (const char*)fPathOut, (const char*)fRuns->GetRunsAsFileName());
+    return Form("%s-F1.root", (const char*)fRuns->GetRunsAsFileName());
 }
 
@@ -1814,14 +1823,7 @@
     DisplayResult(plist);
 
-    if (!IsNoStorage())
-      if (!WriteResult(plist.FindObject("MGeomCam")))
+    if (!WriteResult(plist))
         return kFALSE;
 
-    if (IsHistsStorage())
-      {
-        if (!WriteHists(plist))
-          return kFALSE;
-      }
-    
     *fLog << all << GetDescriptor() << ": Done." << endl;
 
@@ -1909,9 +1911,9 @@
 }
 
+/*
 Bool_t MJCalibration::WriteEventloop(MEvtLoop &evtloop) const
 {
-
-  if (IsNoStorage())
-    return kTRUE;
+    if (IsNoStorage())
+        return kTRUE;
 
   if (fPathOut.IsNull())
@@ -1924,17 +1926,18 @@
   TFile file(oname, fOverwrite?"RECREATE":"NEW", "File created by MJCalibration", 9);
   if (!file.IsOpen())
-    {
+  {
       *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
       return kFALSE;
-    }
-  
+  }
+
   if (evtloop.Write(fName)<=0)
-    {
+  {
       *fLog << err << "Unable to write MEvtloop to " << oname << endl;
-        return kFALSE;
-    }
+      return kFALSE;
+  }
   
   return kTRUE;
 }
+*/
 
 Bool_t MJCalibration::WriteTasks(MTask *t1, MTask *t2) const
@@ -1943,41 +1946,11 @@
         return kTRUE;
 
-    if (fPathOut.IsNull())
-        return kTRUE;
-
-    const TString oname(GetOutputFile());
-
-    *fLog << inf << "Writing to file: " << oname << endl;
-
-    TFile file(oname, fOverwrite?"RECREATE":"NEW", "File created by MJCalibration", 9);
-    if (!file.IsOpen())
-    {
-        *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
-        return kFALSE;
-    }
-
+    TObjArray cont;
     if (t1)
-    {
-        *fLog << inf << " - Writing Task " << t1->GetName() << " [" << t1->ClassName() << "]..." << flush;
-        if (t1->Write()<=0)
-        {
-            *fLog << err << "Unable to write " << t1->GetName() << " to " << oname << endl;
-            return kFALSE;
-        }
-        *fLog << "ok." << endl;
-    }
-
+        cont.Add(t1);
     if (t2)
-    {
-        *fLog << inf << " - Writing Task " << t2->GetName() << " [" << t2->ClassName() << "]..." << flush;
-        if (t2->Write()<=0)
-        {
-            *fLog << err << "Unable to write " << t2->GetName() << " to " << oname << endl;
-            return kFALSE;
-        }
-        *fLog << "ok." << endl;
-    }
-
-    return kTRUE;
+        cont.Add(t2);
+
+    return WriteContainer(cont, GetOutputFileName(), fOverwrite?"RECREATE":"NEW");
 }
 
@@ -1996,90 +1969,46 @@
 // - MCalibrationRelTimeCam or MCalibrationIntensityRelTimeCam     
 //
-Bool_t MJCalibration::WriteResult(TObject *geom)
+Bool_t MJCalibration::WriteResult(MParList &plist)
 {
-    if (fPathOut.IsNull())
-    {
-        *fLog << inf << "No output path specified via SetPathOut - no output written." << endl;
-        return kTRUE;
-    }
-
-    const TString oname(GetOutputFile());
-
-    *fLog << inf << "Writing to file: " << oname << endl;
-
-    TFile file(oname, "UPDATE", "File created by MJCalibration", 9);
-    if (!file.IsOpen())
-    {
-        *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
-        return kFALSE;
-    }
-
     TObjArray cont;
-    if (fDisplay)
-        cont.Add(fDisplay);
-
-    if (IsIntensity())
-    {
-        cont.Add(&fIntensBadCam);
-        cont.Add(&fIntensCalibCam);
-        cont.Add(&fIntensQECam);
-        cont.Add(&fIntensBlindCam);
-    }
-    else
-    {
-        cont.Add(&fBadPixels);
-        cont.Add(&fCalibrationCam);
-        cont.Add(&fQECam);
-        cont.Add(&fCalibrationBlindCam);
-    }
-    cont.Add(&fCalibrationPINDiode);
-
-    //if (IsRelTimes())
-    cont.Add(IsIntensity() ? (TObject*)&fIntensRelTimeCam : (TObject*)&fRelTimeCam);
-
-    if (!geom)
-        *fLog << warn << " - WARNING - MGeomCam... not found!" << endl;
-    else
-        cont.Add(geom);
-
-    return WriteContainer(cont);
-}
-
-// --------------------------------------------------------------------------
-//
-// Write the calibration histograms into the output file GetOutputFile(), 
-// if fOutputPath exists.
-// 
-// The following containers are written:
-// - MHCalibrationChargeCam
-// - MHCalibrationChargeBlindCam
-// - MHCalibrationChargePINDiode
-// If the flag kRelTimes is set, then also:
-// - MHCalibrationRelTimeBlindCam
-//
-Bool_t MJCalibration::WriteHists(MParList &plist)
-{
-    if (fPathOut.IsNull())
-        return kTRUE;
-
-    const TString oname(GetOutputFile());
-
-    *fLog << inf << "Writing to file: " << oname << endl;
-
-    TFile file(oname, "UPDATE", "File created by MJCalibration", 9);
-    if (!file.IsOpen())
-    {
-        *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
-        return kFALSE;
-    }
-
-    TObjArray cont;
-    cont.Add(plist.FindObject("MHCalibrationChargeCam"));
-    cont.Add(plist.FindObject("MHCalibrationChargeBlindCam"));
-    cont.Add(plist.FindObject("MHCalibrationChargePINDiode"));
-    if (IsRelTimes())
-        cont.Add(plist.FindObject("MHCalibrationRelTimeCam"));
-
-    return WriteContainer(cont);
+
+    if (!IsNoStorage())
+    {
+        if (IsIntensity())
+        {
+            cont.Add(&fIntensBadCam);
+            cont.Add(&fIntensCalibCam);
+            cont.Add(&fIntensQECam);
+            cont.Add(&fIntensBlindCam);
+        }
+        else
+        {
+            cont.Add(&fBadPixels);
+            cont.Add(&fCalibrationCam);
+            cont.Add(&fQECam);
+            cont.Add(&fCalibrationBlindCam);
+        }
+        cont.Add(&fCalibrationPINDiode);
+
+        //if (IsRelTimes())
+        cont.Add(IsIntensity() ? (TObject*)&fIntensRelTimeCam : (TObject*)&fRelTimeCam);
+
+        TObject *geom = plist.FindObject("MGeomCam");
+        if (!geom)
+            *fLog << warn << " - WARNING - MGeomCam... not found for writing!" << endl;
+        else
+            cont.Add(geom);
+    }
+
+    if (IsHistsStorage())
+    {
+        cont.Add(plist.FindObject("MHCalibrationChargeCam"));
+        cont.Add(plist.FindObject("MHCalibrationChargeBlindCam"));
+        cont.Add(plist.FindObject("MHCalibrationChargePINDiode"));
+        if (IsRelTimes())
+            cont.Add(plist.FindObject("MHCalibrationRelTimeCam"));
+    }
+
+    return WriteContainer(cont, GetOutputFileName(), "UPDATE");
 }
 
Index: trunk/MagicSoft/Mars/mjobs/MJCalibration.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 6078)
@@ -160,7 +160,6 @@
   void   FixDataCheckHist     ( TH1D     *hist  ) const;
   
-  Bool_t WriteResult   ( TObject *geom );
-  Bool_t WriteHists    ( MParList &plist );
-  Bool_t WriteEventloop( MEvtLoop &evtloop   ) const;
+  Bool_t WriteResult   (MParList &plist);
+  //Bool_t WriteEventloop( MEvtLoop &evtloop   ) const;
   Bool_t WriteTasks    ( MTask *t1, MTask *t2) const;
   Bool_t CheckEnvLocal ();
@@ -169,4 +168,6 @@
   void   InitBlindPixel(MExtractBlindPixel &blindext,
                         MHCalibrationChargeBlindCam &blindcam);
+
+  const char* GetOutputFileName() const;
   
 public:
@@ -189,5 +190,5 @@
   void SetColor        ( const MCalibrationCam::PulserColor_t color) { fColor = color;       }
   void SetExtractor    ( MExtractor* ext)                            { fExtractor = ext;     }
-  void SetExtractorCam ( const MPedestalCam  &ped)                   { ped.Copy(fExtractorCam); }  
+  void SetExtractorCam ( const MPedestalCam  &ped)                   { ped.Copy(fExtractorCam); fExtractorCam.SetName(ped.GetName()); }
   void SetInput        ( MRunIter *iter)                             { fRuns = iter;         }
   void SetQECam        ( const MCalibrationQECam &qe)                { qe.Copy(fQECam);      }
Index: trunk/MagicSoft/Mars/mjobs/MJPedestal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 6078)
@@ -141,11 +141,20 @@
 const char* MJPedestal::GetOutputFile() const
 {
+    const TString name(GetOutputFileName());
+    if (name.IsNull())
+        return "";
+
+    return Form("%s/%s", fPathOut.Data(), name.Data());
+}
+
+const char* MJPedestal::GetOutputFileName() const
+{
     if (fSequence.IsValid())
-        return Form("%s/pedest%08d.root", (const char*)fPathOut, fSequence.GetSequence());
+        return Form("pedest%08d.root", fSequence.GetSequence());
 
     if (!fRuns)
         return "";
 
-    return Form("%s/%s-F0.root", (const char*)fPathOut, (const char*)fRuns->GetRunsAsFileName());
+    return Form("%s-F0.root", (const char*)fRuns->GetRunsAsFileName());
 }
 
@@ -785,30 +794,10 @@
         return kTRUE;
 
-    if (fPathOut.IsNull())
-    {
-        *fLog << inf << "No output path specified via SetPathOut - no output written." << endl;
-        return kTRUE;
-    }
-
-    const TString oname(GetOutputFile());
-
-    *fLog << inf << "Writing to file: " << oname << endl;
-
-    TFile file(oname, "UPDATE", "File created by MJPedestal", 9);
-    if (!file.IsOpen())
-    {
-        *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
-        return kFALSE;
-    }
-
     TObjArray cont;
-
-    if (fDisplay)
-        cont.Add(fDisplay);
 
     cont.Add(&fPedestalCamOut);
     cont.Add(&fBadPixels);
 
-    return WriteContainer(cont);
+    return WriteContainer(cont, GetOutputFileName(), fOverwrite?"RECREATE":"NEW");
 }
 
Index: trunk/MagicSoft/Mars/mjobs/MJob.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJob.cc	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJob.cc	(revision 6078)
@@ -35,4 +35,5 @@
 #include <TFile.h>
 #include <TSystem.h>
+#include <TObjArray.h>
 
 #include "MIter.h"
@@ -173,4 +174,9 @@
 }
 
+//------------------------------------------------------------------------
+//
+// Write containers in list to gFile. Returns kFALSE if no gFile or any
+// container couldn't be written. kTRUE otherwise.
+//
 Bool_t MJob::WriteContainer(TCollection &list) const
 {
@@ -196,4 +202,9 @@
 }
 
+//------------------------------------------------------------------------
+//
+// Read containers in list into list from gFile
+// Returns kFALSE if no gFile or any container couldn't be read.
+//
 Bool_t MJob::ReadContainer(TCollection &list) const
 {
@@ -218,2 +229,37 @@
     return kTRUE;
 }
+
+//------------------------------------------------------------------------
+//
+// Write containers in cont (and - if available) the status display to
+// fPathOut+"/"+name
+//
+Bool_t MJob::WriteContainer(TCollection &cont, const char *name, const char *option, const int compr) const
+{
+    if (fPathOut.IsNull())
+    {
+        *fLog << inf << "No output path specified via SetPathOut - no output written." << endl;
+        return kTRUE;
+    }
+
+    TString oname(fPathOut);
+    oname += "/";
+    oname += name;
+
+    *fLog << inf << "Writing to file: " << oname << endl;
+
+    TString title("File Written by ");
+    title += fName;
+
+    TFile file(oname, option, title, compr);
+    if (!file.IsOpen())
+    {
+        *fLog << err << "ERROR - Couldn't open file " << oname << " for writing..." << endl;
+        return kFALSE;
+    }
+
+    if (fDisplay)
+        cont.Add((TObject*)(fDisplay));
+
+    return WriteContainer(cont);
+}
Index: trunk/MagicSoft/Mars/mjobs/MJob.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJob.h	(revision 6077)
+++ trunk/MagicSoft/Mars/mjobs/MJob.h	(revision 6078)
@@ -44,4 +44,5 @@
     Bool_t WriteContainer(TCollection &list) const;
     Bool_t ReadContainer(TCollection &list) const;
+    Bool_t WriteContainer(TCollection &cont, const char *name, const char *option="RECREATE", const int compr=2) const;
 
 public:
