00001
00007 #include <iostream>
00008 #include <fstream>
00009 #include <vector>
00010 #include "string"
00011 #include <cmath>
00012
00013 #include <FWCore/Framework/interface/Frameworkfwd.h>
00014 #include <FWCore/Framework/interface/MakerMacros.h>
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include "FWCore/Framework/interface/EDAnalyzer.h"
00017 #include "FWCore/Framework/interface/Event.h"
00018 #include "DataFormats/Common/interface/Handle.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00020 #include "FWCore/Framework/interface/EventSetup.h"
00021 #include "FWCore/Framework/interface/ESHandle.h"
00022 #include "DataFormats/CSCDigi/interface/CSCStripDigi.h"
00023 #include "DataFormats/CSCDigi/interface/CSCStripDigiCollection.h"
00024 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00025 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00026 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00027 #include "IORawData/CSCCommissioning/src/FileReaderDDU.h"
00028 #include "EventFilter/CSCRawToDigi/interface/CSCDDUEventData.h"
00029 #include "EventFilter/CSCRawToDigi/interface/CSCDCCEventData.h"
00030 #include "EventFilter/CSCRawToDigi/interface/CSCEventData.h"
00031 #include "EventFilter/CSCRawToDigi/interface/CSCDMBHeader.h"
00032 #include "OnlineDB/CSCCondDB/interface/CSCOldGainAnalyzer.h"
00033
00034 CSCOldGainAnalyzer::CSCOldGainAnalyzer(edm::ParameterSet const& conf) {
00035 debug = conf.getUntrackedParameter<bool>("debug",false);
00036 eventNumber=0,evt=0,Nddu=0,flagGain=-9,flagIntercept=-9;
00037 strip=0,misMatch=0,NChambers=0;
00038 i_chamber=0,i_layer=0,reportedChambers=0;
00039 length=1,gainSlope=-999.0,gainIntercept=-999.0;
00040 counter=0;
00041
00042 adcCharge = TH2F("adcCharge","adcCharge", 100,0,300,100,0,2000);
00043
00044 for (int i=0; i<NUMMODTEN_oldga; i++){
00045 for (int j=0; j<CHAMBERS_oldga; j++){
00046 for (int k=0; k<LAYERS_oldga; k++){
00047 for (int l=0; l<STRIPS_oldga; l++){
00048 maxmodten[i][j][k][l] = 0.0;
00049 }
00050 }
00051 }
00052 }
00053
00054
00055 for (int i=0; i<CHAMBERS_oldga; i++){
00056 size[i] = 0;
00057 }
00058
00059 for (int iii=0;iii<DDU_oldga;iii++){
00060 for (int i=0; i<CHAMBERS_oldga; i++){
00061 for (int j=0; j<LAYERS_oldga; j++){
00062 for (int k=0; k<STRIPS_oldga; k++){
00063 adcMax[iii][i][j][k] = -999.0;
00064 adcMean_max[iii][i][j][k] = -999.0;
00065 }
00066 }
00067 }
00068 }
00069
00070 for (int i=0; i<480; i++){
00071 newGain[i] =0.0;
00072 newIntercept[i]=0.0;
00073 newChi2[i] =0.0;
00074 }
00075 }
00076
00077 void CSCOldGainAnalyzer::analyze(edm::Event const& e, edm::EventSetup const& iSetup) {
00078
00079 edm::Handle<CSCStripDigiCollection> strips;
00080 e.getByLabel("cscunpacker","MuonCSCStripDigi",strips);
00081
00082 edm::Handle<FEDRawDataCollection> rawdata;
00083 e.getByType(rawdata);
00084
00085 for (int id=FEDNumbering::getCSCFEDIds().first;
00086 id<=FEDNumbering::getCSCFEDIds().second; ++id){
00087
00089 const FEDRawData& fedData = rawdata->FEDData(id);
00090 if (fedData.size()){
00091
00093 CSCDCCEventData dccData((short unsigned int *) fedData.data());
00094
00095 const std::vector<CSCDDUEventData> & dduData = dccData.dduData();
00096
00097 evt++;
00098 for (unsigned int iDDU=0; iDDU<dduData.size(); ++iDDU) {
00099
00101 const std::vector<CSCEventData> & cscData = dduData[iDDU].cscData();
00102 Nddu = dduData.size();
00103 reportedChambers += dduData[iDDU].header().ncsc();
00104 NChambers = cscData.size();
00105 int repChambers = dduData[iDDU].header().ncsc();
00106 std::cout << " Reported Chambers = " << repChambers <<" "<<NChambers<< std::endl;
00107 if (NChambers!=repChambers) { std::cout<< "misMatched size!!!" << std::endl; misMatch++;}
00108
00109 for (int i_chamber=0; i_chamber<NChambers; i_chamber++) {
00110
00111 for (int i_layer = 1; i_layer <=6; ++i_layer) {
00112
00113 std::vector<CSCStripDigi> digis = cscData[i_chamber].stripDigis(i_layer) ;
00114 const CSCDMBHeader * thisDMBheader = cscData[i_chamber].dmbHeader();
00115
00116 if (thisDMBheader->cfebAvailable()){
00117 dmbID[i_chamber] = cscData[i_chamber].dmbHeader()->dmbID();
00118 crateID[i_chamber] = cscData[i_chamber].dmbHeader()->crateID();
00119 if(crateID[i_chamber] == 255) continue;
00120
00121 for (unsigned int i=0; i<digis.size(); i++){
00122 size[i_chamber] = digis.size();
00123 std::vector<int> adc = digis[i].getADCCounts();
00124 strip = digis[i].getStrip();
00125 adcMax[iDDU][i_chamber][i_layer-1][strip-1]=-99.0;
00126 for(unsigned int k=0; k<adc.size(); k++){
00127 float ped=(adc[0]+adc[1])/2.;
00128 if(adc[k]-ped > adcMax[iDDU][i_chamber][i_layer-1][strip-1]) {
00129 adcMax[iDDU][i_chamber][i_layer-1][strip-1]=adc[k]-ped;
00130 }
00131 }
00132
00133 adcMean_max[iDDU][i_chamber][i_layer-1][strip-1] += adcMax[iDDU][i_chamber][i_layer-1][strip-1]/20.;
00134
00135
00136 if (evt%20 == 0 && (strip-1)%16 == (evt-1)/NUMMODTEN_oldga){
00137 int ten = int((evt-1)/20)%NUMBERPLOTTED_oldga ;
00138 maxmodten[ten][i_chamber][i_layer-1][strip-1] = adcMean_max[iDDU][i_chamber][i_layer-1][strip-1];
00139 }
00140 }
00141 }
00142 }
00143 }
00144
00145
00146 if((evt-1)%20==0){
00147 for(int iii=0;iii<DDU_oldga;iii++){
00148 for(int ii=0; ii<CHAMBERS_oldga; ii++){
00149 for(int jj=0; jj<LAYERS_oldga; jj++){
00150 for(int kk=0; kk<STRIPS_oldga; kk++){
00151 adcMean_max[iii][ii][jj][kk]=0.0;
00152 }
00153 }
00154 }
00155 }
00156 }
00157
00158 eventNumber++;
00159 edm::LogInfo ("CSCOldGainAnalyzer") << "end of event number " << eventNumber;
00160 }
00161 }
00162 }
00163 }
00164
00165
00166 CSCOldGainAnalyzer::~CSCOldGainAnalyzer(){
00167
00168 filein.open("../test/CSColdgain.cfg");
00169 filein.ignore(1000,'\n');
00170
00171 while(filein != NULL){
00172 lines++;
00173 getline(filein,PSet);
00174
00175 if (lines==2){
00176 name=PSet;
00177 std::cout<<name<<std::endl;
00178 }
00179 }
00180 std::string::size_type runNameStart = name.find("\"",0);
00181 std::string::size_type runNameEnd = name.find("raw",0);
00182 std::string::size_type rootStart = name.find("Gains",0);
00183 int nameSize = runNameEnd+2-runNameStart;
00184 int myRootSize = rootStart-runNameStart+8;
00185 std::string myname= name.substr(runNameStart+1,nameSize);
00186 std::string myRootName= name.substr(runNameStart+1,myRootSize);
00187 std::string myRootEnd = ".root";
00188 std::string myASCIIFileEnd = ".dat";
00189 std::string runFile= myRootName;
00190 std::string myRootFileName = runFile+myRootEnd;
00191 std::string myASCIIFileName= runFile+myASCIIFileEnd;
00192 const char *myNewName=myRootFileName.c_str();
00193 const char *myFileName=myASCIIFileName.c_str();
00194
00195 struct tm* clock;
00196 struct stat attrib;
00197 stat(myname.c_str(), &attrib);
00198 clock = localtime(&(attrib.st_mtime));
00199 std::string myTime=asctime(clock);
00200 std::ofstream myGainsFile(myFileName,std::ios::out);
00201
00202
00203 CSCobject *cn = new CSCobject();
00204 cscmap *map = new cscmap();
00205 condbon *dbon = new condbon();
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 for (int dduiter=0;dduiter<Nddu;dduiter++){
00216 for(int chamberiter=0; chamberiter<NChambers; chamberiter++){
00217 for (int cham=0;cham<NChambers;cham++){
00218 if (cham !=chamberiter) continue;
00219
00220
00221 int new_crateID = crateID[cham];
00222 int new_dmbID = dmbID[cham];
00223 std::cout<<" Crate: "<<new_crateID<<" and DMB: "<<new_dmbID<<std::endl;
00224 map->crate_chamber(new_crateID,new_dmbID,&chamber_id,&chamber_num,§or,&first_strip_index,&strips_per_layer,&chamber_index);
00225 std::cout<<"Data is for chamber:: "<< chamber_id<<" in sector: "<<sector<<" index "<<first_strip_index<<std::endl;
00226
00227
00228
00229 for (int layeriter=0; layeriter<LAYERS_oldga; layeriter++){
00230 for (int stripiter=0; stripiter<STRIPS_oldga; stripiter++){
00231
00232 for (int j=0; j<LAYERS_oldga; j++){
00233 if (j != layeriter) continue;
00234
00235 int layer_id=chamber_num+j+1;
00236 if(sector==-100)continue;
00237 cn->obj[layer_id].resize(size[cham]);
00238 for (int k=0; k<size[cham]; k++){
00239 if (k != stripiter) continue;
00240 float sumOfX = 0.0;
00241 float sumOfY = 0.0;
00242 float sumOfXY = 0.0;
00243 float sumx2 = 0.0;
00244 float gainSlope = 0.0;
00245 float gainIntercept = 0.0;
00246 float chi2 = 0.0;
00247
00248 float charge[NUMBERPLOTTED_oldga]={22.4, 44.8, 67.2, 89.6, 112, 134.4, 156.8, 179.2, 201.6, 224.0};
00249
00250
00251 for(int ii=0; ii<NUMBERPLOTTED_oldga; ii++){
00252 sumOfX += charge[ii];
00253 sumOfY += maxmodten[ii][cham][j][k];
00254 sumOfXY += (charge[ii]*maxmodten[ii][cham][j][k]);
00255 sumx2 += (charge[ii]*charge[ii]);
00256 myCharge[ii] = 22.4 +(22.4*ii);
00257
00258 }
00259
00260
00261
00262 gainSlope = ((NUMBERPLOTTED_oldga*sumOfXY) - (sumOfX * sumOfY))/((NUMBERPLOTTED_oldga*sumx2) - (sumOfX*sumOfX));
00263 gainIntercept = ((sumOfY*sumx2)-(sumOfX*sumOfXY))/((NUMBERPLOTTED_oldga*sumx2)-(sumOfX*sumOfX));
00264
00265
00266 if (isnan(gainSlope)) gainSlope = 0.0;
00267
00268 for(int ii=0; ii<NUMBERPLOTTED_oldga; ii++){
00269 chi2 += (maxmodten[ii][cham][j][k]-(gainIntercept+(gainSlope*charge[ii])))*(maxmodten[ii][cham][j][k]-(gainIntercept+(gainSlope*charge[ii])))/(NUMBERPLOTTED_oldga*NUMBERPLOTTED_oldga);
00270 }
00271
00272
00273
00274
00275 if (gainSlope>5.0 && gainSlope<10.0) flagGain=1;
00276 if (gainSlope<5.0) flagGain=2;
00277 if (gainSlope>10.0) flagGain=3;
00278
00279 if (gainIntercept> -40. && gainIntercept<15.) flagIntercept = 1 ;
00280 if (gainIntercept< -40.) flagIntercept = 2 ;
00281 if (gainIntercept> 15.) flagIntercept = 3 ;
00282
00283
00284 counter++;
00285 myIndex = first_strip_index+counter-1;
00286 if (counter>size[cham]*LAYERS_oldga) counter=0;
00287 myGainsFile <<layer_id<<" "<<" "<<myIndex-1<<" "<<k<<" "<<gainSlope<<" "<<gainIntercept<<" "<<chi2<<std::endl;
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301 cn->obj[layer_id][k].resize(3);
00302 cn->obj[layer_id][k][0] = gainSlope;
00303 cn->obj[layer_id][k][1] = gainIntercept;
00304 cn->obj[layer_id][k][2] = chi2;
00305 }
00306 }
00307 }
00308 }
00309 }
00310 }
00311 }
00312
00313
00314 dbon->cdbon_last_record("gains",&record);
00315 std::cout<<"Last gains record "<<record<<" for run file "<<myname<<" saved "<<myTime<<std::endl;
00316 if(debug) dbon->cdbon_write(cn,"gains",12,3498,myTime);
00317
00318
00319
00320
00321
00322
00323 }
00324
00325