00001 #include "DataUtil/MasterGeVPerMip.h"
00002
00003 #include <cassert>
00004 #include <iostream>
00005 #include <iomanip>
00006 using namespace std;
00007
00008 #include "TString.h"
00009
00010
00011 namespace RT = ReleaseType;
00012
00013
00014 MasterGeVPerMip* MasterGeVPerMip::fMyInstance = 0;
00015
00016
00017 double get_gevpermip(Detector::Detector_t det)
00018 { return MasterGeVPerMip::Instance().Get(det); }
00019
00020 void choose_gevpermip_release(std::string setname)
00021 { MasterGeVPerMip::Instance().SelectSet(setname); }
00022
00023 void choose_gevpermip_release(ReleaseType::Release_t rt)
00024 { MasterGeVPerMip::Instance().SelectSet(rt); }
00025
00026 void new_gevpermip_release(std::string setname,
00027 double nearval, double farval, double caldetval)
00028 { MasterGeVPerMip::Instance().AddSet(setname,nearval,farval,caldetval); }
00029
00030 void new_gevpermip_release(ReleaseType::Release_t rt,
00031 double nearval, double farval, double caldetval)
00032 { MasterGeVPerMip::Instance().AddSet(rt,nearval,farval,caldetval); }
00033
00034 void print_gevpermip(Option_t* opt)
00035 { MasterGeVPerMip::Instance().Print(opt); }
00036
00037 bool gevpermip_release_exists(std::string setname)
00038 { return MasterGeVPerMip::Instance().SetExists(setname); }
00039
00040 bool gevpermip_release_exists(ReleaseType::Release_t rt)
00041 { return MasterGeVPerMip::Instance().SetExists(rt); }
00042
00043
00044
00045 MasterGeVPerMip::MasterGeVPerMip()
00046 {
00047
00048
00049 fQuiet = false;
00050 fAssert = true;
00051 cout << "MasterGeVPerMip creation:" << endl;
00052
00053 string setname;
00054
00055
00056
00057
00058
00059 AddSet("default" , 0.001775, 0.001790, 0.000000);
00060
00061
00062
00063
00064 AddSet(RT::kDogwood7 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00065 AddSet(RT::kDogwood7 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00066 AddSet(RT::kDogwood7 +RT::kDaikon+RT::k08, 0.001777, 0.001793, 0.000000);
00067 AddSet(RT::kDogwood7 +RT::kDaikon+RT::k09, 0.001777, 0.001793, 0.000000);
00068
00069
00070
00071 AddSet(RT::kDogwood6 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00072 AddSet(RT::kDogwood6 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00073 AddSet(RT::kDogwood6 +RT::kDaikon+RT::k08, 0.001777, 0.001793, 0.000000);
00074 AddSet(RT::kDogwood6 +RT::kDaikon+RT::k09, 0.001777, 0.001793, 0.000000);
00075
00076
00077 AddSet(RT::kDogwood5 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00078 AddSet(RT::kDogwood5 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00079 AddSet(RT::kDogwood5 +RT::kDaikon+RT::k08, 0.001777, 0.001793, 0.000000);
00080 AddSet(RT::kDogwood5 +RT::kDaikon+RT::k09, 0.001777, 0.001793, 0.000000);
00081
00082
00083 AddSet(RT::kDogwood4 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00084 AddSet(RT::kDogwood4 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00085 AddSet(RT::kDogwood4 +RT::kDaikon+RT::k08, 0.001777, 0.001793, 0.000000);
00086 AddSet(RT::kDogwood4 +RT::kDaikon+RT::k09, 0.001777, 0.001793, 0.000000);
00087
00088
00089 AddSet(RT::kDogwood3 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00090 AddSet(RT::kDogwood3 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00091 AddSet(RT::kDogwood3 +RT::kDaikon+RT::k08, 0.001777, 0.001793, 0.000000);
00092 AddSet(RT::kDogwood3 +RT::kDaikon+RT::k09, 0.001777, 0.001793, 0.000000);
00093 AddSet(RT::kDogwood3 +RT::kGarlic+RT::k00, 0.001777, 0.001793, 0.000000);
00094
00095
00096 AddSet(RT::kDogwood2 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00097 AddSet(RT::kDogwood2 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00098 AddSet(RT::kDogwood2 +RT::kGarlic+RT::k00, 0.001777, 0.001793, 0.000000);
00099
00100
00101 AddSet(RT::kDogwood1 +RT::kDaikon+RT::k04, 0.001777, 0.001793, 0.000000);
00102 AddSet(RT::kDogwood1 +RT::kDaikon+RT::k07, 0.001777, 0.001793, 0.000000);
00103 AddSet(RT::kDogwood1 +RT::kGarlic+RT::k00, 0.001777, 0.001793, 0.000000);
00104
00105
00106 AddSet("predogwood" , 0.001789, 0.001790, 0.000000);
00107 AddSet("dogwood" , 0.001775, 0.001790, 0.000000);
00108 AddSet(RT::kDogwood +RT::kDaikon+RT::k04, 0.001775, 0.001790, 0.000000);
00109 AddSet(RT::kDogwood +RT::kGarlic+RT::k00, 0.001775, 0.001790, 0.000000);
00110
00111
00112 AddSet("cedar_phy" , 0.001792, 0.001786, 0.000000);
00113 AddSet(RT::kCedar_Phy+RT::kDaikon+RT::k00, 0.001792, 0.001786, 0.000000);
00114 AddSet(RT::kCedar_Phy+RT::kDaikon+RT::k01, 0.001792, 0.001786, 0.000000);
00115 AddSet(RT::kCedar_Phy+RT::kDaikon+RT::k02, 0.001792, 0.001786, 0.000000);
00116 AddSet(RT::kCedar_Phy+RT::kDaikon+RT::k03, 0.001792, 0.001786, 0.000000);
00117 AddSet(RT::kCedar_Phy+RT::kDaikon+RT::k04, 0.001792, 0.001786, 0.000000);
00118
00119 AddSet("r1_24_calb" , 0.001759, 0.001747, 0.000000);
00120
00121 AddSet("cedar" , 0.001759, 0.001737, 0.000000);
00122
00123
00124 SelectSet();
00125 }
00126
00127
00128
00129 MasterGeVPerMip::~MasterGeVPerMip()
00130 {
00131
00132 cout << "MasterGeVPerMip final state:" << endl;
00133 Print();
00134 cout << endl;
00135 }
00136
00137
00138
00139 MasterGeVPerMip& MasterGeVPerMip::Instance()
00140 {
00141 static Cleaner cleaner;
00142 if ( ! fMyInstance ) {
00143 fMyInstance = new MasterGeVPerMip;
00144 cleaner.UseMe();
00145 }
00146 return *fMyInstance;
00147 }
00148
00149
00150
00151 void MasterGeVPerMip::AddSet(ReleaseType::Release_t rt, double nearval,
00152 double farval, double caldetval)
00153 { AddSet(ReleaseType::AsString(rt),nearval,farval,caldetval); }
00154
00155 void MasterGeVPerMip::AddSet(string setname, double nearval,
00156 double farval, double caldetval)
00157 {
00158
00159
00160
00161
00162 string usrreq = TrimOption(setname);
00163 if (usrreq == "") usrreq = "default";
00164
00165 string current = fSetName;
00166
00167 map<string,int>::iterator itr = fSetIndexMap.find(usrreq);
00168 if ( itr != fSetIndexMap.end() ) {
00169
00170 fSetName = itr->first;
00171 fSetIndex = itr->second;
00172
00173 if ( fSetName.find("-modified") == string::npos) {
00174 cout << "FATAL: MasterGevPerMip::AddSet already had a \""
00175 << fSetName << "\", assert(0)." << endl;
00176 assert(0);
00177 }
00178 } else {
00179 fSetName = usrreq;
00180 fSetIndex = fSetIndexMap.size();
00181 fSetIndexMap[usrreq] = fSetIndex;
00182 fBestValueNear.resize(fSetIndex+1);
00183 fBestValueFar.resize(fSetIndex+1);
00184 fBestValueCalDet.resize(fSetIndex+1);
00185 }
00186 fBestValueNear[fSetIndex] = nearval;
00187 fBestValueFar[fSetIndex] = farval;
00188 fBestValueCalDet[fSetIndex] = caldetval;
00189
00190
00191 fQuiet = true;
00192 SelectSet(current);
00193 fQuiet = false;
00194 }
00195
00196
00197
00198 bool MasterGeVPerMip::SetExists(ReleaseType::Release_t rt) const
00199 { return SetExists(ReleaseType::AsString(rt)); }
00200 bool MasterGeVPerMip::SetExists(std::string setname) const
00201 {
00202
00203 string usrreq = TrimOption(setname);
00204 if (usrreq == "") usrreq = "default";
00205
00206 map<string,int>::const_iterator itr = fSetIndexMap.find(usrreq);
00207 if ( itr != fSetIndexMap.end() ) {
00208
00209 return true;
00210 }
00211 return false;
00212 }
00213
00214
00215
00216 double MasterGeVPerMip::Get(Detector::Detector_t det) const
00217 {
00218
00219 switch (det) {
00220 case Detector::kNear: return fBestValueNear[fSetIndex];
00221 case Detector::kFar: return fBestValueFar[fSetIndex];
00222 case Detector::kCalDet: return fBestValueCalDet[fSetIndex];
00223 default:
00224 return 0;
00225 }
00226 }
00227
00228
00229
00230 void MasterGeVPerMip::Print(string option) const
00231 {
00232 string opt = TrimOption(option);
00233 if ( opt == "compact" ) {
00234
00235 cout << "MasterGeVPerMip: (\"" << setiosflags(ios::left)
00236
00237 << fSetName
00238 << resetiosflags(ios::adjustfield) << "\")";
00239 cout << " Near " << Get(Detector::kNear) << ",";
00240 cout << " Far " << Get(Detector::kFar) << ",";
00241 cout << " CalDet " << Get(Detector::kCalDet) << endl;
00242 return;
00243 }
00244
00245 ios_base::fmtflags orig_fmt = cout.flags();
00246 map<string,int>::const_iterator itr = fSetIndexMap.begin();
00247 cout << "MasterGeVPerMip: name index"
00248 << " Near "
00249 << " Far "
00250 << " CalDet "
00251 << endl;
00252 while ( itr != fSetIndexMap.end() ) {
00253 bool iscurrent = ( itr->first == fSetName );
00254 if ( iscurrent || opt == "all" ) {
00255 int indx = itr->second;
00256 if ( iscurrent ) cout << " -> " ;
00257 else cout << " " ;
00258 cout<< "\"" << setiosflags(ios::left)
00259 << setw(24) << itr->first
00260 << resetiosflags(ios::adjustfield) << "\" ";
00261 cout << "(" << setw(3) << indx << ")";
00262 cout << setprecision(8) << fixed;
00263 cout << " " << setw(12) << fBestValueNear[indx]
00264 << " " << setw(12) << fBestValueFar[indx]
00265 << " " << setw(12) << fBestValueCalDet[indx]
00266 << endl;
00267 cout.flags(orig_fmt);
00268 }
00269 itr++;
00270 }
00271 }
00272
00273
00274
00275 void MasterGeVPerMip::SelectSet(ReleaseType::Release_t rt)
00276 { SelectSet(ReleaseType::AsString(rt)); }
00277
00278 void MasterGeVPerMip::SelectSet(string setname)
00279 {
00280
00281 string usrreq = TrimOption(setname);
00282 if (usrreq == "") usrreq = "default";
00283
00284 map<string,int>::iterator itr = fSetIndexMap.find(usrreq);
00285 if ( itr != fSetIndexMap.end() ) {
00286 fSetName = itr->first;
00287 fSetIndex = itr->second;
00288 } else {
00289 if ( ! fQuiet ) {
00290 cout
00291 << "WARNING: MasterGeVPerMip::SelectSet could not find "
00292 << "\"" << usrreq << "\"";
00293 if ( fAssert ) {
00294 cout << ", assert(0)!" << endl;
00295 assert(0);
00296 } else {
00297 cout << ", continue using:" << endl;
00298 }
00299 }
00300 }
00301 if ( ! fQuiet ) Print();
00302 }
00303
00304
00305
00306 void MasterGeVPerMip::SetValue(Detector::Detector_t det, double value)
00307 {
00308 string modsetname = fSetName;
00309 if ( modsetname.find("-modified") == string::npos) modsetname += "-modified";
00310
00311 cout << "MasterGeVPerMip: "
00312 << "SetValue(" << Detector::AsString(det) << "," << value << ")"
00313 << " on \"" << modsetname << "\"" << endl;
00314
00315 fQuiet = true;
00316 SelectSet(modsetname);
00317
00318 if ( fSetName != modsetname ) {
00319
00320 double nearval = Get(Detector::kNear);
00321 double farval = Get(Detector::kFar);
00322 double caldetval = Get(Detector::kCalDet);
00323 AddSet(modsetname,nearval,farval,caldetval);
00324 SelectSet(modsetname);
00325 }
00326
00327 switch (det) {
00328 case Detector::kNear: fBestValueNear[fSetIndex] = value; break;
00329 case Detector::kFar: fBestValueFar[fSetIndex] = value; break;
00330 case Detector::kCalDet: fBestValueCalDet[fSetIndex] = value; break;
00331 default:
00332 cout << "MasterGeVPerMip doesn't handle Detector::k"
00333 << Detector::AsString(det) << " (" << int(det)
00334 << ")" << endl;
00335 break;
00336 }
00337 fQuiet = false;
00338 Print();
00339 }
00340
00341
00342
00343 string MasterGeVPerMip::TrimOption(string opt)
00344 {
00345
00346 TString ts = ToLower(opt).Strip(TString::kBoth);
00347
00348 while ( ts.Index(" ") != Ssiz_t(-1) )
00349 ts = ts.ReplaceAll(" "," ");
00350
00351 string s = ts.Data();
00352 return s;
00353 }
00354
00355