#include "FitBeam.h"

//----------------------------------------------------------------------------
std::string FitBeam::BeamTypeAsString(FitBeam_t beam)
{
   switch (beam) 
   {
   case kUnknown:             return "Unknown";    break;
   case kNuMuLE000z200i:      return "le000z200i"; break;
   case kNuMuLE010z000i:      return "le010z000i"; break;
   case kNuMuLE010z170i:      return "le010z170i"; break;
   case kNuMuLE010z185i:      return "le010z185i"; break;
   case kNuMuLE010z185iN:      return "le010z185iN"; break;
   case kNuMuLE010z200i:      return "le010z200i"; break;
   case kNuMuLE100z200i:      return "le100z200i"; break;
   case kNuMuLE150z200i:      return "le150z200i"; break;
   case kNuMuLE250z200i:      return "le250z200i"; break;
   case kNuMuLE250z200iN:     return "le250z200iN"; break;
   case kAntiNuMuLE000z200i:  return "le000z200i"; break;
   case kAntiNuMuLE010z000i:  return "le010z000i"; break;
   case kAntiNuMuLE010z170i:  return "le010z170i"; break;
   case kAntiNuMuLE010z185i:  return "le010z185i"; break;
   case kAntiNuMuLE010z185iN:  return "le010z185iN"; break;
   case kAntiNuMuLE010z200i:  return "le010z200i"; break;
   case kAntiNuMuLE100z200i:  return "le100z200i"; break;
   case kAntiNuMuLE150z200i:  return "le150z200i"; break;
   case kAntiNuMuLE250z200i:  return "le250z200i"; break;
   case kAntiNuMuLE250z200iN: return "le250z200iN"; break;
   case kBeamNueLE000z200i:   return "le000z200i"; break;
   case kBeamNueLE010z000i:   return "le010z000i"; break;
   case kBeamNueLE010z170i:   return "le010z170i"; break;
   case kBeamNueLE010z185i:   return "le010z185i"; break;
   case kBeamNueLE010z185iN:   return "le010z185iN"; break;
   case kBeamNueLE010z200i:   return "le010z200i"; break;
   case kBeamNueLE100z200i:   return "le100z200i"; break;
   case kBeamNueLE150z200i:   return "le150z200i"; break;
   case kBeamNueLE250z200i:   return "le250z200i"; break;
   case kBeamNueLE250z200iN:   return "le250z200iN"; break;
   default:                   return "Unknown";    break;
   }

   return "Unknown";
}
std::string FitBeam::NeutrinoTypeAsString(FitBeam_t beam)
{
   switch (beam) 
   {
   case kUnknown:             return "Unknown";   break;
   case kNuMuLE000z200i:      return "NuMu";      break;
   case kNuMuLE010z000i:      return "NuMu";      break;
   case kNuMuLE010z170i:      return "NuMu";      break;
   case kNuMuLE010z185i:      return "NuMu";      break;
   case kNuMuLE010z185iN:      return "NuMu";      break;
   case kNuMuLE010z200i:      return "NuMu";      break;
   case kNuMuLE100z200i:      return "NuMu";      break;
   case kNuMuLE150z200i:      return "NuMu";      break;
   case kNuMuLE250z200i:      return "NuMu";      break;
   case kNuMuLE250z200iN:     return "NuMu";      break;
   case kAntiNuMuLE000z200i:  return "AntiNuMu";  break;
   case kAntiNuMuLE010z000i:  return "AntiNuMu";  break;
   case kAntiNuMuLE010z170i:  return "AntiNuMu";  break;
   case kAntiNuMuLE010z185i:  return "AntiNuMu";  break;
   case kAntiNuMuLE010z185iN:  return "AntiNuMu";  break;
   case kAntiNuMuLE010z200i:  return "AntiNuMu";  break;
   case kAntiNuMuLE100z200i:  return "AntiNuMu";  break;
   case kAntiNuMuLE150z200i:  return "AntiNuMu";  break;
   case kAntiNuMuLE250z200i:  return "AntiNuMu";  break;
   case kAntiNuMuLE250z200iN: return "AntiNuMu";  break;
   case kBeamNueLE000z200i:   return "BeamNue";   break;
   case kBeamNueLE010z000i:   return "BeamNue";   break;
   case kBeamNueLE010z170i:   return "BeamNue";   break;
   case kBeamNueLE010z185i:   return "BeamNue";   break;
   case kBeamNueLE010z185iN:   return "BeamNue";   break;
   case kBeamNueLE010z200i:   return "BeamNue";   break;
   case kBeamNueLE100z200i:   return "BeamNue";   break;
   case kBeamNueLE150z200i:   return "BeamNue";   break;
   case kBeamNueLE250z200i:   return "BeamNue";   break;
   case kBeamNueLE250z200iN:  return "BeamNue";   break;
   default:                   return "Unknown";   break;
   }

   return "Unknown";
}

