MpdNDetParam.cxx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "MpdNDetParam.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <stdlib.h>
  6. #include <TSystem.h>
  7. #include "TMap.h"
  8. using namespace std;
  9. MpdNDetParam::~MpdNDetParam()
  10. {
  11. ;
  12. }
  13. int cmp_nocase(const string &s, const string &s2);
  14. /*
  15. {
  16. string::const_iterator p=s.begin();
  17. string::const_iterator p2=s2.begin();
  18. while(p!=s.end()&&p2!=s2.end()) {
  19. if (toupper(*p)!=toupper(*p2)) return (toupper(*p)<toupper(*p2))?-1:1;
  20. ++p;
  21. ++p2;
  22. }
  23. return(s2.size()==s.size())?0:(s.size()<s2.size())?-1:1; // size is unsigned
  24. }
  25. */
  26. // ---------------------------------------------------------------------------
  27. TString MpdNDetParam::GetString(const char* key) const
  28. {
  29. TObjString* value=(TObjString*)fVariables.GetValue(key);
  30. if (value==NULL)
  31. Fatal("GetInteger","Can't find variable named %s.", key);
  32. return value->GetString();
  33. }
  34. Int_t MpdNDetParam::GetInteger(const char* key) const
  35. {
  36. TObjString* value=(TObjString*)fVariables.GetValue(key);
  37. if (value==NULL)
  38. Fatal("GetInteger","Can't find variable named %s.", key);
  39. Int_t val;
  40. char* err=NULL;
  41. val=strtol(value->GetString(),&err, 10);
  42. if (err[0]!='\0')
  43. Fatal("GetInteger","Can't convert variable named %s==\"%s\" to floating point number.", key, value->GetString().Data());
  44. return val;
  45. }
  46. Double_t MpdNDetParam::GetDouble(const char* key) const
  47. {
  48. TObjString* value=(TObjString*)fVariables.GetValue(key);
  49. if (value==NULL)
  50. Fatal("GetDouble","Can't find variable named %s.", key);
  51. Double_t val;
  52. char* err=NULL;
  53. val=strtod(value->GetString(),&err);
  54. if (err[0]!='\0')
  55. Fatal("GetDouble","Can't convert variable named %s==\"%s\" to floating point number.", key, value->GetString().Data());
  56. return val;
  57. }
  58. TString MpdNDetParam::GetStringSlack(const char* key) const
  59. {
  60. TObjString* value=(TObjString*)fVariables.GetValue(key);
  61. if (value==NULL)
  62. {
  63. Warning("GetStringSlack","Can't find variable named %s.", key);
  64. return "";
  65. }
  66. return value->GetString();
  67. }
  68. Int_t MpdNDetParam::GetIntegerSlack(const char* key) const
  69. {
  70. TObjString* value=(TObjString*)fVariables.GetValue(key);
  71. if (value==NULL)
  72. {
  73. Warning("GetIntegerSlack","Can't find variable named %s.", key);
  74. return -1111;
  75. }
  76. Int_t val;
  77. char* err=NULL;
  78. val=strtol(value->GetString(),&err, 10);
  79. if (err[0]!='\0')
  80. {
  81. Warning("GetIntegerSlack","Can't convert variable named %s==\"%s\" to floating point number.", key, value->GetString().Data());
  82. return -1111;
  83. }
  84. return val;
  85. }
  86. Double_t MpdNDetParam::GetDoubleSlack(const char* key) const
  87. {
  88. TObjString* value=(TObjString*)fVariables.GetValue(key);
  89. if (value==NULL)
  90. {
  91. Warning("GetDoubleSlack","Can't find variable named %s.", key);
  92. return -1111;
  93. }
  94. Double_t val;
  95. char* err=NULL;
  96. val=strtod(value->GetString(),&err);
  97. if (err[0]!='\0')
  98. {
  99. Warning("GetDoubleSlack","Can't convert variable named %s==\"%s\" to floating point number.", key, value->GetString().Data());
  100. return -1111;
  101. }
  102. return val;
  103. }
  104. void MpdNDetParam::AddVariable(const char* key, const char* value)
  105. {
  106. TObjString* skey=(TObjString*)fVariables.FindObject(key);
  107. if (skey!=NULL)
  108. {
  109. /** Value for this key already exists **/
  110. skey->GetString()=value;
  111. return;
  112. }
  113. skey=new TObjString(key);
  114. skey->String().ToLower();
  115. TObjString* svalue=new TObjString(value);
  116. fVariables.Add(skey, svalue);
  117. }
  118. //=============================================================================
  119. MpdNDetParam::MpdNDetParam(const char* name, const char* filename)
  120. : TNamed(name, filename), fVariables(200)
  121. {
  122. TString fname=filename;
  123. gSystem->ExpandPathName(fname);
  124. ifstream file(fname);
  125. Int_t linenum;
  126. string buffer;
  127. string message;
  128. string variable;
  129. string value;
  130. fSuccess=1;
  131. if (!file) {
  132. Error("MpdNDetParam", "Can't open file %s. ", filename);
  133. fSuccess=0;
  134. return;
  135. }
  136. fFileName=filename;
  137. linenum=0;
  138. file.exceptions(ifstream::goodbit);
  139. while(getline(file,buffer))
  140. {
  141. linenum++;
  142. if (buffer.empty()) continue;
  143. if (buffer.find_first_not_of(" ")==string::npos) continue;
  144. message=buffer.substr(buffer.find_first_not_of(" ")); //Skipping initial spaces
  145. if (message.empty()) continue;
  146. message=message.substr(0,message.find("#")); //Removing comments
  147. if (message.empty()) continue; //This was just a comment
  148. variable=message.substr(0,message.find("="));
  149. if (variable==message)
  150. {
  151. Error("MpdNDetParam","Syntax error: File %s. Line %d. ", fname.Data(), linenum);
  152. fSuccess=0;
  153. file.close();
  154. return;
  155. }
  156. variable=variable.substr(0,variable.find_first_of(" "));
  157. if (message.find("=")==string::npos)
  158. Error("MpdNDetParam","Can't find value for varible %s at line %d.", variable.c_str(), linenum);
  159. value=message.substr(message.find("=")+1);
  160. if (value.find_first_not_of(" ")==string::npos)
  161. {
  162. Info("MpdNDetParam","Value of varible %s at empty.", variable.c_str());
  163. value="";
  164. }
  165. else
  166. value=value.substr(value.find_first_not_of(" ")); //Skipping initial spaces
  167. AddVariable(variable.c_str(), value.c_str());
  168. if (file.eof()) break;
  169. }
  170. //file.close();
  171. }
  172. //-----------------------------------------------------------------------------
  173. void MpdNDetParam::DumpContainer(ostream& stream) const
  174. {
  175. TObjString* key;
  176. TIterator* iter=fVariables.MakeIterator();
  177. while((key=(TObjString*)iter->Next())!=NULL)
  178. {
  179. TObjString* str=(TObjString*)fVariables.GetValue(key);
  180. stream << key->String() << "=" << str->String() << endl;
  181. }
  182. }
  183. void MpdNDetParam::DumpContainer() const
  184. {
  185. DumpContainer(cout);
  186. }
  187. //-----------------------------------------------------------------------------
  188. Bool_t MpdNDetParam:: Differs(const MpdNDetParam* info) const
  189. {
  190. TObjString* key;
  191. TIterator* iter=fVariables.MakeIterator();
  192. while((key=(TObjString*)iter->Next())!=NULL)
  193. {
  194. TObjString* str=(TObjString*)fVariables.GetValue(key);
  195. TObjString* other=(TObjString*)info->fVariables.GetValue(key);
  196. if (!other||str->String()!=other->String()) break;
  197. }
  198. if (!key) return kTRUE;
  199. iter=info->fVariables.MakeIterator();
  200. while((key=(TObjString*)iter->Next())!=NULL)
  201. {
  202. TObjString* str=(TObjString*)fVariables.GetValue(key);
  203. TObjString* other=(TObjString*)info->fVariables.GetValue(key);
  204. if (!other||str->String()!=other->String()) break;
  205. }
  206. if (!key) return kTRUE;
  207. return kFALSE;
  208. }