Index: trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.cc
===================================================================
--- trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.cc	(revision 897)
+++ trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.cc	(revision 898)
@@ -30,32 +30,30 @@
 #include "MParList.h"
 
+#include "MHMcRate.h"
+#include "MMcEvt.hxx"
 #include "MMcTrig.hxx" 
-#include "MHMcRate.h"
-
-ClassImp(MMcTriggerRateCalc)
-
-// --------------------------------------------------------------------------
-//
-//  default constructor
-//  set member data to initial values
-//
-MMcTriggerRateCalc::MMcTriggerRateCalc (const char *name, const char *title)
-{
-  //  default constructor
-  *fName  = name  ? name  : "MMcTriggerRateCalc";
-  *fTitle = title ? title : "Task to calc the trigger rate";
-
-  fDimension=0;
-  for (int i=0;i<10;i++){
-  fTrigger[i]=0;
-  }
-  fShowers = 0;
-  fAnalShow = 100000;
-
-  fPartId=14;
-
-  fSpecInd=2.75;
-  fFlux0=10.92e-2;
-} 
+
+ClassImp(MMcTriggerRateCalc);
+
+void MMcTriggerRateCalc::Init(int dim, int part, float *trigbg,
+                              float simbg, float spec, float flux0,
+                              const char *name, const char *title)
+{
+    *fName  = name  ? name  : "MMcTriggerRateCalc";
+    *fTitle = title ? title : "Task to calc the trigger rate ";
+
+    fDimension=dim;
+
+    for (int i=0;i<10;i++)
+        fTrigger[i] = dim&&trigbg ? trigbg[i] : 0;
+
+    fShowers = 0;
+    fAnalShow = simbg;
+
+    fPartId=part;
+
+    fSpecInd=spec;
+    fFlux0=flux0;
+}
 
 // --------------------------------------------------------------------------
@@ -70,25 +68,12 @@
 //      rate: rate of incident showers
 //
-MMcTriggerRateCalc::MMcTriggerRateCalc (int dim, int part, float *trigbg,
-				float simbg, float rate,
-				const char *name, const char *title)
-{
-  *fName  = name  ? name  : "MMcTriggerRateCalc";
-  *fTitle = title ? title : "Task to calc the trigger rate ";
-
-  fDimension=dim;
-
-  for (int i=0;i<10;i++){
-  fTrigger[i]=trigbg[i];
-  }
-
-  fShowers = 0;
-  fAnalShow = simbg;
-
-  fPartId=part;
-
-  fSpecInd=rate;
-  fFlux0=0;
-}
+
+MMcTriggerRateCalc::MMcTriggerRateCalc(float rate, int dim, int part,
+                                       float *trigbg, float simbg,
+                                       const char *name, const char *title)
+{
+    Init(dim, part, trigbg, simbg, rate, 0, name, title);
+}
+
 
 // --------------------------------------------------------------------------
@@ -101,28 +86,15 @@
 //               a given trigger condition.
 //      simbg: Number of simulated showers for the bacground
-//      spec: sSpecInd
+//      spec: spectral index
 //      flux0; fFlux0
 //
-MMcTriggerRateCalc::MMcTriggerRateCalc (int dim, int part, float *trigbg, 
-				float simbg, float spec, float flux0, 
-				const char *name, const char *title)
-{
-  *fName  = name  ? name  : "MMcTriggerRateCalc";
-  *fTitle = title ? title : "Task to calc the trigger rate ";
-
-  fDimension=dim;
-
-  for (int i=0;i<10;i++){
-  fTrigger[i]=trigbg[i];
-  }
-
-  fShowers = 0;
-  fAnalShow = simbg;
-
-  fPartId=part;
-
-  fSpecInd=spec;
-  fFlux0=flux0;
-} 
+
+MMcTriggerRateCalc::MMcTriggerRateCalc(int dim, int part, float *trigbg,
+                                       float simbg, float spec, float flux0,
+                                       const char *name, const char *title)
+{
+    Init(dim, part, trigbg, simbg, spec, flux0, name, title);
+}
+
 
 // --------------------------------------------------------------------------
