Index: /trunk/MagicSoft/Mars/Changelog
===================================================================
--- /trunk/MagicSoft/Mars/Changelog	(revision 895)
+++ /trunk/MagicSoft/Mars/Changelog	(revision 896)
@@ -18,4 +18,8 @@
    * macros/MagicHillas.C:
      - changed to new stilish histogram fillers.
+
+   * mhist/MHMcRate.cc:
+     - some simplifications to the constructors
+     - some accelerations of the rate calculation
 
 
Index: /trunk/MagicSoft/Mars/mhist/MHMcRate.cc
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHMcRate.cc	(revision 895)
+++ /trunk/MagicSoft/Mars/mhist/MHMcRate.cc	(revision 896)
@@ -28,5 +28,30 @@
 #include "MLog.h"
 
-ClassImp(MHMcRate)
+ClassImp(MHMcRate);
+
+void MHMcRate::Init(const char *name, const char *title)
+{
+    *fName  = name  ? name  : "MMcTriggerRate";
+    *fTitle = title ? title : "Task to calc the collection area ";
+
+    fPartId=0;              // Type of particle
+
+    fEnergyMax=0.0;         // Maximum Energy in GeV
+    fEnergyMin=1000000.0;   // Minimum Energy in GeV
+
+    fThetaMax=0.0;          // Maximum theta angle of run
+    fThetaMin=370.0;        // Minimum theta angle of run
+    fPhiMax=0.0;            // Maximum phi angle of run
+    fPhiMin=370.0;          // Minimum phi angle of run
+
+    fImpactMax=0.0;         // Maximum impact parameter
+    fImpactMin=100000.0;    // Minimum impact parameter
+
+    fBackTrig=-1.0;         // Number of triggers from background
+    fBackSim=-1.0;          // Number of simulated showers for the background
+
+    fTrigRate= -1.0;        // Trigger rate in Hz
+    fTrigRateError= -1.0;   // Estimated error for the trigger rate in Hz
+}
 
 // --------------------------------------------------------------------------
@@ -35,34 +60,14 @@
 //  fills all member data with initial values
 //
-MHMcRate::MHMcRate (const char *name, const char *title)
-{
-  *fName  = name  ? name  : "MMcTriggerRate";
-  *fTitle = title ? title : "Task to calc the collection area ";
-
-  fPartId=0;              // Type of particle
-  
-  fEnergyMax=0.0;         // Maximum Energy in GeV
-  fEnergyMin=1000000.0;   // Minimum Energy in GeV
-  
-  fThetaMax=0.0;          // Maximum theta angle of run 
-  fThetaMin=370.0;        // Minimum theta angle of run
-  fPhiMax=0.0;            // Maximum phi angle of run 
-  fPhiMin=370.0;          // Minimum phi angle of run
-  
-  fImpactMax=0.0;         // Maximum impact parameter
-  fImpactMin=100000.0;    // Minimum impact parameter
-  
-  fBackTrig=-1.0;         // Number of triggers from background
-  fBackSim=-1.0;          // Number of simulated showers for the background
-  
-  fSpecIndex=0.0;         // dn/dE = k * e^{- fSpecIndex}
-  fFlux0=-1.0;            // dn/dE = fFlux0 * E^{-a}
-  
-  fShowRate= -1.0;        // Showers rate in Hz
-  fShowRateError=0.0;     // Estimated error of shower rate in Hz
-  
-  fTrigRate= -1.0;        // Trigger rate in Hz
-  fTrigRateError= -1.0;   // Estimated error for the trigger rate in Hz
-} 
+MHMcRate::MHMcRate(const char *name, const char *title)
+{
+    Init(name, title);
+
+    fSpecIndex=0.0;         // dn/dE = k * e^{- fSpecIndex}
+    fFlux0=-1.0;            // dn/dE = fFlux0 * E^{-a}
+
+    fShowRate= -1.0;        // Showers rate in Hz
+    fShowRateError=0.0;     // Estimated error of shower rate in Hz
+}
 
 // --------------------------------------------------------------------------
@@ -72,36 +77,15 @@
 //  incident showers to ShowRate
 //
