00001 #include "CalibFormats/HcalObjects/interface/HcalDbService.h"
00002 #include "CondFormats/HcalObjects/interface/HcalQIECoder.h"
00003 #include "CondFormats/HcalObjects/interface/HcalPedestals.h"
00004 #include "CondFormats/HcalObjects/interface/HcalPedestalWidths.h"
00005 #include "Geometry/CaloTopology/interface/HcalTopology.h"
00006 #include "CalibCalorimetry/HcalAlgos/interface/HcalPedestalAnalysis.h"
00007 #include "TFile.h"
00008 #include <math.h>
00009
00010
00011
00012
00013
00014 using namespace std;
00015
00016 HcalPedestalAnalysis::HcalPedestalAnalysis(const edm::ParameterSet& ps)
00017 : fRefPedestals (0),
00018 fRefPedestalWidths (0),
00019 fRawPedestals (0),
00020 fRawPedestalWidths (0),
00021 fValPedestals (0),
00022 fValPedestalWidths (0)
00023 {
00024 fTopology=0;
00025 m_coder = 0;
00026 m_shape = 0;
00027 evt=0;
00028 sample=0;
00029 m_file=0;
00030 m_AllPedsOK=0;
00031 for(int i=0; i<4; i++) m_stat[i]=0;
00032 for(int k=0;k<4;k++) state.push_back(true);
00033
00034
00035 m_outputFileMean = ps.getUntrackedParameter<string>("outputFileMeans", "");
00036 if ( m_outputFileMean.size() != 0 ) {
00037 cout << "Hcal pedestal means will be saved to " << m_outputFileMean.c_str() << endl;
00038 }
00039 m_outputFileWidth = ps.getUntrackedParameter<string>("outputFileWidths", "");
00040 if ( m_outputFileWidth.size() != 0 ) {
00041 cout << "Hcal pedestal widths will be saved to " << m_outputFileWidth.c_str() << endl;
00042 }
00043 m_outputFileROOT = ps.getUntrackedParameter<string>("outputFileHist", "");
00044 if ( m_outputFileROOT.size() != 0 ) {
00045 cout << "Hcal pedestal histograms will be saved to " << m_outputFileROOT.c_str() << endl;
00046 }
00047 m_nevtsample = ps.getUntrackedParameter<int>("nevtsample",0);
00048
00049 if(m_nevtsample==9999999) m_nevtsample=0;
00050 m_pedsinADC = ps.getUntrackedParameter<int>("pedsinADC",0);
00051 m_hiSaveflag = ps.getUntrackedParameter<int>("hiSaveflag",0);
00052 m_pedValflag = ps.getUntrackedParameter<int>("pedValflag",0);
00053 if(m_pedValflag<0) m_pedValflag=0;
00054 if (m_nevtsample>0 && m_pedValflag>0) {
00055 cout<<"WARNING - incompatible cfg options: nevtsample = "<<m_nevtsample<<", pedValflag = "<<m_pedValflag<<endl;
00056 cout<<"Setting pedValflag = 0"<<endl;
00057 m_pedValflag=0;
00058 }
00059 if(m_pedValflag>1) m_pedValflag=1;
00060 m_startTS = ps.getUntrackedParameter<int>("firstTS", 0);
00061 if(m_startTS<0) m_startTS=0;
00062 m_endTS = ps.getUntrackedParameter<int>("lastTS", 9);
00063
00064 fTopology=new HcalTopology(HcalTopologyMode::LHC,2,3);
00065
00066
00067
00068 hbHists.ALLPEDS = new TH1F("HBHE All Pedestals","HBHE All Peds",10,0,9);
00069 hbHists.PEDRMS= new TH1F("HBHE All Pedestal Widths","HBHE All Pedestal RMS",100,0,3);
00070 hbHists.PEDMEAN= new TH1F("HBHE All Pedestal Means","HBHE All Pedestal Means",100,0,9);
00071 hbHists.CHI2= new TH1F("HBHE Chi2/ndf for whole range Gauss fit","HBHE Chi2/ndf Gauss",200,0.,50.);
00072
00073 hoHists.ALLPEDS = new TH1F("HO All Pedestals","HO All Peds",10,0,9);
00074 hoHists.PEDRMS= new TH1F("HO All Pedestal Widths","HO All Pedestal RMS",100,0,3);
00075 hoHists.PEDMEAN= new TH1F("HO All Pedestal Means","HO All Pedestal Means",100,0,9);
00076 hoHists.CHI2= new TH1F("HO Chi2/ndf for whole range Gauss fit","HO Chi2/ndf Gauss",200,0.,50.);
00077
00078 hfHists.ALLPEDS = new TH1F("HF All Pedestals","HF All Peds",10,0,9);
00079 hfHists.PEDRMS= new TH1F("HF All Pedestal Widths","HF All Pedestal RMS",100,0,3);
00080 hfHists.PEDMEAN= new TH1F("HF All Pedestal Means","HF All Pedestal Means",100,0,9);
00081 hfHists.CHI2= new TH1F("HF Chi2/ndf for whole range Gauss fit","HF Chi2/ndf Gauss",200,0.,50.);
00082 }
00083
00084
00085 HcalPedestalAnalysis::~HcalPedestalAnalysis(){
00086
00087 for(_meot=hbHists.PEDTRENDS.begin(); _meot!=hbHists.PEDTRENDS.end(); _meot++){
00088 for(int i=0; i<16; i++) _meot->second[i].first->Delete();
00089 }
00090 for(_meot=hoHists.PEDTRENDS.begin(); _meot!=hoHists.PEDTRENDS.end(); _meot++){
00091 for(int i=0; i<16; i++) _meot->second[i].first->Delete();
00092 }
00093 for(_meot=hfHists.PEDTRENDS.begin(); _meot!=hfHists.PEDTRENDS.end(); _meot++){
00094 for(int i=0; i<16; i++) _meot->second[i].first->Delete();
00095 }
00096 hbHists.ALLPEDS->Delete();
00097 hbHists.PEDRMS->Delete();
00098 hbHists.PEDMEAN->Delete();
00099 hbHists.CHI2->Delete();
00100
00101 hoHists.ALLPEDS->Delete();
00102 hoHists.PEDRMS->Delete();
00103 hoHists.PEDMEAN->Delete();
00104 hoHists.CHI2->Delete();
00105
00106 hfHists.ALLPEDS->Delete();
00107 hfHists.PEDRMS->Delete();
00108 hfHists.PEDMEAN->Delete();
00109 hfHists.CHI2->Delete();
00110 }
00111
00112
00113 void HcalPedestalAnalysis::setup(const std::string& m_outputFileROOT) {
00114
00115 m_file=new TFile(m_outputFileROOT.c_str(),"RECREATE");
00116 m_file->mkdir("HB");
00117 m_file->cd();
00118 m_file->mkdir("HO");
00119 m_file->cd();
00120 m_file->mkdir("HF");
00121 m_file->cd();
00122 }
00123
00124
00125 void HcalPedestalAnalysis::processEvent(const HBHEDigiCollection& hbhe,
00126 const HODigiCollection& ho,
00127 const HFDigiCollection& hf,
00128 const HcalDbService& cond)
00129 {
00130 evt++;
00131 sample=1;
00132 evt_curr=evt;
00133 if(m_nevtsample>0) {
00134 sample = (evt-1)/m_nevtsample +1;
00135 evt_curr = evt%m_nevtsample;
00136 if(evt_curr==0)evt_curr=m_nevtsample;
00137 }
00138
00139
00140
00141 try{
00142 if(!hbhe.size()) throw (int)hbhe.size();
00143 for (HBHEDigiCollection::const_iterator j=hbhe.begin(); j!=hbhe.end(); j++){
00144 const HBHEDataFrame digi = (const HBHEDataFrame)(*j);
00145 m_coder = cond.getHcalCoder(digi.id());
00146 m_shape = cond.getHcalShape(m_coder);
00147 for(int k=0; k<(int)state.size();k++) state[k]=true;
00148
00149
00150 for (int i=m_startTS; i<digi.size() && i<=m_endTS; i++) {
00151 for(int flag=0; flag<4; flag++){
00152 if(i+flag<digi.size() && i+flag<=m_endTS){
00153 per2CapsHists(flag,0,digi.id(),digi.sample(i),digi.sample(i+flag),hbHists.PEDTRENDS,cond);
00154 }
00155 }
00156 }
00157 if(m_startTS==0 && m_endTS>4){
00158 AllChanHists(digi.id(),digi.sample(0),digi.sample(1),digi.sample(2),digi.sample(3),digi.sample(4),digi.sample(5),hbHists.PEDTRENDS);
00159 }
00160 }
00161 }
00162 catch (int i ) {
00163
00164 }
00165
00166 try{
00167 if(!ho.size()) throw (int)ho.size();
00168 for (HODigiCollection::const_iterator j=ho.begin(); j!=ho.end(); j++){
00169 const HODataFrame digi = (const HODataFrame)(*j);
00170 m_coder = cond.getHcalCoder(digi.id());
00171 for (int i=m_startTS; i<digi.size() && i<=m_endTS; i++) {
00172 for(int flag=0; flag<4; flag++){
00173 if(i+flag<digi.size() && i+flag<=m_endTS){
00174 per2CapsHists(flag,1,digi.id(),digi.sample(i),digi.sample(i+flag),hoHists.PEDTRENDS,cond);
00175 }
00176 }
00177 }
00178 if(m_startTS==0 && m_endTS>4){
00179 AllChanHists(digi.id(),digi.sample(0),digi.sample(1),digi.sample(2),digi.sample(3),digi.sample(4),digi.sample(5),hoHists.PEDTRENDS);
00180 }
00181 }
00182 }
00183 catch (int i ) {
00184
00185 }
00186
00187 try{
00188 if(!hf.size()) throw (int)hf.size();
00189 for (HFDigiCollection::const_iterator j=hf.begin(); j!=hf.end(); j++){
00190 const HFDataFrame digi = (const HFDataFrame)(*j);
00191 m_coder = cond.getHcalCoder(digi.id());
00192 for (int i=m_startTS; i<digi.size() && i<=m_endTS; i++) {
00193 for(int flag=0; flag<4; flag++){
00194 if(i+flag<digi.size() && i+flag<=m_endTS){
00195 per2CapsHists(flag,2,digi.id(),digi.sample(i),digi.sample(i+flag),hfHists.PEDTRENDS,cond);
00196 }
00197 }
00198 }
00199 if(m_startTS==0 && m_endTS>4){
00200 AllChanHists(digi.id(),digi.sample(0),digi.sample(1),digi.sample(2),digi.sample(3),digi.sample(4),digi.sample(5),hfHists.PEDTRENDS);
00201 }
00202 }
00203 }
00204 catch (int i ) {
00205
00206 }
00207
00208 if(m_nevtsample>0) {
00209 if(evt%m_nevtsample==0) SampleAnalysis();
00210 }
00211 }
00212
00213
00214 void HcalPedestalAnalysis::per2CapsHists(int flag, int id, const HcalDetId detid, const HcalQIESample& qie1, const HcalQIESample& qie2, map<HcalDetId, map<int,PEDBUNCH> > &toolT, const HcalDbService& cond) {
00215
00216
00217
00218
00219 static const int bins=10;
00220 static const int bins2=100;
00221 float lo=-0.5; float hi=9.5;
00222 map<int,PEDBUNCH> _mei;
00223 static map<HcalDetId, map<int,float> > QieCalibMap;
00224 string type = "HBHE";
00225
00226 if(id==0){
00227 if(detid.ieta()<16) type = "HB";
00228 if(detid.ieta()>16) type = "HE";
00229 if(detid.ieta()==16){
00230 if(detid.depth()<3) type = "HB";
00231 if(detid.depth()==3) type = "HE";
00232 }
00233 }
00234 else if(id==1) type = "HO";
00235 else if(id==2) type = "HF";
00236
00237 _meot = toolT.find(detid);
00238
00239
00240 if (_meot==toolT.end()){
00241 map<int,PEDBUNCH> insert;
00242 map<int,float> qiecalib;
00243 char name[1024];
00244 for(int i=0; i<4; i++){
00245 lo=-0.5;
00246
00247
00248 if (m_pedsinADC) hi=9.5;
00249 else hi = 11.5;
00250 sprintf(name,"%s Pedestal, eta=%d phi=%d d=%d cap=%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth(),i);
00251 insert[i].first = new TH1F(name,name,bins,lo,hi);
00252 sprintf(name,"%s Product, eta=%d phi=%d d=%d caps=%d*%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth(),i,(i+1)%4);
00253 insert[4+i].first = new TH1F(name,name,bins2,0.,100.);
00254 sprintf(name,"%s Product, eta=%d phi=%d d=%d caps=%d*%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth(),i,(i+2)%4);
00255 insert[8+i].first = new TH1F(name,name,bins2,0.,100.);
00256 sprintf(name,"%s Product, eta=%d phi=%d d=%d caps=%d*%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth(),i,(i+3)%4);
00257 insert[12+i].first = new TH1F(name,name,bins2,0.,100.);
00258 }
00259 sprintf(name,"%s Signal in TS 4+5, eta=%d phi=%d d=%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth());
00260 insert[16].first = new TH1F(name,name,21,-0.5,20.5);
00261 sprintf(name,"%s Signal in TS 4+5-2-3, eta=%d phi=%d d=%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth());
00262 insert[17].first = new TH1F(name,name,21,-10.5,10.5);
00263 sprintf(name,"%s Signal in TS 4+5-(0+1+2+3)/2., eta=%d phi=%d d=%d",type.c_str(),detid.ieta(),detid.iphi(),detid.depth());
00264 insert[18].first = new TH1F(name,name,21,-10.5,10.5);
00265 toolT[detid] = insert;
00266 _meot = toolT.find(detid);
00267
00268 QieCalibMap[detid]=qiecalib;
00269 }
00270
00271 _mei = _meot->second;
00272
00273 const HcalQIECoder* coder = cond.getHcalCoder(detid);
00274 const HcalQIEShape* shape = cond.getHcalShape(coder);
00275 float charge1 = coder->charge(*shape,qie1.adc(),qie1.capid());
00276 float charge2 = coder->charge(*shape,qie2.adc(),qie2.capid());
00277
00278
00279 if(flag==0){
00280 if(m_nevtsample>0) {
00281 if((evt-1)%m_nevtsample==0 && state[qie1.capid()]){
00282 state[qie1.capid()]=false;
00283 _mei[qie1.capid()].first->Reset();
00284 _mei[qie1.capid()+4].first->Reset();
00285 _mei[qie1.capid()+8].first->Reset();
00286 _mei[qie1.capid()+12].first->Reset();
00287 }
00288 }
00289 if (qie1.adc()<bins){
00290 if (m_pedsinADC) _mei[qie1.capid()].first->Fill(qie1.adc());
00291 else _mei[qie1.capid()].first->Fill(charge1);
00292 }
00293 else if(qie1.adc()>=bins){
00294 _mei[qie1.capid()].first->AddBinContent(bins+1,1);
00295 }
00296 }
00297
00298
00299 if(flag>0){
00300 map<int,float> qiecalib = QieCalibMap[detid];
00301
00302
00303 if (charge1*charge2<bins2){
00304 _mei[qie1.capid()+4*flag].first->Fill(charge1*charge2);
00305 }
00306 else{
00307 _mei[qie1.capid()+4*flag].first->Fill(bins2);
00308 }
00309 }
00310
00311 if(flag==0){
00312 if(id==0) hbHists.ALLPEDS->Fill(qie1.adc());
00313 else if(id==1) hoHists.ALLPEDS->Fill(qie1.adc());
00314 else if(id==2) hfHists.ALLPEDS->Fill(qie1.adc());
00315 }
00316 }
00317
00318
00319 void HcalPedestalAnalysis::AllChanHists(const HcalDetId detid, const HcalQIESample& qie0, const HcalQIESample& qie1, const HcalQIESample& qie2, const HcalQIESample& qie3, const HcalQIESample& qie4, const HcalQIESample& qie5, map<HcalDetId, map<int,PEDBUNCH> > &toolT) {
00320
00321
00322
00323 _meot = toolT.find(detid);
00324 map<int,PEDBUNCH> _mei = _meot->second;
00325 _mei[16].first->Fill(qie4.adc()+qie5.adc()-1.);
00326 _mei[17].first->Fill(qie4.adc()+qie5.adc()-qie2.adc()-qie3.adc());
00327 _mei[18].first->Fill(qie4.adc()+qie5.adc()-(qie0.adc()+qie1.adc()+qie2.adc()+qie3.adc())/2.);
00328 }
00329
00330
00331 void HcalPedestalAnalysis::SampleAnalysis(){
00332
00333 char PedSampleNum[20];
00334
00335
00336 sprintf(PedSampleNum,"HB_Sample%d",sample);
00337 m_file->cd();
00338 m_file->mkdir(PedSampleNum);
00339 m_file->cd(PedSampleNum);
00340 GetPedConst(hbHists.PEDTRENDS,hbHists.PEDMEAN,hbHists.PEDRMS);
00341 sprintf(PedSampleNum,"HO_Sample%d",sample);
00342 m_file->cd();
00343 m_file->mkdir(PedSampleNum);
00344 m_file->cd(PedSampleNum);
00345 GetPedConst(hoHists.PEDTRENDS,hoHists.PEDMEAN,hoHists.PEDRMS);
00346 sprintf(PedSampleNum,"HF_Sample%d",sample);
00347 m_file->cd();
00348 m_file->mkdir(PedSampleNum);
00349 m_file->cd(PedSampleNum);
00350 GetPedConst(hfHists.PEDTRENDS,hfHists.PEDMEAN,hfHists.PEDRMS);
00351 }
00352
00353
00354 void HcalPedestalAnalysis::GetPedConst(map<HcalDetId, map<int,PEDBUNCH> > &toolT, TH1F* PedMeans, TH1F* PedWidths)
00355 {
00356
00357
00358 float cap[4]; float sig[4][4]; float dcap[4]; float dsig[4][4]; float chi2[4];
00359
00360 for(_meot=toolT.begin(); _meot!=toolT.end(); _meot++){
00361 HcalDetId detid = _meot->first;
00362
00363
00364 if(fitflag>0){
00365 for (int i=0; i<4; i++) {
00366 TF1 *fit = _meot->second[i].first->GetFunction("gaus");
00367 chi2[i]=0;
00368 if(fit->GetNDF()!=0) chi2[i]=fit->GetChisquare()/fit->GetNDF();
00369 cap[i]=fit->GetParameter(1);
00370 sig[i][i]=fit->GetParameter(2);
00371 dcap[i]=fit->GetParError(1);
00372 dsig[i][i]=fit->GetParError(2);
00373 }
00374 }
00375 else{
00376 for (int i=0; i<4; i++) {
00377 cap[i]=_meot->second[i].first->GetMean();
00378 sig[i][i]=_meot->second[i].first->GetRMS();
00379 m_stat[i]=0;
00380
00381 for(int j=m_startTS; j<m_endTS+1; j++){
00382 m_stat[i]+=_meot->second[i].first->GetBinContent(j+1);
00383 }
00384 dcap[i] = sig[i][i]/sqrt(m_stat[i]);
00385
00386 dsig[i][i] = sig[i][i]/sqrt(2.*m_stat[i]);
00387 chi2[i]=0.;
00388 }
00389 }
00390
00391 for (int i=0; i<4; i++) {
00392 if(m_hiSaveflag>0) {
00393 if (m_pedsinADC)
00394 _meot->second[i].first->GetXaxis()->SetTitle("ADC");
00395 else _meot->second[i].first->GetXaxis()->SetTitle("Charge, fC");
00396 _meot->second[i].first->GetYaxis()->SetTitle("CapID samplings");
00397 _meot->second[i].first->Write();
00398 }
00399 if(m_nevtsample>0) {
00400 _meot->second[i].second.first[0].push_back(cap[i]);
00401 _meot->second[i].second.first[1].push_back(dcap[i]);
00402 _meot->second[i].second.first[2].push_back(sig[i][i]);
00403 _meot->second[i].second.first[3].push_back(dsig[i][i]);
00404 _meot->second[i].second.first[4].push_back(chi2[i]);
00405 }
00406 PedMeans->Fill(cap[i]);
00407 PedWidths->Fill(sig[i][i]);
00408 }
00409
00410
00411 if(m_hiSaveflag==-100){
00412 for(int i=16; i<19; i++){
00413 if (m_pedsinADC)
00414 _meot->second[i].first->GetXaxis()->SetTitle("ADC");
00415 else _meot->second[i].first->GetXaxis()->SetTitle("Charge, fC");
00416 _meot->second[i].first->GetYaxis()->SetTitle("Events");
00417 _meot->second[i].first->Write();
00418 }
00419 }
00420
00421
00422 sig[0][0]=sig[0][0]*sig[0][0];
00423 sig[1][1]=sig[1][1]*sig[1][1];
00424 sig[2][2]=sig[2][2]*sig[2][2];
00425 sig[3][3]=sig[3][3]*sig[3][3];
00426
00427
00428
00429 sig[0][1]= _meot->second[4].first->GetMean()-cap[0]*cap[1];
00430 sig[0][2]= _meot->second[8].first->GetMean()-cap[0]*cap[2];
00431 sig[1][2]= _meot->second[5].first->GetMean()-cap[1]*cap[2];
00432 sig[1][3]= _meot->second[9].first->GetMean()-cap[1]*cap[3];
00433 sig[2][3]= _meot->second[6].first->GetMean()-cap[2]*cap[3];
00434 sig[0][3]= _meot->second[12].first->GetMean()-cap[0]*cap[3];
00435 sig[1][0]= _meot->second[13].first->GetMean()-cap[1]*cap[0];
00436 sig[2][0]= _meot->second[10].first->GetMean()-cap[2]*cap[0];
00437 sig[2][1]= _meot->second[14].first->GetMean()-cap[2]*cap[1];
00438 sig[3][1]= _meot->second[11].first->GetMean()-cap[3]*cap[1];
00439 sig[3][2]= _meot->second[15].first->GetMean()-cap[3]*cap[2];
00440 sig[3][0]= _meot->second[7].first->GetMean()-cap[3]*cap[0];
00441
00442
00443 for(int i=0; i<4; i++){
00444 if(m_nevtsample>0) {
00445 _meot->second[i].second.first[5].push_back(sig[i][(i+1)%4]);
00446 _meot->second[i].second.first[6].push_back(2*sig[i][i]*dsig[i][i]);
00447 _meot->second[i].second.first[7].push_back(sig[i][(i+2)%4]);
00448 _meot->second[i].second.first[8].push_back(2*sig[i][i]*dsig[i][i]);
00449 _meot->second[i].second.first[9].push_back(sig[i][(i+3)%4]);
00450 _meot->second[i].second.first[10].push_back(2*sig[i][i]*dsig[i][i]);
00451 }
00452
00453 if(m_hiSaveflag>10) {
00454 if (m_pedsinADC)
00455 _meot->second[i+4].first->GetXaxis()->SetTitle("ADC^2");
00456 else _meot->second[i+4].first->GetXaxis()->SetTitle("Charge^2, fC^2");
00457 _meot->second[i+4].first->GetYaxis()->SetTitle("2-CapID samplings");
00458 _meot->second[i+4].first->Write();
00459 if (m_pedsinADC)
00460 _meot->second[i+8].first->GetXaxis()->SetTitle("ADC^2");
00461 else _meot->second[i+8].first->GetXaxis()->SetTitle("Charge^2, fC^2");
00462 _meot->second[i+8].first->GetYaxis()->SetTitle("2-CapID samplings");
00463 _meot->second[i+8].first->Write();
00464 if (m_pedsinADC)
00465 _meot->second[i+12].first->GetXaxis()->SetTitle("ADC^2");
00466 else _meot->second[i+12].first->GetXaxis()->SetTitle("Charge^2, fC^2");
00467 _meot->second[i+12].first->GetYaxis()->SetTitle("2-CapID samplings");
00468 _meot->second[i+12].first->Write();
00469 }
00470 }
00471
00472
00473
00474 if (m_nevtsample<1) {
00475 sig[1][0]=sig[0][1];
00476 sig[2][0]=sig[0][2];
00477 sig[2][1]=sig[1][2];
00478 sig[3][1]=sig[1][3];
00479 sig[3][2]=sig[2][3];
00480 sig[0][3]=sig[3][0];
00481 if (fRawPedestals)
00482 {
00483 HcalPedestal item(detid,cap[0],cap[1],cap[2],cap[3]);
00484 fRawPedestals->addValues(item);
00485 }
00486 if (fRawPedestalWidths)
00487 {
00488 HcalPedestalWidth widthsp(detid);
00489 widthsp.setSigma(0,0,sig[0][0]);
00490 widthsp.setSigma(0,1,sig[0][1]);
00491 widthsp.setSigma(0,2,sig[0][2]);
00492 widthsp.setSigma(1,1,sig[1][1]);
00493 widthsp.setSigma(1,2,sig[1][2]);
00494 widthsp.setSigma(1,3,sig[1][3]);
00495 widthsp.setSigma(2,2,sig[2][2]);
00496 widthsp.setSigma(2,3,sig[2][3]);
00497 widthsp.setSigma(3,3,sig[3][3]);
00498 widthsp.setSigma(3,0,sig[0][3]);
00499 fRawPedestalWidths->addValues(widthsp);
00500 }
00501 }
00502 }
00503 }
00504
00505
00506 int HcalPedestalAnalysis::done(const HcalPedestals* fInputPedestals,
00507 const HcalPedestalWidths* fInputPedestalWidths,
00508 HcalPedestals* fOutputPedestals,
00509 HcalPedestalWidths* fOutputPedestalWidths)
00510 {
00511 int nstat[4];
00512
00513
00514
00515 fRefPedestals = fInputPedestals;
00516 fRefPedestalWidths = fInputPedestalWidths;
00517
00518
00519 if(m_pedValflag>0) {
00520 fValPedestals = fOutputPedestals;
00521 fValPedestalWidths = fOutputPedestalWidths;
00522 fRawPedestals = new HcalPedestals(fTopology,m_pedsinADC);
00523 fRawPedestalWidths = new HcalPedestalWidths(fTopology,m_pedsinADC);
00524 }
00525 else {
00526 fRawPedestals = fOutputPedestals;
00527 fRawPedestalWidths = fOutputPedestalWidths;
00528 fValPedestals = new HcalPedestals(fTopology,m_pedsinADC);
00529 fValPedestalWidths = new HcalPedestalWidths(fTopology,m_pedsinADC);
00530 }
00531
00532
00533 if(m_nevtsample<1) SampleAnalysis();
00534 if(m_nevtsample>0) {
00535 if(evt%m_nevtsample!=0) SampleAnalysis();
00536 }
00537
00538
00539 if(m_nevtsample>0){
00540 m_file->cd();
00541 m_file->cd("HB");
00542 Trendings(hbHists.PEDTRENDS,hbHists.CHI2,hbHists.CAPID_AVERAGE,hbHists.CAPID_CHI2);
00543 m_file->cd();
00544 m_file->cd("HO");
00545 Trendings(hoHists.PEDTRENDS,hoHists.CHI2,hoHists.CAPID_AVERAGE,hoHists.CAPID_CHI2);
00546 m_file->cd();
00547 m_file->cd("HF");
00548 Trendings(hfHists.PEDTRENDS,hfHists.CHI2,hfHists.CAPID_AVERAGE,hfHists.CAPID_CHI2);
00549 }
00550
00551 if (m_nevtsample<1) {
00552
00553
00554
00555
00556
00557 m_AllPedsOK=-1;
00558 if(m_pedValflag>0) {
00559 for (int i=0; i<4; i++) nstat[i]=(int)m_stat[i];
00560 int NPedErrors=HcalPedVal(nstat,fRefPedestals,fRefPedestalWidths,
00561 fRawPedestals,fRawPedestalWidths,
00562 fValPedestals,fValPedestalWidths);
00563 m_AllPedsOK=NPedErrors;
00564 }
00565
00566
00567
00568
00569
00570 }
00571
00572
00573
00574 m_file->cd();
00575 m_file->cd("HB");
00576 hbHists.ALLPEDS->Write();
00577 hbHists.PEDRMS->Write();
00578 hbHists.PEDMEAN->Write();
00579
00580 m_file->cd();
00581 m_file->cd("HO");
00582 hoHists.ALLPEDS->Write();
00583 hoHists.PEDRMS->Write();
00584 hoHists.PEDMEAN->Write();
00585
00586 m_file->cd();
00587 m_file->cd("HF");
00588 hfHists.ALLPEDS->Write();
00589 hfHists.PEDRMS->Write();
00590 hfHists.PEDMEAN->Write();
00591
00592 m_file->Close();
00593 cout << "Hcal histograms written to " << m_outputFileROOT.c_str() << endl;
00594 return (int)m_AllPedsOK;
00595 }
00596
00597
00598 void HcalPedestalAnalysis::Trendings(map<HcalDetId, map<int,PEDBUNCH> > &toolT, TH1F* Chi2, TH1F* CapidAverage, TH1F* CapidChi2){
00599
00600
00601
00602 map<int, std::vector<double> > AverageValues;
00603
00604 for(_meot=toolT.begin(); _meot!=toolT.end(); _meot++){
00605 for(int i=0; i<4; i++){
00606 char name[1024];
00607 HcalDetId detid = _meot->first;
00608 sprintf(name,"Pedestal trend, eta=%d phi=%d d=%d cap=%d",detid.ieta(),detid.iphi(),detid.depth(),i);
00609 int bins = _meot->second[i].second.first[0].size();
00610 float lo =0.5;
00611 float hi = (float)bins+0.5;
00612 _meot->second[i].second.second.push_back(new TH1F(name,name,bins,lo,hi));
00613 sprintf(name,"Width trend, eta=%d phi=%d d=%d cap=%d",detid.ieta(),detid.iphi(),detid.depth(),i);
00614 bins = _meot->second[i].second.first[2].size();
00615 hi = (float)bins+0.5;
00616 _meot->second[i].second.second.push_back(new TH1F(name,name,bins,lo,hi));
00617 sprintf(name,"Correlation trend, eta=%d phi=%d d=%d caps=%d*%d",detid.ieta(),detid.iphi(),detid.depth(),i,(i+1)%4);
00618 bins = _meot->second[i].second.first[5].size();
00619 hi = (float)bins+0.5;
00620 _meot->second[i].second.second.push_back(new TH1F(name,name,bins,lo,hi));
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630 std::vector<double>::iterator sample_it;
00631
00632 int j=0;
00633 for(sample_it=_meot->second[i].second.first[0].begin();
00634 sample_it!=_meot->second[i].second.first[0].end();sample_it++){
00635 _meot->second[i].second.second[0]->SetBinContent(++j,*sample_it);
00636 }
00637 j=0;
00638 for(sample_it=_meot->second[i].second.first[1].begin();
00639 sample_it!=_meot->second[i].second.first[1].end();sample_it++){
00640 _meot->second[i].second.second[0]->SetBinError(++j,*sample_it);
00641 }
00642
00643 _meot->second[i].second.second[0]->Fit("pol0","Q");
00644 TF1 *fit = _meot->second[i].second.second[0]->GetFunction("pol0");
00645 AverageValues[0].push_back(fit->GetParameter(0));
00646 AverageValues[1].push_back(fit->GetParError(0));
00647 if(sample>1)
00648 AverageValues[2].push_back(fit->GetChisquare()/fit->GetNDF());
00649 else
00650 AverageValues[2].push_back(fit->GetChisquare());
00651 sprintf(name,"Sample (%d events)",m_nevtsample);
00652 _meot->second[i].second.second[0]->GetXaxis()->SetTitle(name);
00653 _meot->second[i].second.second[0]->GetYaxis()->SetTitle("Pedestal value");
00654 _meot->second[i].second.second[0]->Write();
00655
00656 j=0;
00657 for(sample_it=_meot->second[i].second.first[2].begin();
00658 sample_it!=_meot->second[i].second.first[2].end();sample_it++){
00659 _meot->second[i].second.second[1]->SetBinContent(++j,*sample_it);
00660 }
00661 j=0;
00662 for(sample_it=_meot->second[i].second.first[3].begin();
00663 sample_it!=_meot->second[i].second.first[3].end();sample_it++){
00664 _meot->second[i].second.second[1]->SetBinError(++j,*sample_it);
00665 }
00666 _meot->second[i].second.second[1]->GetXaxis()->SetTitle(name);
00667 _meot->second[i].second.second[1]->GetYaxis()->SetTitle("Pedestal width");
00668 _meot->second[i].second.second[1]->Write();
00669
00670 j=0;
00671 for(sample_it=_meot->second[i].second.first[5].begin();
00672 sample_it!=_meot->second[i].second.first[5].end();sample_it++){
00673 _meot->second[i].second.second[2]->SetBinContent(++j,*sample_it);
00674 }
00675 j=0;
00676 for(sample_it=_meot->second[i].second.first[6].begin();
00677 sample_it!=_meot->second[i].second.first[6].end();sample_it++){
00678 _meot->second[i].second.second[2]->SetBinError(++j,*sample_it);
00679 }
00680 _meot->second[i].second.second[2]->GetXaxis()->SetTitle(name);
00681 _meot->second[i].second.second[2]->GetYaxis()->SetTitle("Close correlation");
00682 _meot->second[i].second.second[2]->Write();
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710 j=0;
00711 for(sample_it=_meot->second[i].second.first[4].begin();
00712 sample_it!=_meot->second[i].second.first[4].end();sample_it++){
00713 Chi2->Fill(*sample_it);
00714 }
00715 }
00716 }
00717 CapidAverage= new TH1F("Constant fit: Pedestal Values",
00718 "Constant fit: Pedestal Values",
00719 AverageValues[0].size(),0.,AverageValues[0].size());
00720 std::vector<double>::iterator sample_it;
00721 int j=0;
00722 for(sample_it=AverageValues[0].begin();
00723 sample_it!=AverageValues[0].end();sample_it++){
00724 CapidAverage->SetBinContent(++j,*sample_it);
00725 }
00726 j=0;
00727 for(sample_it=AverageValues[1].begin();
00728 sample_it!=AverageValues[1].end();sample_it++){
00729 CapidAverage->SetBinError(++j,*sample_it);
00730 }
00731 CapidChi2= new TH1F("Constant fit: Chi2/ndf",
00732 "Constant fit: Chi2/ndf",
00733 AverageValues[2].size(),0.,AverageValues[2].size());
00734 j=0;
00735 for(sample_it=AverageValues[2].begin();
00736 sample_it!=AverageValues[2].end();sample_it++){
00737 CapidChi2->SetBinContent(++j,*sample_it);
00738
00739 }
00740 Chi2->GetXaxis()->SetTitle("Chi2/ndf");
00741 Chi2->GetYaxis()->SetTitle("50 x [(16+2) x 4 x 4] `events`");
00742 Chi2->Write();
00743 CapidAverage->GetYaxis()->SetTitle("Pedestal value");
00744 CapidAverage->GetXaxis()->SetTitle("(16+2) x 4 x 4 `events`");
00745 CapidAverage->Write();
00746 CapidChi2->GetYaxis()->SetTitle("Chi2/ndf");
00747 CapidChi2->GetXaxis()->SetTitle("(16+2) x 4 x 4 `events`");
00748 CapidChi2->Write();
00749
00750 }
00751
00752
00753 int HcalPedestalAnalysis::HcalPedVal(int nstat[4], const HcalPedestals* fRefPedestals,
00754 const HcalPedestalWidths* fRefPedestalWidths,
00755 HcalPedestals* fRawPedestals,
00756 HcalPedestalWidths* fRawPedestalWidths,
00757 HcalPedestals* fValPedestals,
00758 HcalPedestalWidths* fValPedestalWidths)
00759 {
00760
00761
00762
00763 HcalDetId detid;
00764 float RefPedVals[4]; float RefPedSigs[4][4];
00765 float RawPedVals[4]; float RawPedSigs[4][4];
00766 map<HcalDetId,bool> isinRaw;
00767 map<HcalDetId,bool> isinRef;
00768 std::vector<DetId> RefChanns=fRefPedestals->getAllChannels();
00769 std::vector<DetId> RawChanns=fRawPedestals->getAllChannels();
00770 std::ofstream PedValLog;
00771 PedValLog.open("HcalPedVal.log");
00772
00773 if(nstat[0]+nstat[1]+nstat[2]+nstat[3]<2500) PedValLog<<"HcalPedVal: warning - low statistics"<<std::endl;
00774
00775 for (int i=0; i<(int)RawChanns.size(); i++){
00776 isinRef[HcalDetId(RawChanns[i])]=false;
00777 }
00778 for (int i=0; i<(int)RefChanns.size(); i++){
00779 detid=HcalDetId(RefChanns[i]);
00780 isinRaw[detid]=false;
00781 isinRef[detid]=true;
00782 }
00783 for (int i=0; i<(int)RawChanns.size(); i++){
00784 detid=HcalDetId(RawChanns[i]);
00785 isinRaw[detid]=true;
00786 if (isinRef[detid]==false) {
00787 PedValLog<<"HcalPedVal: channel "<<detid<<" not found in reference set"<<std::endl;
00788 std::cerr<<"HcalPedVal: channel "<<detid<<" not found in reference set"<<std::endl;
00789 }
00790 }
00791
00792
00793 int erflag=0;
00794 for (int i=0; i<(int)RefChanns.size(); i++){
00795 detid=HcalDetId(RefChanns[i]);
00796 for (int icap=0; icap<4; icap++) {
00797 RefPedVals[icap]=fRefPedestals->getValues(detid)->getValue(icap);
00798 for (int icap2=icap; icap2<4; icap2++) {
00799 RefPedSigs[icap][icap2]=fRefPedestalWidths->getValues(detid)->getSigma(icap,icap2);
00800 if(icap2!=icap)RefPedSigs[icap2][icap]=RefPedSigs[icap][icap2];
00801 }
00802 }
00803
00804
00805 if(isinRaw[detid]) {
00806 for (int icap=0; icap<4; icap++) {
00807 RawPedVals[icap]=fRawPedestals->getValues(detid)->getValue(icap);
00808 for (int icap2=icap; icap2<4; icap2++) {
00809 RawPedSigs[icap][icap2]=fRawPedestalWidths->getValues(detid)->getSigma(icap,icap2);
00810 if(icap2!=icap)RawPedSigs[icap2][icap]=RawPedSigs[icap][icap2];
00811 }
00812 }
00813
00814
00815 for (int icap=0; icap<4; icap++) {
00816 if(RawPedVals[icap]<1. || RawPedSigs[icap][icap]<0.01) isinRaw[detid]=false;
00817 for (int icap2=icap; icap2<4; icap2++){
00818 if(fabs(RawPedSigs[icap][icap2]/sqrt(RawPedSigs[icap][icap]*RawPedSigs[icap2][icap2]))>1.) isinRaw[detid]=false;
00819 }
00820 }
00821 }
00822
00823
00824 if(isinRaw[detid]) {
00825 for (int icap=0; icap<4; icap++) {
00826 int icap2=(icap+1)%4;
00827 float width=sqrt(RawPedSigs[icap][icap]);
00828 float erof1=width/sqrt((float)nstat[icap]);
00829 float erof2=sqrt(erof1*erof1+RawPedSigs[icap][icap]/(float)nstat[icap]);
00830 float erofwidth=width/sqrt(2.*nstat[icap]);
00831 float diffof1=RawPedVals[icap]-RefPedVals[icap];
00832 float diffof2=RawPedVals[icap]+RawPedVals[icap2]-RefPedVals[icap]-RefPedVals[icap2];
00833 float diffofw=width-sqrt(RefPedSigs[icap][icap]);
00834
00835
00836 int nTS=2;
00837 if(detid.subdet()==HcalForward) nTS=1;
00838 if(nTS==1 && fabs(diffof1)>0.5+erof1) {
00839 erflag+=1;
00840 PedValLog<<"HcalPedVal: drift in channel "<<detid<<" cap "<<icap<<": "<<RawPedVals[icap]<<" - "<<RefPedVals[icap]<<" = "<<diffof1<<std::endl;
00841 }
00842 if(nTS==2 && fabs(diffof2)>0.5+erof2) {
00843 erflag+=1;
00844 PedValLog<<"HcalPedVal: drift in channel "<<detid<<" caps "<<icap<<"+"<<icap2<<": "<<RawPedVals[icap]<<"+"<<RawPedVals[icap2]<<" - "<<RefPedVals[icap]<<"+"<<RefPedVals[icap2]<<" = "<<diffof2<<std::endl;
00845 }
00846 if(fabs(diffofw)>0.15*width+erofwidth) {
00847 erflag+=1;
00848 PedValLog<<"HcalPedVal: width changed in channel "<<detid<<" cap "<<icap<<": "<<width<<" - "<<sqrt(RefPedSigs[icap][icap])<<" = "<<diffofw<<std::endl;
00849 }
00850 }
00851 }
00852
00853
00854 else {
00855 PedValLog<<"HcalPedVal: no valid data from channel "<<detid<<std::endl;
00856 erflag+=100000;
00857 HcalPedestal item(detid,RefPedVals[0],RefPedVals[1],RefPedVals[2],RefPedVals[3]);
00858 fValPedestals->addValues(item);
00859 HcalPedestalWidth widthsp(detid);
00860 for (int icap=0; icap<4; icap++) {
00861 for (int icap2=icap; icap2<4; icap2++) widthsp.setSigma(icap2,icap,RefPedSigs[icap2][icap]);
00862 }
00863 fValPedestalWidths->addValues(widthsp);
00864 }
00865
00866
00867 }
00868
00869 if(erflag==0) PedValLog<<"HcalPedVal: all pedestals checked OK"<<std::endl;
00870
00871
00872
00873 if(erflag%100000 == 0) {
00874 for (int i=0; i<(int)RefChanns.size(); i++){
00875 detid=HcalDetId(RefChanns[i]);
00876 if (isinRaw[detid]) {
00877 HcalPedestalWidth widthsp(detid);
00878 for (int icap=0; icap<4; icap++) {
00879 RefPedVals[icap]=fRefPedestals->getValues(detid)->getValue(icap);
00880 for (int icap2=icap; icap2<4; icap2++) {
00881 RefPedSigs[icap][icap2]=fRefPedestalWidths->getValues(detid)->getSigma(icap,icap2);
00882 if(icap2!=icap)RefPedSigs[icap2][icap]=RefPedSigs[icap][icap2];
00883 widthsp.setSigma(icap2,icap,RefPedSigs[icap2][icap]);
00884 }
00885 }
00886 fValPedestalWidths->addValues(widthsp);
00887 HcalPedestal item(detid,RefPedVals[0],RefPedVals[1],RefPedVals[2],RefPedVals[3]);
00888 fValPedestals->addValues(item);
00889 }
00890 }
00891 }
00892
00893
00894 else {
00895 for (int i=0; i<(int)RawChanns.size(); i++){
00896 detid=HcalDetId(RawChanns[i]);
00897 if (isinRaw[detid]) {
00898 HcalPedestalWidth widthsp(detid);
00899 for (int icap=0; icap<4; icap++) {
00900 RawPedVals[icap]=fRawPedestals->getValues(detid)->getValue(icap);
00901 for (int icap2=icap; icap2<4; icap2++) {
00902 RawPedSigs[icap][icap2]=fRawPedestalWidths->getValues(detid)->getSigma(icap,icap2);
00903 if(icap2!=icap)RawPedSigs[icap2][icap]=RawPedSigs[icap][icap2];
00904 widthsp.setSigma(icap2,icap,RawPedSigs[icap2][icap]);
00905 }
00906 }
00907 fValPedestalWidths->addValues(widthsp);
00908 HcalPedestal item(detid,RawPedVals[0],RawPedVals[1],RawPedVals[2],RawPedVals[3]);
00909 fValPedestals->addValues(item);
00910 }
00911 }
00912 }
00913 return erflag;
00914 }
00915