@@ -136,79 +108,46 @@
 Bool_t MMcTriggerRateCalc::PreProcess (MParList *pList)
 {
-  // connect the raw data with this task
-  int i;               // bucle variable
-  char auxname[15];    // string to write container names
-
-  fMcEvt = (MMcEvt*)pList->FindObject("MMcEvt");
-  if (!fMcEvt)
-  {
-    *fLog << dbginf << "MMcEvt not found... aborting." << endl;
-    return kFALSE;
-  }
-
-  if(fDimension>0)
-    for(i=0;i<fDimension;i++){
-      sprintf(auxname,"MMcTrig;%i",i+1);
-      fMcTrig[i] = (MMcTrig*)pList->FindObject(auxname);
-      if (!fMcTrig[i])
-	{
-	  *fLog << dbginf << "MMcTrig not found... aborting." << endl;
-	  return kFALSE;
-	} 
-      sprintf(auxname,"MHMcRate;%i",i+1);
-      fMcRate[i] = (MHMcRate*)pList->FindCreateObj(auxname);
-      if (!fMcTrig[i])
-	{
-	  return kFALSE;
-	} 
-      fMcRate[i]->SetParticle(fPartId);
-      fMcRate[i]->SetBackground(fTrigger[i],fAnalShow);
-      fTrigger[i]=0;
-    }
-  else if (fDimension==0)
-    {  
-      fMcTrig[0] = (MMcTrig*)pList->FindObject("MMcTrig");
-      if (!fMcTrig[0])
-	{
-	  *fLog << dbginf << "MMcTrig not found... aborting." << endl;
-	  return kFALSE;
-	} 
-      fMcRate[0] = (MHMcRate*)pList->FindCreateObj("MHMcRate");
-      if (!fMcTrig[0])
-	{
-	  return kFALSE;
-	} 
-      fMcRate[0]->SetParticle(fPartId);
-      fMcRate[0]->SetBackground(fTrigger[0],fAnalShow);
-      fTrigger[0]=0;
-      fDimension=1;
-    }   
-  else
-     {
-      sprintf(auxname,"MMcTrig;%i.",-fDimension);
-      fMcTrig[0] = (MMcTrig*)pList->FindObject(auxname);
-      if (!fMcTrig[0])
-	{
-	  *fLog << dbginf << "MMcTrig not found... aborting." << endl;
-	  return kFALSE;
-	} 
-     sprintf(auxname,"MHMcRate;%i.",-fDimension);
-     fMcRate[0] = (MHMcRate*)pList->FindCreateObj(auxname);
-      if (!fMcTrig[0])
-	{
-	  return kFALSE;
-	} 
-      fMcRate[0]->SetParticle(fPartId);
-      fMcRate[0]->SetBackground(fTrigger[0],fAnalShow);
-      fTrigger[0]=0;
-      fDimension=1;
-    }
-  
-  fAnalShow=0.0;
-  *fLog<<dbginf<< "Pre Process done"<<endl;
-  
-  return kTRUE ; 
-  
-} 
+    // connect the raw data with this task
+
+    fMcEvt = (MMcEvt*)pList->FindObject("MMcEvt");
+    if (!fMcEvt)
+    {
+        *fLog << dbginf << "MMcEvt not found... aborting." << endl;
+        return kFALSE;
+    }
+
+    const UInt_t from = fDimension<=0 ? -fDimension : 0;
+
+    if (fDimension<=0)
+        fDimension = -fDimension;
+
+    fMcTrig = new TObjArray(pList->FindObjectList("MMcTrig", from, fDimension));
+    if (fMcTrig->GetEntriesFast() != fDimension)
+    {
+        *fLog << dbginf << "Error: Not all requested MMcTrig objects are available...aborting." << endl;
+        return kFALSE;
+    }
+
+    fMcRate = new TObjArray(pList->FindObjectList("MHMcRate", from, fDimension));
+    if (fMcRate->GetEntriesFast() != fDimension)
+    {
+        *fLog << dbginf << "Error: Not all requested MHMcRate objects are available...aborting." << endl;
+        return kFALSE;
+    }
+
+    for (int i=0; i<fDimension; i++)
+    {
+        MHMcRate &rate = *GetRate(i);
+
+        rate.SetParticle(fPartId);
+        rate.SetBackground(fTrigger[i], fAnalShow);
+
+        fTrigger[i]=0;
+    }
+
+    fAnalShow=0.0;
+
+    return kTRUE;
+}
 
 // --------------------------------------------------------------------------
@@ -219,28 +158,29 @@
 //  MHMcRate container.
 //
