00001 // 00002 // Body for SimFlag class so that CINT recognizes its existence 00003 // 00004 #include "DbiSimFlag.hxx" 00005 #include "TMath.h" 00006 #include "TString.h" 00007 00008 //_____________________________________________________________________________ 00009 00010 Int_t DbiSimFlag::FullMask() 00011 { 00012 return kData|kDaqFakeData|kMC|kReroot; 00013 } 00014 00015 //_____________________________________________________________________________ 00016 00017 const Char_t* DbiSimFlag::AsString(SimFlag_t simFlag) 00018 { 00019 // static function to return mapping enum --> string 00020 00021 switch (simFlag) { 00022 case kUnknown: return "Unknown"; break; 00023 case kData: return "Data"; break; 00024 case kDaqFakeData: return "DaqFakeData"; break; 00025 case kMC: return "MC"; break; 00026 case kReroot: return "Reroot"; break; 00027 default: return "?Data?"; break; 00028 } 00029 } 00030 00031 //_____________________________________________________________________________ 00032 00033 const Char_t* DbiSimFlag::MaskToString(Int_t mask) 00034 { 00035 // Return a mask of SimFlags as a string 00036 // 00037 // Result is a pointer to a statically allocated string. 00038 // User should copy this into their own buffer before calling 00039 // this method again. 00040 00041 static Char_t newstring[255] = ""; 00042 00043 Char_t* ptr = newstring; // start at the beginning 00044 00045 *ptr = 0; // start with nothing 00046 Int_t fullmask = DbiSimFlag::FullMask(); 00047 00048 for (Int_t i=0; i<32; i++) { 00049 DbiSimFlag::SimFlag_t flag = (DbiSimFlag::SimFlag_t)(1<<i); 00050 if (mask & flag & fullmask) { 00051 const Char_t* toadd = DbiSimFlag::AsString(flag); 00052 if (ptr != newstring) *ptr++ = ','; 00053 strcpy(ptr,toadd); 00054 ptr += strlen(toadd); 00055 } 00056 } 00057 *ptr++ = 0; // ensure trailing 0 00058 00059 return newstring; 00060 } 00061 00062 //_____________________________________________________________________________ 00063 00064 DbiSimFlag::SimFlag_t DbiSimFlag::StringToEnum(const Char_t* chars, Int_t maxChar) 00065 { 00066 // convert a set of chars to a valid enum 00067 00068 Int_t mask = DbiSimFlag::StringToMask(chars,maxChar); 00069 00070 switch (mask) { 00071 case kUnknown: return kUnknown; break; 00072 case kData: return kData; break; 00073 case kDaqFakeData: return kDaqFakeData; break; 00074 case kMC: return kMC; break; 00075 case kReroot: return kReroot; break; 00076 default: return kUnknown; break; 00077 } 00078 00079 } 00080 00081 //_____________________________________________________________________________ 00082 00083 Int_t DbiSimFlag::StringToMask(const Char_t* chars, Int_t maxChar) 00084 { 00085 // convert a set of chars to a mask of enum's 00086 // simple tests for unique characters: {d,f,m,r} 00087 00088 Int_t mask = 0; 00089 00090 TString thestring(chars); 00091 if (maxChar>0 && maxChar<thestring.Length()) thestring.Resize(maxChar); 00092 00093 thestring.ToLower(); 00094 if (thestring.Contains("d")) mask |= kData; 00095 if (thestring.Contains("f")) mask |= kDaqFakeData; 00096 if (thestring.Contains("m")) mask |= kMC; 00097 if (thestring.Contains("r")) mask |= kReroot; 00098 00099 return mask; 00100 } 00101 00102 //_____________________________________________________________________________ 00103 00104 Int_t DbiSimFlag::Compact(SimFlag_t simFlag) 00105 { 00106 // turn mask-like enum value into sequential int 00107 00108 switch (simFlag) { 00109 case kUnknown: return -1; break; 00110 case kData: return 0; break; 00111 case kDaqFakeData: return 1; break; 00112 case kMC: return 2; break; 00113 case kReroot: return 3; break; 00114 default: return -1; break; 00115 } 00116 00117 } 00118 00119 //_____________________________________________________________________________ 00120 00121 DbiSimFlag::SimFlag_t DbiSimFlag::Expand(Int_t compactSimFlag) 00122 { 00123 // turn sequential int into mask-like enum value 00124 00125 switch (compactSimFlag) { 00126 case 0: return kData; break; 00127 case 1: return kDaqFakeData; break; 00128 case 2: return kMC; break; 00129 case 3: return kReroot; break; 00130 default: return kUnknown; break; 00131 } 00132 } 00133 00134 //_____________________________________________________________________________