00001 #include <iostream>
00002 #include <fstream>
00003 using namespace std;
00004
00005 #include "CalibrationHelperFunctions.cxx"
00006
00007 #include "TFile.h"
00008 #include "TMath.h"
00009 #include "TH1.h"
00010 #include "TF1.h"
00011 #include "TPostScript.h"
00012 #include "TCanvas.h"
00013 #include "TStyle.h"
00014 #include "TLatex.h"
00015 #include "TString.h"
00016 #include "TLine.h"
00017
00018 void drawTower(TH1* h, TF1* f, int id, int status, CalibrationHelperFunctions* helper);
00019
00020 float getTowerEta(int id);
00021 TString towerQA(TH1* h, TF1* f);
00022 bool isBadIso2005(int id);
00023 bool isBadPoverE2005(int id);
00024 bool isBadTower2005(int id);
00025 bool isPmtNew(int id);
00026 bool isBadTower2006(int id);
00027
00028 void mip_histogram_fitter(const char* file_list="mips.list", const char* postscript="mip.ps", const char* gainfile="mip.gains.long",const char* ofname="2008.mipfit.root",const char* gfiles="mip.gains"){
00029 const int ntowers = 4800;
00030
00031 int mipstatus[ntowers];
00032 cout<<"input files: "<<file_list<<endl;
00033 cout<<"plots: "<<postscript<<endl;
00034 cout<<"gains: "<<gainfile<<endl;
00035
00036 gStyle->SetCanvasColor(10);
00037 gStyle->SetCanvasBorderMode(0);
00038 gStyle->SetStatColor(10);
00039 gStyle->SetOptTitle(0);
00040 gStyle->SetOptFit(111);
00041 gStyle->SetOptStat("mrie");
00042
00043 TFile* outfile = new TFile(ofname,"RECREATE");
00044 CalibrationHelperFunctions* helper = new CalibrationHelperFunctions();
00045 float pi = TMath::Pi();
00046
00047 TPostScript *ps = new TPostScript(postscript);
00048 TCanvas *c = new TCanvas("c","",100,100,600.,800.);
00049 int pad;
00050 TH1 *mip_histo[ntowers];
00051 TH2F* etaphi = new TH2F("etaphi","Mip peaks",40,-1.0,1.0,120,-pi,pi);
00052 TH2F* statcode = new TH2F("statcode","Mip peaks",40,-1.0,1.0,120,-pi,pi);
00053 etaphi->SetXTitle("#eta");
00054 etaphi->SetYTitle("#phi");
00055 statcode->SetXTitle("#eta");
00056 statcode->SetYTitle("#phi");
00057 TH1 *dumhist;
00058 char file[200];
00059 int nfiles = 0;
00060 ifstream filelist(file_list);
00061 while(1){
00062 filelist >> file;
00063 if(!filelist.good()) break;
00064 cout<<file<<endl;
00065 TFile input_file(file,"READ");
00066 char name[100];
00067
00068 for(int y = 0; y < ntowers; y++)
00069 {
00070 sprintf(name,"mip_histo_%i",y+1);
00071 if(nfiles == 0)
00072 {
00073 mip_histo[y] = (TH1*)input_file.Get(name);
00074 }
00075 else
00076 {
00077
00078 dumhist = (TH1*)input_file.Get(name);
00079 mip_histo[y]->Add(dumhist);
00080 dumhist->Clear();
00081 }
00082 }
00083 nfiles++;
00084 input_file.Clear();
00085 }
00086
00087 TF1 *gaussian_fit[ntowers], *landau_fit[ntowers];
00088 char name[100];
00089
00090 int counter = 0;
00091 for(int i=0; i<ntowers; i++){
00092 mipstatus[i] = 0;
00093
00094
00095 if(counter%20 == 0){
00096 c->Update();
00097 ps->NewPage();
00098 c->Clear();
00099 c->Divide(4,5);
00100 pad = 1;
00101 }
00102
00103 if(i%600==0) cout<<"finished drawing tower "<<i+1<<endl;
00104
00105 c->cd(pad);
00106
00107
00108 sprintf(name,"fit_%i",i+1);
00109
00110 gaussian_fit[i] = new TF1(name,"gaus(0) + pol0(3)",5.,250.);
00111
00112 landau_fit[i] = new TF1(name,"landau",5.,200.);
00113
00114
00115 if((i+1) % 20 == 0){
00116
00117 mip_histo[i]->Rebin(5);
00118 mip_histo[i]->GetXaxis()->SetRangeUser(6.,100.);
00119 }else{
00120 mip_histo[i]->Rebin(2);
00121 mip_histo[i]->GetXaxis()->SetRangeUser(6.,50.);
00122 }
00123 float guesspeak = mip_histo[i]->GetBinCenter(mip_histo[i]->GetMaximumBin());
00124 float guessrms = mip_histo[i]->GetRMS();
00125 gaussian_fit[i]->SetParameter(1,guesspeak);
00126 gaussian_fit[i]->SetParameter(2,guessrms);
00127 gaussian_fit[i]->SetParLimits(0,1,1000000);
00128 gaussian_fit[i]->SetParLimits(1,1,250);
00129 gaussian_fit[i]->SetParLimits(2,0,100);
00130 gaussian_fit[i]->SetParLimits(3,0,1000000);
00131 landau_fit[i]->SetParameter(1,17.);
00132 landau_fit[i]->SetParameter(2,3.);
00133
00134
00135
00136
00137
00138
00139
00140
00141 gaussian_fit[i]->SetLineColor(kBlue);
00142 gaussian_fit[i]->SetLineWidth(0.6);
00143
00144 landau_fit[i]->SetLineColor(kYellow);
00145 landau_fit[i]->SetLineWidth(0.6);
00146
00147 double histogram_top = mip_histo[i]->GetBinContent(mip_histo[i]->GetMaximumBin());
00148 double gaussian_mean = 0;
00149
00150 if(mip_histo[i]->Integral() > 25){
00151 mip_histo[i]->Fit(gaussian_fit[i],"rql","",guesspeak-2*guessrms,guesspeak+2*guessrms);
00152 mipstatus[i]+=1;
00153 double gauss_const = gaussian_fit[i]->GetParameter(0);
00154 gaussian_mean = gaussian_fit[i]->GetParameter(1);
00155
00156 if(gaussian_mean < 5)mipstatus[i]+=4;
00157 if((i+1)%20==0){
00158 if(abs(gaussian_mean-guesspeak) > 10)mipstatus[i]+=8;
00159 if(gaussian_fit[i]->GetParameter(2) > 20)mipstatus[i]+=2;
00160 }else{
00161 if(abs(gaussian_mean-guesspeak) > 5)mipstatus[i]+=8;
00162 if(gaussian_fit[i]->GetParameter(2) > 15)mipstatus[i]+=2;
00163 }
00164 if(guesspeak > 50)mipstatus[i]+=64;
00165 if(mipstatus[i]==1){
00166 etaphi->Fill(helper->getEta(i+1),helper->getPhi(i+1),gaussian_mean);
00167 mipstatus[i]+=128;
00168 }
00169 statcode->Fill(helper->getEta(i+1),helper->getPhi(i+1),mipstatus[i]);
00170
00171 }
00172 if(mipstatus[i]==129)mipstatus[i] = 1;
00173
00174 if(mipstatus[i]>1){
00175
00176 mip_histo[i]->GetFunction(name)->SetLineColor(kRed);
00177 }
00178 drawTower(mip_histo[i],gaussian_fit[i],i+1,mipstatus[i],helper);
00179
00180 TLine *gaussian_peak = new TLine(gaussian_mean,0.,gaussian_mean,histogram_top+15);
00181 gaussian_peak->SetLineColor(kBlue);
00182 if(mipstatus[i]!=1)gaussian_peak->SetLineColor(kRed);
00183 gaussian_peak->SetLineWidth(2.0);
00184 gaussian_peak->Draw("same");
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 pad++;
00201 counter++;
00202 }
00203 c->Update();
00204 ps->NewPage();
00205 c->Clear();
00206 c->Divide(1,2);
00207 gStyle->SetPalette(1);
00208 gStyle->SetOptStat("e");
00209 c->cd(1);
00210 etaphi->Draw("colz");
00211 c->cd(2);
00212 statcode->GetZaxis()->SetRangeUser(0,20);
00213 statcode->Draw("colz");
00214 ps->Close();
00215
00216 ofstream gains(gainfile);
00217 ofstream shortgain(gfiles);
00218 char line[500];
00219
00220 int nGood = 0;
00221 int nZero = 0;
00222 for(int i=0; i<ntowers; i++){
00223 double fitMaximum = gaussian_fit[i]->GetMaximum(0.,100.);
00224 double mipPeak = gaussian_fit[i]->GetX(fitMaximum, 0., 100.);
00225 double fitMean = gaussian_fit[i]->GetParameter(1);
00226
00227 int hentries = mip_histo[i]->GetEntries();
00228 double hmean = mip_histo[i]->GetMean();
00229 double hrms = mip_histo[i]->GetRMS();
00230 double fNDF = gaussian_fit[i]->GetNDF();
00231 double fchi = gaussian_fit[i]->GetChisquare();
00232 double chi = 0;
00233 if(fNDF > 0)chi = fchi/fNDF;
00234
00235
00236
00237 double gain = 0;
00238 double fSig = 0;
00239 double fMeanErr = 0;
00240 double fSigErr = 0;
00241 double fCon = 0;
00242 double fConErr = 0;
00243 double mInt = 0;
00244 if(mipPeak > 0 && fitMean > 0){
00245 float eta = getTowerEta(i+1);
00246 float theta=2.*TMath::ATan(TMath::Exp(-eta));
00247 gain = 0.264*(1.+0.056*eta*eta)/(TMath::Sin(theta)*fitMean);
00248 fSig = gaussian_fit[i]->GetParameter(2);
00249 fSigErr = gaussian_fit[i]->GetParError(2);
00250 fCon = gaussian_fit[i]->GetParameter(0);
00251 fConErr = gaussian_fit[i]->GetParError(0);
00252 fMeanErr = gaussian_fit[i]->GetParError(1);
00253 mip_histo[i]->GetXaxis()->SetRangeUser(fitMean-2*fSig,fitMean+2*fSig);
00254 mInt = mip_histo[i]->Integral();
00255 if((i+1) % 20 == 0){
00256 mip_histo[i]->GetXaxis()->SetRangeUser(6.,100.);
00257 }else{
00258 mip_histo[i]->GetXaxis()->SetRangeUser(6.,50.);
00259 }
00260 }
00261
00262 sprintf(line,"%-4i,%i,%2.3f,%2.3f,%2.3f,%i,%2.3f,%2.3f,%2.3f,%2.3f,%2.3f,%2.3f,%2.3f,%2.3f",i+1,hentries,hmean,hrms,gain,mipstatus[i],chi,fCon,fConErr,fitMean,fMeanErr,fSig,fSigErr,mInt);
00263 if(mipstatus[i]==1)nGood++;
00264 if(mipstatus[i]==0)nZero++;
00265 gains<<line<<endl;
00266 shortgain<<i+1<<" "<<fitMean<<" "<<fMeanErr<<" "<<mipstatus[i]<<endl;
00267 }
00268
00269
00270 outfile->cd();
00271 for(int i = 0; i < ntowers; i++){
00272 mip_histo[i]->Write();
00273 }
00274 etaphi->Write();
00275 statcode->Write();
00276 outfile->Close();
00277
00278 cout<<"finished tower fits"<<endl;
00279 cout<<"nGood = "<<nGood<<", nZero = "<<nZero<<endl;
00280
00281
00282 gains.close();
00283 shortgain.close();
00284 }
00285
00286 void drawTower(TH1* h, TF1* f, int id, int status, CalibrationHelperFunctions* helper){
00287
00288 double peak = f->GetParameter(1);
00289 double mean = f->Mean(5.,200.);
00290 double histo_height = h->GetBinContent(h->GetMaximumBin());
00291 if(histo_height == 0) histo_height = 1.;
00292
00293 int xLatexBin = 20;
00294
00295
00296 h->SetXTitle("ADC");
00297 h->Draw("e");
00298
00299
00300 char line_name[50];
00301 sprintf(line_name,"mip_peak_%i",id);
00302 TH1* line = new TH1F(line_name,line_name,h->GetNbinsX(),h->GetBinLowEdge(1),h->GetBinLowEdge(h->GetNbinsX()+1));
00303 line->SetLineColor(kRed);
00304 line->Fill(peak,1.e8);
00305
00306
00307
00308 char tower_title[100];
00309 char teta[100];
00310 char tphi[100];
00311 sprintf(teta,"e:%1.2f",helper->getEta(id));
00312 sprintf(tphi,"p:%1.2f",helper->getPhi(id));
00313 TLatex eta_latex;
00314 TLatex phi_latex;
00315 eta_latex.SetTextSize(0.15);
00316 phi_latex.SetTextSize(0.15);
00317 eta_latex.DrawTextNDC(0.65,0.5,teta);
00318 phi_latex.DrawTextNDC(0.65,0.3,tphi);
00319 sprintf(tower_title,"%i",id);
00320 TLatex title_latex;
00321 title_latex.SetTextSize(0.15);
00322 if(status!=1) title_latex.SetTextColor(kRed);
00323
00324 title_latex.DrawTextNDC(0.13,0.78,tower_title);
00325 if(status!=1){
00326 char tower_code[100];
00327 sprintf(tower_code,"%i",status);
00328 TLatex status_latex;
00329 status_latex.SetTextSize(0.15);
00330 status_latex.SetTextColor(kRed);
00331 status_latex.DrawTextNDC(0.47,0.78,tower_code);
00332 }
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 }
00373
00374 float getTowerEta(int id){
00375 float eta = (id%20)*0.05-0.025;
00376 if(eta < 0.02) eta = 0.97;
00377 return eta;
00378 }
00379
00380 TString towerQA(TH1* h, TF1* f){
00381 TString QA = "";
00382
00383 if(h->GetEntries() < 1) QA += "empty";
00384 if(h->GetBinContent(0) > 5) QA += "under";
00385 if(h->GetBinContent(h->GetNbinsX()+1) > 5) QA += "over";
00386 if(h->GetBinCenter(h->GetMaximumBin()) < 10.) QA += "lowmax";
00387 if(f->GetParameter(1) < 0.) QA += "negfit";
00388
00389 return QA;
00390 }
00391
00392 bool isBadPoverE2005(int id){
00393 switch(id){
00394 case(30): case(95): case(108): case(162): case(308): case(533): case(555): case(750):
00395 case(762): case(779): case(873): case(882): case(899): case(1024): case(1130): case(1132):
00396 case(1197): case(1204): case(1217): case(1237): case(1257): case(1294): case(1306): case(1375):
00397 case(1434): case(1487): case(1537): case(1709): case(1984): case(2043): case(2162): case(2339):
00398 case(2392):
00399 return true;
00400 default:
00401 return false;
00402 }
00403 }
00404
00405 bool isBadIso2005(int id){
00406 switch(id){
00407 case(34): case(35): case(266): case(267): case(286): case(287): case(561): case(562):
00408 case(615): case(616): case(633): case(653): case(637): case(657): case(649): case(650):
00409 case(673): case(674): case(813): case(814): case(837): case(857): case(953): case(954):
00410 case(1026): case(1046): case(1353): case(1354): case(1574): case(1575): case(1753): case(1773):
00411 case(1765): case(1766): case(1897): case(1898): case(2073): case(2093): case(2077): case(2097):
00412 case(2440): case(2460): case(2589): case(2590): case(3070): case(3071): case(3494): case(3495):
00413 case(4677): case(4678):
00414 return true;
00415 default:
00416 return false;
00417 }
00418 }
00419
00420 bool isBadTower2005(int id){
00421 switch(id){
00422 case(36): case(45): case(46): case(47): case(48): case(50): case(59): case(63): case(139): case(220):
00423 case(297): case(303): case(389): case(411): case(426): case(446): case(448): case(485): case(492):
00424 case(528): case(559): case(565): case(638): case(671): case(691): case(738): case(744): case(761):
00425 case(846): case(855): case(875): case(897): case(916): case(1028): case(1080): case(1100): case(1104):
00426 case(1160): case(1176): case(1220): case(1280): case(1317): case(1397): case(1398): case(1400):
00427 case(1417): case(1419): case(1420): case(1440): case(1471): case(1505): case(1612): case(1668):
00428 case(1676): case(1679): case(1720): case(1764): case(1856): case(1866): case(1880): case(1909):
00429 case(2069): case(2074): case(2075): case(2079): case(2092): case(2161): case(2168): case(2241):
00430 case(2257): case(2285): case(2378): case(2394): case(2403): case(2409): case(2458): case(2460):
00431 case(2470): case(2504): case(2529): case(2592): case(2610): case(2658): case(2794): case(2834):
00432 case(2835): case(2863): case(2865): case(2897): case(2961): case(2969): case(2972): case(3069):
00433 case(3086): case(3093): case(3097): case(3232): case(3255): case(3283): case(3289): case(3309):
00434 case(3372): case(3407): case(3515): case(4171): case(4217): case(4232): case(4240): case(4312):
00435 case(4357): case(4377): case(4506): case(4507): case(4508): case(4514): case(4519): case(4543):
00436 case(4558): case(4560): case(4580): case(4585): case(4639): case(4660): case(4671): case(4678):
00437 case(4766): case(4768):
00438 return true;
00439 default:
00440 return false;
00441 }
00442 }
00443
00444 bool isPmtNew(int id){
00445 switch(id){
00446 case(10): case(11): case(30): case(36): case(63): case(66): case(91): case(272): case(274): case(279):
00447 case(297): case(303): case(313): case(318): case(326): case(361): case(367): case(390): case(412):
00448 case(448): case(528): case(565): case(596): case(691): case(738): case(744): case(761): case(774):
00449 case(855): case(875): case(897): case(1317): case(1400): case(1471): case(1476): case(1505): case(1507):
00450 case(1529): case(1721): case(1764): case(1808): case(1872): case(1873): case(1881): case(1883):
00451 case(1913): case(1924): case(1976): case(2020): case(2186): case(2187): case(2195): case(2238):
00452 case(2255): case(2257): case(2285): case(2378):
00453 return true;
00454 default:
00455 return false;
00456 }
00457 }
00458
00459 bool isBadTower2006(int id){
00460 switch(id){
00461
00462 case(50): case(139): case(220):
00463 case(389): case(411): case(426): case(446): case(485): case(492):
00464 case(638): case(671):
00465 case(846): case(855): case(875): case(916): case(1028): case(1080): case(1100):
00466 case(1160): case(1176): case(1220): case(1280): case(1397):
00467 case(1612): case(1668):
00468 case(1720): case(1856): case(1880):
00469 case(2074): case(2075): case(2079): case(2092): case(2168):
00470 case(2257): case(2394): case(2403): case(2409): case(2458):
00471 case(2470): case(2504): case(2529): case(2610): case(2658): case(2794): case(2834):
00472 case(2865): case(2897): case(2961): case(2969): case(2972):
00473 case(3097): case(3255): case(3289):
00474 case(3372): case(3515): case(4171): case(4217): case(4240):
00475 case(4357): case(4377): case(4506): case(4507): case(4508): case(4514): case(4543):
00476 case(4560): case(4580): case(4585): case(4671):
00477 case(4766): case(4768):
00478 return true;
00479
00480
00481 case(34): case(35): case(266): case(267): case(286): case(287): case(561): case(562):
00482 case(615): case(616): case(633): case(653): case(637): case(657): case(649): case(650):
00483 case(673): case(674): case(813): case(814): case(837): case(857): case(953): case(954):
00484 case(1026): case(1046): case(1353): case(1354): case(1574): case(1575): case(1753): case(1773):
00485 case(1765): case(1766): case(2073): case(2093): case(2077): case(2097):
00486 case(2440): case(2460): case(2589): case(2590): case(3070): case(3071): case(3494): case(3495):
00487 case(4677): case(4678):
00488 return true;
00489
00490
00491 case(240): case(390): case(391): case(392): case(409): case(410): case(412): case(504): case(541): case(594):
00492 case(629): case(639): case(647): case(681): case(749): case(760): case(839): case(840): case(844):
00493 case(859): case(873): case(880): case(933): case(1018): case(1125): case(1142): case(1143):
00494 case(1158): case(1159): case(1161): case(1162): case(1163): case(1171): case(1180): case(1198):
00495 case(1217): case(1224): case(1225): case(1237): case(1240): case(1244): case(1250):
00496 case(1301): case(1319): case(1321): case(1341): case(1342): case(1348): case(1375): case(1381): case(1401):
00497 case(1422): case(1507): case(1588): case(1608): case(1654): case(1732): case(1779): case(1838):
00498 case(1892): case(1893): case(1949): case(1985): case(2005): case(2021): case(2025): case(2070): case(2085):
00499 case(2094): case(2095): case(2101): case(2105): case(2108): case(2116): case(2177): case(2188): case(2196):
00500 case(2222): case(2262): case(2301): case(2305): case(2337): case(2453): case(2580): case(2633): case(2652):
00501 case(2727): case(3007): case(3017): case(3154): case(3171): case(3220): case(3231): case(3287): case(3290):
00502 case(3296): case(3328): case(3333): case(3493): case(3508): case(3544): case(3557): case(3588): case(3604):
00503 case(3611): case(3653): case(3678): case(3679): case(3709): case(3715): case(3727): case(3745): case(3746):
00504 case(3761): case(3769): case(3795): case(3803): case(3986): case(4014): case(4105): case(4016): case(4107):
00505 case(4018): case(4019): case(4020): case(4053): case(4054): case(4055): case(4056): case(4057): case(4075):
00506 case(4077): case(4078): case(4080): case(4100): case(4119): case(4120): case(4130): case(4174): case(4326):
00507 case(4388): case(4459): case(4464): case(4505): case(4549): case(4569): case(4596): case(4672): case(4684):
00508 case(4765):
00509 return true;
00510
00511
00512 case(341): case(900): case(1044): case(1063): case(1078): case(1850): case(1877): case(1878): case(3738):
00513 case(4015): case(4017): case(1048): case(3690): case(3718):
00514 return true;
00515
00516 default:
00517 return false;
00518 }
00519 }