-MHMcRate::MHMcRate (Float_t ShowRate, 
-		  const char *name, const char *title)
-{
-
-  *fName  = name  ? name  : "MMcTriggerRate";
-  *fTitle = title ? title : "Task to calc the collection area ";
-
-  fPartId=0;              // Type of particle
-  
-  fEnergyMax=0.0;         // Maximum Energy in GeV
-  fEnergyMin=1000000.0;   // Minimum Energy in GeV
-  
-  fThetaMax=0.0;          // Maximum theta angle of run 
-  fThetaMin=370.0;        // Minimum theta angle of run
-  fPhiMax=0.0;            // Maximum phi angle of run 
-  fPhiMin=370.0;          // Minimum phi angle of run
-  
-  fImpactMax=0.0;         // Maximum impact parameter
-  fImpactMin=100000.0;    // Minimum impact parameter
-  
-  fBackTrig=-1.0;         // Number of triggers from background
-  fBackSim=-1.0;          // Number of simulated showers for the background
-  
-  fSpecIndex=0.0;         // dn/dE = k * e^{- fSpecIndex}
-  fFlux0=-1.0;            // dn/dE = fFlux0 * E^{-a}
-  
-  fShowRate= ShowRate;               // Showers rate in Hz
-  fShowRateError=sqrt(ShowRate);     // Estimated error of shower rate in Hz
-  
-  fTrigRate= -1.0;        // Trigger rate in Hz
-  fTrigRateError= -1.0;   // Estimated error for the trigger rate in Hz
-} 
+MHMcRate::MHMcRate(Float_t showrate,
+                   const char *name, const char *title)
+{
+    Init(name, title);
+
+    fSpecIndex=0.0;         // dn/dE = k * e^{- fSpecIndex}
+    fFlux0=-1.0;            // dn/dE = fFlux0 * E^{-a}
+
+    fShowRate= showrate;               // Showers rate in Hz
+    fShowRateError=sqrt(showrate);     // Estimated error of shower rate in Hz
+}
 
 // --------------------------------------------------------------------------
@@ -111,43 +95,15 @@
 //  spectral index and the initial flux to SpecIndex and Flux0
 //
-MHMcRate::MHMcRate (Float_t SpecIndex, Float_t Flux0, 
-		  const char *name, const char *title)
-{
-  *fName  = name  ? name  : "MMcTriggerRate";
-  *fTitle = title ? title : "Task to calc the collection area ";
-
-  fPartId=0;              // Type of particle
-  
-  fEnergyMax=0.0;         // Maximum Energy in GeV
-  fEnergyMin=1000000.0;   // Minimum Energy in GeV
-  
-  fThetaMax=0.0;          // Maximum theta angle of run 
-  fThetaMin=370.0;        // Minimum theta angle of run
-  fPhiMax=0.0;            // Maximum phi angle of run 
-  fPhiMin=370.0;          // Minimum phi angle of run
-  
-  fImpactMax=0.0;         // Maximum impact parameter
-  fImpactMin=100000.0;    // Minimum impact parameter
-  
-  fBackTrig=-1.0;         // Number of triggers from background
-  fBackSim=-1.0;          // Number of simulated showers for the background
-  
-  fSpecIndex=SpecIndex;   // dn/dE = k * e^{- fSpecIndex}
-  fFlux0=Flux0;           // dn/dE = fFlux0 * E^{-a}
-  
-  fShowRate= -1.0;       
-  fShowRateError=0.0;     
-  
-  fTrigRate= -1.0;        // Trigger rate in Hz
-  fTrigRateError= -1.0;   // Estimated error for the trigger rate in Hz
-} 
-
-// --------------------------------------------------------------------------
-//
-//  default constructor
-//
-MHMcRate::~MHMcRate()
-{ 
-} 
+MHMcRate::MHMcRate(Float_t specindex, Float_t flux0,
+                   const char *name, const char *title)
+{
+    Init(name, title);
+
+    fSpecIndex=specindex;   // dn/dE = k * e^{- fSpecIndex}
+    fFlux0=flux0;           // dn/dE = fFlux0 * E^{-a}
+
+    fShowRate= -1.0;
+    fShowRateError=0.0;
+}
 
 // --------------------------------------------------------------------------
@@ -156,7 +112,7 @@
 //
 void MHMcRate:: SetParticle(UShort_t part)
-{ 
-  fPartId=part;
-} 
+{
+    fPartId=part;
+}
 
 // --------------------------------------------------------------------------
@@ -164,9 +120,9 @@
 //  Set the information about trigger due only to the background conditions
 //
-void MHMcRate::SetBackground (Float_t Showers, Float_t Triggers)
-{ 
-  fBackTrig=Showers;      // Number of triggers from background
-  fBackSim=Triggers;      // Number of simulated showers for the background
-} 
+void MHMcRate::SetBackground (Float_t showers, Float_t triggers)
+{
+    fBackTrig=showers;      // Number of triggers from background
+    fBackSim=triggers;      // Number of simulated showers for the background
+}
 
 // --------------------------------------------------------------------------
@@ -174,20 +130,20 @@
 //  update the limits for energy, theta, phi and impact parameter
 //
-void MHMcRate::Boundaries(Float_t Energy, Float_t Theta, 
-			 Float_t Phi, Float_t Impact)
+void MHMcRate::Boundaries(Float_t energy, Float_t theta,
+                          Float_t phi, Float_t impact)
 { 
   // It updates the limit values 
 
-  if(fThetaMax<Theta) fThetaMax=Theta;
-  if(fThetaMin>Theta) fThetaMin=Theta;
-
-  if(fPhiMax<Phi) fPhiMax=Phi;
-  if(fPhiMin>Phi) fPhiMin=Phi;
-
-  if(fImpactMax<Impact) fImpactMax=Impact;
-  if(fImpactMin>Impact) fImpactMin=Impact;
-
-  if(fEnergyMax<Energy) fEnergyMax=Energy;
-  if(fEnergyMin>Energy) fEnergyMin=Energy;
+  if (fThetaMax<theta) fThetaMax=theta;
+  if (fThetaMin>theta) fThetaMin=theta;
+
+  if (fPhiMax<phi) fPhiMax=phi;
+  if (fPhiMin>phi) fPhiMin=phi;
+
+  if (fImpactMax<impact) fImpactMax=impact;
+  if (fImpactMin>impact) fImpactMin=impact;
+
+  if (fEnergyMax<energy) fEnergyMax=energy;
+  if (fEnergyMin>energy) fEnergyMin=energy;
 
 } 
