00001 #include "CondTools/Ecal/plugins/StoreEcalCondition.h"
00002
00003 #include "FWCore/ServiceRegistry/interface/Service.h"
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005 #include "FWCore/Framework/interface/Event.h"
00006 #include "CondCore/DBCommon/interface/Time.h"
00007 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010 #include <fstream>
00011 #include <iostream>
00012 #include <string>
00013 #include <cstring>
00014 #include <time.h>
00015 #include <unistd.h>
00016
00017 using std::string;
00018 using std::cout;
00019 using std::endl;
00020
00021 StoreEcalCondition::StoreEcalCondition(const edm::ParameterSet& iConfig) {
00022
00023 prog_name_ = "StoreEcalCondition";
00024
00025 logfile_ = iConfig.getParameter< std::string >("logfile");
00026 sm_slot_ = iConfig.getUntrackedParameter< unsigned int >("smSlot", 1);
00027
00028 typedef std::vector< edm::ParameterSet > Parameters;
00029 Parameters toPut=iConfig.getParameter<Parameters>("toPut");
00030 for(Parameters::iterator itToPut = toPut.begin(); itToPut != toPut.end(); ++itToPut)
00031 {
00032 inpFileName_.push_back(itToPut->getUntrackedParameter<std::string>("inputFile"));
00033 inpFileNameEE_.push_back(itToPut->getUntrackedParameter<std::string>("inputFileEE"));
00034 objectName_.push_back(itToPut->getUntrackedParameter<std::string>("conditionType"));
00035 since_.push_back(itToPut->getUntrackedParameter<unsigned int>("since"));
00036 }
00037
00038 sm_constr_ = -1;
00039 }
00040
00041 void StoreEcalCondition::endJob() {
00042
00043 edm::Service<cond::service::PoolDBOutputService> mydbservice;
00044 if( !mydbservice.isAvailable() ){
00045 edm::LogError("StoreEcalCondition")<<"PoolDBOutputService is unavailable"<<std::endl;
00046 return;
00047 }
00048
00049 bool toAppend=false;
00050
00051 std::string message = "finished OK\n";
00052 size_t messageSize = message.size() + 1;
00053 char * messChar = new char [messageSize];
00054 strncpy(messChar, message.c_str(), messageSize);
00055
00056 for (unsigned int i=0;i<objectName_.size();i++) {
00057 cond::Time_t newTime;
00058
00059 if ( mydbservice->isNewTagRequest( objectName_[i]+std::string("Rcd") ) ) {
00060
00061
00062
00063 newTime = mydbservice->beginOfTime();
00064 } else {
00065
00066
00067
00068 toAppend=true;
00069 newTime = (cond::Time_t)since_[i];
00070 }
00071 edm::LogInfo("StoreEcalCondition") << "Reading " << objectName_[i]
00072 << " from file and writing to DB with newTime " << newTime << endl;
00073 std::cout << "Reading " << objectName_[i]
00074 << " from file and writing to DB with newTime " << newTime << endl;
00075
00076 if (objectName_[i] == "EcalWeightXtalGroups") {
00077 EcalWeightXtalGroups* mycali = readEcalWeightXtalGroupsFromFile(inpFileName_[i].c_str());
00078 if(!toAppend){
00079 mydbservice->createNewIOV<EcalWeightXtalGroups>(mycali,newTime,mydbservice->endOfTime(),"EcalWeightXtalGroupsRcd");
00080 }else{
00081 mydbservice->appendSinceTime<EcalWeightXtalGroups>(mycali,newTime,"EcalWeightXtalGroupsRcd");
00082 }
00083 }else if (objectName_[i] =="EcalTBWeights") {
00084 EcalTBWeights* mycali=readEcalTBWeightsFromFile(inpFileName_[i].c_str());
00085 if(!toAppend){
00086 mydbservice->createNewIOV<EcalTBWeights>(mycali,newTime,mydbservice->endOfTime(),"EcalTBWeightsRcd");
00087 }else{
00088 mydbservice->appendSinceTime<EcalTBWeights>(mycali,newTime,"EcalTBWeightsRcd");
00089 }
00090 } else if (objectName_[i] == "EcalADCToGeVConstant") {
00091 EcalADCToGeVConstant* mycali=readEcalADCToGeVConstantFromFile(inpFileName_[i].c_str());
00092 if(!toAppend){
00093 mydbservice->createNewIOV<EcalADCToGeVConstant>(mycali,newTime,mydbservice->endOfTime(),"EcalADCToGeVConstantRcd");
00094 }else{
00095 mydbservice->appendSinceTime<EcalADCToGeVConstant>(mycali,newTime,"EcalADCToGeVConstantRcd");
00096 }
00097 } else if (objectName_[i] == "EcalIntercalibConstants") {
00098 EcalIntercalibConstants* mycali=readEcalIntercalibConstantsFromFile(inpFileName_[i].c_str(),inpFileNameEE_[i].c_str());
00099 if(!toAppend){
00100 mydbservice->createNewIOV<EcalIntercalibConstants>(mycali,newTime,mydbservice->endOfTime(),"EcalIntercalibConstantsRcd");
00101 }else{
00102 mydbservice->appendSinceTime<EcalIntercalibConstants>(mycali,newTime,"EcalIntercalibConstantsRcd");
00103 }
00104 } else if (objectName_[i] == "EcalIntercalibConstantsMC") {
00105 EcalIntercalibConstantsMC* mycali=readEcalIntercalibConstantsMCFromFile(inpFileName_[i].c_str(),inpFileNameEE_[i].c_str());
00106 if(!toAppend){
00107 mydbservice->createNewIOV<EcalIntercalibConstantsMC>(mycali,newTime,mydbservice->endOfTime(),"EcalIntercalibConstantsMCRcd");
00108 }else{
00109 mydbservice->appendSinceTime<EcalIntercalibConstantsMC>(mycali,newTime,"EcalIntercalibConstantsMCRcd");
00110 }
00111 } else if (objectName_[i] == "EcalGainRatios") {
00112 EcalGainRatios* mycali=readEcalGainRatiosFromFile(inpFileName_[i].c_str());
00113 if(!toAppend){
00114 mydbservice->createNewIOV<EcalGainRatios>(mycali,newTime,mydbservice->endOfTime(),"EcalGainRatiosRcd");
00115 }else{
00116 mydbservice->appendSinceTime<EcalGainRatios>(mycali,newTime,"EcalGainRatiosRcd");
00117 }
00118 } else if (objectName_[i] == "EcalChannelStatus")
00119 {
00120 EcalChannelStatus* mycali=readEcalChannelStatusFromFile(inpFileName_[i].c_str());
00121 if(!toAppend){
00122 mydbservice->createNewIOV<EcalChannelStatus>(mycali,newTime,mydbservice->endOfTime(),"EcalChannelStatusRcd");
00123 }else{
00124 mydbservice->appendSinceTime<EcalChannelStatus>(mycali,newTime,"EcalChannelStatusRcd");
00125 }
00126 } else {
00127 edm::LogError("StoreEcalCondition")<< "Object " << objectName_[i] << " is not supported by this program." << endl;
00128 }
00129
00130
00131
00132
00133 writeToLogFileResults(messChar);
00134
00135 edm::LogInfo("StoreEcalCondition") << "Finished endJob" << endl;
00136 }
00137
00138 delete [] messChar;
00139 }
00140
00141
00142 StoreEcalCondition::~StoreEcalCondition() {
00143
00144 }
00145
00146
00147 void StoreEcalCondition::analyze( const edm::Event& evt, const edm::EventSetup& evtSetup) {
00148
00149
00150 }
00151
00152
00153
00154 void StoreEcalCondition::writeToLogFile(string a, string b, unsigned long long since) {
00155
00156
00157 FILE *outFile;
00158 outFile = fopen(logfile_.c_str(),"a");
00159 if(!outFile) {
00160 edm::LogError("StoreEcalCondition") <<"*** Can not open file: " << logfile_;
00161 return;
00162 }
00163 char header[256];
00164 fillHeader(header);
00165 char appendMode[10];
00166 if (since != 0)
00167 sprintf(appendMode,"append");
00168 else
00169 sprintf(appendMode,"create");
00170
00171 fprintf(outFile, "%s %s condition from file %s written into DB for SM %d (mapped to SM %d) in %s mode (since run %u)\n",
00172 header, a.c_str(),b .c_str(), sm_constr_, sm_slot_, appendMode, (unsigned int)since);
00173
00174 fclose(outFile);
00175
00176 }
00177
00178 void StoreEcalCondition::writeToLogFileResults(char* arg) {
00179
00180
00181 FILE *outFile;
00182 outFile = fopen(logfile_.c_str(),"a");
00183 if(!outFile) {
00184 edm::LogError("StoreEcalCondition")<<"*** Can not open file: " << logfile_;
00185 return;
00186 }
00187 char header[256];
00188 fillHeader(header);
00189 fprintf(outFile, "%s %s\n", header,arg);
00190 fclose(outFile);
00191 }
00192
00193
00194 void StoreEcalCondition::fillHeader(char* header)
00195
00196 {
00197 time_t rawtime;
00198 struct tm * timeinfo;
00199 time ( &rawtime );
00200 timeinfo = localtime ( &rawtime );
00201 char user[50];
00202 sprintf(user,"%s",getlogin());
00203 sprintf(header,"%s %s:",asctime(timeinfo),user);
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 EcalWeightXtalGroups*
00239 StoreEcalCondition::readEcalWeightXtalGroupsFromFile(const char* inputFile) {
00240
00241
00242
00243
00244 EcalWeightXtalGroups* xtalGroups = new EcalWeightXtalGroups();
00245 std::ifstream groupid_in(inputFile);
00246
00247 if(!groupid_in.is_open()) {
00248 edm::LogError("StoreEcalCondition")<< "*** Can not open file: "<< inputFile ;
00249 return 0;
00250 }
00251
00252 int smnumber=-99999;
00253
00254 std::ostringstream str;
00255 groupid_in >> smnumber;
00256 if (smnumber == -99999) {
00257 edm::LogError("StoreEcalCondition") << "ERROR: SM number not found in file" << endl;
00258 return 0;
00259 }
00260 str << "sm= " << smnumber << endl;
00261 sm_constr_ = smnumber;
00262
00263 char temp[256];
00264
00265 for (int i=0;i<=5;i++) {
00266 groupid_in.getline(temp,255);
00267 str << temp << endl;
00268 }
00269
00270
00271 groupid_in.getline(temp, 255);
00272 str << temp << endl;
00273
00274 edm::LogInfo("StoreEcalCondition") << "GROUPID file " << str.str() ;
00275
00276 int xtals = 0;
00277 int xtal, ietaf, iphif, groupID;
00278 while (groupid_in.good()) {
00279 groupid_in >> xtal >> ietaf >> iphif >> groupID;
00280 if (groupid_in.eof()) { break; }
00281
00282 LogDebug("StoreEcalCondition") << "XTAL=" << xtal << " ETA=" << ietaf << " PHI=" << iphif
00283 << " GROUP=" << groupID ;
00284
00285
00286 EBDetId ebid(sm_slot_,xtal,EBDetId::SMCRYSTALMODE);
00287
00288 xtalGroups->setValue(ebid.rawId(), EcalXtalGroupId( groupID ) );
00289 xtals++;
00290 }
00291
00292 if (xtals != 1700) {
00293 edm::LogError("StoreEcalCondition") << "ERROR: GROUPID file did not contain data for 1700 crystals" << endl;
00294 return 0;
00295 }
00296
00297 edm::LogInfo("StoreEcalCondition") << "Groups for " << xtals << " xtals written into DB" ;
00298 sm_constr_ = smnumber;
00299
00300 return xtalGroups;
00301 }
00302
00303
00304 EcalTBWeights*
00305 StoreEcalCondition::readEcalTBWeightsFromFile(const char* inputFile) {
00306
00307
00308
00309
00310 EcalTBWeights* tbwgt = new EcalTBWeights();
00311
00312 std::ifstream WeightsFileTB(inputFile);
00313 if(!WeightsFileTB.is_open()) {
00314 edm::LogError("StoreEcalCondition")<< "*** Can not open file: "<< inputFile ;
00315 return 0;
00316 }
00317
00318 int smnumber=-99999;
00319
00320 std::ostringstream str;
00321 WeightsFileTB >> smnumber;
00322 if (smnumber == -99999)
00323 return 0;
00324
00325 str << "sm= " << smnumber << endl;
00326
00327 char temp[256];
00328
00329 for (int i=0;i<=5;i++)
00330 {
00331 WeightsFileTB.getline(temp,255);
00332 str << temp << endl;
00333 }
00334
00335 edm::LogInfo("StoreEcalCondition") << "Weights file " << str.str() ;
00336
00337 int ngroups=0;
00338 while (WeightsFileTB.good())
00339 {
00340 int igroup_ID = -99999;
00341 int nSamples = -99999;
00342 int nTdcBins = -99999;
00343
00344 WeightsFileTB >> igroup_ID >> nSamples >> nTdcBins;
00345 if (igroup_ID == -99999 || nSamples == -99999 || nTdcBins == -99999)
00346 break;
00347
00348 std::ostringstream str;
00349 str << "Igroup=" << igroup_ID << " Nsamples=" << nSamples << " NTdcBins=" << nTdcBins <<"\n" ;
00350
00351 for (int iTdcBin = 0; iTdcBin < nTdcBins; iTdcBin++) {
00352
00353 EcalWeightSet wgt;
00354 EcalWeightSet::EcalWeightMatrix& wgt1 = wgt.getWeightsBeforeGainSwitch();
00355 EcalWeightSet::EcalWeightMatrix& wgt2 = wgt.getWeightsAfterGainSwitch();
00356 EcalWeightSet::EcalChi2WeightMatrix& chisq1 = wgt.getChi2WeightsBeforeGainSwitch();
00357 EcalWeightSet::EcalChi2WeightMatrix& chisq2 = wgt.getChi2WeightsAfterGainSwitch();
00358
00359
00360
00361
00362
00363
00364 for(int j = 0; j < nSamples; ++j) {
00365 double ww = 0.0; WeightsFileTB >> ww;
00366 wgt1(0,j)=ww;
00367 str << ww << " ";
00368 }
00369 str << std::endl;
00370
00371
00372 for(int j = 0; j < nSamples; ++j) {
00373 double ww = 0.0; WeightsFileTB >> ww;
00374 wgt1(1,j)=ww;
00375 str << ww << " ";
00376 }
00377 str << std::endl;
00378
00379
00380 for(int j = 0; j < nSamples; ++j) {
00381 double ww = 0.0; WeightsFileTB >> ww;
00382 wgt1(2,j)=ww;
00383 str << ww << " ";
00384 }
00385 str << std::endl;
00386
00387 for(int j = 0; j < nSamples; ++j) {
00388
00389
00390 for(int k = 0; k < nSamples; ++k) {
00391 double ww = 0.0; WeightsFileTB >> ww;
00392 chisq1(j,k)=ww;
00393 str << ww << " ";
00394 }
00395 str << std::endl;
00396 }
00397
00398
00399 for(int j = 0; j < nSamples; ++j) {
00400 double ww = 0.0; WeightsFileTB >> ww;
00401 wgt2(0,j)=ww;
00402 str << ww << " ";
00403 }
00404 str << std::endl;
00405
00406
00407 for(int j = 0; j < nSamples; ++j) {
00408 double ww = 0.0; WeightsFileTB >> ww;
00409 wgt2(1,j)=ww;
00410 str << ww << " ";
00411 }
00412 str << std::endl;
00413
00414
00415 for(int j = 0; j < nSamples; ++j) {
00416 double ww = 0.0; WeightsFileTB >> ww;
00417 wgt2(2,j)=ww;
00418 str << ww << " ";
00419 }
00420 str << std::endl;
00421
00422 for(int j = 0; j < nSamples; ++j) {
00423
00424
00425 for(int k = 0; k < nSamples; ++k) {
00426 double ww = 0.0; WeightsFileTB >> ww;
00427 chisq2(j,k)=ww;
00428 str << ww << " ";
00429 }
00430 str << std::endl;
00431 }
00432
00433 LogDebug("StoreEcalCondition") << str.str();
00434
00435
00436 tbwgt->setValue(std::make_pair( igroup_ID , iTdcBin+1 ), wgt);
00437 }
00438 ngroups++;
00439 }
00440
00441 sm_constr_ = smnumber;
00442
00443
00444 edm::LogInfo("StoreEcalCondition") << "Weights for " << ngroups << " groups written into DB" ;
00445 return tbwgt;
00446 }
00447
00448
00449
00450 EcalADCToGeVConstant*
00451 StoreEcalCondition::readEcalADCToGeVConstantFromFile(const char* inputFile) {
00452
00453
00454
00455 FILE *inpFile;
00456 inpFile = fopen(inputFile,"r");
00457 if(!inpFile) {
00458 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00459 return 0;
00460 }
00461
00462 char line[256];
00463
00464 std::ostringstream str;
00465
00466 fgets(line,255,inpFile);
00467 int sm_number=atoi(line);
00468 str << "sm= " << sm_number << endl ;
00469
00470 fgets(line,255,inpFile);
00471
00472
00473 fgets(line,255,inpFile);
00474 string gen_tag=to_string(line);
00475 str << "gen tag " << gen_tag << endl ;
00476
00477 fgets(line,255,inpFile);
00478 string cali_method=to_string(line);
00479 str << "cali method " << cali_method << endl ;
00480
00481 fgets(line,255,inpFile);
00482 string cali_version=to_string(line);
00483 str << "cali version " << cali_version << endl ;
00484
00485 fgets(line,255,inpFile);
00486 string cali_type=to_string(line);
00487 str << "cali type " << cali_type << endl ;
00488
00489 edm::LogInfo("StoreEcalCondition") << "ADCToGeV file " << str.str() ;
00490
00491 fgets(line,255,inpFile);
00492 float adc_to_gev=0;
00493 sscanf(line, "%f", &adc_to_gev );
00494 LogDebug("StoreEcalCondition") <<" calib="<< adc_to_gev ;
00495 fgets(line,255,inpFile);
00496 float adc_to_gev_ee=0;
00497 sscanf(line, "%f", &adc_to_gev_ee );
00498 LogDebug("StoreEcalCondition") <<" calib="<< adc_to_gev_ee ;
00499
00500 fclose(inpFile);
00501
00502 sm_constr_ = sm_number;
00503
00504
00505 EcalADCToGeVConstant* agc = new EcalADCToGeVConstant(adc_to_gev,adc_to_gev_ee );
00506 edm::LogInfo("StoreEcalCondition") << "ADCtoGeV scale written into the DB";
00507 return agc;
00508 }
00509
00510
00511
00512 EcalIntercalibConstants*
00513 StoreEcalCondition::readEcalIntercalibConstantsFromFile(const char* inputFile,const char* inputFileEE) {
00514
00515
00516 EcalIntercalibConstants* ical = new EcalIntercalibConstants();
00517
00518
00519 FILE *inpFile;
00520 inpFile = fopen(inputFile,"r");
00521 if(!inpFile) {
00522 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00523 return 0;
00524 }
00525
00526 char line[256];
00527
00528 std::ostringstream str;
00529
00530 fgets(line,255,inpFile);
00531 string sm_or_all=to_string(line);
00532 int sm_number=0;
00533 int nchan=1700;
00534 sm_number=atoi(line);
00535 str << "sm= " << sm_number << endl ;
00536 if(sm_number!=-1){
00537 nchan=1700;
00538 } else {
00539 nchan=61200;
00540 }
00541
00542
00543 fgets(line,255,inpFile);
00544
00545
00546 fgets(line,255,inpFile);
00547 string gen_tag=to_string(line);
00548 str << "gen tag " << gen_tag << endl ;
00549
00550 fgets(line,255,inpFile);
00551 string cali_method=to_string(line);
00552 str << "cali method " << cali_method << endl ;
00553
00554 fgets(line,255,inpFile);
00555 string cali_version=to_string(line);
00556 str << "cali version " << cali_version << endl ;
00557
00558 fgets(line,255,inpFile);
00559 string cali_type=to_string(line);
00560 str << "cali type " << cali_type << endl ;
00561
00562 edm::LogInfo("StoreEcalCondition") << "Intercalibration file " << str.str() ;
00563
00564 int sm_num[61200]={0};
00565 int cry_num[61200]={0};
00566 float calib[61200]={0};
00567 float calib_rms[61200]={0};
00568 int calib_nevents[61200]={0};
00569 int calib_status[61200]={0};
00570
00571 int ii = 0;
00572 if(sm_number!=-1){
00573 while(fgets(line,255,inpFile)) {
00574 sscanf(line, "%d %f %f %d %d", &cry_num[ii], &calib[ii], &calib_rms[ii], &calib_nevents[ii], &calib_status[ii] );
00575
00576
00577
00578 sm_num[ii]=sm_number;
00579 ii++ ;
00580 }
00581 } else {
00582
00583 cout<<"mode ALL BARREL" <<endl;
00584 while(fgets(line,255,inpFile)) {
00585 sscanf(line, "%d %d %f %f %d", &sm_num[ii], &cry_num[ii], &calib[ii], &calib_rms[ii], &calib_status[ii] );
00586 if(ii==0) cout<<"crystal "<<cry_num[ii]<<" of sm "<<sm_num[ii]<<" cali= "<< calib[ii]<<endl;
00587 ii++ ;
00588 }
00589 }
00590
00591
00592 fclose(inpFile);
00593
00594 edm::LogInfo("StoreEcalCondition") << "Read intercalibrations for " << ii << " xtals " ;
00595
00596 cout << " I read the calibrations for "<< ii<< " crystals " << endl;
00597 if(ii!=nchan) edm::LogWarning("StoreEcalCondition") << "Some crystals missing. Missing channels will be set to 0" << endl;
00598
00599
00600
00601 sm_constr_ = sm_number;
00602
00603
00604
00605 for(int i=0; i<nchan; i++){
00606
00607
00608
00609
00610 int slot_num=convertFromConstructionSMToSlot(sm_num[i],-1);
00611 EBDetId ebid(slot_num,cry_num[i],EBDetId::SMCRYSTALMODE);
00612
00613 ical->setValue( ebid.rawId(), calib[i] );
00614
00615 if(i==0) cout<<"crystal "<<cry_num[i]<<" of sm "<<sm_num[i]<< " in slot " <<slot_num<<" calib= "<< calib[i]<<endl;
00616
00617 }
00618
00619 cout<<"loop on channels done" << endl;
00620
00621 FILE *inpFileEE;
00622 inpFileEE = fopen(inputFileEE,"r");
00623 if(!inpFileEE) {
00624 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00625
00626
00627
00628 for(int iX=EEDetId::IX_MIN; iX<=EEDetId::IX_MAX ;++iX)
00629 {
00630 for(int iY=EEDetId::IY_MIN; iY<=EEDetId::IY_MAX; ++iY)
00631 {
00632
00633 if (EEDetId::validDetId(iX,iY,1))
00634 {
00635 EEDetId eedetidpos(iX,iY,1);
00636 ical->setValue( eedetidpos, 1.0 );
00637 }
00638 if (EEDetId::validDetId(iX,iY,-1))
00639 {
00640 EEDetId eedetidneg(iX,iY,-1);
00641 ical->setValue( eedetidneg, 1.0 );
00642 }
00643 }
00644 }
00645
00646 } else {
00647 cout<<"... now reading EE file ..." <<endl;
00648
00649 int ii=0;
00650 while(fgets(line,255,inpFileEE)) {
00651 int iz,ix,iy;
00652 float calibee;
00653 sscanf(line, "%d %d %d %f", &iz, &ix, &iy, &calibee );
00654 if(ii<=0) cout<<"crystal "<<iz<<"/"<<ix<<"/"<<iy<<" cali="<< calibee<<endl;
00655
00656 if (EEDetId::validDetId(ix,iy,iz))
00657 {
00658 EEDetId eedetid(ix,iy,iz);
00659 ical->setValue( eedetid, calibee );
00660 }
00661
00662 ii++ ;
00663 }
00664
00665
00666 fclose(inpFileEE);
00667
00668 }
00669
00670 cout<<"loop on EE channels done" << endl;
00671
00672
00673
00674 return ical;
00675 }
00676
00677
00678 EcalIntercalibConstantsMC*
00679 StoreEcalCondition::readEcalIntercalibConstantsMCFromFile(const char* inputFile,const char* inputFileEE) {
00680
00681
00682 EcalIntercalibConstantsMC* ical = new EcalIntercalibConstantsMC();
00683
00684
00685 FILE *inpFile;
00686 inpFile = fopen(inputFile,"r");
00687 if(!inpFile) {
00688 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00689 return 0;
00690 }
00691
00692 char line[256];
00693
00694 std::ostringstream str;
00695
00696 fgets(line,255,inpFile);
00697 string sm_or_all=to_string(line);
00698 int sm_number=0;
00699 int nchan=1700;
00700 sm_number=atoi(line);
00701 str << "sm= " << sm_number << endl ;
00702 if(sm_number!=-1){
00703 nchan=1700;
00704 } else {
00705 nchan=61200;
00706 }
00707
00708
00709 fgets(line,255,inpFile);
00710
00711
00712 fgets(line,255,inpFile);
00713 string gen_tag=to_string(line);
00714 str << "gen tag " << gen_tag << endl ;
00715
00716 fgets(line,255,inpFile);
00717 string cali_method=to_string(line);
00718 str << "cali method " << cali_method << endl ;
00719
00720 fgets(line,255,inpFile);
00721 string cali_version=to_string(line);
00722 str << "cali version " << cali_version << endl ;
00723
00724 fgets(line,255,inpFile);
00725 string cali_type=to_string(line);
00726 str << "cali type " << cali_type << endl ;
00727
00728 edm::LogInfo("StoreEcalCondition") << "Intercalibration file " << str.str() ;
00729
00730 int sm_num[61200]={0};
00731 int cry_num[61200]={0};
00732 float calib[61200]={0};
00733 float calib_rms[61200]={0};
00734 int calib_nevents[61200]={0};
00735 int calib_status[61200]={0};
00736
00737 int ii = 0;
00738 if(sm_number!=-1){
00739 while(fgets(line,255,inpFile)) {
00740 sscanf(line, "%d %f %f %d %d", &cry_num[ii], &calib[ii], &calib_rms[ii], &calib_nevents[ii], &calib_status[ii] );
00741
00742
00743
00744 sm_num[ii]=sm_number;
00745 ii++ ;
00746 }
00747 } else {
00748
00749 cout<<"mode ALL BARREL" <<endl;
00750 while(fgets(line,255,inpFile)) {
00751 sscanf(line, "%d %d %f %f %d", &sm_num[ii], &cry_num[ii], &calib[ii], &calib_rms[ii], &calib_status[ii] );
00752 if(ii==0) cout<<"crystal "<<cry_num[ii]<<" of sm "<<sm_num[ii]<<" cali= "<< calib[ii]<<endl;
00753 ii++ ;
00754 }
00755 }
00756
00757
00758 fclose(inpFile);
00759
00760 edm::LogInfo("StoreEcalCondition") << "Read intercalibrations for " << ii << " xtals " ;
00761
00762 cout << " I read the calibrations for "<< ii<< " crystals " << endl;
00763 if(ii!=nchan) edm::LogWarning("StoreEcalCondition") << "Some crystals missing. Missing channels will be set to 0" << endl;
00764
00765
00766
00767 sm_constr_ = sm_number;
00768
00769
00770
00771 for(int i=0; i<nchan; i++){
00772
00773
00774
00775
00776 int slot_num=convertFromConstructionSMToSlot(sm_num[i],-1);
00777 EBDetId ebid(slot_num,cry_num[i],EBDetId::SMCRYSTALMODE);
00778
00779 ical->setValue( ebid.rawId(), calib[i] );
00780
00781 if(i==0) cout<<"crystal "<<cry_num[i]<<" of sm "<<sm_num[i]<< " in slot " <<slot_num<<" calib= "<< calib[i]<<endl;
00782
00783 }
00784
00785 cout<<"loop on channels done" << endl;
00786
00787 FILE *inpFileEE;
00788 inpFileEE = fopen(inputFileEE,"r");
00789 if(!inpFileEE) {
00790 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00791
00792
00793
00794 for(int iX=EEDetId::IX_MIN; iX<=EEDetId::IX_MAX ;++iX)
00795 {
00796 for(int iY=EEDetId::IY_MIN; iY<=EEDetId::IY_MAX; ++iY)
00797 {
00798
00799 if (EEDetId::validDetId(iX,iY,1))
00800 {
00801 EEDetId eedetidpos(iX,iY,1);
00802 ical->setValue( eedetidpos, 1.0 );
00803 }
00804 if (EEDetId::validDetId(iX,iY,-1))
00805 {
00806 EEDetId eedetidneg(iX,iY,-1);
00807 ical->setValue( eedetidneg, 1.0 );
00808 }
00809 }
00810 }
00811
00812 } else {
00813 cout<<"... now reading EE file ..." <<endl;
00814
00815 int ii=0;
00816 while(fgets(line,255,inpFileEE)) {
00817 int iz,ix,iy;
00818 float calibee;
00819 sscanf(line, "%d %d %d %f", &iz, &ix, &iy, &calibee );
00820 if(ii<=0) cout<<"crystal "<<iz<<"/"<<ix<<"/"<<iy<<" cali="<< calibee<<endl;
00821
00822 if (EEDetId::validDetId(ix,iy,iz))
00823 {
00824 EEDetId eedetid(ix,iy,iz);
00825 ical->setValue( eedetid, calibee );
00826 }
00827
00828 ii++ ;
00829 }
00830
00831
00832 fclose(inpFileEE);
00833
00834 }
00835
00836 cout<<"loop on EE channels done" << endl;
00837
00838
00839
00840 return ical;
00841 }
00842
00843
00844 int StoreEcalCondition::convertFromConstructionSMToSlot(int sm_constr,int sm_slot){
00845
00846
00847
00848
00849 int slot_to_constr[37]={-1,12,17,10,1,8,4,27,20,23,25,6,34,35,15,18,30,21,9
00850 ,24,22,13,31,26,16,2,11,5,0,29,28,14,33,32,3,7,19};
00851 int constr_to_slot[36]={28,4,25,34,6,27,11,35,5,18,3,26,1,21,31,14,24,2,15,
00852 36,8,17,20,9,19,10,23,7,30,29,16,22,33,32,12,13 };
00853
00854 int result=0;
00855 if(sm_constr!=-1) {
00856 result=constr_to_slot[sm_constr];
00857 } else if(sm_slot!=-1) {
00858 result=slot_to_constr[sm_slot];
00859 }
00860 return result;
00861 }
00862
00863
00864 EcalGainRatios*
00865 StoreEcalCondition::readEcalGainRatiosFromFile(const char* inputFile) {
00866
00867
00868
00869 EcalGainRatios* gratio = new EcalGainRatios;
00870
00871
00872 FILE *inpFile;
00873 inpFile = fopen(inputFile,"r");
00874 if(!inpFile) {
00875 edm::LogError("StoreEcalCondition")<<"*** Can not open file: "<<inputFile;
00876 return 0;
00877 }
00878
00879 char line[256];
00880 std::ostringstream str;
00881
00882 fgets(line,255,inpFile);
00883 string sm_or_all=to_string(line);
00884 int sm_number=0;
00885 int nchan=1700;
00886 sm_number=atoi(line);
00887 str << "sm= " << sm_number << endl ;
00888 if(sm_number!=-1){
00889 nchan=1700;
00890 } else {
00891 nchan=61200;
00892 }
00893
00894 fgets(line,255,inpFile);
00895
00896
00897 fgets(line,255,inpFile);
00898 string gen_tag=to_string(line);
00899 str << "gen tag " << gen_tag << endl ;
00900
00901 fgets(line,255,inpFile);
00902 string cali_method=to_string(line);
00903 str << "cali method " << cali_method << endl ;
00904
00905 fgets(line,255,inpFile);
00906 string cali_version=to_string(line);
00907 str << "cali version " << cali_version << endl ;
00908
00909
00910 fgets(line,255,inpFile);
00911 string cali_type=to_string(line);
00912
00913 str << "cali type " << cali_type << endl ;
00914
00915 edm::LogInfo("StoreEcalCondition") << "GainRatio file " << str.str() ;
00916
00917
00918
00919 int cry_num[61200]={0};
00920 float g1_g12[61200]={0};
00921 float g6_g12[61200]={0};
00922 int calib_status[61200]={0};
00923 int dummy1=0;
00924 int dummy2=0;
00925 int hash1=0;
00926
00927 int ii = 0;
00928
00929 if(sm_number!=-1){
00930 while(fgets(line,255,inpFile)) {
00931 sscanf(line, "%d %d %d %f %f %d", &dummy1, &dummy2, &cry_num[ii], &g1_g12[ii], &g6_g12[ii], &calib_status[ii] );
00932 ii++ ;
00933 }
00934
00935
00936 fclose(inpFile);
00937
00938
00939
00940 edm::LogInfo("StoreEcalCondition") << "Read gainRatios for " << ii << " xtals " ;
00941 if(ii!=1700) edm::LogWarning("StoreEcalCondition") << " Missing crystals:: missing channels will be set to 0" << endl;
00942
00943
00944 sm_constr_ = sm_number;
00945
00946 for(int i=0; i<1700; i++){
00947
00948
00949 EBDetId ebid(sm_slot_,cry_num[i],EBDetId::SMCRYSTALMODE);
00950
00951 EcalMGPAGainRatio gr;
00952 gr.setGain12Over6( g6_g12[i] );
00953 gr.setGain6Over1(g1_g12[i]/g6_g12[i]);
00954 gratio->setValue( ebid.rawId(), gr );
00955 }
00956
00957
00958
00959
00960
00961
00962 } else {
00963
00964 cout<<"mode ALL BARREL" <<endl;
00965 while(fgets(line,255,inpFile)) {
00966 int eta=0;
00967 int phi=0;
00968 sscanf(line, "%d %d %d %f %f",&hash1, &eta, &phi, &g1_g12[ii], &g6_g12[ii]);
00969 if(ii<20) cout<<"crystal eta/phi="<<eta<<"/"<<phi<<" g1_12/g6_12= "<< g1_g12[ii]<<"/"<<g6_g12[ii]<<endl;
00970
00971 if(g1_g12[ii]<9 || g1_g12[ii]>15 ) g1_g12[ii]=12.0;
00972 if(g6_g12[ii]<1 || g6_g12[ii]>3 ) g6_g12[ii]=2.0;
00973
00974 if(eta<-85|| eta>85 || eta==0) std::cout<<"error!!!"<<endl;
00975 if(phi<1 || phi>360) std::cout<<"error!!!"<<endl;
00976
00977 EBDetId ebid(eta, phi,EBDetId::ETAPHIMODE);
00978 EcalMGPAGainRatio gr;
00979 gr.setGain12Over6( g6_g12[ii] );
00980 gr.setGain6Over1(g1_g12[ii]/g6_g12[ii]);
00981 gratio->setValue( ebid.rawId(), gr );
00982
00983 ii++ ;
00984 }
00985
00986 fclose(inpFile);
00987 if(ii!=61200) edm::LogWarning("StoreEcalCondition") << " Missing crystals !!!!!!!" << endl;
00988
00989 std::cout<< "number of crystals read:"<<ii<<endl;
00990
00991 }
00992
00993
00994
00995 for(int iX=EEDetId::IX_MIN; iX<=EEDetId::IX_MAX ;++iX) {
00996 for(int iY=EEDetId::IY_MIN; iY<=EEDetId::IY_MAX; ++iY) {
00997
00998 EcalMGPAGainRatio gr;
00999 gr.setGain12Over6( 2. );
01000 gr.setGain6Over1( 6. );
01001
01002
01003 if (EEDetId::validDetId(iX,iY,1))
01004 {
01005 EEDetId eedetidpos(iX,iY,1);
01006 gratio->setValue( eedetidpos.rawId(), gr );
01007 }
01008 if (EEDetId::validDetId(iX,iY,-1))
01009 {
01010 EEDetId eedetidneg(iX,iY,-1);
01011 gratio->setValue( eedetidneg.rawId(), gr );
01012 }
01013 }
01014 }
01015
01016
01017 std::cout <<" gratio pointer="<<gratio<<endl;
01018
01019
01020
01021 std::cout<< "now leaving"<<endl;
01022
01023
01024
01025 return gratio;
01026
01027 }
01028
01029 EcalChannelStatus*
01030 StoreEcalCondition::readEcalChannelStatusFromFile(const char* inputFile)
01031 {
01032 EcalChannelStatus* status = new EcalChannelStatus();
01033
01034 for(int ieta=-EBDetId::MAX_IETA; ieta<=EBDetId::MAX_IETA; ++ieta)
01035 {
01036 if(ieta==0) continue;
01037 for(int iphi=EBDetId::MIN_IPHI; iphi<=EBDetId::MAX_IPHI; ++iphi) {
01038 if (EBDetId::validDetId(ieta,iphi)) {
01039 EBDetId ebid(ieta,iphi);
01040 status->setValue( ebid, 0 );
01041 }
01042 }
01043 }
01044
01045 for(int iX=EEDetId::IX_MIN; iX<=EEDetId::IX_MAX ;++iX)
01046 {
01047 for(int iY=EEDetId::IY_MIN; iY<=EEDetId::IY_MAX; ++iY)
01048 {
01049
01050 if (EEDetId::validDetId(iX,iY,1))
01051 {
01052 EEDetId eedetidpos(iX,iY,1);
01053 status->setValue( eedetidpos, 0 );
01054 }
01055 if (EEDetId::validDetId(iX,iY,-1))
01056 {
01057 EEDetId eedetidneg(iX,iY,-1);
01058 status->setValue( eedetidneg, 0 );
01059 }
01060 }
01061 }
01062
01063
01064
01065 std::cout << "Reading channel status from file " << inputFile << std::endl;
01066 FILE *ifile = fopen( inputFile ,"r" );
01067 if ( !ifile )
01068 throw cms::Exception ("Cannot open ECAL channel status file") ;
01069
01070 char line[256];
01071
01072 fgets(line,255,ifile);
01073 std::string gen_tag= line;
01074 std::cout << "Gen tag " << gen_tag << std::endl ;
01075
01076 fgets(line,255,ifile);
01077 std::string comment = line ;
01078 std::cout << "Gen comment " << comment << std::endl ;
01079
01080 int iovRunStart(0);
01081 fgets(line,255,ifile);
01082 sscanf (line, "%d", &iovRunStart);
01083 std::cout << "IOV START " << iovRunStart << std::endl;
01084
01085
01086 int iovRunEnd(0);
01087 fgets(line,255,ifile);
01088 sscanf (line, "%d", &iovRunEnd);
01089 std::cout << "IOV END " << iovRunEnd << std::endl;
01090
01091
01092 int ii = 0;
01093 while(fgets(line,255,ifile))
01094 {
01095 std::string EBorEE;
01096 int hashedIndex(0);
01097 int chStatus(0);
01098 std::stringstream aStrStream;
01099 aStrStream << line;
01100 aStrStream >> EBorEE >> hashedIndex >> chStatus;
01101
01102 std::cout << EBorEE << " hashedIndex " << hashedIndex << " status " << chStatus << std::endl;
01103
01104 if (EBorEE == "EB")
01105 {
01106 EBDetId aEBDetId=EBDetId::unhashIndex(hashedIndex);
01107 status->setValue( aEBDetId, chStatus );
01108 }
01109 else if (EBorEE == "EE")
01110 {
01111
01112 EEDetId aEEDetId=EEDetId::unhashIndex(hashedIndex);
01113 status->setValue( aEEDetId, chStatus );
01114 }
01115 else if (EBorEE == "EBTT")
01116 {
01117 int ism=hashedIndex;
01118 int itt=chStatus;
01119
01120 int ixtt=(itt-1)%4;
01121 int iytt=(itt-1)/4;
01122 int ixmin=ixtt*5;
01123 int iymin=iytt*5;
01124 int ixmax=(ixtt+1)*5-1;
01125 int iymax=(iytt+1)*5-1;
01126 for(int ieta=iymin; ieta<=iymax; ieta++) {
01127 for(int iphi=ixmin; iphi<=ixmax; iphi++) {
01128 int ixt=ieta*20+iphi+1;
01129 std::cout<< "killing crystal "<< ism << "/" << ixt << endl;
01130 EBDetId ebid(ism,ixt,EBDetId::SMCRYSTALMODE);
01131 status->setValue( ebid, 1 );
01132 }
01133 }
01134 }
01135
01136 ii++ ;
01137
01138 }
01139
01140 fclose(ifile);
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168 return status;
01169
01170
01171 }