Int_t FitBeam::AsInt(FitBeam_t beam)
{
  switch (beam)
    {
    case kUnknown:             return Int_t(kUnknown);             break;
    case kNuMuLE000z200i:      return Int_t(kNuMuLE000z200i);      break;
    case kNuMuLE010z000i:      return Int_t(kNuMuLE010z000i);      break;
    case kNuMuLE010z170i:      return Int_t(kNuMuLE010z170i);      break;
    case kNuMuLE010z185i:      return Int_t(kNuMuLE010z185i);      break;
    case kNuMuLE010z185iN:      return Int_t(kNuMuLE010z185iN);      break;
    case kNuMuLE010z200i:      return Int_t(kNuMuLE010z200i);      break;
    case kNuMuLE100z200i:      return Int_t(kNuMuLE100z200i);      break;
    case kNuMuLE150z200i:      return Int_t(kNuMuLE150z200i);      break;
    case kNuMuLE250z200i:      return Int_t(kNuMuLE250z200i);      break;
    case kNuMuLE250z200iN:      return Int_t(kNuMuLE250z200iN);      break;
    case kAntiNuMuLE000z200i:  return Int_t(kAntiNuMuLE000z200i);  break;
    case kAntiNuMuLE010z000i:  return Int_t(kAntiNuMuLE010z000i);  break;
    case kAntiNuMuLE010z170i:  return Int_t(kAntiNuMuLE010z170i);  break;
    case kAntiNuMuLE010z185i:  return Int_t(kAntiNuMuLE010z185i);  break;
    case kAntiNuMuLE010z185iN:  return Int_t(kAntiNuMuLE010z185iN);  break;
    case kAntiNuMuLE010z200i:  return Int_t(kAntiNuMuLE010z200i);  break;
    case kAntiNuMuLE100z200i:  return Int_t(kAntiNuMuLE100z200i);  break;
    case kAntiNuMuLE150z200i:  return Int_t(kAntiNuMuLE150z200i);  break;
    case kAntiNuMuLE250z200i:  return Int_t(kAntiNuMuLE250z200i);  break;
    case kAntiNuMuLE250z200iN:  return Int_t(kAntiNuMuLE250z200iN);  break;
    case kBeamNueLE000z200i:   return Int_t(kBeamNueLE000z200i);   break;
    case kBeamNueLE010z000i:   return Int_t(kBeamNueLE010z000i);   break;
    case kBeamNueLE010z170i:   return Int_t(kBeamNueLE010z170i);   break;
    case kBeamNueLE010z185i:   return Int_t(kBeamNueLE010z185i);   break;
    case kBeamNueLE010z185iN:   return Int_t(kBeamNueLE010z185iN);   break;
    case kBeamNueLE010z200i:   return Int_t(kBeamNueLE010z200i);   break;
    case kBeamNueLE100z200i:   return Int_t(kBeamNueLE100z200i);   break;
    case kBeamNueLE150z200i:   return Int_t(kBeamNueLE150z200i);   break;
    case kBeamNueLE250z200i:   return Int_t(kBeamNueLE250z200i);   break;
    case kBeamNueLE250z200iN:  return Int_t(kBeamNueLE250z200iN);   break;
    default:                   return Int_t(kUnknown);             break;
    }
}
FitBeam::FitBeam_t FitBeam::IntToEnum(Int_t beamint)
{
  switch (beamint)
    {
    case 0:     return kUnknown;             break;
    case 5601:  return kNuMuLE000z200i;      break;
    case 5608:  return kNuMuLE010z000i;      break;
    case 5606:  return kNuMuLE010z170i;      break;
    case 5602:  return kNuMuLE010z185i;      break;
    case 5611:  return kNuMuLE010z185iN;      break;
    case 5607:  return kNuMuLE010z200i;      break;
    case 5603:  return kNuMuLE100z200i;      break;
    case 5609:  return kNuMuLE150z200i;      break;
    case 5604:  return kNuMuLE250z200i;      break;
    case 5610:  return kNuMuLE250z200iN;     break;
    case 5501:  return kAntiNuMuLE000z200i;  break;
    case 5508:  return kAntiNuMuLE010z000i;  break;
    case 5506:  return kAntiNuMuLE010z170i;  break;
    case 5502:  return kAntiNuMuLE010z185i;  break;
    case 5511:  return kAntiNuMuLE010z185iN;  break;
    case 5507:  return kAntiNuMuLE010z200i;  break;
    case 5503:  return kAntiNuMuLE100z200i;  break;
    case 5509:  return kAntiNuMuLE150z200i;  break;
    case 5504:  return kAntiNuMuLE250z200i;  break;
    case 5510:  return kAntiNuMuLE250z200iN;  break;
    case 5301:  return kBeamNueLE000z200i;   break;
    case 5308:  return kBeamNueLE010z000i;   break;
    case 5306:  return kBeamNueLE010z170i;   break;
    case 5302:  return kBeamNueLE010z185i;   break;
    case 5311:  return kBeamNueLE010z185iN;   break;
    case 5307:  return kBeamNueLE010z200i;   break;
    case 5303:  return kBeamNueLE100z200i;   break;
    case 5309:  return kBeamNueLE150z200i;   break;
    case 5304:  return kBeamNueLE250z200i;   break;
    case 5310:  return kBeamNueLE250z200iN;  break;
    default:    return kUnknown;             break;
    }
}

