CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CalibCalorimetry/HcalAlgos/src/HcalDbASCIIIO.cc

Go to the documentation of this file.
00001 
00002 //
00003 // F.Ratnikov (UMd), Oct 28, 2005
00004 // $Id: HcalDbASCIIIO.cc,v 1.58 2011/02/15 10:41:14 rofierzy Exp $
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 // ------------------------------ some little helpers ------------------------------
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 // ------------------------------ start templates ------------------------------
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; //ignore comment
00122     std::vector <std::string> items = splitString (std::string (buffer));
00123     if (items.size()==0) continue; // blank line
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 //    if (fObject->exists(id) )
00131 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00132 //    else
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; //ignore comment
00171     std::vector <std::string> items = splitString (std::string (buffer));
00172     if (items.size()==0) continue; // blank line
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 //    if (fObject->exists(id) )
00180 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00181 //    else
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; //ignore comment
00216     std::vector <std::string> items = splitString (std::string (buffer));
00217     if (items.size()==0) continue; // blank line
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 //    if (fObject->exists(id) )
00225 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00226 //    else
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; //ignore comment
00261     std::vector <std::string> items = splitString (std::string (buffer));
00262     if (items.size()==0) continue; // blank line
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;//throw cms::Exception("Wrong number of elements");
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 //          std::cout <<"test "<<(fObject.getValues(*channel))->getValue(0,0,0);
00295             thisline[j] = fObject.getValues(*channel)->getValue(m,i,j);
00296 //          thisline[j] = fObject.getValues(*channel)->getValue(1,1,1);
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 // ------------------------------ end templates ------------------------------
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 // ------------------------------ start specific implementations ------------------------------
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; //ignore comment
00347     std::vector <std::string> items = splitString (std::string (buffer));
00348     if (items.size()==0) continue; // blank line
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; //ignore comment
00385     std::vector <std::string> items = splitString (std::string (buffer));
00386     if (items.size()==0) continue; // blank line
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; //ignore comment
00452     std::vector <std::string> items = splitString (std::string (buffer));
00453     if (items.size()==0) continue; // blank line
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; // blank line
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; // blank line
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 //    if (fObject->exists(id) )
00524 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00525 //    else
00526 //      {
00527 
00528     if (items.size() < 12) // old format without widths
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 // new format with widths
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; //ignore comment
00585     std::vector <std::string> items = splitString (std::string (buffer));
00586     if (items.size()==0) continue; // blank line
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 //    if (fObject->exists(id) )
00594 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00595 //    else
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); //atoi (items [4].c_str()) );
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') // contains tag name
00646           {
00647             std::vector <std::string> items = splitString (std::string (buffer) );
00648             fObject->setTagString(items[1]);
00649             continue;
00650           }
00651         if (buffer [1] == 'A') // contains algo name
00652           {
00653             std::vector <std::string> items = splitString (std::string (buffer) );
00654             fObject->setAlgoString(items[1]);
00655             continue;
00656           }
00657         else continue; //ignore comment
00658       }
00659     std::vector <std::string> items = splitString (std::string (buffer));
00660     if (items.size()==0) continue; // blank line
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   //first print tag and algo
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   //then the values
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   //  std::sort (channels.begin(), channels.end(), DetIdLess ());
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; // blank line
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; //ignore comment
00740     std::vector <std::string> items = splitString (std::string (buffer));
00741     if (items.size()==0) continue; // blank line
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 //    if (fObject->exists(id) )
00751 //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00752 //    else
00753 //      {
00754 
00755     if (items.size() < 20) //old format
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 // new format
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; //ignore comment
00839     std::vector <std::string> items = splitString (std::string (buffer));
00840     if (items.size()<1) continue;
00841     if (items [0] == "SHAPE") { // basic 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       //      fObject->setShape (lowEdges);
00850     }
00851     else { // QIE parameters
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       //      try {
00859       //      fObject->getCoder (id);
00860       //      edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00861         //      }
00862 //      catch (cms::Exception& e) {
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; //ignore comment
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     //    try {
00937     //    fObject->getCoder (id);
00938     //    edm::LogWarning("Redefining Channel") << "line: " << buffer << "\n attempts to redefine data. Ignored" << std::endl;
00939       //    }
00940 //    catch (cms::Exception& e) {
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; //ignore comment
00986     std::vector <std::string> items = splitString (std::string (buffer));
00987     if (items.size () < 12) {
00988       if (items.size()==0) continue; // no warning here
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(""); // don't worry here
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     //    std::cout << "HcalElectronicsMap-> processing line: " << buffer << std::endl;
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     // first, handle undefined cases
01029     if (items [8] == "NA") { // undefined channel
01030       fObject->mapEId2chId (elId, DetId (HcalDetId::Undefined));
01031     } else if (items [8] == "NT") { // undefined trigger channel
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   // changes by Jared, 6.03.09/(included 25.03.09)
01061   //  sprintf (buf, "#%10s %6s %6s %6s %6s %6s %6s %6s %15s %15s %15s %15s",
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         // changes by Jared, 6.03.09/(included 25.03.09)
01073         //      sprintf (buf, " %10X %6d %6d %6c %6d %6d %6d %6d %15s %15s %15s %15s",
01074         sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01075                  //              i,
01076                  converter.getId().rawId(),
01077                  // changes by Jared, 6.03.09/(included 25.03.09)
01078                  //              eid.readoutVMECrateId(), eid.htrSlot(), eid.htrTopBottom()>0?'t':'b', eid.dccid(), eid.spigot(), eid.fiberIndex(), eid.fiberChanId(),
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         // changes by Jared, 6.03.09/(included 25.03.09)
01089         //      sprintf (buf, " %10X %6d %6d %6c %6d %6d %6d %6d %15s %15s %15s %15s",
01090         sprintf (buf, " %7X %3d %3d %3c %4d %7d %10d %14d %7s %5s %5s %6s",
01091                  //              i,
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; //ignore comment
01109     std::vector <std::string> items = splitString (std::string (buffer));
01110     if (items.size()==0) continue; // blank line
01111     // now get non-channel data
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     // now proceeed to per-channel data
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; //ignore comment
01177     std::vector <std::string> items = splitString (buffer);
01178     if (items.size()==0) continue; // blank line
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     //from_string<int>(subd, items[0], std::dec);
01205     from_string<int>(sidering, items[1], std::dec);
01206     from_string<unsigned int>(slice, items[2], std::dec);
01207     //from_string<int>(ty, items[3], std::dec);
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 //     std::cout << buffer << '\n';
01222 //     std::cout << subd << ' ' << sidering << ' ' << slice << ' '
01223 //            << ty << ' ' << subchan << ' ' << LS << ' '
01224 //            << val << ' ' << upper << ' ' << lower << '\n';
01225 //     std::cout << newId ;
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 //     std::cout << std::endl;
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 //     std::cout << "subd: " << subd << '\n';
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 //       std::cout << valId << ' '
01280 //              << valId.subdet() << ' ' 
01281 //              << val->LS() << ' ' << val->getValue() << ' '
01282 //              << val->getUpperLimit() << ' ' << val->getLowerLimit()
01283 //              << std::endl;
01284     }
01285   }
01286 
01287   return true;
01288 }
01289 
01290 
01291 // Format of the ASCII file:
01292 // line# Ring Slice Subchannel Subdetector Eta Phi Depth
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; //ignore comment
01298     std::vector <std::string> items = splitString (std::string (buffer));
01299     if (items.size () < 8) {
01300       if (items.size()==0) continue; // no warning here
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     //    std::cout << "HcalDcsMap-> processing line: " << buffer << std::endl;
01308     //int ring = atoi (items [1].c_str());
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 //    if(items[4].find("HV")!=std::string::npos){
01314 //      type = HcalDcsDetId::HV;
01315 //    }
01316 //    else if (items[4].find("BV")!=std::string::npos){
01317 //      type = HcalDcsDetId::BV;
01318 //    }
01319 //    else if (items[4].find("CATH")!=std::string::npos){
01320 //      type = HcalDcsDetId::CATH;
01321 //    }
01322 //    else if (items[4].find("DYN7")!=std::string::npos){
01323 //      type = HcalDcsDetId::DYN7;
01324 //    }
01325 //    else if (items[4].find("DYN8")!=std::string::npos){
01326 //      type = HcalDcsDetId::DYN8;
01327 //    }
01328 //    else if (items[4].find("RM_TEMP")!=std::string::npos){
01329 //      type = HcalDcsDetId::RM_TEMP;
01330 //    }
01331 //    else if (items[4].find("CCM_TEMP")!=std::string::npos){
01332 //      type = HcalDcsDetId::CCM_TEMP;
01333 //    }
01334 //    else if (items[4].find("CALIB_TEMP")!=std::string::npos){
01335 //      type = HcalDcsDetId::CALIB_TEMP;
01336 //    }
01337 //    else if (items[4].find("LVTTM_TEMP")!=std::string::npos){
01338 //      type = HcalDcsDetId::LVTTM_TEMP;
01339 //    }
01340 //    else if (items[4].find("TEMP")!=std::string::npos){
01341 //      type = HcalDcsDetId::TEMP;
01342 //    }
01343 //    else if (items[4].find("QPLL_LOCK")!=std::string::npos){
01344 //      type = HcalDcsDetId::QPLL_LOCK;
01345 //    }
01346 //    else if (items[4].find("STATUS")!=std::string::npos){
01347 //      type = HcalDcsDetId::STATUS;
01348 //    }
01349 //    else if (items[4].find("DCS_MAX")!=std::string::npos){
01350 //      type = HcalDcsDetId::DCS_MAX;
01351 //    }
01352 //    else{
01353 //      edm::LogError("MapFormat") << "HcalDcsMap-> Unknown DCS Type, line is not accepted: " << items[4];
01354 //      continue;
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 // Format of the ASCII file:
01397 // line# Ring Slice Subchannel Subdetector Eta Phi Depth
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     //std::string _dcs_type = "DCSUNKNOWN";
01411     HcalText2DetIdConverter _converter(_line.getHcalDetId());
01412     sprintf (buf, " %8X %10d %6d %8d %7s %5s %5s %6s",
01413              line_counter,
01414              dcsId.ring(), // contains zside() already
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