00001
00002
00003
00004
00005
00006 #include <vector>
00007 #include <string>
00008 #include <cstdio>
00009 #include <sstream>
00010
00011 #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h"
00012 #include "DataFormats/HcalDetId/interface/HcalElectronicsId.h"
00013 #include "DataFormats/HcalDetId/interface/HcalDcsDetId.h"
00014 #include "CalibFormats/HcalObjects/interface/HcalText2DetIdConverter.h"
00015
00016 #include "CondFormats/HcalObjects/interface/AllObjects.h"
00017 #include "CalibCalorimetry/HcalAlgos/interface/HcalDbASCIIIO.h"
00018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00019
00020 namespace {
00021 class DetIdLess {
00022 public:
00023 bool operator () (DetId fFirst, DetId fSecond) const {
00024 HcalGenericDetId first (fFirst);
00025 HcalGenericDetId second (fSecond);
00026 if (first.genericSubdet () != second.genericSubdet ()) return first.genericSubdet () < second.genericSubdet ();
00027 if (first.isHcalDetId ()) {
00028 HcalDetId f1 (first);
00029 HcalDetId s1 (second);
00030 return f1.zside () != s1.zside () ? f1.zside () < s1.zside () :
00031 f1.iphi () != s1.iphi () ? f1.iphi () < s1.iphi () :
00032 f1.ietaAbs () != s1.ietaAbs () ? f1.ietaAbs () < s1.ietaAbs () :
00033 f1.depth () < s1.depth ();
00034 }
00035 else {
00036 return first.rawId() < second.rawId();
00037 }
00038 }
00039 };
00040 class HcalElectronicsIdLess {
00041 public:
00042 bool operator () (HcalElectronicsId first, HcalElectronicsId second) const {
00043 return
00044 first.readoutVMECrateId () != second.readoutVMECrateId () ? first.readoutVMECrateId () < second.readoutVMECrateId () :
00045 first.htrSlot () != second.htrSlot () ? first.htrSlot () < second.htrSlot () :
00046 first.htrTopBottom () != second.htrTopBottom () ? first.htrTopBottom () < second.htrTopBottom () :
00047 first.fiberIndex () != second.fiberIndex () ? first.fiberIndex () < second.fiberIndex () :
00048 first.fiberChanId () < second.fiberChanId ();
00049 }
00050 };
00051 }
00052
00053
00054
00055 std::vector <std::string> splitString (const std::string& fLine) {
00056 std::vector <std::string> result;
00057 int start = 0;
00058 bool empty = true;
00059 for (unsigned i = 0; i <= fLine.size (); i++) {
00060 if (fLine [i] == ' ' || i == fLine.size ()) {
00061 if (!empty) {
00062 std::string item (fLine, start, i-start);
00063 result.push_back (item);
00064 empty = true;
00065 }
00066 start = i+1;
00067 }
00068 else {
00069 if (empty) empty = false;
00070 }
00071 }
00072 return result;
00073 }
00074
00075 std::vector <unsigned int> splitStringToIntByComma (const std::string& fLine) {
00076 std::vector <unsigned int> result;
00077 int start = 0;
00078 bool empty = true;
00079 for (unsigned i = 0; i <= fLine.size (); i++) {
00080 if (fLine [i] == ',' || i == fLine.size ()) {
00081 if (!empty) {
00082 std::string itemString (fLine, start, i-start);
00083 result.push_back (atoi (itemString.c_str()) );
00084 empty = true;
00085 }
00086 start = i+1;
00087 }
00088 else {
00089 if (empty) empty = false;
00090 }
00091 }
00092 return result;
00093 }
00094
00095 DetId HcalDbASCIIIO::getId (const std::vector <std::string> & items) {
00096 HcalText2DetIdConverter converter (items [3], items [0], items [1], items [2]);
00097 return converter.getId ();
00098 }
00099
00100 void HcalDbASCIIIO::dumpId (std::ostream& fOutput, DetId id) {
00101 HcalText2DetIdConverter converter (id);
00102 char buffer [1024];
00103 sprintf (buffer, " %15s %15s %15s %15s",
00104 converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str (),converter.getFlavor ().c_str ());
00105 fOutput << buffer;
00106 }
00107
00108
00109
00110 template<class T>
00111 bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)) {
00112 std::istringstream iss(s);
00113 return !(iss >> f >> t).fail();
00114 }
00115
00116 template <class T,class S>
00117 bool getHcalObject (std::istream& fInput, T* fObject, S* fCondObject) {
00118 if (!fObject) fObject = new T;
00119 char buffer [1024];
00120 while (fInput.getline(buffer, 1024)) {
00121 if (buffer [0] == '#') continue;
00122 std::vector <std::string> items = splitString (std::string (buffer));
00123 if (items.size()==0) continue;
00124 if (items.size () < 8) {
00125 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 8 items: eta, phi, depth, subdet, 4x values" << std::endl;
00126 continue;
00127 }
00128 DetId id = HcalDbASCIIIO::getId (items);
00129
00130
00131
00132
00133
00134 fCondObject = new S(id, atof (items [4].c_str()), atof (items [5].c_str()),
00135 atof (items [6].c_str()), atof (items [7].c_str()));
00136 fObject->addValues(*fCondObject);
00137 delete fCondObject;
00138
00139 }
00140
00141 return true;
00142 }
00143
00144 template <class T>
00145 bool dumpHcalObject (std::ostream& fOutput, const T& fObject) {
00146 char buffer [1024];
00147 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %10s\n", "eta", "phi", "dep", "det", "cap0", "cap1", "cap2", "cap3", "DetId");
00148 fOutput << buffer;
00149 std::vector<DetId> channels = fObject.getAllChannels ();
00150 std::sort (channels.begin(), channels.end(), DetIdLess ());
00151 for (std::vector<DetId>::iterator channel = channels.begin ();
00152 channel != channels.end ();
00153 channel++) {
00154 const float* values = fObject.getValues (*channel)->getValues ();
00155 if (values) {
00156 HcalDbASCIIIO::dumpId (fOutput, *channel);
00157 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %10X\n",
00158 values[0], values[1], values[2], values[3], channel->rawId ());
00159 fOutput << buffer;
00160 }
00161 }
00162 return true;
00163 }
00164
00165 template <class T,class S>
00166 bool getHcalSingleFloatObject (std::istream& fInput, T* fObject, S* fCondObject) {
00167 if (!fObject) fObject = new T;
00168 char buffer [1024];
00169 while (fInput.getline(buffer, 1024)) {
00170 if (buffer [0] == '#') continue;
00171 std::vector <std::string> items = splitString (std::string (buffer));
00172 if (items.size()==0) continue;
00173 if (items.size () < 5) {
00174 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, value" << std::endl;
00175 continue;
00176 }
00177 DetId id = HcalDbASCIIIO::getId (items);
00178
00179
00180
00181
00182
00183 fCondObject = new S(id, atof (items [4].c_str()) );
00184 fObject->addValues(*fCondObject);
00185 delete fCondObject;
00186
00187 }
00188 return true;
00189 }
00190
00191 template <class T>
00192 bool dumpHcalSingleFloatObject (std::ostream& fOutput, const T& fObject) {
00193 char buffer [1024];
00194 sprintf (buffer, "# %15s %15s %15s %15s %8s %10s\n", "eta", "phi", "dep", "det", "value", "DetId");
00195 fOutput << buffer;
00196 std::vector<DetId> channels = fObject.getAllChannels ();
00197 std::sort (channels.begin(), channels.end(), DetIdLess ());
00198 for (std::vector<DetId>::iterator channel = channels.begin ();
00199 channel != channels.end ();
00200 channel++) {
00201 const float value = fObject.getValues (*channel)->getValue ();
00202 HcalDbASCIIIO::dumpId (fOutput, *channel);
00203 sprintf (buffer, " %8.5f %10X\n",
00204 value, channel->rawId ());
00205 fOutput << buffer;
00206 }
00207 return true;
00208 }
00209
00210 template <class T,class S>
00211 bool getHcalSingleIntObject (std::istream& fInput, T* fObject, S* fCondObject) {
00212 if (!fObject) fObject = new T;
00213 char buffer [1024];
00214 while (fInput.getline(buffer, 1024)) {
00215 if (buffer [0] == '#') continue;
00216 std::vector <std::string> items = splitString (std::string (buffer));
00217 if (items.size()==0) continue;
00218 if (items.size () < 5) {
00219 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, value" << std::endl;
00220 continue;
00221 }
00222 DetId id = HcalDbASCIIIO::getId (items);
00223
00224
00225
00226
00227
00228 fCondObject = new S(id, atoi (items [4].c_str()) );
00229 fObject->addValues(*fCondObject);
00230 delete fCondObject;
00231
00232 }
00233 return true;
00234 }
00235
00236 template <class T>
00237 bool dumpHcalSingleIntObject (std::ostream& fOutput, const T& fObject) {
00238 char buffer [1024];
00239 sprintf (buffer, "# %15s %15s %15s %15s %8s %10s\n", "eta", "phi", "dep", "det", "value", "DetId");
00240 fOutput << buffer;
00241 std::vector<DetId> channels = fObject.getAllChannels ();
00242 std::sort (channels.begin(), channels.end(), DetIdLess ());
00243 for (std::vector<DetId>::iterator channel = channels.begin ();
00244 channel != channels.end ();
00245 channel++) {
00246 const int value = fObject.getValues (*channel)->getValue ();
00247 HcalDbASCIIIO::dumpId (fOutput, *channel);
00248 sprintf (buffer, " %15d %10X\n",
00249 value, channel->rawId ());
00250 fOutput << buffer;
00251 }
00252 return true;
00253 }
00254
00255 template <class T,class S>
00256 bool getHcalMatrixObject (std::istream& fInput, T* fObject, S* fCondObject) {
00257 if (!fObject) fObject = new T;
00258 char buffer [1024];
00259 while (fInput.getline(buffer, 1024)) {
00260 if (buffer [0] == '#') continue;
00261 std::vector <std::string> items = splitString (std::string (buffer));
00262 if (items.size()==0) continue;
00263 DetId firstid = HcalDbASCIIIO::getId (items);
00264 fCondObject = new S(firstid.rawId());
00265 for(int j = 0; j != 10; j++) fCondObject->setValue(atoi(items[4].c_str()), 0, j, atof(items[j+5].c_str()));
00266 for(int i = 1; i != 40; i++){
00267 fInput.getline(buffer, 1024);
00268 items = splitString (std::string (buffer));
00269 DetId id = HcalDbASCIIIO::getId (items);
00270 if(id.rawId() != firstid.rawId()) break;
00271 for(int j = 0; j != 10; j++) fCondObject->setValue(atoi(items[4].c_str()), i%10, j, atof(items[j+5].c_str()));
00272 }
00273 fObject->addValues(*fCondObject);
00274 delete fCondObject;
00275 }
00276 return true;
00277 }
00278
00279 template <class T>
00280 bool dumpHcalMatrixObject (std::ostream& fOutput, const T& fObject) {
00281 char buffer [1024];
00282 sprintf (buffer, "# %5s %5s %5s %5s %5s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n",
00283 "eta", "phi", "dep", "det", "capid","c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "DetId");
00284 fOutput << buffer;
00285 std::vector<DetId> channels = fObject.getAllChannels ();
00286 std::sort (channels.begin(), channels.end(), DetIdLess ());
00287 for (std::vector<DetId>::iterator channel = channels.begin ();
00288 channel != channels.end ();
00289 channel++) {
00290 float thisline[10];
00291 for(int m = 0; m != 4; m++){
00292 for(int i = 0; i != 10; i++){
00293 for(int j = 0; j != 10; j++){
00294
00295 thisline[j] = fObject.getValues(*channel)->getValue(m,i,j);
00296
00297 }
00298 HcalDbASCIIIO::dumpId (fOutput, *channel);
00299 sprintf(buffer, " %5i %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00300 m, thisline[0], thisline[1], thisline[2], thisline[3], thisline[4], thisline[5], thisline[6], thisline[7],
00301 thisline[8], thisline[9], channel->rawId());
00302 fOutput << buffer;
00303 }
00304 }
00305 }
00306
00307 return true;
00308 }
00309
00310
00311
00312 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalGains* fObject) {return getHcalObject (fInput, fObject, new HcalGain);}
00313 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalGains& fObject) {return dumpHcalObject (fOutput, fObject);}
00314 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalGainWidths* fObject) {return getHcalObject (fInput, fObject, new HcalGainWidth);}
00315 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalGainWidths& fObject) {return dumpHcalObject (fOutput, fObject);}
00316
00317 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalRespCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalRespCorr); }
00318 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalRespCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00319
00320 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLUTCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalLUTCorr); }
00321 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLUTCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00322
00323 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPFCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalPFCorr); }
00324 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPFCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00325
00326 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalTimeCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalTimeCorr); }
00327 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalTimeCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00328
00329 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalZSThresholds* fObject) {return getHcalSingleIntObject (fInput, fObject, new HcalZSThreshold); }
00330 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalZSThresholds& fObject) {return dumpHcalSingleIntObject (fOutput, fObject); }
00331
00332 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalValidationCorrs* fObject) {return getHcalSingleFloatObject (fInput, fObject, new HcalValidationCorr); }
00333 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalValidationCorrs& fObject) {return dumpHcalSingleFloatObject (fOutput, fObject); }
00334 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCholeskyMatrices* fObject) {return getHcalMatrixObject (fInput, fObject, new HcalCholeskyMatrix); }
00335 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCholeskyMatrices& fObject) {return dumpHcalMatrixObject (fOutput, fObject); }
00336 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCovarianceMatrices* fObject) {return getHcalMatrixObject (fInput, fObject, new HcalCovarianceMatrix); }
00337 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCovarianceMatrices& fObject) {return dumpHcalMatrixObject (fOutput, fObject); }
00338
00339
00340
00341 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalRecoParams* fObject)
00342 {
00343 if (!fObject) fObject = new HcalRecoParams();
00344 char buffer [1024];
00345 while (fInput.getline(buffer, 1024)) {
00346 if (buffer [0] == '#') continue;
00347 std::vector <std::string> items = splitString (std::string (buffer));
00348 if (items.size()==0) continue;
00349 if (items.size () < 6) {
00350 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, firstSample, samplesToAdd" << std::endl;
00351 continue;
00352 }
00353 DetId id = HcalDbASCIIIO::getId (items);
00354
00355 HcalRecoParam* fCondObject = new HcalRecoParam(id, atoi (items [4].c_str()), atoi (items [5].c_str()) );
00356 fObject->addValues(*fCondObject);
00357 delete fCondObject;
00358 }
00359 return true;
00360 }
00361 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalRecoParams& fObject)
00362 {
00363 char buffer [1024];
00364 sprintf (buffer, "# %15s %15s %15s %15s %18s %15s %10s\n", "eta", "phi", "dep", "det", "firstSample", "samplesToAdd", "DetId");
00365 fOutput << buffer;
00366 std::vector<DetId> channels = fObject.getAllChannels ();
00367 std::sort (channels.begin(), channels.end(), DetIdLess ());
00368 for (std::vector<DetId>::iterator channel = channels.begin ();
00369 channel != channels.end ();
00370 channel++) {
00371 HcalDbASCIIIO::dumpId (fOutput, *channel);
00372 sprintf (buffer, " %15d %15d %16X\n",
00373 fObject.getValues (*channel)->firstSample(), fObject.getValues (*channel)->samplesToAdd(), channel->rawId ());
00374 fOutput << buffer;
00375 }
00376 return true;
00377 }
00378
00379 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLongRecoParams* fObject)
00380 {
00381 if (!fObject) fObject = new HcalLongRecoParams();
00382 char buffer [1024];
00383 while (fInput.getline(buffer, 1024)) {
00384 if (buffer [0] == '#') continue;
00385 std::vector <std::string> items = splitString (std::string (buffer));
00386 if (items.size()==0) continue;
00387 if (items.size() < 5) {
00388 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, signalTSs, noiseTSs" << std::endl;
00389 continue;
00390 }
00391 if (items.size() > 7) {
00392 edm::LogWarning("Format Problem ?") << "Check line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, signalTSs, noiseTSs. "
00393 << "\n ! signalTS and noiseTS must be of format <ts1,ts2,ts3,...> withOUT spaces. Ignoring line for safety" << std::endl;
00394 continue;
00395 }
00396 DetId id = HcalDbASCIIIO::getId (items);
00397
00398 std::vector<unsigned int> mySignalTS = splitStringToIntByComma(items[4]);
00399 std::vector<unsigned int> myNoiseTS = splitStringToIntByComma(items[5]);
00400
00401 HcalLongRecoParam* fCondObject = new HcalLongRecoParam(id, mySignalTS, myNoiseTS );
00402 fObject->addValues(*fCondObject);
00403 delete fCondObject;
00404 }
00405 return true;
00406 }
00407 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLongRecoParams& fObject)
00408 {
00409 char buffer [1024];
00410 sprintf (buffer, "# %15s %15s %15s %15s %10s %10s %10s\n", "eta", "phi", "dep", "det", "signalTSs", "noiseTSs", "DetId");
00411 fOutput << buffer;
00412 std::vector<DetId> channels = fObject.getAllChannels ();
00413 std::sort (channels.begin(), channels.end(), DetIdLess ());
00414 for (std::vector<DetId>::iterator channel = channels.begin ();
00415 channel != channels.end ();
00416 channel++) {
00417 HcalGenericDetId fId(*channel);
00418 if (fId.isHcalZDCDetId())
00419 {
00420 std::vector<unsigned int> vSignalTS = fObject.getValues (*channel)->signalTS();
00421 std::vector<unsigned int> vNoiseTS = fObject.getValues (*channel)->noiseTS();
00422 HcalDbASCIIIO::dumpId (fOutput, *channel);
00423 sprintf (buffer, " ");
00424 fOutput << buffer;
00425 for (unsigned int i=0; i<vSignalTS.size(); i++)
00426 {
00427 if (i>0) {sprintf (buffer, ","); fOutput << buffer;}
00428 sprintf (buffer, "%u", vSignalTS.at(i));
00429 fOutput << buffer;
00430 }
00431 sprintf (buffer, " ");
00432 fOutput << buffer;
00433 for (unsigned int i=0; i<vNoiseTS.size(); i++)
00434 {
00435 if (i>0) { sprintf (buffer, ","); fOutput << buffer;}
00436 sprintf (buffer, "%u", vNoiseTS.at(i));
00437 fOutput << buffer;
00438 }
00439 sprintf (buffer, " %10X\n", channel->rawId ());
00440 fOutput << buffer;
00441 }
00442 }
00443 return true;
00444 }
00445
00446 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalMCParams* fObject)
00447 {
00448 if (!fObject) fObject = new HcalMCParams();
00449 char buffer [1024];
00450 while (fInput.getline(buffer, 1024)) {
00451 if (buffer [0] == '#') continue;
00452 std::vector <std::string> items = splitString (std::string (buffer));
00453 if (items.size()==0) continue;
00454 if (items.size () < 5) {
00455 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 5 items: eta, phi, depth, subdet, signalShape" << std::endl;
00456 continue;
00457 }
00458 DetId id = HcalDbASCIIIO::getId (items);
00459
00460 HcalMCParam* fCondObject = new HcalMCParam(id, atoi (items [4].c_str()) );
00461 fObject->addValues(*fCondObject);
00462 delete fCondObject;
00463 }
00464 return true;
00465 }
00466 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalMCParams& fObject)
00467 {
00468 char buffer [1024];
00469 sprintf (buffer, "# %15s %15s %15s %15s %14s %10s\n", "eta", "phi", "dep", "det", "signalShape", "DetId");
00470 fOutput << buffer;
00471 std::vector<DetId> channels = fObject.getAllChannels ();
00472 std::sort (channels.begin(), channels.end(), DetIdLess ());
00473 for (std::vector<DetId>::iterator channel = channels.begin ();
00474 channel != channels.end ();
00475 channel++) {
00476 const int value = fObject.getValues (*channel)->signalShape();
00477 HcalDbASCIIIO::dumpId (fOutput, *channel);
00478 sprintf (buffer, " %10d %17X\n",
00479 value, channel->rawId ());
00480 fOutput << buffer;
00481 }
00482 return true;
00483 }
00484
00485 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPedestals* fObject) {
00486 if (!fObject) fObject = new HcalPedestals(false);
00487 char buffer [1024];
00488
00489 while (fInput.getline(buffer, 1024)) {
00490 std::vector <std::string> items = splitString (std::string (buffer));
00491 if (items.size()==0) continue;
00492 else {
00493 if (items[0] == "#U")
00494 {
00495 if (items[1] == (std::string)"ADC") fObject->setUnitADC(true);
00496 else if (items[1] == (std::string)"fC") fObject->setUnitADC(false);
00497 else
00498 {
00499 edm::LogWarning("Pedestal Unit Error") << "Unrecognized unit for pedestals. Assuming fC." << std::endl;
00500 fObject->setUnitADC(false);
00501 }
00502 break;
00503 }
00504 else
00505 {
00506 edm::LogWarning("Pedestal Unit Missing") << "The unit for the pedestals is missing in the txt file." << std::endl;
00507 return false;
00508 }
00509 }
00510 }
00511 while (fInput.getline(buffer, 1024)) {
00512 if (buffer [0] == '#') continue;
00513 std::vector <std::string> items = splitString (std::string (buffer));
00514 if (items.size()==0) continue;
00515 if (items.size () < 8) {
00516 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 8 items: eta, phi, depth, subdet, 4x values"
00517 << " or 12 items: eta, phi, depth, subdet, 4x values for mean, 4x values for width"
00518 << std::endl;
00519 continue;
00520 }
00521 DetId id = getId (items);
00522
00523
00524
00525
00526
00527
00528 if (items.size() < 12)
00529 {
00530 HcalPedestal* fCondObject = new HcalPedestal(id, atof (items [4].c_str()), atof (items [5].c_str()),
00531 atof (items [6].c_str()), atof (items [7].c_str()),
00532 0., 0., 0., 0. );
00533 fObject->addValues(*fCondObject);
00534 delete fCondObject;
00535 }
00536 else
00537 {
00538 HcalPedestal* fCondObject = new HcalPedestal(id, atof (items [4].c_str()), atof (items [5].c_str()),
00539 atof (items [6].c_str()), atof (items [7].c_str()),
00540 atof (items [8].c_str()), atof (items [9].c_str()),
00541 atof (items [10].c_str()), atof (items [11].c_str()) );
00542 fObject->addValues(*fCondObject);
00543 delete fCondObject;
00544 }
00545
00546
00547 }
00548 return true;
00549 }
00550
00551
00552 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPedestals& fObject) {
00553 char buffer [1024];
00554 if (fObject.isADC() ) sprintf (buffer, "#U ADC << this is the unit \n");
00555 else sprintf (buffer, "#U fC << this is the unit \n");
00556 fOutput << buffer;
00557
00558 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n", "eta", "phi", "dep", "det", "cap0", "cap1", "cap2", "cap3", "widthcap0", "widthcap1", "widthcap2", "widthcap3", "DetId");
00559 fOutput << buffer;
00560
00561 std::vector<DetId> channels = fObject.getAllChannels ();
00562 std::sort (channels.begin(), channels.end(), DetIdLess ());
00563 for (std::vector<DetId>::iterator channel = channels.begin ();
00564 channel != channels.end ();
00565 channel++) {
00566 const float* values = fObject.getValues (*channel)->getValues ();
00567 if (values) {
00568 dumpId (fOutput, *channel);
00569 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00570 values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], channel->rawId ());
00571 fOutput << buffer;
00572 }
00573 }
00574 return true;
00575 }
00576
00577
00578
00579 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalChannelQuality* fObject)
00580 {
00581 if (!fObject) fObject = new HcalChannelQuality;
00582 char buffer [1024];
00583 while (fInput.getline(buffer, 1024)) {
00584 if (buffer [0] == '#') continue;
00585 std::vector <std::string> items = splitString (std::string (buffer));
00586 if (items.size()==0) continue;
00587 if (items.size () < 6) {
00588 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 6 items: eta, phi, depth, subdet, base - either (hex) or (dec), value" << std::endl;
00589 continue;
00590 }
00591 DetId id = getId (items);
00592
00593
00594
00595
00596
00597 uint32_t mystatus;
00598 if (items[4] == "(hex)")
00599 sscanf(items[5].c_str(),"%X", &mystatus);
00600 else if (items[4] == "(dec)")
00601 sscanf(items[5].c_str(),"%u", &mystatus);
00602 else
00603 {
00604 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n value field must contain the base: one of (hex), (dec)" << std::endl;
00605 continue;
00606 }
00607
00608 HcalChannelStatus* fCondObject = new HcalChannelStatus(id, mystatus);
00609 fObject->addValues(*fCondObject);
00610 delete fCondObject;
00611
00612 }
00613 return true;
00614 }
00615
00616
00617 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalChannelQuality& fObject) {
00618 char buffer [1024];
00619 sprintf (buffer, "# %15s %15s %15s %15s %15s %10s\n", "eta", "phi", "dep", "det", "(base) value", "DetId");
00620 fOutput << buffer;
00621 std::vector<DetId> channels = fObject.getAllChannels ();
00622 std::sort (channels.begin(), channels.end(), DetIdLess ());
00623 for (std::vector<DetId>::iterator channel = channels.begin ();
00624 channel != channels.end ();
00625 channel++) {
00626 const int value = fObject.getValues (*channel)->getValue ();
00627 dumpId (fOutput, *channel);
00628 sprintf (buffer, "%6s %15X %10X\n", "(hex)",
00629 value, channel->rawId ());
00630 fOutput << buffer;
00631 }
00632 return true;
00633 }
00634
00635
00636
00637 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalL1TriggerObjects* fObject)
00638 {
00639 if (!fObject) fObject = new HcalL1TriggerObjects;
00640 char buffer [1024];
00641
00642 while (fInput.getline(buffer, 1024)) {
00643 if (buffer [0] == '#')
00644 {
00645 if (buffer [1] == 'T')
00646 {
00647 std::vector <std::string> items = splitString (std::string (buffer) );
00648 fObject->setTagString(items[1]);
00649 continue;
00650 }
00651 if (buffer [1] == 'A')
00652 {
00653 std::vector <std::string> items = splitString (std::string (buffer) );
00654 fObject->setAlgoString(items[1]);
00655 continue;
00656 }
00657 else continue;
00658 }
00659 std::vector <std::string> items = splitString (std::string (buffer));
00660 if (items.size()==0) continue;
00661 if (items.size () < 7) {
00662 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 7 items: eta, phi, depth, subdet, pedestal, resp.corr.gain, flag" << std::endl;
00663 continue;
00664 }
00665 DetId id = getId (items);
00666
00667 HcalL1TriggerObject* fCondObject = new HcalL1TriggerObject(id, atof(items[4].c_str()), atof(items[5].c_str()), atoi(items[6].c_str()) );
00668
00669 fObject->addValues(*fCondObject);
00670 delete fCondObject;
00671 }
00672 return true;
00673 }
00674
00675 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalL1TriggerObjects& fObject)
00676 {
00677 char buffer [1024];
00678
00679 sprintf (buffer, "#T %s << this is the tag name \n", fObject.getTagString().c_str() );
00680 fOutput << buffer;
00681 sprintf (buffer, "#A %s << this is the algorithm name \n", fObject.getAlgoString().c_str() );
00682 fOutput << buffer;
00683
00684
00685 sprintf (buffer, "# %15s %15s %15s %15s %8s %13s %8s %10s\n",
00686 "eta", "phi", "dep", "det", "ped", "respcorrgain", "flag",
00687 "DetId");
00688 fOutput << buffer;
00689 std::vector<DetId> channels = fObject.getAllChannels ();
00690
00691 for (std::vector<DetId>::iterator channel = channels.begin ();
00692 channel != channels.end ();
00693 channel++) {
00694 const HcalL1TriggerObject* item = fObject.getValues (*channel);
00695 if (item) {
00696 dumpId (fOutput, *channel);
00697 sprintf (buffer, " %10.7f %10.7f %12d %10X\n",
00698 item->getPedestal(), item->getRespGain(), item->getFlag(), channel->rawId ());
00699 fOutput << buffer;
00700 }
00701 }
00702 return true;
00703
00704 }
00705
00706
00707
00708 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalPedestalWidths* fObject) {
00709 if (!fObject) fObject = new HcalPedestalWidths(false);
00710 char buffer [1024];
00711 int linecounter = 0;
00712
00713 while (fInput.getline(buffer, 1024)) {
00714 linecounter++;
00715 std::vector <std::string> items = splitString (std::string (buffer));
00716 if (items.size()==0) continue;
00717 else {
00718 if (items[0] == (std::string)"#U")
00719 {
00720 if (items[1] == (std::string)"ADC") fObject->setUnitADC(true);
00721 else if (items[1] == (std::string)"fC") fObject->setUnitADC(false);
00722 else
00723 {
00724 edm::LogWarning("Pedestal Width Unit Error") << "Unrecognized unit for pedestal widths. Assuming fC." << std::endl;
00725 fObject->setUnitADC(false);
00726 }
00727 break;
00728 }
00729 else
00730 {
00731 edm::LogWarning("Pedestal Width Unit Missing") << "The unit for the pedestal widths is missing in the txt file." << std::endl;
00732 return false;
00733 }
00734 }
00735 }
00736
00737 while (fInput.getline(buffer, 1024)) {
00738 linecounter++;
00739 if (buffer [0] == '#') continue;
00740 std::vector <std::string> items = splitString (std::string (buffer));
00741 if (items.size()==0) continue;
00742 if (items.size () < 14) {
00743 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line number: " << linecounter << "\n line must contain 14 items: eta, phi, depth, subdet, 10x correlations"
00744 << " or 20 items: eta, phi, depth, subdet, 16x correlations"
00745 << std::endl;
00746 continue;
00747 }
00748 DetId id = getId (items);
00749
00750
00751
00752
00753
00754
00755 if (items.size() < 20)
00756 {
00757 HcalPedestalWidth values(id);
00758 values.setSigma (0, 0, atof (items [4].c_str()));
00759 values.setSigma (1, 0, atof (items [5].c_str()));
00760 values.setSigma (1, 1, atof (items [6].c_str()));
00761 values.setSigma (2, 0, atof (items [7].c_str()));
00762 values.setSigma (2, 1, atof (items [8].c_str()));
00763 values.setSigma (2, 2, atof (items [9].c_str()));
00764 values.setSigma (3, 0, atof (items [10].c_str()));
00765 values.setSigma (3, 1, atof (items [11].c_str()));
00766 values.setSigma (3, 2, atof (items [12].c_str()));
00767 values.setSigma (3, 3, atof (items [13].c_str()));
00768 values.setSigma (0, 1, 0.);
00769 values.setSigma (0, 2, 0.);
00770 values.setSigma (0, 3, 0.);
00771 values.setSigma (1, 2, 0.);
00772 values.setSigma (1, 3, 0.);
00773 values.setSigma (2, 3, 0.);
00774 fObject->addValues(values);
00775 }
00776 else
00777 {
00778 HcalPedestalWidth values(id);
00779 values.setSigma (0, 0, atof (items [4].c_str()) );
00780 values.setSigma (0, 1, atof (items [5].c_str()) );
00781 values.setSigma (0, 2, atof (items [6].c_str()) );
00782 values.setSigma (0, 3, atof (items [7].c_str()) );
00783 values.setSigma (1, 0, atof (items [8].c_str()) );
00784 values.setSigma (1, 1, atof (items [9].c_str()) );
00785 values.setSigma (1, 2, atof (items [10].c_str()) );
00786 values.setSigma (1, 3, atof (items [11].c_str()) );
00787 values.setSigma (2, 0, atof (items [12].c_str()) );
00788 values.setSigma (2, 1, atof (items [13].c_str()) );
00789 values.setSigma (2, 2, atof (items [14].c_str()) );
00790 values.setSigma (2, 3, atof (items [15].c_str()) );
00791 values.setSigma (3, 0, atof (items [16].c_str()) );
00792 values.setSigma (3, 1, atof (items [17].c_str()) );
00793 values.setSigma (3, 2, atof (items [18].c_str()) );
00794 values.setSigma (3, 3, atof (items [19].c_str()) );
00795 fObject->addValues(values);
00796 }
00797
00798
00799 }
00800 return true;
00801 }
00802
00803 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalPedestalWidths& fObject) {
00804 char buffer [1024];
00805 if (fObject.isADC() ) sprintf (buffer, "#U ADC << this is the unit \n");
00806 else sprintf (buffer, "#U fC << this is the unit \n");
00807 fOutput << buffer;
00808
00809 sprintf (buffer, "# %15s %15s %15s %15s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %10s\n",
00810 "eta", "phi", "dep", "det",
00811 "cov_0_0", "cov_0_1", "cov_0_2", "cov_0_3", "cov_1_0", "cov_1_1", "cov_1_2", "cov_1_3", "cov_2_0", "cov_2_1", "cov_2_2", "cov_2_3", "cov_3_0", "cov_3_1", "cov_3_2", "cov_3_3",
00812 "DetId");
00813 fOutput << buffer;
00814 std::vector<DetId> channels = fObject.getAllChannels ();
00815 std::sort (channels.begin(), channels.end(), DetIdLess ());
00816 for (std::vector<DetId>::iterator channel = channels.begin ();
00817 channel != channels.end ();
00818 channel++) {
00819 const HcalPedestalWidth* item = fObject.getValues (*channel);
00820 if (item) {
00821 dumpId (fOutput, *channel);
00822 sprintf (buffer, " %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %10X\n",
00823 item->getSigma (0,0), item->getSigma (0,1), item->getSigma (0,2), item->getSigma (0,3),
00824 item->getSigma (1,0), item->getSigma (1,1), item->getSigma (1,2), item->getSigma (1,3),
00825 item->getSigma (2,0), item->getSigma (2,1), item->getSigma (2,2), item->getSigma (2,3),
00826 item->getSigma (3,0), item->getSigma (3,1), item->getSigma (3,2), item->getSigma (3,3), channel->rawId ());
00827 fOutput << buffer;
00828 }
00829 }
00830 return true;
00831 }
00832
00833
00834
00835 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalQIEData* fObject) {
00836 char buffer [1024];
00837 while (fInput.getline(buffer, 1024)) {
00838 if (buffer [0] == '#') continue;
00839 std::vector <std::string> items = splitString (std::string (buffer));
00840 if (items.size()<1) continue;
00841 if (items [0] == "SHAPE") {
00842 if (items.size () < 33) {
00843 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 33 items: SHAPE 32 x low QIE edges for first 32 bins" << std::endl;
00844 continue;
00845 }
00846 float lowEdges [32];
00847 int i = 32;
00848 while (--i >= 0) lowEdges [i] = atof (items [i+1].c_str ());
00849
00850 }
00851 else {
00852 if (items.size () < 36) {
00853 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 36 items: eta, phi, depth, subdet, 4 capId x 4 Ranges x offsets, 4 capId x 4 Ranges x slopes" << std::endl;
00854 continue;
00855 }
00856 DetId id = getId (items);
00857 fObject->sort ();
00858
00859
00860
00861
00862
00863 HcalQIECoder coder (id.rawId ());
00864 int index = 4;
00865 for (unsigned capid = 0; capid < 4; capid++) {
00866 for (unsigned range = 0; range < 4; range++) {
00867 coder.setOffset (capid, range, atof (items [index++].c_str ()));
00868 }
00869 }
00870 for (unsigned capid = 0; capid < 4; capid++) {
00871 for (unsigned range = 0; range < 4; range++) {
00872 coder.setSlope (capid, range, atof (items [index++].c_str ()));
00873 }
00874 }
00875 fObject->addCoder (coder);
00876
00877 }
00878 }
00879 fObject->sort ();
00880 return true;
00881 }
00882
00883 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalQIEData& fObject) {
00884 char buffer [1024];
00885 fOutput << "# QIE basic shape: SHAPE 32 x low edge values for first 32 channels" << std::endl;
00886 sprintf (buffer, "SHAPE ");
00887 fOutput << buffer;
00888 for (unsigned bin = 0; bin < 32; bin++) {
00889 sprintf (buffer, " %8.5f", fObject.getShape ().lowEdge (bin));
00890 fOutput << buffer;
00891 }
00892 fOutput << std::endl;
00893
00894 fOutput << "# QIE data" << std::endl;
00895 sprintf (buffer, "# %15s %15s %15s %15s %36s %36s %36s %36s %36s %36s %36s %36s\n",
00896 "eta", "phi", "dep", "det",
00897 "4 x offsets cap0", "4 x offsets cap1", "4 x offsets cap2", "4 x offsets cap3",
00898 "4 x slopes cap0", "4 x slopes cap1", "4 x slopes cap2", "4 x slopes cap3");
00899 fOutput << buffer;
00900 std::vector<DetId> channels = fObject.getAllChannels ();
00901 std::sort (channels.begin(), channels.end(), DetIdLess ());
00902 for (std::vector<DetId>::iterator channel = channels.begin ();
00903 channel != channels.end ();
00904 channel++) {
00905 const HcalQIECoder* coder = fObject.getCoder (*channel);
00906 dumpId (fOutput, *channel);
00907 for (unsigned capid = 0; capid < 4; capid++) {
00908 for (unsigned range = 0; range < 4; range++) {
00909 sprintf (buffer, " %8.5f", coder->offset (capid, range));
00910 fOutput << buffer;
00911 }
00912 }
00913 for (unsigned capid = 0; capid < 4; capid++) {
00914 for (unsigned range = 0; range < 4; range++) {
00915 sprintf (buffer, " %8.5f", coder->slope (capid, range));
00916 fOutput << buffer;
00917 }
00918 }
00919 fOutput << std::endl;
00920 }
00921 return true;
00922 }
00923
00924
00925 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalCalibrationQIEData* fObject) {
00926 char buffer [1024];
00927 while (fInput.getline(buffer, 1024)) {
00928 if (buffer [0] == '#') continue;
00929 std::vector <std::string> items = splitString (std::string (buffer));
00930 if (items.size () < 36) {
00931 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 36 items: eta, phi, depth, subdet, 32 bin values" << std::endl;
00932 continue;
00933 }
00934 DetId id = getId (items);
00935 fObject->sort ();
00936
00937
00938
00939
00940
00941 HcalCalibrationQIECoder coder (id.rawId ());
00942 int index = 4;
00943 float values [32];
00944 for (unsigned bin = 0; bin < 32; bin++) {
00945 values[bin] = atof (items [index++].c_str ());
00946 }
00947 coder.setMinCharges (values);
00948 fObject->addCoder (coder);
00949
00950 }
00951 fObject->sort ();
00952 return true;
00953 }
00954
00955 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalCalibrationQIEData& fObject) {
00956 char buffer [1024];
00957 fOutput << "# QIE data in calibration mode" << std::endl;
00958 sprintf (buffer, "# %15s %15s %15s %15s %288s\n",
00959 "eta", "phi", "dep", "det", "32 x charges");
00960 fOutput << buffer;
00961 std::vector<DetId> channels = fObject.getAllChannels ();
00962 std::sort (channels.begin(), channels.end(), DetIdLess ());
00963 for (std::vector<DetId>::iterator channel = channels.begin ();
00964 channel != channels.end ();
00965 channel++) {
00966 const HcalCalibrationQIECoder* coder = fObject.getCoder (*channel);
00967 if (coder) {
00968 dumpId (fOutput, *channel);
00969 const float* lowEdge = coder->minCharges ();
00970 for (unsigned bin = 0; bin < 32; bin++) {
00971 sprintf (buffer, " %8.5f", lowEdge [bin]);
00972 fOutput << buffer;
00973 }
00974 fOutput << std::endl;
00975 }
00976 }
00977 return true;
00978 }
00979
00980
00981
00982 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalElectronicsMap* fObject) {
00983 char buffer [1024];
00984 while (fInput.getline(buffer, 1024)) {
00985 if (buffer [0] == '#') continue;
00986 std::vector <std::string> items = splitString (std::string (buffer));
00987 if (items.size () < 12) {
00988 if (items.size()==0) continue;
00989 if (items.size()<9) {
00990 edm::LogError("MapFormat") << "HcalElectronicsMap-> line too short: " << buffer;
00991 continue;
00992 }
00993 if (items[8]=="NA" || items[8]=="NT") {
00994 while (items.size()<12) items.push_back("");
00995 } else if (items[8]=="HT") {
00996 if (items.size()==11) items.push_back("");
00997 else {
00998 edm::LogError("MapFormat") << "HcalElectronicsMap-> Bad line: " << buffer
00999 << "\n HT line must contain at least 11 items: i cr sl tb dcc spigot fiber fiberchan subdet=HT ieta iphi";
01000 continue;
01001 }
01002 } else {
01003 edm::LogError("MapFormat") << "HcalElectronicsMap-> Bad line: " << buffer
01004 << "\n line must contain 12 items: i cr sl tb dcc spigot fiber fiberchan subdet ieta iphi depth";
01005 continue;
01006 }
01007 }
01008
01009 int crate = atoi (items [1].c_str());
01010 int slot = atoi (items [2].c_str());
01011 int top = 1;
01012 if (items [3] == "b") top = 0;
01013 int dcc = atoi (items [4].c_str());
01014 int spigot = atoi (items [5].c_str());
01015 HcalElectronicsId elId;
01016 if (items[8] == "HT" || items[8] == "NT") {
01017 int slb = atoi (items [6].c_str());
01018 int slbCh = atoi (items [7].c_str());
01019 elId=HcalElectronicsId(slbCh, slb, spigot, dcc,crate,slot,top);
01020 } else {
01021 int fiber = atoi (items [6].c_str());
01022 int fiberCh = atoi (items [7].c_str());
01023
01024 elId=HcalElectronicsId(fiberCh, fiber, spigot, dcc);
01025 elId.setHTR (crate, slot, top);
01026 }
01027
01028
01029 if (items [8] == "NA") {
01030 fObject->mapEId2chId (elId, DetId (HcalDetId::Undefined));
01031 } else if (items [8] == "NT") {
01032 fObject->mapEId2tId (elId, DetId (HcalTrigTowerDetId::Undefined));
01033 } else {
01034 HcalText2DetIdConverter converter (items [8], items [9], items [10], items [11]);
01035 if (converter.isHcalDetId ()) {
01036 fObject->mapEId2chId (elId, converter.getId ());
01037 }
01038 else if (converter.isHcalTrigTowerDetId ()) {
01039 fObject->mapEId2tId (elId, converter.getId ());
01040 }
01041 else if (converter.isHcalCalibDetId ()) {
01042 fObject->mapEId2chId (elId, converter.getId ());
01043 }
01044 else if (converter.isHcalZDCDetId ()) {
01045 fObject->mapEId2chId (elId, converter.getId ());
01046 }
01047 else {
01048 edm::LogWarning("Format Error") << "HcalElectronicsMap-> Unknown subdetector: "
01049 << items [8] << '/' << items [9] << '/' << items [10] << '/' << items [11] << std::endl;
01050 }
01051 }
01052 }
01053 fObject->sort ();
01054 return true;
01055 }
01056
01057 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalElectronicsMap& fObject) {
01058 std::vector<HcalElectronicsId> eids = fObject.allElectronicsId ();
01059 char buf [1024];
01060
01061
01062 sprintf (buf, "# %7s %3s %3s %3s %4s %7s %10s %14s %7s %5s %5s %6s",
01063 "i", "cr", "sl", "tb", "dcc", "spigot", "fiber/slb", "fibcha/slbcha", "subdet", "ieta", "iphi", "depth");
01064 fOutput << buf << std::endl;
01065
01066 for (unsigned i = 0; i < eids.size (); i++) {
01067 HcalElectronicsId eid = eids[i];
01068 if (eid.isTriggerChainId()) {
01069 DetId trigger = fObject.lookupTrigger (eid);
01070 if (trigger.rawId ()) {
01071 HcalText2DetIdConverter converter (trigger);
01072
01073
01074 sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01075
01076 converter.getId().rawId(),
01077
01078
01079 eid.readoutVMECrateId(), eid.htrSlot(), eid.htrTopBottom()>0?'t':'b', eid.dccid(), eid.spigot(), eid.slbSiteNumber(), eid.slbChannelIndex(),
01080 converter.getFlavor ().c_str (), converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str ()
01081 );
01082 fOutput << buf << std::endl;
01083 }
01084 } else {
01085 DetId channel = fObject.lookup (eid);
01086 if (channel.rawId()) {
01087 HcalText2DetIdConverter converter (channel);
01088
01089
01090 sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01091
01092 converter.getId().rawId(),
01093 eid.readoutVMECrateId(), eid.htrSlot(), eid.htrTopBottom()>0?'t':'b', eid.dccid(), eid.spigot(), eid.fiberIndex(), eid.fiberChanId(),
01094 converter.getFlavor ().c_str (), converter.getField1 ().c_str (), converter.getField2 ().c_str (), converter.getField3 ().c_str ()
01095 );
01096 fOutput << buf << std::endl;
01097 }
01098 }
01099 }
01100 return true;
01101 }
01102
01103
01104 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalLutMetadata* fObject){
01105 if (!fObject) fObject = new HcalLutMetadata;
01106 char buffer [1024];
01107 while (fInput.getline(buffer, 1024)) {
01108 if (buffer [0] == '#') continue;
01109 std::vector <std::string> items = splitString (std::string (buffer));
01110 if (items.size()==0) continue;
01111
01112 if (items.size() > 1 &&
01113 items[0].find("RctLsb")!=std::string::npos){
01114 fObject->setRctLsb( atof( items[1].c_str() ) );
01115 continue;
01116 }
01117 if (items.size() > 1 &&
01118 items[0].find("Gain")!=std::string::npos){
01119 fObject->setNominalGain( atof( items[1].c_str() ) );
01120 continue;
01121 }
01122
01123 if (items.size () < 7) {
01124 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 7 items: eta, phi, depth, subdet, Rcalib, LutGranularity, OutputLutThreshold" << std::endl;
01125 continue;
01126 }
01127 DetId id = getId (items);
01128
01129 HcalLutMetadatum * fCondObject = new HcalLutMetadatum(id,
01130 atof (items [4].c_str()),
01131 atoi (items [5].c_str()),
01132 atoi (items [6].c_str()));
01133 fObject->addValues(*fCondObject);
01134 delete fCondObject;
01135 }
01136 return true;
01137 }
01138
01139
01140 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalLutMetadata& fObject){
01141 char buffer [1024];
01142 const float _rctLsb = fObject.getRctLsb();
01143 const float _gain = fObject.getNominalGain();
01144 sprintf (buffer, "# %20s\n", "Non-channel data");
01145 fOutput << buffer;
01146 sprintf (buffer, "%8s %8.5f\n", "RctLsb", _rctLsb);
01147 fOutput << buffer;
01148 sprintf (buffer, "%8s %8.5f\n", "Gain", _gain);
01149 fOutput << buffer;
01150 sprintf (buffer, "# %15s %15s %15s %15s %8s %15s %19s %10s\n", "eta", "phi", "dep", "det", "Rcalib", "LutGranularity", "OutputLutThreshold", "DetId");
01151 fOutput << buffer;
01152 std::vector<DetId> channels = fObject.getAllChannels ();
01153 std::sort (channels.begin(), channels.end(), DetIdLess ());
01154 for (std::vector<DetId>::iterator channel = channels.begin ();
01155 channel != channels.end ();
01156 channel++) {
01157 const float _rCalib = fObject.getValues (*channel)->getRCalib();
01158 const uint8_t _lutGranularity = fObject.getValues (*channel)->getLutGranularity();
01159 const uint8_t _outputLutThreshold = fObject.getValues (*channel)->getOutputLutThreshold();
01160 dumpId (fOutput, *channel);
01161 sprintf (buffer, " %8.5f %15d %19d %10X\n",
01162 _rCalib,
01163 _lutGranularity,
01164 _outputLutThreshold,
01165 channel->rawId ());
01166 fOutput << buffer;
01167 }
01168 return true;
01169 }
01170
01171
01172 bool HcalDbASCIIIO::getObject(std::istream& fInput, HcalDcsValues * fObject) {
01173 if (!fObject) fObject = new HcalDcsValues;
01174 std::string buffer;
01175 while (getline(fInput, buffer)) {
01176 if (buffer.at(0) == '#') continue;
01177 std::vector <std::string> items = splitString (buffer);
01178 if (items.size()==0) continue;
01179
01180 if (items.size() < 9) {
01181 edm::LogWarning("Format Error") << "Bad line: " << buffer << "\n line must contain 9 items: subDet, side_ring, slice, type, subChannel, LS, Value, UpperLimit, LowerLimit" << std::endl;
01182 continue;
01183 }
01184
01185 HcalOtherSubdetector subd;
01186 int sidering;
01187 unsigned int slice, subchan;
01188 switch (items[0].at(1)) {
01189 case 'B':
01190 subd = HcalDcsBarrel;
01191 break;
01192 case 'E':
01193 subd = HcalDcsEndcap;
01194 break;
01195 case 'F':
01196 subd = HcalDcsForward;
01197 break;
01198 case 'O':
01199 subd = HcalDcsOuter;
01200 break;
01201 default:
01202 continue;
01203 }
01204
01205 from_string<int>(sidering, items[1], std::dec);
01206 from_string<unsigned int>(slice, items[2], std::dec);
01207
01208 from_string<unsigned int>(subchan, items[4], std::dec);
01209
01210 HcalDcsDetId newId(subd, sidering, slice,
01211 HcalDcsDetId::DcsTypeFromString(items[3]), subchan);
01212
01213 int LS;
01214 float val,upper,lower;
01215 from_string<int>(LS, items[5], std::dec);
01216 from_string<float>(val, items[6], std::dec);
01217 from_string<float>(upper, items[7], std::dec);
01218 from_string<float>(lower, items[8], std::dec);
01219
01220 HcalDcsValue newVal(newId.rawId(),LS,val,upper,lower);
01221
01222
01223
01224
01225
01226 if (!(fObject->addValue(newVal))) {
01227 edm::LogWarning("Data Error") << "Data from line " << buffer
01228 << "\nwas not added to the HcalDcsValues object." << std::endl;
01229 }
01230
01231 }
01232 fObject->sortAll();
01233 return true;
01234 }
01235
01236 bool HcalDbASCIIIO::dumpObject(std::ostream& fOutput,
01237 HcalDcsValues const& fObject) {
01238 fOutput << "# subDet side_ring slice type subChan LS Value UpperLimit LowerLimit DcsId\n";
01239 for(int subd = HcalDcsValues::HcalHB;
01240 subd <= HcalDcsValues::HcalHF; ++subd) {
01241
01242 HcalDcsValues::DcsSet const & vals=
01243 fObject.getAllSubdetValues(HcalDcsValues::DcsSubDet(subd));
01244 for (HcalDcsValues::DcsSet::const_iterator val = vals.begin();
01245 val != vals.end(); ++val) {
01246 HcalDcsDetId valId(val->DcsId());
01247
01248 switch (valId.subdet()) {
01249 case HcalDcsBarrel:
01250 fOutput << "HB ";
01251 break;
01252 case HcalDcsEndcap:
01253 fOutput << "HE ";
01254 break;
01255 case HcalDcsOuter:
01256 fOutput << "HO ";
01257 break;
01258 case HcalDcsForward:
01259 fOutput << "HF ";
01260 break;
01261 default :
01262 fOutput << valId.subdet() << ' ';
01263 }
01264
01265 if (valId.subdet() == HcalDcsOuter)
01266 fOutput << valId.ring() << ' ';
01267 else
01268 fOutput << valId.zside() << ' ';
01269
01270 fOutput << valId.slice() << ' '
01271 << valId.typeString(valId.type()) << ' '
01272 << valId.subchannel() << ' ';
01273 fOutput << val->LS() << ' '
01274 << val->getValue() << ' '
01275 << val->getUpperLimit() << ' '
01276 << val->getLowerLimit() << ' ';
01277 fOutput << std::hex << val->DcsId() << std::dec << '\n';
01278
01279
01280
01281
01282
01283
01284 }
01285 }
01286
01287 return true;
01288 }
01289
01290
01291
01292
01293
01294 bool HcalDbASCIIIO::getObject (std::istream& fInput, HcalDcsMap* fObject) {
01295 char buffer [1024];
01296 while (fInput.getline(buffer, 1024)) {
01297 if (buffer [0] == '#') continue;
01298 std::vector <std::string> items = splitString (std::string (buffer));
01299 if (items.size () < 8) {
01300 if (items.size()==0) continue;
01301 else {
01302 edm::LogError("MapFormat") << "HcalDcsMap-> Bad line: " << buffer
01303 << "\n line must contain 8 items: line side_ring slice subchannel subdet ieta iphi depth";
01304 continue;
01305 }
01306 }
01307
01308
01309 int ring = atoi(items[1].c_str());
01310 unsigned int slice = atoi (items [2].c_str());
01311 unsigned int subchannel = atoi (items [3].c_str());
01312 HcalDcsDetId::DcsType type = HcalDcsDetId::DCSUNKNOWN;
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356 HcalOtherSubdetector subdet = HcalOtherEmpty;
01357 if (items[4].find("CALIB")!=std::string::npos){
01358 subdet = HcalCalibration;
01359 }
01360 else if (items[4].find("HB")!=std::string::npos){
01361 subdet = HcalDcsBarrel;
01362 }
01363 else if (items[4].find("HE")!=std::string::npos){
01364 subdet = HcalDcsEndcap;
01365 }
01366 else if (items[4].find("HO")!=std::string::npos){
01367 subdet = HcalDcsOuter;
01368 }
01369 else if (items[4].find("HF")!=std::string::npos){
01370 subdet = HcalDcsForward;
01371 }
01372 else{
01373 edm::LogError("MapFormat") << "HcalDcsMap-> Unknown subdetector, line is not accepted: " << items[5];
01374 continue;
01375 }
01376 HcalDcsDetId dcsId(subdet, ring, slice, type, subchannel);
01377 HcalText2DetIdConverter converter (items [4], items [5], items [6], items [7]);
01378 HcalDetId id(0);
01379 if (converter.isHcalDetId()){
01380 id = converter.getId();
01381 }
01382 else{
01383 edm::LogWarning("Invalid HCAL channel") << "HcalDcsMap-> invalid channel: "
01384 << items [4] << '/'
01385 << items [5] << '/'
01386 << items [6] << '/'
01387 << items [7] << std::endl;
01388 continue;
01389 }
01390 fObject->mapGeomId2DcsId(id, dcsId);
01391 }
01392 fObject->sort ();
01393 return true;
01394 }
01395
01396
01397
01398
01399 bool HcalDbASCIIIO::dumpObject (std::ostream& fOutput, const HcalDcsMap& fObject) {
01400 char buf [1024];
01401 sprintf (buf, "# %7s %10s %6s %8s %7s %5s %5s %6s",
01402 "i", "side_ring", "slice", "subchan", "subdet", "ieta", "iphi", "depth");
01403 fOutput << buf << std::endl;
01404 HcalDcsMap::const_iterator _line;
01405 unsigned int line_counter = 0;
01406 for (_line = fObject.beginById();
01407 _line != fObject.endById();
01408 ++_line) {
01409 HcalDcsDetId dcsId = _line.getHcalDcsDetId();
01410
01411 HcalText2DetIdConverter _converter(_line.getHcalDetId());
01412 sprintf (buf, " %8X %10d %6d %8d %7s %5s %5s %6s",
01413 line_counter,
01414 dcsId.ring(),
01415 dcsId.slice(),
01416 dcsId.subchannel(),
01417 _converter.getFlavor().c_str(),
01418 _converter.getField1().c_str(),
01419 _converter.getField2().c_str(),
01420 _converter.getField3().c_str()
01421 );
01422 fOutput << buf << std::endl;
01423 ++line_counter;
01424 }
01425 return true;
01426 }
01427
01428