FitBeam::FitBeam_t FitBeam::StringToEnum(std::string beamstring)
{   
  if (beamstring=="") {                         return kUnknown;            }
  else if (beamstring=="NuMuLE000z200i") {      return kNuMuLE000z200i;     }
  else if (beamstring=="NuMuLE010z000i") {      return kNuMuLE010z000i;     }
  else if (beamstring=="NuMuLE010z170i") {      return kNuMuLE010z170i;     }
  else if (beamstring=="NuMuLE010z185i") {      return kNuMuLE010z185i;     }
  else if (beamstring=="NuMuLE010z185iN") {      return kNuMuLE010z185iN;     }
  else if (beamstring=="NuMuLE010z200i") {      return kNuMuLE010z200i;     }
  else if (beamstring=="NuMuLE100z200i") {      return kNuMuLE100z200i;     }
  else if (beamstring=="NuMuLE150z200i") {      return kNuMuLE150z200i;     }
  else if (beamstring=="NuMuLE250z200i") {      return kNuMuLE250z200i;     }
  else if (beamstring=="NuMuLE250z200iN") {      return kNuMuLE250z200iN;     }
  else if (beamstring=="AntiNuMuLE000z200i") {  return kAntiNuMuLE000z200i; }
  else if (beamstring=="AntiNuMuLE010z000i") {  return kAntiNuMuLE010z000i; }
  else if (beamstring=="AntiNuMuLE010z170i") {  return kAntiNuMuLE010z170i; }
  else if (beamstring=="AntiNuMuLE010z185i") {  return kAntiNuMuLE010z185i; }
  else if (beamstring=="AntiNuMuLE010z185iN") {  return kAntiNuMuLE010z185iN; }
  else if (beamstring=="AntiNuMuLE010z200i") {  return kAntiNuMuLE010z200i; }
  else if (beamstring=="AntiNuMuLE100z200i") {  return kAntiNuMuLE100z200i; }
  else if (beamstring=="AntiNuMuLE150z200i") {  return kAntiNuMuLE150z200i; }
  else if (beamstring=="AntiNuMuLE250z200i") {  return kAntiNuMuLE250z200i; }
  else if (beamstring=="AntiNuMuLE250z200iN") {  return kAntiNuMuLE250z200iN; }
  else if (beamstring=="BeamNueLE000z200i") {  return kBeamNueLE000z200i; }
  else if (beamstring=="BeamNueLE010z000i") {  return kBeamNueLE010z000i; }
  else if (beamstring=="BeamNueLE010z170i") {  return kBeamNueLE010z170i; }
  else if (beamstring=="BeamNueLE010z185i") {  return kBeamNueLE010z185i; }
  else if (beamstring=="BeamNueLE010z185iN") {  return kBeamNueLE010z185iN; }
  else if (beamstring=="BeamNueLE010z200i") {  return kBeamNueLE010z200i; }
  else if (beamstring=="BeamNueLE100z200i") {  return kBeamNueLE100z200i; }
  else if (beamstring=="BeamNueLE150z200i") {  return kBeamNueLE150z200i; }
  else if (beamstring=="BeamNueLE250z200i") {  return kBeamNueLE250z200i; }
  else if (beamstring=="BeamNueLE250z200iN") {  return kBeamNueLE250z200iN; }
  else  return kUnknown;       
}

