00001 #include "CalibTracker/SiStripChannelGain/plugins/SiStripGainFromAsciiFile.h" 00002 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00003 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00004 00005 #include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h" 00006 00007 #include "DataFormats/DetId/interface/DetId.h" 00008 00009 00010 #include <iostream> 00011 #include <fstream> 00012 #include <sstream> 00013 00014 00015 SiStripGainFromAsciiFile::SiStripGainFromAsciiFile(const edm::ParameterSet& iConfig) : ConditionDBWriter<SiStripApvGain>(iConfig){ 00016 00017 00018 Asciifilename_=iConfig.getParameter<std::string>("InputFileName"); 00019 referenceValue_ = iConfig.getParameter<double>("referenceValue"); 00020 fp_ = iConfig.getUntrackedParameter<edm::FileInPath>("file",edm::FileInPath("CalibTracker/SiStripCommon/data/SiStripDetInfo.dat")); 00021 } 00022 00023 00024 SiStripGainFromAsciiFile::~SiStripGainFromAsciiFile(){ 00025 edm::LogInfo("SiStripGainFromAsciiFile::~SiStripGainFromAsciiFile"); 00026 } 00027 00028 SiStripApvGain * SiStripGainFromAsciiFile::getNewObject(){ 00029 00030 SiStripApvGain* obj = new SiStripApvGain(); 00031 00032 uint32_t detid; 00033 FibersGain FG; 00034 00035 std::stringstream ss; 00036 ss.str(""); 00037 ss << "[SiStripGainFromAsciiFile::getNewObject]\n Reading Ascii File\n"; 00038 std::ifstream infile; 00039 infile.open (Asciifilename_.c_str()); 00040 if (infile.is_open()){ 00041 while (infile.good()){ 00042 infile >> detid >> FG.fiber[0] >> FG.fiber[1] >> FG.fiber[2]; 00043 ss << detid << " " << FG.fiber[0] << " " << FG.fiber[1] << " " << FG.fiber[2] << std::endl; 00044 GainsMap.insert(std::pair<unsigned int,FibersGain>(detid,FG)); 00045 } 00046 infile.close(); 00047 edm::LogInfo("SiStripGainFromAsciiFile") << ss.str(); 00048 } else { 00049 edm::LogError("SiStripGainFromAsciiFile")<< " [SiStripGainFromAsciiFile::getNewObject] Error opening file " << Asciifilename_ << std::endl; 00050 assert(0); 00051 } 00052 00053 00054 00055 SiStripDetInfoFileReader reader(fp_.fullPath()); 00056 00057 const std::vector<uint32_t> DetIds = reader.getAllDetIds(); 00058 00059 ss.str(""); 00060 ss << "[SiStripGainFromAsciiFile::getNewObject]\n Filling SiStripApvGain object"; 00061 short nApvPair; 00062 for(std::vector<uint32_t>::const_iterator it=DetIds.begin(); it!=DetIds.end(); it++){ 00063 00064 if (DetId(*it).det()!=DetId::Tracker) 00065 continue; 00066 00067 nApvPair=reader.getNumberOfApvsAndStripLength(*it).first/2; 00068 00069 ss << "Looking at detid " << *it << " nApvPairs " << nApvPair << std::endl; 00070 00071 __gnu_cxx::hash_map< unsigned int,FibersGain>::const_iterator iter=GainsMap.find(*it); 00072 00073 if (iter!=GainsMap.end()){ 00074 FG = iter->second; 00075 ss << " " << FG.fiber[0] << " " << FG.fiber[1] << " " << FG.fiber[2] << std::endl; 00076 } 00077 else { 00078 ss << "Hard reset for detid " << *it << std::endl; 00079 FG.hard_reset(referenceValue_); 00080 } 00081 00082 std::vector<float> DetGainsVector; 00083 00084 if (nApvPair==2){ 00085 DetGainsVector.push_back(FG.fiber[0]/referenceValue_); 00086 DetGainsVector.push_back(FG.fiber[0]/referenceValue_); 00087 DetGainsVector.push_back(FG.fiber[2]/referenceValue_); 00088 DetGainsVector.push_back(FG.fiber[2]/referenceValue_); 00089 } else if (nApvPair==3){ 00090 DetGainsVector.push_back(FG.fiber[0]/referenceValue_); 00091 DetGainsVector.push_back(FG.fiber[0]/referenceValue_); 00092 DetGainsVector.push_back(FG.fiber[1]/referenceValue_); 00093 DetGainsVector.push_back(FG.fiber[1]/referenceValue_); 00094 DetGainsVector.push_back(FG.fiber[2]/referenceValue_); 00095 DetGainsVector.push_back(FG.fiber[2]/referenceValue_); 00096 } else { 00097 edm::LogError("SiStripGainFromAsciiFile") << " SiStripGainFromAsciiFile::getNewObject] ERROR for detid " << *it << " not expected number of APV pairs " << nApvPair <<std::endl; 00098 } 00099 00100 SiStripApvGain::Range range(DetGainsVector.begin(),DetGainsVector.end()); 00101 if ( ! obj->put(*it,range) ){ 00102 edm::LogError("SiStripGainFromAsciiFile")<<" [SiStripGainFromAsciiFile::getNewObject] detid already exists"<<std::endl; 00103 ss <<" [SiStripGainFromAsciiFile::getNewObject] detid already exists"<<std::endl; 00104 } 00105 } 00106 edm::LogInfo("SiStripGainFromAsciiFile") << ss.str(); 00107 00108 return obj; 00109 } 00110 00111 00112 00113