-Bool_t MMcTriggerRateCalc::Process () 
-{ 
-  Float_t Ener, Theta, Phi, Param;
-
-  //  Counting analysed and simulated showers
-
-  fShowers++;
-  if (fMcEvt->GetPhotElfromShower()) fAnalShow++;
-
-  //  Getting angles, energy and impact parameter to set boundaries
-
-  Theta=fMcEvt->GetTheta();
-  Phi=fMcEvt->GetPhi();
-  Param=fMcEvt->GetImpact();
-  Ener=fMcEvt->GetEnergy()/1000.0;
-
-  //  Counting number of triggers
-
-  for(int i=0;i<fDimension;i++){
-  fTrigger[i]=fTrigger[i]+fMcTrig[i]->GetFirstLevel();
-  fMcRate[i]->Boundaries(Ener, Theta, Phi, Param);
-  }
-
-  return kTRUE ;
+Bool_t MMcTriggerRateCalc::Process ()
+{
+    //  Counting analysed and simulated showers
+
+    fShowers++;
+    if (fMcEvt->GetPhotElfromShower())
+        fAnalShow++;
+
+    //  Getting angles, energy and impact parameter to set boundaries
+
+    const Float_t theta=fMcEvt->GetTheta();
+    const Float_t phi  =fMcEvt->GetPhi();
+    const Float_t param=fMcEvt->GetImpact();
+    const Float_t ener =fMcEvt->GetEnergy()/1000.0;
+
+    //  Counting number of triggers
+
+    for (int i=0; i<fDimension; i++)
+    {
+        fTrigger[i] += GetTrig(i)->GetFirstLevel();
+
+        GetRate(i)->UpdateBoundaries(ener, theta, phi, param);
+    }
+
+    return kTRUE;
 }
 
@@ -249,16 +189,19 @@
 //  The PostProcess-function calculates and shows the trigger rate
 //
-Bool_t MMcTriggerRateCalc::PostProcess () 
-{ 
-  // Computing trigger rate and showing it
-  for(int i=0;i<fDimension;i++){
-    fMcRate[i]->CalcRate(fTrigger[i],fAnalShow,fShowers);
-    fMcRate[i]->Print();
-    fMcRate[i]->Draw("S");
-  }
-
-  return kTRUE ; 
-}
-
-
-
+Bool_t MMcTriggerRateCalc::PostProcess ()
+{
+    // Computing trigger rate and showing it
+    for(int i=0; i<fDimension; i++)
+    {
+        MHMcRate &rate = *GetRate(i);
+
+        rate.CalcRate(fTrigger[i], fAnalShow, fShowers);
+        rate.Print();
+        rate.Draw("S");
+    }
+
+    return kTRUE;
+}
+
+
+
Index: trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.h
===================================================================
--- trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.h	(revision 897)
+++ trunk/MagicSoft/Mars/mmontecarlo/MMcTriggerRateCalc.h	(revision 898)
@@ -2,47 +2,60 @@
 #define MTRIGGERRATECALC_H
 
+#ifndef MAGIC_H
+#include "MAGIC.h"
+#endif
+#ifndef ROOT_TObjArray
+#include <TObjArray.h>
+#endif
 #ifndef MTASK_H
 #include "MTask.h"
 #endif
 
-#include "MMcEvt.hxx"
-
 class MParList;
-class MMcTrig ; 
 class MMcEvt;
+class MMcTrig;
 class MHMcRate;
 
-class MMcTriggerRateCalc : public MTask {
- private:
-  MMcTrig         *fMcTrig[10]  ; //!
-  MMcEvt          *fMcEvt;        //!
+class MMcTriggerRateCalc : public MTask
+{
+private:
+    MMcEvt    *fMcEvt;        //!
 
-  MHMcRate         *fMcRate[10] ;  //!
+    TObjArray *fMcRate;
+    TObjArray *fMcTrig;
 
-  Int_t           fDimension;     // Information about the trigger conditions
-                                  // in the root file to be read.
+    Int_t      fDimension;     // Information about the trigger conditions
+    // in the root file to be read.
 
-  Float_t         fTrigger[10];   // Number of triggered showers
-  Float_t         fShowers;       // Number of simulated showers
-  Float_t         fAnalShow;      // Number of analysed showers
+    Float_t    fTrigger[10];   // Number of triggered showers
+    Float_t    fShowers;       // Number of simulated showers
+    Float_t    fAnalShow;      // Number of analysed showers
 
-  Int_t           fPartId;        // Incident particle that generates showers
+    Int_t      fPartId;        // Incident particle that generates showers
 
-  Float_t         fSpecInd;       // Spectral indec of the simualtion
-  Float_t         fFlux0;         // Flux 0 for the differential flux
+    Float_t    fSpecInd;       // Spectral indec of the simualtion
+    Float_t    fFlux0;         // Flux 0 for the differential flux
 
- public:   
-  MMcTriggerRateCalc (const char *name=NULL, const char *title=NULL); 
-  MMcTriggerRateCalc (int dim, int part, float *trigbg, float simbg, float rate,
-		  const char *name=NULL, const char *title=NULL);
-  MMcTriggerRateCalc (int dim, int part, float *trigbg, float simbg, float spec,
-		  float flux0, const char *name=NULL, const char *title=NULL);
+    void Init(int dim, int part, float *trigbg,
+              float simbg, float spec, float flux0,
+              const char *name, const char *title);
 
-  Bool_t PreProcess(MParList *pList);
-  Bool_t Process() ;
-  Bool_t PostProcess() ;
-  
-  ClassDef(MMcTriggerRateCalc, 0)	// Task to compute the trigger rate
+    MHMcRate *GetRate(UInt_t i) const { return (MHMcRate*)((*fMcRate)[i]); }
+    MMcTrig *GetTrig(UInt_t i) const { return (MMcTrig*)((*fMcTrig)[i]); }
 
+public:
+    MMcTriggerRateCalc(int dim=0, int part=14, float *trigbg=NULL,
+                       float simbg=100000, float spec=2.75, float flux0=10.92e-2,
+                       const char *name=NULL, const char *title=NULL);
+
+    MMcTriggerRateCalc(float rate, int dim, int part, float *trigbg,
+                       float simbg,
+                       const char *name=NULL, const char *title=NULL);
+
+    Bool_t PreProcess(MParList *pList);
+    Bool_t Process();
+    Bool_t PostProcess();
+
+    ClassDef(MMcTriggerRateCalc, 0)	// Task to compute the trigger rate
 };
 
