#include "hparamlist.h"
#include "hrichanalysispar.h"
#include <iomanip>
#include <iostream>
#include <string.h>
using namespace std;
ClassImp(HRichAnalysisPar)
HRichAnalysisPar::HRichAnalysisPar(const Char_t* name, const Char_t* title,
                                   const Char_t* context)
   : HParCond(name, title, context)
{
   clear();
}
HRichAnalysisPar::~HRichAnalysisPar()
{
   clear();
}
void HRichAnalysisPar::clear()
{
   iCutOffThresheold = 0;
   iRingMatrixSize = 0;
   iRingMaskSize = 0;
   iRingRadius = 0;
   iRingRadiusError = 0;
   isActiveCleanAlonePad = 0;
   iCleanAlonePadBorder = 0;
   iCleanAlonePadLowerThreshold = 0;
   isActiveCleanHighPulse = 0;
   iCleanHighPulseBorder = 0;
   iCleanHighPulseUpperThreshold = 0;
   maxFiredSectorPads = 0;
   isActiveBorderAmplitReduction = 0;
   isActiveLabelPads = 0;
   iLabeledPadsDistance = 0;
   isActiveTestAsymmetry = 0;
   isActiveTestDensity = 0;
   fThresholdDensity = 0.;
   fSurfaceArea = 0.;
   isActiveDynamicThrAmplitude = 0;
   fLowerAmplFactor = 0.;
   fFormulaParam1 = 0.;
   fFormulaParam2 = 0.;
   fFormulaParam3 = 0.;
   isActiveFiredRingPadsRatio = 0;
   fFiredRingPadsRatio = 0.;
   isActiveTestCharge = 0;
   fRingMinCharge = 0.;
   fRingMaxCharge = 0.;
   isActiveFakesRejection = 0;
   fFakeQualityRatio = 0.;
   fFakeCentroidCut = 0.;
   iSuperiorAlgorithmID = 0;
   isActiveRingFindFitMatrix = 0;
   iMinimalFitMatrixRingQuality = 0;
   iMinimalFitMatrixRingDistance = 0;
   iHowManyFitMatrixRings = 0;
   isActiveRingHoughTransf = 0;
   iMinimalHoughTransfRingQuality = 0;
   iMinimalHoughTransfRingDistance = 0;
   iHowManyHoughTransfRings = 0;
   fAmpCorrFac.Set(6);
   fAmpCorrFac.Reset(1.F);
}
void HRichAnalysisPar::defaultInit()
{
   clear();
}
void HRichAnalysisPar::printParams()
{
   cout << endl << endl;
   cout << "$RING PARAMETERS$" << endl;
   cout << "\tRing radius       = " << iRingRadius << endl;
   cout << "\tRing radius error = " << iRingRadiusError << endl << endl;
   cout << "$PAD CLEANING$" << endl;
   cout << "\tClean Alone Pad lower threshold  = " << iCleanAlonePadLowerThreshold << endl;
   cout << "\tClean High Pulse upper threshold = " << iCleanHighPulseUpperThreshold << endl << endl;
   cout << "$PATTERN MATRIX$" << endl;
   if (isActiveRingFindFitMatrix) {
      cout << "\tMinimal Ring Quality in Pattern Matrix         = " << iMinimalFitMatrixRingQuality << endl;
      cout << "\tMinimal Rings Distances in Pattern Matrix      = " << iMinimalFitMatrixRingDistance << endl;
      cout << "\tNumber of Rings to be sought by Pattern Matrix = " << iHowManyFitMatrixRings << endl << endl;
   } else {
      cout << "\t(not active)" << endl << endl;
   }
   cout << "$HOUGH TRANSFORM$" << endl;
   if (isActiveRingHoughTransf) {
      cout << "\tMinimal Ring Quality in Hough Transform         = " << iMinimalHoughTransfRingQuality << endl;
      cout << "\tMinimal Rings Distances in Hough Transform      = " << iMinimalHoughTransfRingDistance << endl;
      cout << "\tNumber of Rings to be sought by Hough Transform = " << iHowManyHoughTransfRings << endl << endl;
   } else {
      cout << "\t(not active)" << endl << endl;
   }
   cout << "$RING TESTS$" << endl;
   if (isActiveTestDensity) cout << "\tRing Test Density                 = yes" << endl;
   else cout << "\tRing Test Density                 = no" << endl;
   if (isActiveBorderAmplitReduction) cout << "\tAmplitude reduction at the border = yes" << endl;
   else cout << "\tAmplitude reduction at the border = no" << endl;
   if (isActiveDynamicThrAmplitude) cout << "\tDynamic Amplitude Threshold       = yes" << endl;
   else cout << "\tDynamic Amplitude Threshold       = no" << endl;
   if (isActiveFiredRingPadsRatio) cout << "\tFired Pads Ratio in ring          = yes" << endl;
   else cout << "\tFired Pads Ratio in ring          = no" << endl;
   if (isActiveTestAsymmetry) cout << "\tTest Ring Asymmetry               = yes" << endl;
   else cout << "\tTest Ring Asymmetry               = no" << endl;
   if (isActiveTestCharge) cout << "\tTest Ring Charge                  = yes" << endl;
   else cout << "\tTest Ring Charge                  = no" << endl;
   if (isActiveFakesRejection) cout << "\tFakes Rejection                   = yes" << endl;
   else cout << "\tFakes Rejection                   = no" << endl << endl;
   Info("printParams", "RICH ANALYSIS PARAMETERS\n");
   cout << " iCutOffThresheold.................." << iCutOffThresheold << endl;
   cout << " iRingRadius........................" << iRingRadius << endl;
   cout << " iRingMatrixSize...................." << iRingMatrixSize << endl;
   cout << " iRingMaskSize......................" << iRingMaskSize << endl;
   cout << " isActiveCleanAlonePad.............." << isActiveCleanAlonePad << endl;
   cout << " iCleanAlonePadBorder..............." << iCleanAlonePadBorder << endl;
   cout << " iCleanAlonePadLowerThreshold......." << iCleanAlonePadLowerThreshold << endl;
   cout << " isActiveCleanHighPulse............." << isActiveCleanHighPulse << endl;
   cout << " iCleanHighPulseBorder.............." << iCleanHighPulseBorder << endl;
   cout << " iCleanHighPulseUpperThreshold......" << iCleanHighPulseUpperThreshold << endl;
   cout << " isActiveLabelPads.................." << isActiveLabelPads << endl;
   cout << " iLabeledPadsDistance..............." << iLabeledPadsDistance << endl;
   cout << " maxFiredSectorPads................." << maxFiredSectorPads << endl;
   cout << " isActiveBorderAmplitReduction......" << isActiveBorderAmplitReduction << endl;
   cout << " isActiveTestDensity................" << isActiveTestDensity << endl;
   cout << " fThresholdDensity.................." << fThresholdDensity << endl;
   cout << " fSurfaceArea......................." << fSurfaceArea << endl;
   cout << " isActiveDynamicThrAmplitude........" << isActiveDynamicThrAmplitude << endl;
   cout << " fLowerAmplFactor..................." << fLowerAmplFactor << endl;
   cout << " fFormulaParam1....................." << fFormulaParam1 << endl;
   cout << " fFormulaParam2....................." << fFormulaParam2 << endl;
   cout << " fFormulaParam3....................." << fFormulaParam3 << endl;
   cout << " isActiveFiredRingPadsRatio........." << isActiveFiredRingPadsRatio << endl;
   cout << " fFiredRingPadsRatio................" << fFiredRingPadsRatio << endl;
   cout << " isActiveTestAsymmetry.............." << isActiveTestAsymmetry << endl;
   cout << " isActiveTestCharge................." << isActiveTestCharge << endl;
   cout << " fRingMinCharge....................." << fRingMinCharge << endl;
   cout << " fRingMaxCharge....................." << fRingMaxCharge << endl;
   cout << " isActiveFakesRejection............." << isActiveFakesRejection << endl;
   cout << " fFakeQualityRatio.................." << fFakeQualityRatio << endl;
   cout << " fFakeCentroidCut..................." << fFakeCentroidCut << endl;
   cout << " iSuperiorAlgorithmID..............." << iSuperiorAlgorithmID << endl;
   cout << " isActiveRingFindFitMatrix.........." << isActiveRingFindFitMatrix << endl;
   cout << " iMinimalFitMatrixRingQuality......." << iMinimalFitMatrixRingQuality << endl;
   cout << " iMinimalFitMatrixRingDistance......" << iMinimalFitMatrixRingDistance << endl;
   cout << " iHowManyFitMatrixRings............." << iHowManyFitMatrixRings << endl;
   cout << " isActiveRingHoughTransf............" << isActiveRingHoughTransf << endl;
   cout << " iMinimalHoughTransfRingQuality....." << iMinimalHoughTransfRingQuality << endl;
   cout << " iMinimalHoughTransfRingDistance...." << iMinimalHoughTransfRingDistance << endl;
   cout << " iHowManyHoughTransfRings..........." << iHowManyHoughTransfRings << endl << endl;
   cout << " fAmpCorrFac........................";
   for (Int_t i = 0; i < 6; ++i) {
     cout << " " << fAmpCorrFac.At(i);
     cout << endl << endl;
   }
}
void HRichAnalysisPar::putParams(HParamList* l)
{
   if (!l) return;
   l->add("iCutOffThresheold", iCutOffThresheold);
   l->add("iRingRadius", iRingRadius);
   l->add("iRingRadiusError", iRingRadiusError);
   l->add("iRingMatrixSize", iRingMatrixSize);
   l->add("iRingMatrix", iRingMatrix);
   l->add("iRingMaskSize", iRingMaskSize);
   l->add("iRingMask", iRingMask);
   l->add("isActiveCleanAlonePad", isActiveCleanAlonePad);
   l->add("iCleanAlonePadBorder", iCleanAlonePadBorder);
   l->add("iCleanAlonePadLowerThreshold", iCleanAlonePadLowerThreshold);
   l->add("isActiveCleanHighPulse", isActiveCleanHighPulse);
   l->add("iCleanHighPulseBorder", iCleanHighPulseBorder);
   l->add("iCleanHighPulseUpperThreshold", iCleanHighPulseUpperThreshold);
   l->add("isActiveLabelPads", isActiveLabelPads);
   l->add("iLabeledPadsDistance", iLabeledPadsDistance);
   l->add("maxFiredSectorPads", maxFiredSectorPads);
   l->add("isActiveBorderAmplitReduction", isActiveBorderAmplitReduction);
   l->add("isActiveTestDensity", isActiveTestDensity);
   l->add("fThresholdDensity", fThresholdDensity);
   l->add("fSurfaceArea", fSurfaceArea);
   l->add("isActiveDynamicThrAmplitude", isActiveDynamicThrAmplitude);
   l->add("fLowerAmplFactor", fLowerAmplFactor);
   l->add("fFormulaParam1", fFormulaParam1);
   l->add("fFormulaParam2", fFormulaParam2);
   l->add("fFormulaParam3", fFormulaParam3);
   l->add("isActiveFiredRingPadsRatio", isActiveFiredRingPadsRatio);
   l->add("fFiredRingPadsRatio", fFiredRingPadsRatio);
   l->add("isActiveTestAsymmetry", isActiveTestAsymmetry);
   l->add("isActiveTestCharge", isActiveTestCharge);
   l->add("fRingMinCharge", fRingMinCharge);
   l->add("fRingMaxCharge", fRingMaxCharge);
   l->add("isActiveFakesRejection", isActiveFakesRejection);
   l->add("fFakeQualityRatio", fFakeQualityRatio);
   l->add("fFakeCentroidCut", fFakeCentroidCut);
   l->add("iSuperiorAlgorithmID", iSuperiorAlgorithmID);
   l->add("isActiveRingFindFitMatrix", isActiveRingFindFitMatrix);
   l->add("iMinimalFitMatrixRingQuality", iMinimalFitMatrixRingQuality);
   l->add("iMinimalFitMatrixRingDistance", iMinimalFitMatrixRingDistance);
   l->add("iHowManyFitMatrixRings", iHowManyFitMatrixRings);
   l->add("isActiveRingHoughTransf", isActiveRingHoughTransf);
   l->add("iMinimalHoughTransfRingQuality", iMinimalHoughTransfRingQuality);
   l->add("iMinimalHoughTransfRingDistance", iMinimalHoughTransfRingDistance);
   l->add("iHowManyHoughTransfRings", iHowManyHoughTransfRings);
   l->add("fAmpCorrFac", fAmpCorrFac);
}
Bool_t HRichAnalysisPar::getParams(HParamList* l)
{
   if (!l) return kFALSE;
   if (!l->fill("iCutOffThresheold", &iCutOffThresheold)) return kFALSE;
   if (!l->fill("iRingRadius", &iRingRadius)) return kFALSE;
   if (!l->fill("iRingRadiusError", &iRingRadiusError)) return kFALSE;
   if (!l->fill("iRingMatrixSize", &iRingMatrixSize)) return kFALSE;
   if (!l->fill("iRingMatrix", &iRingMatrix)) return kFALSE;
   if (!l->fill("iRingMaskSize", &iRingMaskSize)) return kFALSE;
   if (!l->fill("iRingMask", &iRingMask)) return kFALSE;
   if (!l->fill("isActiveCleanAlonePad", &isActiveCleanAlonePad)) return kFALSE;
   if (!l->fill("iCleanAlonePadBorder", &iCleanAlonePadBorder)) return kFALSE;
   if (!l->fill("iCleanAlonePadLowerThreshold", &iCleanAlonePadLowerThreshold)) return kFALSE;
   if (!l->fill("isActiveCleanHighPulse", &isActiveCleanHighPulse)) return kFALSE;
   if (!l->fill("iCleanHighPulseBorder", &iCleanHighPulseBorder)) return kFALSE;
   if (!l->fill("iCleanHighPulseUpperThreshold", &iCleanHighPulseUpperThreshold)) return kFALSE;
   if (!l->fill("isActiveLabelPads", &isActiveLabelPads)) return kFALSE;
   if (!l->fill("iLabeledPadsDistance", &iLabeledPadsDistance)) return kFALSE;
   if (!l->fill("maxFiredSectorPads", &maxFiredSectorPads)) return kFALSE;
   if (!l->fill("isActiveBorderAmplitReduction", &isActiveBorderAmplitReduction)) return kFALSE;
   if (!l->fill("isActiveTestDensity", &isActiveTestDensity)) return kFALSE;
   if (!l->fill("fThresholdDensity", &fThresholdDensity)) return kFALSE;
   if (!l->fill("fSurfaceArea", &fSurfaceArea)) return kFALSE;
   if (!l->fill("isActiveDynamicThrAmplitude", &isActiveDynamicThrAmplitude)) return kFALSE;
   if (!l->fill("fLowerAmplFactor", &fLowerAmplFactor)) return kFALSE;
   if (!l->fill("fFormulaParam1", &fFormulaParam1)) return kFALSE;
   if (!l->fill("fFormulaParam2", &fFormulaParam2)) return kFALSE;
   if (!l->fill("fFormulaParam3", &fFormulaParam3)) return kFALSE;
   if (!l->fill("isActiveFiredRingPadsRatio", &isActiveFiredRingPadsRatio)) return kFALSE;
   if (!l->fill("fFiredRingPadsRatio", &fFiredRingPadsRatio)) return kFALSE;
   if (!l->fill("isActiveTestAsymmetry", &isActiveTestAsymmetry)) return kFALSE;
   if (!l->fill("isActiveTestCharge", &isActiveTestCharge)) return kFALSE;
   if (!l->fill("fRingMinCharge", &fRingMinCharge)) return kFALSE;
   if (!l->fill("fRingMaxCharge", &fRingMaxCharge)) return kFALSE;
   if (!l->fill("isActiveFakesRejection", &isActiveFakesRejection)) return kFALSE;
   if (!l->fill("fFakeQualityRatio", &fFakeQualityRatio)) return kFALSE;
   if (!l->fill("fFakeCentroidCut", &fFakeCentroidCut)) return kFALSE;
   if (!l->fill("iSuperiorAlgorithmID", &iSuperiorAlgorithmID)) return kFALSE;
   if (!l->fill("isActiveRingFindFitMatrix", &isActiveRingFindFitMatrix)) return kFALSE;
   if (!l->fill("iMinimalFitMatrixRingQuality", &iMinimalFitMatrixRingQuality)) return kFALSE;
   if (!l->fill("iMinimalFitMatrixRingDistance", &iMinimalFitMatrixRingDistance)) return kFALSE;
   if (!l->fill("iHowManyFitMatrixRings", &iHowManyFitMatrixRings)) return kFALSE;
   if (!l->fill("isActiveRingHoughTransf", &isActiveRingHoughTransf)) return kFALSE;
   if (!l->fill("iMinimalHoughTransfRingQuality", &iMinimalHoughTransfRingQuality)) return kFALSE;
   if (!l->fill("iMinimalHoughTransfRingDistance", &iMinimalHoughTransfRingDistance)) return kFALSE;
   if (!l->fill("iHowManyHoughTransfRings", &iHowManyHoughTransfRings)) return kFALSE;
   if (!l->fill("fAmpCorrFac", &fAmpCorrFac)) return kFALSE;
   return kTRUE;
}
void HRichAnalysisPar::Streamer(TBuffer &R__b)
{
   
   UInt_t R__s, R__c;
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
      HParCond::Streamer(R__b);
      R__b >> iCutOffThresheold;
      R__b >> iRingRadius;
      R__b >> iRingRadiusError;
      R__b >> iRingMatrixSize;
      iRingMatrix.Streamer(R__b);
      R__b >> iRingMaskSize;
      iRingMask.Streamer(R__b);
      R__b >> isActiveCleanAlonePad;
      R__b >> iCleanAlonePadBorder;
      R__b >> iCleanAlonePadLowerThreshold;
      R__b >> isActiveCleanHighPulse;
      R__b >> iCleanHighPulseBorder;
      R__b >> iCleanHighPulseUpperThreshold;
      R__b >> isActiveLabelPads;
      R__b >> iLabeledPadsDistance;
      R__b >> maxFiredSectorPads;
      R__b >> isActiveBorderAmplitReduction;
      R__b >> isActiveTestDensity;
      R__b >> fThresholdDensity;
      R__b >> fSurfaceArea;
      R__b >> isActiveDynamicThrAmplitude;
      R__b >> fLowerAmplFactor;
      R__b >> fFormulaParam1;
      R__b >> fFormulaParam2;
      R__b >> fFormulaParam3;
      R__b >> isActiveFiredRingPadsRatio;
      R__b >> fFiredRingPadsRatio;
      R__b >> isActiveTestAsymmetry;
      R__b >> isActiveTestCharge;
      R__b >> fRingMinCharge;
      R__b >> fRingMaxCharge;
      R__b >> isActiveFakesRejection;
      R__b >> fFakeQualityRatio;
      R__b >> fFakeCentroidCut;
      R__b >> iSuperiorAlgorithmID;
      R__b >> isActiveRingFindFitMatrix;
      R__b >> iMinimalFitMatrixRingQuality;
      R__b >> iMinimalFitMatrixRingDistance;
      R__b >> iHowManyFitMatrixRings;
      R__b >> isActiveRingHoughTransf;
      R__b >> iMinimalHoughTransfRingQuality;
      R__b >> iMinimalHoughTransfRingDistance;
      R__b >> iHowManyHoughTransfRings;
      if (R__v > 1) fAmpCorrFac.Streamer(R__b);
      else          fAmpCorrFac.Reset(1.F);
      R__b.ReadStaticArray((char*)filename);
      R__b.CheckByteCount(R__s, R__c, HRichAnalysisPar::IsA());
   } else {
      R__c = R__b.WriteVersion(HRichAnalysisPar::IsA(), kTRUE);
      HParCond::Streamer(R__b);
      R__b << iCutOffThresheold;
      R__b << iRingRadius;
      R__b << iRingRadiusError;
      R__b << iRingMatrixSize;
      iRingMatrix.Streamer(R__b);
      R__b << iRingMaskSize;
      iRingMask.Streamer(R__b);
      R__b << isActiveCleanAlonePad;
      R__b << iCleanAlonePadBorder;
      R__b << iCleanAlonePadLowerThreshold;
      R__b << isActiveCleanHighPulse;
      R__b << iCleanHighPulseBorder;
      R__b << iCleanHighPulseUpperThreshold;
      R__b << isActiveLabelPads;
      R__b << iLabeledPadsDistance;
      R__b << maxFiredSectorPads;
      R__b << isActiveBorderAmplitReduction;
      R__b << isActiveTestDensity;
      R__b << fThresholdDensity;
      R__b << fSurfaceArea;
      R__b << isActiveDynamicThrAmplitude;
      R__b << fLowerAmplFactor;
      R__b << fFormulaParam1;
      R__b << fFormulaParam2;
      R__b << fFormulaParam3;
      R__b << isActiveFiredRingPadsRatio;
      R__b << fFiredRingPadsRatio;
      R__b << isActiveTestAsymmetry;
      R__b << isActiveTestCharge;
      R__b << fRingMinCharge;
      R__b << fRingMaxCharge;
      R__b << isActiveFakesRejection;
      R__b << fFakeQualityRatio;
      R__b << fFakeCentroidCut;
      R__b << iSuperiorAlgorithmID;
      R__b << isActiveRingFindFitMatrix;
      R__b << iMinimalFitMatrixRingQuality;
      R__b << iMinimalFitMatrixRingDistance;
      R__b << iHowManyFitMatrixRings;
      R__b << isActiveRingHoughTransf;
      R__b << iMinimalHoughTransfRingQuality;
      R__b << iMinimalHoughTransfRingDistance;
      R__b << iHowManyHoughTransfRings;
      fAmpCorrFac.Streamer(R__b);
      R__b.WriteArray(filename, 40);
      R__b.SetByteCount(R__c, kTRUE);
   }
}