00001 #include "AlcapExcept.h"
00002 #include "ModulesParser.h"
00003 #include "IdChannel.h"
00004 #include <iostream>
00005 #include <ostream>
00006 #include <algorithm>
00007
00008 MAKE_EXCEPTION(InvalidDetector,Base)
00009
00010 ClassImp(IDs::channel);
00011
00012 std::string IDs::channel::str()const{
00013 std::string output=GetDetectorString(this->fDetector);
00014 output+=GetSlowFastString(this->fSlowFast);
00015 return output;
00016 }
00017
00018 std::string IDs::channel::GetDetectorString(Detector_t det){
00019 std::string output;
00020 switch(det){
00021 case kErrorDetector : output="Unknown"; break ;
00022 case kAnyDetector : output="*" ; break ;
00023 case kGe : output="Ge" ; break ;
00024 case kLiquidSc : output="LiquidSc" ; break ;
00025 case kNDet : output="NDet" ; break ;
00026 case kNDet2 : output="NDet2" ; break ;
00027 case kScGe : output="ScGe" ; break ;
00028 case kScL : output="ScL" ; break ;
00029 case kScR : output="ScR" ; break ;
00030 case kScVe : output="ScVe" ; break ;
00031 case kSiL1_1 : output="SiL1-1" ; break ;
00032 case kSiL1_2 : output="SiL1-2" ; break ;
00033 case kSiL1_3 : output="SiL1-3" ; break ;
00034 case kSiL1_4 : output="SiL1-4" ; break ;
00035 case kSiL2 : output="SiL2" ; break ;
00036 case kSiR1_1 : output="SiR1-1" ; break ;
00037 case kSiR1_2 : output="SiR1-2" ; break ;
00038 case kSiR1_3 : output="SiR1-3" ; break ;
00039 case kSiR1_4 : output="SiR1-4" ; break ;
00040 case kSiR1_sum : output="SiR1-sum" ; break ;
00041 case kSiR2 : output="SiR2" ; break ;
00042 case kMuSc : output="muSc" ; break ;
00043 case kMuScA : output="muScA" ; break ;
00044 }
00045 return output;
00046 }
00047
00048 IDs::Detector_t IDs::channel::GetDetectorEnum(const std::string& det){
00049 const char* names[1+IDs::num_detector_enums]={
00050 "*" ,
00051 "Ge" , "LiquidSc" , "NDet" , "NDet2" , "ScGe" ,
00052 "ScL" , "ScR" , "ScVe" , "SiL1-1" , "SiL1-2" ,
00053 "SiL1-3" , "SiL1-4" , "SiL2" , "SiR1-1" , "SiR1-2" ,
00054 "SiR1-3" , "SiR1-4" , "SiR1-sum" , "SiR2" , "muSc" ,
00055 "muScA" };
00056 for (int i=0;i<=IDs::num_detector_enums;i++){
00057 if(modules::parser::iequals(det,names[i])) return (Detector_t)i;
00058 }
00059 std::cout<<"Unknown detector name given to IDs::channel: '"<<det<<"'"<<std::endl;
00060 throw Except::InvalidDetector(det.c_str());
00061 }
00062
00063 IDs::channel& IDs::channel::operator=(const std::string& rhs){
00064
00065 static const int num_strs=3;
00066 static const char fast_slow_strs[num_strs]={'*','F','S'};
00067 int i=0;
00068 size_t sz = rhs.size();
00069 for(i=0;i<num_strs ; i++){
00070 if(modules::parser::iequals(rhs[sz-1],fast_slow_strs[i])){
00071 if(modules::parser::iequals(rhs[sz-2],'-')){
00072 break;
00073 }
00074 }
00075 }
00076
00077 size_t boundary=std::string::npos;
00078 if(i< num_strs){
00079 boundary=sz-2;
00080 std::string fs=rhs.substr(boundary);
00081 fSlowFast=GetSlowFastEnum(fs);
00082 }else fSlowFast=kNotApplicable;
00083
00084
00085 fDetector=GetDetectorEnum(rhs.substr(0,boundary));
00086
00087 return *this;
00088 }
00089
00090 std::string IDs::channel::GetSlowFastString(SlowFast_t sf){
00091 std::string output;
00092 switch(sf){
00093 case kAnySlowFast : output+="-*" ; break ;
00094 case kSlow : output+="-S" ; break ;
00095 case kFast : output+="-F" ; break ;
00096 case kNotApplicable : break;
00097 case kErrorSlowFast: output+="-Unknown" ;break ;
00098 }
00099 return output;
00100 }
00101
00102 IDs::SlowFast_t IDs::channel::GetSlowFastEnum(const std::string& type){
00103 if(modules::parser::iequals(type,"-S") || type=="slow") return kSlow;
00104 else if(modules::parser::iequals(type,"-F")|| type=="fast") return kFast;
00105 else if(type=="-*"|| type=="any") return kAnySlowFast;
00106 return kNotApplicable;
00107 }
00108
00109 IDs::channel IDs::channel::GetCorrespondingFastSlow()const{
00110 switch(fSlowFast){
00111 case kFast: return IDs::channel(fDetector,kSlow); break;
00112 case kSlow: return IDs::channel(fDetector,kFast); break;
00113 case kNotApplicable:
00114 case kAnySlowFast:
00115 case kErrorSlowFast:return *this; break;
00116 }
00117 return *this;
00118 }
00119
00120 std::ostream& operator<< (ostream& os ,const IDs::channel& id){
00121 os<<id.str();
00122 return os;
00123 }
00124
00125 void IDs::channel::Debug()const{
00126 std::cout<<"Detector: "<<GetDetectorString(Detector())<<std::endl;
00127 std::cout<<"Slow/fast: "<<GetSlowFastString(SlowFast())<<std::endl;
00128 }