Int_t FitBeam::AsZbeamCode(FitBeam_t beam){
  switch (beam)
    {
    case kUnknown:             return 0;  break;
    case kNuMuLE000z200i:      return 1;  break;
    case kNuMuLE010z000i:      return 8;  break;
    case kNuMuLE010z170i:      return 6;  break;
    case kNuMuLE010z185i:      return 2;  break;
    case kNuMuLE010z185iN:      return 2;  break;
    case kNuMuLE010z200i:      return 7;  break;
    case kNuMuLE100z200i:      return 3;  break;
    case kNuMuLE150z200i:      return 9;  break;
    case kNuMuLE250z200i:      return 4;  break;
    case kNuMuLE250z200iN:     return 4;  break;
    case kAntiNuMuLE000z200i:  return 1;  break;
    case kAntiNuMuLE010z000i:  return 8;  break;
    case kAntiNuMuLE010z170i:  return 6;  break;
    case kAntiNuMuLE010z185i:  return 2;  break;
    case kAntiNuMuLE010z185iN:  return 2;  break;
    case kAntiNuMuLE010z200i:  return 7;  break;
    case kAntiNuMuLE100z200i:  return 3;  break;
    case kAntiNuMuLE150z200i:  return 9;  break;
    case kAntiNuMuLE250z200i:  return 4;  break;
    case kAntiNuMuLE250z200iN: return 4;  break;
    case kBeamNueLE000z200i:   return 1;  break;
    case kBeamNueLE010z000i:   return 8;  break;
    case kBeamNueLE010z170i:   return 6;  break;
    case kBeamNueLE010z185i:   return 2;  break;
    case kBeamNueLE010z185iN:   return 2;  break;
    case kBeamNueLE010z200i:   return 7;  break;
    case kBeamNueLE100z200i:   return 3;  break;
    case kBeamNueLE150z200i:   return 9;  break;
    case kBeamNueLE250z200i:   return 4;  break;
    case kBeamNueLE250z200iN:  return 4;  break;

    default:                   return 0;  break;
    }
}