@@ -199,38 +155,38 @@
 void MHMcRate::CalcRate(Float_t trig, Float_t anal, Float_t simu) 
 { 
-  // It computes the trigger rate
-
-  // First one computes the rate of incident showers.
-  fShowRate=fFlux0/(fSpecIndex-1)*
-    (-pow(fEnergyMax,1-fSpecIndex)+pow(fEnergyMin,1-fSpecIndex));
-
-  if (fPartId!=1) 
-    fShowRate=fShowRate*(fPhiMax-fPhiMin)*
-      (cos(fThetaMax)-cos(fThetaMin));
-
-  fShowRate=fShowRate*PI_NUMBER*(fImpactMax/100.0*fImpactMax/100.0-
-				   fImpactMin/100.0*fImpactMin/100.0);
-
-  fShowRateError=sqrt(fShowRate);
-
-  // Then the trigger rate and its error is evaluated
-  if(fBackTrig<0){
-    fTrigRateError=sqrt((trig*fShowRate*fShowRate/(simu*simu))+
-		    ((1.0-anal*160.0e-9)*
-		     (1.0-anal*160.0e-9)*1/
-		     (fBackSim*fBackSim*160.0e-9*fBackSim*160.0e-9))); 
-    fBackTrig=0;
-  }
-  else
-    fTrigRateError=sqrt((trig*fShowRate*fShowRate/(simu*simu))+
-		       ((1.0-anal*160.0e-9)*
-			(1.0-anal*160.0e-9)*fBackTrig/
-			(fBackSim*160.0e-9*fBackSim*160.0e-9))); 
-  
-  fTrigRate=trig*fShowRate/simu+
-      (1.0-anal*160.0e-9)*fBackTrig/
-      (fBackSim*160.0e-9);
-
-} 
+    // It computes the trigger rate
+
+    // First one computes the rate of incident showers.
+    const Double_t specidx = 1.0-fSpecIndex;
+
+    const Double_t epowmax = pow(fEnergyMax, specidx);
+    const Double_t epowmin = pow(fEnergyMin, specidx);
+
+    fShowRate = fFlux0/specidx*(epowmax-epowmin);
+
+    if (fPartId!=1)
+        fShowRate *= (fPhiMax-fPhiMin)*(cos(fThetaMax)-cos(fThetaMin));
+
+    const Double_t impactdiff = fImpactMax-fImpactMin;
+
+    fShowRate *= TMath::Pi()*(impactdiff/100.0*impactdiff/100.0);
+
+    fShowRateError = sqrt(fShowRate);
+
+    const Double_t anal2 = 1.0-anal*160.0e-9;
+    const Double_t back2 = fBackSim*160.0e-9;
+
+    // Then the trigger rate and its error is evaluated
+    if(fBackTrig<0){
+        fTrigRateError = sqrt((trig*fShowRate*fShowRate/(simu*simu)) +
+                              (anal2*anal2*1/(fBackSim*back2*back2)));
+        fBackTrig=0;
+    }
+    else
+        fTrigRateError = sqrt((trig*fShowRate*fShowRate/(simu*simu)) +
+                              (anal2*anal2*fBackTrig/(back2*back2)));
+
+    fTrigRate = trig*fShowRate/simu + anal2*fBackTrig/back2;
+}
 
 // --------------------------------------------------------------------------
@@ -240,7 +196,6 @@
 void MHMcRate::Print()
 {
-  *fLog<<"Incident rate "<<fShowRate<<" Hz "<<endl;
-  *fLog<<endl<<"Trigger Rate "<<fTrigRate<<" +- "<<fTrigRateError<<" Hz"<<endl;
-
+    *fLog << "Incident rate " << fShowRate << " Hz " << endl;
+    *fLog << "Trigger Rate " << fTrigRate << " +- " << fTrigRateError << " Hz" << endl;
 }
 
@@ -251,4 +206,4 @@
 void MHMcRate::Draw(Option_t* option) 
 { 
-  *fLog<<"To be iplemented"<<endl;
+  *fLog << "To be iplemented" << endl;
 } 
Index: /trunk/MagicSoft/Mars/mhist/MHMcRate.h
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHMcRate.h	(revision 895)
+++ /trunk/MagicSoft/Mars/mhist/MHMcRate.h	(revision 896)
@@ -39,4 +39,6 @@
   Float_t fTrigRateError;   // Estimated error for the trigger rate in Hz
 
+  void Init(const char *name, const char *title);
+
  public: 
   
