104 #if !defined(__CINT__) || defined(__MAKECINT__)
109 #include "TChainElement.h"
110 #include "TGraphErrors.h"
113 #include "TProfile.h"
117 #include "TPolyMarker.h"
118 #include "TEllipse.h"
124 #include "TPrincipal.h"
131 Int_t EW_ASYMMETRY = kFALSE;
134 Bool_t USE_OLD_STDDEV = kTRUE;
135 Bool_t FORCE_GLO_SO = kTRUE;
136 Bool_t FORCE_g3_same = kTRUE;
137 Bool_t FORCE_g4_same = kTRUE;
138 Bool_t FORCE_g5_same = kTRUE;
139 Bool_t NO_PLOTS = kFALSE;
140 Bool_t BY_SECTOR = kFALSE;
141 Bool_t FIX_GL = kFALSE;
142 double GUESS_GL = 9.0;
143 double GUESS_g5 = 15.0;
144 double MAX_DEV = 4.0;
145 double REF_CONST1 = 0.318;
146 double RUN_CORRELATE = 0.70;
151 int Calib_SC_GL(
const char* input=0,
const char* cuts=0,
int scaler=-1,
int debug=0,
const char* gcuts=0);
152 int Calib_SC_GL(
const char* input,
const char* cuts,
const char* scalerstr,
int debug=0,
const char* gcuts=0);
155 Double_t funcGapf(Double_t* x, Double_t* pars);
156 Double_t funcSC(Double_t* x, Double_t* pars);
157 Double_t funcSC2(Double_t* x, Double_t* pars);
158 void fnchGapf(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag);
159 void fnchSC(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag);
160 void fnchSCGapf(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag);
161 void fnchSCGapfSec(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag);
164 int Init(
const char* input);
166 void SetMinMax(
int n, Double_t* ar,
double& min,
double& max,
double inclusion,
double margin=0.075);
167 int SetMinuitPars(
const int n, TString* names, Double_t* starts, Double_t* steps,
int debug, Bool_t* fixing=0);
168 void GetMinuitPar(
const int n);
169 void GetMinuitPars(
const int n, Bool_t* fixing=0, Double_t* fixedValues=0);
171 int FitWithOutlierRemoval(
int npar,
int debug);
172 void DrawErrorContours(
int npar, Bool_t* fix=0);
173 TString PCA(
int Nmax=32,
int debug=0);
174 void PrintResult(
double scp,
double escp,
double sop,
double esop,
175 double glp,
double eglp,
double ewp,
double eewp,
const char* det);
176 void PrintResult(
double scp,
double escp,
double sop,
double esop,
177 double* glp,
double* eglp,
const char* det);
180 const int nLimit=150;
183 const int npos=nfip*nsca;
184 const int nMeasuresMax=nfip*256;
185 const int nMeasuresHalf=nMeasuresMax/2;
194 Bool_t allZeros = kTRUE;
198 TCanvas* cSummary = 0;
199 TCanvas* conSC[nsca];
201 TCanvas* conSCGL = 0;
207 Int_t colorData = kOrange+2;
208 Int_t colorMiFit = kGray;
209 Int_t colorFit = kBlack;
210 Int_t colorConstraint = kBlue;
211 Int_t colorGrid = kSpring+8;
212 Int_t colorAggregate = kViolet+1;
213 Int_t colorOutlier = kMagenta-9;
214 Int_t colorFinal = kRed;
218 TVirtualFitter* minuit = 0;
219 TMinuit* minuit2 = 0;
221 Double_t* fitPars = 0;
222 Double_t* fitParErrs = 0;
224 Double_t fitParsSC[3];
225 Double_t fitParErrsSC[3];
226 Double_t fitParsGL[3];
227 Double_t fitParErrsGL[3];
228 Double_t fitParsSCGL[9];
229 Double_t fitParErrsSCGL[9];
230 Double_t fitParsSCGLsec[19];
231 Double_t fitParErrsSCGLsec[19];
234 char* parNameSCGL[9];
235 char* parNameSCGLsec[19];
236 Bool_t unfittableSec[12];
240 Double_t m_sc[nMeasuresMax];
241 Double_t m_scS[12][nMeasuresMax];
242 Double_t m_sc2[nMeasuresMax];
243 Double_t m_sc2S[12][nMeasuresMax];
244 Double_t m_usc[nMeasuresMax];
245 Double_t m_ugl[nMeasuresMax];
246 Double_t m_gapf[nMeasuresMax];
247 Double_t m_gapfS[12][nMeasuresMax];
248 Double_t m_runs[nMeasuresMax];
249 Double_t m_L[nMeasuresMax];
250 Double_t m_c1[nMeasuresMax];
251 Int_t m_set[nMeasuresMax];
252 Int_t m_runIdx[nMeasuresMax];
253 Double_t devsSC[nMeasuresMax];
254 Double_t devsGL[nMeasuresMax];
255 Double_t maxvarSC[nMeasuresMax];
256 Double_t maxvarGL[nMeasuresMax];
257 Double_t devsSCsec[12][nMeasuresMax];
258 Double_t devsGLsec[12][nMeasuresMax];
259 Double_t devs_set[nfip];
261 Bool_t outliers0[nMeasuresMax];
262 Bool_t outliersSC[nMeasuresMax];
263 Bool_t outliersGL[nMeasuresMax];
270 double VAR_all = 1.0;
271 double STDDEV_SC = 0.001;
272 double STDDEV_GL = 0.035;
280 double xgl[nMeasuresMax];
281 double ygl[nMeasuresMax];
282 double xgo[nMeasuresMax];
283 double ygo[nMeasuresMax];
284 double xsc[nMeasuresMax];
285 double ysc[nMeasuresMax];
286 double yso[nMeasuresMax];
289 TString pcadets[nsca];
290 double pcacoef[nsca];
293 const int maxp = 1024;
294 TPrincipal* ppl[maxp];
295 Bool_t DO_PCA = kFALSE;
296 Bool_t ITER0 = kFALSE;
304 int Calib_SC_GL(
const char* input,
const char* cuts,
const char* scalerstr,
int debug,
const char* gcuts) {
306 return (scastr.Contains(
":") ?
307 Calib_SC_GL(input,cuts, -999,debug,gcuts) :
308 Calib_SC_GL(input,cuts,nsca-1,debug,gcuts) );
311 int Calib_SC_GL(
const char* input,
const char* cuts,
int scaler,
int debug,
const char* gcuts) {
319 dets[3] =
"zdce+zdcw";
320 dets[4] =
"bbce+bbcw";
337 if (BY_SECTOR && EWmode==0) {
338 printf(
"Error: must do east or west only when processing by sector!");
341 if (EW_ASYMMETRY && EWmode!=0) {
342 printf(
"Error: must do both east and west when processing full asymmetry!");
345 if (EW_ASYMMETRY && BY_SECTOR) {
346 printf(
"Error: by sector not yet implemented when processing full asymmetry!");
350 int status = Init(input);
351 if (status)
return status;
353 cut = ((cuts) ? cuts :
"");
354 gcut = ((gcuts) ? gcuts : cut.GetTitle());
356 DO_PCA = (scaler < -1);
360 Bool_t no_plots = NO_PLOTS;
363 printf(
"\n*** Running PCA iteration 0 ***\n\n");
365 status = Calib_SC_GL(input,cuts,scaler,debug,gcuts);
366 if (status)
return status;
370 printf(
"\n*** Running PCA iteration 1 ***\n\n");
374 fitPars = fitParsSCGL;
376 dets[nsca-1] = PCA(1-scaler,debug);
379 if (scastr.Length()) {
380 dets[nsca-1] = scastr;
386 double temp1,vsc_min = 1e10;
390 TString EWstr = (EWmode < 0 ?
" EAST" : (EWmode > 0 ?
" WEST" :
""));
391 TString scvarstr = (EWmode < 0 ?
"sce" : (EWmode > 0 ?
"scw" : (EW_ASYMMETRY ?
"scw" :
"sc")));
392 TString uscvarstr = (EWmode < 0 ?
"usce" :
"usc");
393 const char* scvar = scvarstr.Data();
394 const char* uscvar = uscvarstr.Data();
395 if (EWmode != 0) printf(
"\nAsymmetrical calibration mode:%s\n\n",EWstr.Data());
417 mark.SetMarkerColor(colorFinal);
418 mark.SetMarkerStyle(28);
421 ellip.SetLineColor(colorFinal);
422 ellip.SetLineStyle(2);
423 ellip.SetFillStyle(0);
429 outliers = outliers0;
431 fitParErrs = fitParErrsSC;
436 Int_t fittableCnt[12];
437 memset(fittableCnt,0,12*
sizeof(Int_t));
438 int startSec = (EWmode < 0 ? 13 : 1);
440 for (i=0;i<nfi;i++) {
441 TString SCvarstr = (EW_ASYMMETRY ?
"usc:usce:scw:sce" : Form(
"%s:%s:gapf",uscvar,scvar));
442 nMeasuresI = SCi[i]->Draw(SCvarstr.Data(),cut,
"goff");
445 memcpy(&(m_usc [nMeasures ]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
446 memcpy(&(m_usc [nMeasures+nMeasuresHalf]),SCi[i]->GetV2(),nMeasuresI*
sizeof(Double_t));
447 memcpy(&(m_sc [nMeasures ]),SCi[i]->GetV3(),nMeasuresI*
sizeof(Double_t));
448 memcpy(&(m_sc [nMeasures+nMeasuresHalf]),SCi[i]->GetV4(),nMeasuresI*
sizeof(Double_t));
449 Bool_t useGapfew = (SCi[i]->Draw(
"1",cut&&
"gapfw!=0||gapfe!=0",
"goff") > 0);
450 SCi[i]->Draw(
"gapfw:gapfe:gapf",cut,
"goff");
453 memcpy(&(m_gapf[nMeasures ]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
454 memcpy(&(m_gapf[nMeasures+nMeasuresHalf]),SCi[i]->GetV2(),nMeasuresI*
sizeof(Double_t));
456 printf(
"Set %3d: no e/w gapf, using global gapf\n",i);
457 memcpy(&(m_gapf[nMeasures ]),SCi[i]->GetV3(),nMeasuresI*
sizeof(Double_t));
458 memcpy(&(m_gapf[nMeasures+nMeasuresHalf]),SCi[i]->GetV3(),nMeasuresI*
sizeof(Double_t));
461 memcpy(&(m_usc [nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
462 memcpy(&(m_sc [nMeasures]),SCi[i]->GetV2(),nMeasuresI*
sizeof(Double_t));
463 memcpy(&(m_gapf[nMeasures]),SCi[i]->GetV3(),nMeasuresI*
sizeof(Double_t));
468 SCvarstr = Form(
"sc%d:gapf%d",k,k);
469 TCut testFittable = Form(
"sc%d!=0&&gapf%d!=0",k,k);
470 Int_t fittableCntS = SCi[i]->Draw(SCvarstr.Data(),cut&&testFittable,
"goff");
471 if (fittableCntS > 0) {
472 fittableCnt[j] += fittableCntS;
473 SCi[i]->Draw(SCvarstr.Data(),cut,
"goff");
474 memcpy(&(m_scS [j][nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
475 memcpy(&(m_gapfS[j][nMeasures]),SCi[i]->GetV2(),nMeasuresI*
sizeof(Double_t));
477 if (debug>0) printf(
"Set %3d : Unfittable sector: %d\n",i,k);
478 memset(&(m_scS [j][nMeasures]),0,nMeasuresI*
sizeof(Double_t));
479 memset(&(m_gapfS[j][nMeasures]),0,nMeasuresI*
sizeof(Double_t));
483 SCi[i]->Draw(
"const1:run",cut,
"goff");
484 memcpy(&(m_c1 [nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
485 memcpy(&(m_runs[nMeasures]),SCi[i]->GetV2(),nMeasuresI*
sizeof(Double_t));
488 if (glmode[i] == 2) {
489 SCi[i]->Draw(
"ugl",cut,
"goff");
490 memcpy(&(m_ugl[nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
491 ugl[i] = m_ugl[nMeasures];
492 }
else for (k=0; k<nMeasuresI; k++) m_ugl[k+nMeasures] = ugl[i];
493 if (!FIX_GL && (m_runs[0] > 20000000)) GUESS_GL = 0.5;
494 for (k=0; k<nMeasuresI; k++) {
495 m_set[k+nMeasures] = i;
496 m_runIdx[k+nMeasures] = k+nMeasures;
497 for (j=0; j<k+nMeasures; j++) {
498 if (m_runs[k+nMeasures] == m_runs[j]) { m_runIdx[k+nMeasures] = j;
break; }
501 nMeasures += nMeasuresI;
503 for (i=0;BY_SECTOR && i<12;i++) {
504 unfittableSec[i] = (fittableCnt[i] < 8);
505 if (unfittableSec[i]) printf(
"Unfittable sector: %d\n",startSec + i);
509 for (j=0;j<nsca;j++) {
510 if (scaler>=0 && j!=scaler)
continue;
511 if (dets[j].Length()<1)
continue;
512 const char* dt = dets[j].Data();
520 for (i=0;i<nfi;i++) {
521 SCi[i]->Draw(dt,cut,
"goff");
522 nMeasuresI = SCi[i]->GetSelectedRows();
523 memcpy(&(m_L[nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
524 nMeasures += nMeasuresI;
529 double sce_init = GUESS_g5 + GUESS_GL;
533 if (TMath::Abs(TMath::Log(fitParsSCGL[1]/GUESS_g5)) > 0.9) {
534 if (debug>0) printf(
"\nWARNING: g5 from iteration 0 at or near limit - not sane\n");
535 sce_init = GUESS_g5 + fitParsSCGL[4];
537 sce_init = fitParsSCGL[1] + fitParsSCGL[4];
544 SCall->Draw(Form(
"%s",dt),cut,
"goff");
545 histo = SCall->GetHistogram();
546 double dtrms = histo->GetRMS();
547 TCut avoidSmallDenominators = Form(
"abs(%s)>%g",dt,dtrms * 0.4);
548 SCall->Draw(Form(
"%s/(%s)",scvar,dt),avoidSmallDenominators&&cut,
"goff");
549 histo = SCall->GetHistogram();
550 sce_init *= (histo->GetMean());
552 if (debug) printf(
"\nUsing initial value for SCe of %g\n",sce_init);
554 TString sname[3] = {
"SO",
"log(SCe)",
"log(g5)"};
555 Double_t sstart[3] = {100., TMath::Log(sce_init), TMath::Log(GUESS_g5)};
556 Double_t sstep[3] = {1000., TMath::Abs(0.01*TMath::Log(sce_init)), 0.01};
557 if (DO_PCA) { sstart[0] = 1e-3; sstep[0] = 1e-5; }
558 SetMinuitPars(3,sname,sstart,sstep,debug);
559 minuit->SetFCN(fnchSC);
562 printf(
"\nSpaceCharge fit results {scaler: %s}:\n",dt);
563 status = FitWithOutlierRemoval(3,debug);
565 if (debug) printf(
"Fit failed with initial g5=15. Trying 12...\n");
567 sstart[2] = TMath::Log(GUESS_g5);
568 SetMinuitPars(3,sname,sstart,sstep,debug);
569 status = FitWithOutlierRemoval(3,debug);
572 if (debug) printf(
"Fit failed with initial g5=12. Trying 20...\n");
574 sstart[2] = TMath::Log(GUESS_g5);
575 SetMinuitPars(3,sname,sstart,sstep,debug);
576 status = FitWithOutlierRemoval(3,debug);
579 printf(
"Fit failed for sc, err = %d\nTrying next scaler (if any)...\n\n",status);
583 if (!NO_PLOTS && debug>0) {
585 conSC[j] =
new TCanvas(Form(
"conSC_%d",j),Form(
"SC fit contours for %s",dt),600,400);
586 conSC[j]->Divide(2,2);
587 }
else conSC[j]->cd();
588 DrawErrorContours(3);
595 sofE[j] = fitParErrs[0];
596 sceE[j] = fitParErrs[1];
597 gglE[j] = fitParErrs[2];
601 if (debug>0) printf(
"VAR_all = %6.4g for %s\n",VAR_all,dt);
602 if (VAR_all < vsc_min) {
605 memcpy(outliersSC,outliers0,nMeasures*
sizeof(Double_t));
613 if (jmin<0) { printf(
"ERROR - no good scaler found\n");
return 1; }
614 const char* detbest = dets[jmin].Data();
616 printf(
"*** Best scaler = %s [ID = %d]\n\n",detbest,jmin);
618 fitParsSC[0] = sof[jmin];
619 fitParsSC[1] = sce[jmin];
620 fitParsSC[2] = ggl[jmin];
621 fitParErrsSC[0] = sofE[jmin];
622 fitParErrsSC[1] = sceE[jmin];
623 fitParErrsSC[2] = gglE[jmin];
624 STDDEV_SC = ssc[jmin];
634 outliers = outliersGL;
636 fitParErrs = fitParErrsGL;
642 for (i=0;i<nfi;i++) {
643 SCi[i]->Draw(detbest,cut,
"goff");
644 nMeasuresI = SCi[i]->GetSelectedRows();
645 memcpy(&(m_L[nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
646 nMeasures += nMeasuresI;
650 double scale_init = GUESS_GL / (ggl[jmin] + GUESS_GL);
651 double scXgl = sce[jmin]*scale_init;
652 double escXgl = sceE[jmin]*scale_init;
653 double GLO = sof[jmin];
654 double eGLO = sofE[jmin];
655 TString gname[3] = {
"g2",
"g1/g2 = SCxGL",
"GLO"};
656 Double_t gstart[3] = {1.0, scXgl, GLO};
657 Double_t gstep[3] = {0.01, escXgl, eGLO};
659 gstart[1] = GUESS_GL;
660 gstep[1] = 0.1*GUESS_GL;
662 SetMinuitPars(3,gname,gstart,gstep,debug);
663 minuit->SetFCN(fnchGapf);
666 printf(
"\nGridLeak fit results {scaler: %s}:\n",detbest);
667 status = FitWithOutlierRemoval(3,debug);
669 printf(
"Fit failed for gapf, err = %d\n",status);
670 if (!FIX_GL)
return 1;
671 printf(
"Continuing with a fixed GL.");
672 for (k=0;k<3;k++) { fitPars[k] = gstart[k]; fitParErrs[k] = gstep[k]; }
674 if (!NO_PLOTS && debug>0) {
676 conGL =
new TCanvas(
"conGL",
"GL fit contours",600,400);
679 DrawErrorContours(3);
690 escXgl = fitParErrs[1];
692 eGLO = fitParErrs[2];
699 double scp = (sce[jmin]-scXgl)/ggl[jmin];
700 double escp = TMath::Sqrt(sceE[jmin]*sceE[jmin] +
702 scp*scp*gglE[jmin]*gglE[jmin]
705 double sop = sof[jmin];
706 double esop = sofE[jmin];
710 double scale_final = scXgl/(sce[jmin] - scXgl);
711 double glp = ggl[jmin]*scale_final;
715 eglp = TMath::Sqrt(TMath::Power(glp*gglE[jmin]/ggl[jmin],2) +
716 TMath::Power(scale_final*escXgl*sce[jmin]/(scXgl*scXgl),2) +
717 TMath::Power(scale_final*sceE[jmin]*scXgl,2));
720 printf(
"\n*** FIRST PASS CALIBRATION VALUES: ***\n");
721 PrintResult(scp, escp, sop, esop, glp, eglp, ewp, eewp, detbest);
722 printf(
"USING STDDEV sc => %f :: gapf => %f\n",STDDEV_SC,STDDEV_GL);
730 fitPars = fitParsSCGL;
731 fitParErrs = fitParErrsSCGL;
732 parName = parNameSCGL;
736 TString fname[9] = {
"g2",
"log(g5)",
"log(SC)",
"SO",
"log(GL)",
"GLO",
"log(g5r)",
"log(g4r)",
"log(ewratio)"};
737 Double_t fstart[9] = {fitParsGL[0], TMath::Log(fitParsSC[2]), TMath::Log(scp),
738 sop, TMath::Log(GUESS_GL), GLO, 0, 0, TMath::Log(ewp)};
739 Double_t fstep[9] = {fitParErrsGL[0], fitParErrsSC[2]/fitParsSC[2], escp/scp,
740 esop, 0.1, eGLO, 0.001, 0.001, 0.001};
741 Bool_t ffix[9] = {kFALSE, kFALSE, kFALSE, kFALSE, FIX_GL,
742 FORCE_GLO_SO, (FORCE_g3_same || FORCE_g5_same), FORCE_g4_same, !EW_ASYMMETRY};
743 SetMinuitPars(9,fname,fstart,fstep,debug,ffix);
744 minuit->SetFCN(fnchSCGapf);
747 printf(
"\nSpaceCharge & GridLeak fit results {scaler: %s}:\n",detbest);
748 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
750 printf(
"Fit failed for sc+gl, err = %d\n",status);
755 Double_t covarAdjust = 1;
756 if (!(ffix[2] || ffix[4]))
757 covarAdjust += (minuit->GetCovarianceMatrixElement(2,4) /
758 (minuit->GetCovarianceMatrixElement(2,2) +
759 minuit->GetCovarianceMatrixElement(4,4)));
760 GetMinuitPars(npar,ffix,fstart);
761 status = minuit->ExecuteCommand(
"SET LIM", 0, 0);
763 printf(
"SetLimit failed for sc+gl, err = %d\n",status);
766 double eplus,eminus,eparab,gcc;
767 for (k=0;k<npar;k++) {
768 if (ffix[k]) { fitPars[k] = fstart[k]; fitParErrs[k] = 0;
continue; }
770 printf(
"%s\t:\t%g\t+/- %g\t(AT LIMIT!)\n",parName[k],fitPars[k],fitParErrs[k]);
773 for (i=0;i<npar;i++)
if (i!=k && !ffix[i]) minuit->FixParameter(i);
774 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
776 printf(
"Fit failed for sc+gl, err = %d\n",status);
779 arglist[1] = (double) k+1;
780 status = minuit->ExecuteCommand(
"MINOS", arglist, 2);
782 printf(
"Fit errors failed for sc+gl, err = %d\n",status);
786 minuit2->mnerrs(k,eplus,eminus,eparab,gcc);
787 if (eplus!=0.0 && eminus!=0.0) fitParErrs[k] = 0.5*(eplus-eminus);
788 else if (eplus!=0.0 || eminus!=0.0) fitParErrs[k] = eparab;
789 if (debug>0) printf(
"%s\t:\t%g\t+%g/%g or +/- %g\n",parName[k],fitPars[k],eplus,eminus,eparab);
790 printf(
"%s\t:\t%g\t+/- %g\n",parName[k],fitPars[k],fitParErrs[k]);
791 for (i=0;i<npar;i++)
if (i!=k && !ffix[i]) minuit->ReleaseParameter(i);
793 if (!NO_PLOTS && debug>0) {
795 conSCGL =
new TCanvas(
"conSCGL",
"SCGL fit contours",600,900);
796 conSCGL->Divide(3,5);
797 }
else conSCGL->cd();
798 DrawErrorContours(npar,ffix);
800 Double_t bstart[19] = {fitPars[0], fitPars[1], fitPars[2], fitPars[3],
801 fitPars[4], fitPars[4], fitPars[4], fitPars[4], fitPars[4], fitPars[4],
802 fitPars[4], fitPars[4], fitPars[4], fitPars[4], fitPars[4], fitPars[4],
803 fitPars[5], fitPars[6], fitPars[7]};
804 Double_t bstep[19] = {fitParErrs[0], fitParErrs[1], fitParErrs[2],
805 fitParErrs[3], fitParErrs[4], fitParErrs[4], fitParErrs[4],
806 fitParErrs[4], fitParErrs[4], fitParErrs[4], fitParErrs[4],
807 fitParErrs[4], fitParErrs[4], fitParErrs[4], fitParErrs[4],
808 fitParErrs[4], fitParErrs[5], fitParErrs[6], fitParErrs[7]};
818 escp = fitParErrs[2];
819 esop = fitParErrs[3];
820 eglp = fitParErrs[4];
825 fitParErrs[5] = eGLO;
828 eGLO = fitParErrs[5];
837 }
else if (FORCE_g3_same) {
838 fitPars[6] = 1.0/fitPars[7];
839 fitParErrs[6] = fitPars[6]*(fitParErrs[7]/fitPars[7]);
843 eewp = fitParErrs[8];
848 double scXgl_final = scp*glp;
849 double escXgl_final = scXgl_final*TMath::Sqrt(covarAdjust*
850 (TMath::Power(fitParErrs[4]/fitPars[4],2)+
851 TMath::Power(fitParErrs[2]/fitPars[2],2)));
852 printf(Form(
"\n***%s FINAL CALIBRATION VALUES: ***\n",EWstr.Data()));
853 PrintResult(scp, escp, sop, esop, glp, eglp, ewp, eewp, detbest);
863 double scpS, sopS, escpS, esopS, GLOS, eGLOS;
872 fitPars = fitParsSCGLsec;
873 fitParErrs = fitParErrsSCGLsec;
874 parName = parNameSCGLsec;
878 TString bname[19] = {
"g2",
"log(g5)",
"log(SC)",
"SO",
"log(GLa)",
"log(GLb)",
879 "log(GLc)",
"log(GLd)",
"log(GLe)",
"log(GLf)",
"log(GLg)",
"log(GLh)",
880 "log(GLi)",
"log(GLj)",
"log(GLk)",
"log(GLl)",
"GLO",
"log(g5r)",
"log(g4r)"};
881 Bool_t bfix[19] = {kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE,
882 kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE, kFALSE,
883 FORCE_GLO_SO, (FORCE_g3_same || FORCE_g5_same), FORCE_g4_same};
884 for (k=0;k<12;k++) bfix[k+4] = unfittableSec[k];
885 SetMinuitPars(19,bname,bstart,bstep,debug,bfix);
886 minuit->SetFCN(fnchSCGapfSec);
889 printf(
"\nSpaceCharge & GridLeak fit by sector results {scaler: %s}:\n",detbest);
890 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
892 printf(
"Fit failed for sc+gl by sector, err = %d\n",status);
895 GetMinuitPars(npar,bfix,bstart);
896 status = minuit->ExecuteCommand(
"SET LIM", 0, 0);
898 printf(
"SetLimit failed for sc+gl by sector, err = %d\n",status);
901 for (k=0;k<npar;k++) {
902 if (bfix[k]) { fitPars[k] = bstart[k]; fitParErrs[k] = 0;
continue; }
904 printf(
"%s\t:\t%g\t+/- %g\t(AT LIMIT!)\n",parName[k],fitPars[k],fitParErrs[k]);
907 for (i=0;i<npar;i++)
if (i!=k && !bfix[i]) minuit->FixParameter(i);
908 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
910 printf(
"Fit failed for sc+gl by sector, err = %d\n",status);
913 arglist[1] = (double) k+1;
914 status = minuit->ExecuteCommand(
"MINOS", arglist, 2);
916 printf(
"Fit errors failed for sc+gl by sector, err = %d\n",status);
920 minuit2->mnerrs(k,eplus,eminus,eparab,gcc);
921 if (eplus!=0.0 && eminus!=0.0) fitParErrs[k] = 0.5*(eplus-eminus);
922 else if (eplus!=0.0 || eminus!=0.0) fitParErrs[k] = eparab;
923 if (debug>0) printf(
"%s\t:\t%g\t+%g/%g or +/- %g\n",parName[k],fitPars[k],eplus,eminus,eparab);
924 printf(
"%s\t:\t%g\t+/- %g\n",parName[k],fitPars[k],fitParErrs[k]);
925 for (i=0;i<npar;i++)
if (i!=k && !bfix[i]) minuit->ReleaseParameter(i);
947 glpS[i]=fitPars[4+i];
948 eglpS[i]=fitParErrs[4+i];
950 escpS = fitParErrs[2];
951 esopS = fitParErrs[3];
956 fitParErrs[16] = eGLOS;
959 eGLOS = fitParErrs[16];
963 fitParErrs[18] = 0.0;
967 fitParErrs[17] = 0.0;
968 }
else if (FORCE_g3_same) {
969 fitPars[17] = 1.0/fitPars[18];
970 fitParErrs[17] = fitPars[17]*(fitParErrs[18]/fitPars[18]);
972 printf(Form(
"\n***%s FINAL BY-SECTOR CALIBRATION VALUES: ***\n",EWstr.Data()));
973 PrintResult(scpS, escpS, sopS, esopS, glpS, eglpS, detbest);
988 if (NO_PLOTS)
return 0;
998 if (fitParsSCGL[6] == 1.0 && fitParsSCGL[7] == 1.0) {
999 memcpy(m_sc2,m_sc,nMeasures*
sizeof(Double_t));
1000 for (k=0; k<12; k++)
1001 memcpy(m_sc2S[k],m_scS[k],nMeasures*
sizeof(Double_t));
1005 for (i=0; i<nMeasures; i++) {
1006 m_sc2[i] = m_sc[i] - m_usc[i] *
1007 (1.0 - ( ( fitParsSCGL[1] + m_ugl[i])/
1008 (fitParsSCGL[7]*(fitParsSCGL[6]*fitParsSCGL[1] + m_ugl[i]))));
1009 if (!BY_SECTOR)
continue;
1010 for (k=0; k<12; k++)
1011 m_sc2S[k][i] = m_scS[k][i] - m_usc[i] *
1012 (1.0 - ( ( fitParsSCGLsec[1] + m_ugl[i])/
1013 (fitParsSCGLsec[18]*(fitParsSCGLsec[17]*fitParsSCGLsec[1] + m_ugl[i]))));
1017 double sc_min[12],sc_max[12],sc_offset[12],gapf_min[12],gapf_max[12],gapf_offset[12],Lmin,Lmax;
1018 SetMinMax(nMeasures,m_L,Lmin,Lmax,m_L[0]);
1019 for (k=0; k<(BY_SECTOR?12:1); k++) {
1020 SetMinMax(nMeasures,(BY_SECTOR?m_sc2S[k]:m_sc2),sc_min[k],sc_max[k],0);
1022 sc_offset[k] = 0.002*TMath::Max(1,
1023 TMath::Max(TMath::Nint((sc_max[k]-sc_min[k])*0.2/0.002),
1024 TMath::Nint(MAX_DEV*vsc[jmin]*5./0.002)));
1025 sc_max[k] += (nfi-1)*sc_offset[k];
1026 SetMinMax(nMeasures,(BY_SECTOR?m_gapfS[k]:m_gapf),gapf_min[k],gapf_max[k],0,0.25);
1027 gapf_max[k] += (BY_SECTOR ?
1028 fitParsSCGLsec[0]*scpS*glpS[k]*(Lmax-sopS) :
1029 fitParsSCGL[0]*scp*glp*(Lmax-sop) );
1030 gapf_offset[k] = 0.05*TMath::Max(1,
1031 TMath::Max(TMath::Nint((gapf_max[k]-gapf_min[k])*0.2/0.05),
1032 TMath::Nint(MAX_DEV*vgl*5./0.05)));
1033 gapf_max[k] += (nfi-1)*gapf_offset[k];
1041 fnGapf =
new TF1(
"fnGapf",
"[0] * ( ([2]*[4]) * (x - [16]) ) + [10]",Lmin,Lmax);
1042 fnSC =
new TF1(
"fnSC",
"([2]*([1] + [4])) * (x - [3]) / ([18]*([17]*[1] + [8])) + [10]",Lmin,Lmax);
1043 fnGapf->SetParameters(fitParsSCGLsec);
1044 fnSC->SetParameters(fitParsSCGLsec);
1046 fnGapf =
new TF1(
"fnGapf",
"[0] * ( ([2]*[4]) * (x - [5]) ) + [10]",Lmin,Lmax);
1047 fnSC =
new TF1(
"fnSC",
"([2]*([1] + [4])) * (x - [3]) / ([7]*([6]*[1] + [8])) + [10]",Lmin,Lmax);
1048 fnGapf->SetParameters(fitParsSCGL);
1049 fnSC->SetParameters(fitParsSCGL);
1051 fnGapf->SetLineWidth(1);
1052 fnSC->SetLineWidth(1);
1053 TF1* fiGapf =
new TF1(
"fiGapf",
"[0] * ( ([1]) * (x - [2]) ) + [10]",Lmin,Lmax);
1054 TF1* fiSC =
new TF1(
"fiSC",
"[1] * (x - [0]) / ([2] + [8]) + [10]",Lmin,Lmax);
1055 fiGapf->SetParameters(fitParsGL);
1056 fiSC->SetParameters(fitParsSC);
1057 fiGapf->SetLineWidth(1);
1058 fiSC->SetLineWidth(1);
1059 fiGapf->SetLineColor(colorMiFit);
1060 fiSC->SetLineColor(colorMiFit);
1063 cGL =
new TCanvas(
"cGL",
"GridLeak Fits by Sector",30,30,1000,750);
1067 cSC =
new TCanvas(
"cSC",
"SpaceCharge Fits",60,60,1000,750);
1072 for (k=0; k<12; k++) {
1073 if (unfittableSec[k])
continue;
1074 htGLsec[k] =
new TH2D(Form(
"htGL%d",k),
1075 Form(
"Sector %d: adjusted #font[32]{gapf} vs. %s for all sets, offset by %4.2f",
1076 k+startSec,detbest,gapf_offset[k]),
1077 1,Lmin,Lmax,1,gapf_min[k],gapf_max[k]);
1080 htSCsec[k] =
new TH2D(Form(
"htSC%d",k),
1081 Form(
"Sector %d: #font[32]{sc} vs. %s for all sets, offset by %5.3f",
1082 k+startSec,detbest,sc_offset[k]),
1083 1,Lmin,Lmax,1,sc_min[k],sc_max[k]);
1087 fnGapf->SetParameter(4,fitParsSCGLsec[4+k]);
1088 fnSC->SetParameter(4,fitParsSCGLsec[4+k]);
1089 for (i=0; i<nfi; i++) {
1091 SCi[i]->Draw(Form(
"gapf%d+%s*(%g)*%s+%g:%s",
1093 (glmode[i] == 2 ?
"ugl" : Form(
"(%g)",ugl[i])),
1094 fitParsSCGLsec[0],uscvar,i*gapf_offset[k],detbest),
1098 fiGapf->SetParameter(10,0+i*gapf_offset[k]);
1099 fiGapf->DrawCopy(
"same");
1100 fnGapf->SetParameter(10,0+i*gapf_offset[k]);
1101 fnGapf->SetLineColor(colorFit);
1102 fnGapf->DrawCopy(
"same");
1103 fnGapf->SetParameter(10,MAX_DEV*vgl+i*gapf_offset[k]);
1104 fnGapf->SetLineColor(colorOutlier);
1105 fnGapf->DrawCopy(
"same");
1106 fnGapf->SetParameter(10,-MAX_DEV*vgl+i*gapf_offset[k]);
1107 fnGapf->DrawCopy(
"same");
1110 if (fitParsSCGL[6] == 1.0 && fitParsSCGL[7] == 1.0) {
1111 SCi[i]->Draw(Form(
"%s+%g:%s",scvar,i*sc_offset[k],detbest),gcut,
"same");
1113 SCi[i]->Draw(Form(
"%s-%s*(1-(%g+ugl)/(%g*(%g+ugl)))+%g:%s",scvar,uscvar,
1114 fitParsSCGLsec[1],fitParsSCGLsec[18],fitParsSCGLsec[17]*fitParsSCGLsec[1],
1115 i*sc_offset[k],detbest),gcut,
"same");
1117 fiSC->SetParameter(8,ugl[i]);
1118 fiSC->SetParameter(10,0+i*sc_offset[k]);
1119 fiSC->DrawCopy(
"same");
1120 fnSC->SetParameter(8,ugl[i]);
1121 fnSC->SetParameter(10,0+i*sc_offset[k]);
1122 fnSC->SetLineColor(colorFit);
1123 fnSC->DrawCopy(
"same");
1124 fnSC->SetParameter(10,MAX_DEV*vsc[jmin]+i*sc_offset[k]);
1125 fnSC->SetLineColor(colorOutlier);
1126 fnSC->DrawCopy(
"same");
1127 fnSC->SetParameter(10,-MAX_DEV*vsc[jmin]+i*sc_offset[k]);
1128 fnSC->DrawCopy(
"same");
1132 if (!cGL) cGL =
new TCanvas(
"cGL",
"GridLeak Fits",30,30,500,500);
1133 TH2D* htGL =
new TH2D(
"htGL",
1134 Form(
"adjusted #font[32]{gapf} vs. %s for all sets, offset by %4.2f",
1135 detbest,gapf_offset[0]),
1136 1,Lmin,Lmax,1,gapf_min[0],gapf_max[0]);
1139 if (!cSC) cSC =
new TCanvas(
"cSC",
"SpaceCharge Fits",60,60,500,500);
1140 TH2D* htSC =
new TH2D(
"htSC",
1141 Form(
"#font[32]{sc} vs. %s for all sets, offset by %5.3f",
1142 detbest,sc_offset[0]),
1143 1,Lmin,Lmax,1,sc_min[0],sc_max[0]);
1146 for (i=0; i<nfi; i++) {
1148 SCi[i]->Draw(Form(
"gapf+%s*(%g)*%s+%g:%s",
1149 (glmode[i] == 2 ?
"ugl" : Form(
"(%g)",ugl[i])),
1150 fitParsSCGL[0],uscvar,i*gapf_offset[0],detbest),
1154 fiGapf->SetParameter(10,0+i*gapf_offset[0]);
1155 fiGapf->DrawCopy(
"same");
1156 fnGapf->SetParameter(10,0+i*gapf_offset[0]);
1157 fnGapf->SetLineColor(colorFit);
1158 fnGapf->DrawCopy(
"same");
1159 fnGapf->SetParameter(10,MAX_DEV*vgl+i*gapf_offset[0]);
1160 fnGapf->SetLineColor(colorOutlier);
1161 fnGapf->DrawCopy(
"same");
1162 fnGapf->SetParameter(10,-MAX_DEV*vgl+i*gapf_offset[0]);
1163 fnGapf->DrawCopy(
"same");
1166 if (fitParsSCGL[6] == 1.0 && fitParsSCGL[7] == 1.0) {
1167 SCi[i]->Draw(Form(
"%s+%g:%s",scvar,i*sc_offset[0],detbest),gcut,
"same");
1169 SCi[i]->Draw(Form(
"%s-%s*(1-(%g+ugl)/(%g*(%g+ugl)))+%g:%s",scvar,uscvar,
1170 fitParsSCGL[1],fitParsSCGL[7],fitParsSCGL[6]*fitParsSCGL[1],
1171 i*sc_offset[0],detbest),gcut,
"same");
1173 fiSC->SetParameter(8,ugl[i]);
1174 fiSC->SetParameter(10,0+i*sc_offset[0]);
1175 fiSC->DrawCopy(
"same");
1176 fnSC->SetParameter(8,ugl[i]);
1177 fnSC->SetParameter(10,0+i*sc_offset[0]);
1178 fnSC->SetLineColor(colorFit);
1179 fnSC->DrawCopy(
"same");
1180 fnSC->SetParameter(10,MAX_DEV*vsc[jmin]+i*sc_offset[0]);
1181 fnSC->SetLineColor(colorOutlier);
1182 fnSC->DrawCopy(
"same");
1183 fnSC->SetParameter(10,-MAX_DEV*vsc[jmin]+i*sc_offset[0]);
1184 fnSC->DrawCopy(
"same");
1196 printf(
"\n\n*** The following calibration values may not be trusted at this time... ***");
1197 printf(
"\n\n*** Try the following calibration values: ***\n");
1198 for (i=0; i<nfi; i++) {
1199 printf(
"sc = %6.4g * ((%s) - (%6.4g))",sce[jmin],detbest,sof[jmin]);
1200 printf(
" with GL = %5.2f\n\n",ugl[i]);
1206 if (cSummary==0) cSummary =
new TCanvas(
"cSummary",
"Calib SC and GL");
1207 cSummary->Divide(2,2,0.01,0.025);
1209 Double_t min,max,ymin,ymax,ymin2,ymax2;
1215 TF1* miGL =
new TF1(
"igapfL_of_SCGL",
"[0]*([1]-x)",0,5e-5);
1216 miGL->SetParameters(fitParsGL);
1217 miGL->SetLineWidth(1);
1218 miGL->SetLineColor(colorMiFit);
1219 TF1* myGL =
new TF1(
"gapfL_of_SCGL",
"[0]*([2]*[4]-x)",0,5e-5);
1220 myGL->SetParameters(fitParsSCGL);
1221 myGL->SetLineWidth(1);
1222 myGL->SetLineColor(colorFit);
1224 memset(asg,0,nfip*
sizeof(Double_t));
1225 memset(glk,0,nfip*
sizeof(Double_t));
1226 memset(nno,0,nfip*
sizeof(Double_t));
1228 for (i=0;i<nMeasures;i++) {
1229 if (outliersGL[i])
continue;
1233 xgl[k] = m_usc[i]*m_ugl[i]/(m_L[i]-fitParsSCGL[5]);
1234 ygl[k] = m_gapf[i]/(m_L[i]-fitParsSCGL[5]);
1240 for (i=0;i<nfi;i++) {
1244 SetMinMax(k,xgl,min,max,scXgl_final);
1245 SetMinMax(k,ygl,ymin,ymax,zero);
1246 miGL->SetRange(min,max);
1247 myGL->SetRange(min,max);
1251 histo = myGL->GetHistogram();
1252 histo->SetTitle(
"#font[32]{gapf}/#font[32]{L} vs. SC#timesGL");
1253 histo->SetYTitle(
"#font[32]{gapf} / (#font[32]{L}_{best} - GLO)");
1254 histo->SetXTitle(
"#font[32]{sc}_{used} GL_{used} / (#font[32]{L}_{best} - GLO)");
1255 histo->GetYaxis()->SetTitleOffset(1.25);
1256 histo->SetMinimum(ymin);
1257 histo->SetMaximum(ymax);
1260 mark2.SetMarkerColor(colorData);
1261 mark2.SetMarkerStyle(1);
1262 mark2.DrawPolyMarker(k,xgl,ygl);
1263 mark2.SetMarkerColor(colorAggregate);
1264 mark2.SetMarkerStyle(27);
1265 mark2.DrawPolyMarker(nfi,asg,glk);
1267 ellip.DrawEllipse(scXgl_final,zero,escXgl_final,0.004*(ymax-ymin),0,360,0);
1268 mark.DrawMarker(scXgl_final,zero);
1274 TF1* miGO =
new TF1(
"igapf_of_GLO",
"[0]*[1]*(x-[2])",0,5e-6);
1275 miGO->SetParameters(fitParsGL);
1276 miGO->SetLineWidth(1);
1277 miGO->SetLineColor(colorMiFit);
1278 TF1* myGO =
new TF1(
"gapf_of_GLO",
"[0]*[2]*[4]*(x-[5])",0,5e-6);
1279 myGO->SetParameters(fitParsSCGL);
1280 myGO->SetLineWidth(1);
1281 myGO->SetLineColor(colorFit);
1283 memset(ago,0,nfip*
sizeof(Double_t));
1284 memset(glo,0,nfip*
sizeof(Double_t));
1286 for (i=0;i<nMeasures;i++) {
1287 if (outliersGL[i])
continue;
1290 xgo[k] = m_L[i] - (m_usc[i]*m_ugl[i])/(fitParsSCGL[2]*fitParsSCGL[4]);
1296 for (i=0;i<nfi;i++) {
1300 SetMinMax(nfi,ago,min,max,GLO);
1301 SetMinMax(k,ygo,ymin,ymax,zero);
1302 miGO->SetRange(min,max);
1303 myGO->SetRange(min,max);
1307 histo = myGO->GetHistogram();
1308 histo->SetTitle(Form(
"#font[32]{gapf} vs. GLO%s",(FORCE_GLO_SO ?
" #equiv SO" :
"")));
1309 histo->SetYTitle(
"#font[32]{gapf}");
1310 histo->SetXTitle(
"#font[32]{L}_{best} - (#font[32]{sc}_{used} GL_{used} g_{2} / g_{GL})");
1311 histo->GetYaxis()->SetTitleOffset(1.25);
1312 histo->SetMinimum(ymin);
1313 histo->SetMaximum(ymax);
1316 mark2.SetMarkerColor(colorData);
1317 mark2.SetMarkerStyle(1);
1318 mark2.DrawPolyMarker(nMeasures,xgo,ygo);
1319 mark2.SetMarkerColor(colorAggregate);
1320 mark2.SetMarkerStyle(27);
1321 mark2.DrawPolyMarker(nfi,ago,glo);
1323 ellip.DrawEllipse(GLO,zero,eGLO,0.004*(ymax-ymin),0,360,0);
1324 mark.DrawMarker(GLO,zero);
1330 TF1* miSO =
new TF1(
"iSO_of_GL",
"[0]",0,100);
1331 TF1* miSC =
new TF1(
"iSC_of_GL",
"[1]/([2]+[0])",0,100);
1332 miSO->SetParameters(fitParsSC);
1333 miSC->SetParameters(fitParsSC);
1334 miSC->SetParameter(0,fitParsSCGL[4]);
1335 miSO->SetLineWidth(1);
1336 miSC->SetLineWidth(1);
1337 miSO->SetLineColor(colorMiFit);
1338 miSC->SetLineColor(colorMiFit);
1339 TF1* mySO =
new TF1(
"SO_of_GL",
"[3]",0,100);
1340 TF1* mySC =
new TF1(
"SC_of_GL",
"[2]",0,100);
1341 mySO->SetParameters(fitParsSCGL);
1342 mySC->SetParameters(fitParsSCGL);
1343 mySO->SetLineWidth(1);
1344 mySC->SetLineWidth(1);
1345 mySO->SetLineColor(colorFit);
1346 mySC->SetLineColor(colorFit);
1347 memset(nno,0,nfip*
sizeof(Double_t));
1348 memset(spo,0,nfip*
sizeof(Double_t));
1349 memset(spc,0,nfip*
sizeof(Double_t));
1351 for (i=0;i<nMeasures;i++) {
1352 if (outliersSC[i])
continue;
1362 temp1 = ((m_sc[i] - m_usc[i]) * fitParsSCGL[7] * (fitParsSCGL[6] * fitParsSCGL[1] + m_ugl[i]) +
1363 m_usc[i] * ( fitParsSCGL[1] + m_ugl[i])) /
1364 ( fitParsSCGL[1] + fitParsSCGL[4]);
1365 yso[k] = m_L[i] - (temp1 / fitParsSCGL[2]);
1366 ysc[k] = temp1 / (m_L[i] - fitParsSCGL[3]);
1373 for (i=0;i<nfi;i++) {
1376 if (spc[i] - miSC->Eval(ugl[i]) > 0) j++;
1378 i = (nfi>5 ? 1 : 0);
1379 if (j<=i || j>=nfi-i) {
1381 printf(
"WARNING! Symptoms of non-linearity in chosen luminosity scaler!\n");
1382 printf(
" Suggestion: use ");
1383 if (DO_PCA) printf(
"more PCA variables\n\n");
1384 else printf(
"PCA method\n\n");
1386 SetMinMax(nfi,ugl,min,max,glp);
1387 SetMinMax(k,yso,ymin,ymax,sop);
1388 SetMinMax(k,ysc,ymin2,ymax2,scp);
1389 miSO->SetRange(min,max);
1390 miSC->SetRange(min,max);
1391 mySO->SetRange(min,max);
1392 mySC->SetRange(min,max);
1396 histo = mySC->GetHistogram();
1397 histo->SetTitle(
"SC vs. GL");
1398 histo->SetYTitle(
"[#font[32]{sc} / (#font[32]{L}_{best} - SO)] (g_{5} + GL_{used}) / (g_{5} + GL)");
1399 histo->SetXTitle(
"GL_{used}");
1400 histo->GetYaxis()->SetTitleOffset(1.25);
1401 histo->SetMinimum(ymin2);
1402 histo->SetMaximum(ymax2);
1405 mark2.SetMarkerColor(colorData);
1406 mark2.SetMarkerStyle(1);
1407 mark2.DrawPolyMarker(k,xsc,ysc);
1408 mark2.SetMarkerColor(colorAggregate);
1409 mark2.SetMarkerStyle(27);
1410 mark2.DrawPolyMarker(nfi,ugl,spc);
1413 if (!scgl_fit) scgl_fit =
new TF1(
"scgl_fit",
"[0]/x",-5.,100.);
1414 scgl_fit->SetParameter(0,scXgl_final);
1415 scgl_fit->SetLineColor(colorConstraint);
1416 scgl_fit->SetLineWidth(1);
1417 scgl_fit->DrawCopy(
"same");
1418 scgl_fit->SetLineStyle(7);
1419 scgl_fit->SetParameter(0,scXgl_final+escXgl_final);
1420 scgl_fit->DrawCopy(
"same");
1421 scgl_fit->SetParameter(0,scXgl_final-escXgl_final);
1422 scgl_fit->DrawCopy(
"same");
1424 ellip.DrawEllipse(glp,scp,eglp,escp,0,360,0);
1425 mark.DrawMarker(glp,scp);
1429 histo = mySO->GetHistogram();
1430 histo->SetTitle(
"SO vs. GL");
1431 histo->SetYTitle(
"#font[32]{L}_{best} - [#font[32]{sc} (g_{5} + GL_{used}) / (g_{5} + GL)]");
1432 histo->SetXTitle(
"GL_{used}");
1433 histo->GetYaxis()->SetTitleOffset(1.25);
1434 histo->SetMinimum(ymin);
1435 histo->SetMaximum(ymax);
1438 mark2.SetMarkerColor(colorData);
1439 mark2.SetMarkerStyle(1);
1440 mark2.DrawPolyMarker(k,xsc,yso);
1441 mark2.SetMarkerColor(colorAggregate);
1442 mark2.SetMarkerStyle(27);
1443 mark2.DrawPolyMarker(nfi,ugl,spo);
1445 ellip.DrawEllipse(glp,sop,eglp,esop,0,360,0);
1446 mark.DrawMarker(glp,sop);
1453 for (i=0;i<nfi;i++) {
1454 int color = 60 + (int) (40.0*((
float) i)/((float) (nfi-1)));
1455 SCi[i]->SetMarkerColor(color);
1456 SCi[i]->SetLineColor(color);
1457 SCi[i]->SetMarkerStyle(22+i);
1468 Double_t funcGapf(Double_t* x, Double_t* pars) {
1475 return (x[2] / REF_CONST1) * pars[0] * ( pars[1] * (x[0] - pars[2]) - x[1] );
1478 Double_t funcSC(Double_t* x, Double_t* pars) {
1484 return pars[1] * (x[0] - pars[0]) / (x[1] + pars[2]);
1487 Double_t funcSC2(Double_t* x, Double_t* pars) {
1497 (pars[1] * (x[0] - pars[0]) - (pars[2] + x[1]) * x[2]) /
1498 (pars[4] * (pars[3] * pars[2] + x[1]));
1501 void fnchGapf(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) {
1507 for (
int i=0;i<nMeasures;i++) {
1508 if (outliers[i])
continue;
1509 if (m_gapf[i] == 0) { outliers[i]=kTRUE; devs[i] = 0;
continue; }
1511 x[1] = m_usc[i] * m_ugl[i];
1513 devs[i] = m_gapf[i] - funcGapf(x,par);
1514 maxvarGL[i] = devs[i]*devs[i];
1515 int k = m_runIdx[i];
1517 if (maxvarGL[i]>maxvarGL[k]) {
1518 for (
int j=k;j<i;j++) {
1519 if (m_runIdx[j]==k) maxvarGL[j] = maxvarGL[i];
1521 }
else maxvarGL[i] = maxvarGL[k];
1524 for (
int i=0;i<nMeasures;i++) {
1525 if (outliers[i])
continue;
1526 chisq += RUN_CORRELATE*maxvarGL[i] + (1.0-RUN_CORRELATE)*devs[i]*devs[i];
1529 CHISQ = (chisq/(STDDEV*STDDEV))/(nMeasuresI-npar);
1533 void fnchSC(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) {
1540 pars[1] = TMath::Exp(par[1]);
1541 pars[2] = TMath::Exp(par[2]);
1543 for (
int i=0;i<nMeasures;i++) {
1544 if (outliers[i])
continue;
1545 if (m_sc[i] == 0) { outliers[i]=kTRUE; devs[i] = 0;
continue; }
1548 devs[i] = m_sc[i] - funcSC(x,pars);
1549 maxvarSC[i] = devs[i]*devs[i];
1550 int k = m_runIdx[i];
1552 if (maxvarSC[i]>maxvarSC[k]) {
1553 for (
int j=k;j<i;j++) {
1554 if (m_runIdx[j]==k) maxvarSC[j] = maxvarSC[i];
1556 }
else maxvarSC[i] = maxvarSC[k];
1559 for (
int i=0;i<nMeasures;i++) {
1560 if (outliers[i])
continue;
1561 chisq += RUN_CORRELATE*maxvarSC[i] + (1.0-RUN_CORRELATE)*devs[i]*devs[i];
1564 CHISQ = (chisq/(STDDEV*STDDEV))/(nMeasuresI-npar);
1568 void fnchSCGapf(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) {
1577 Double_t SC = TMath::Exp(par[2]);
1578 Double_t GL = TMath::Exp(par[4]);
1579 Double_t g5 = TMath::Exp(par[1]);
1580 Double_t g5r= TMath::Exp(par[6]);
1581 Double_t g4r= TMath::Exp(par[7]);
1582 Double_t ewr= TMath::Exp(par[8]);
1585 parGL[2] = (FORCE_GLO_SO ? par[3] : par[5]);
1587 parSC[1] = SC*(g5 + GL);
1589 parSC[3] = (FORCE_g5_same ? 1. : (FORCE_g3_same ? 1./g4r : g5r));
1590 parSC[4] = (FORCE_g4_same ? 1. : g4r);
1591 for (
int l=0;l<(EW_ASYMMETRY ? 2 : 1);l++) {
1597 for (
int i=0;i<nMeasures;i++) {
1598 int m = i + l*nMeasuresHalf;
1600 x[1] = m_usc[m] * m_ugl[i];
1602 if (!outliersGL[i]) {
1603 devsGL[i] = m_gapf[m] - funcGapf(x,parGL);
1604 maxvarGL[i] = devsGL[i]*devsGL[i];
1605 int k = m_runIdx[i];
1607 if (maxvarGL[i]>maxvarGL[k]) {
1608 for (
int j=k;j<i;j++) {
1609 if (m_runIdx[j]==k) maxvarGL[j] = maxvarGL[i];
1611 }
else maxvarGL[i] = maxvarGL[k];
1617 if (!outliersSC[i]) {
1618 devsSC[i] = m_sc[m] - funcSC2(x,parSC);
1619 maxvarSC[i] = devsSC[i]*devsSC[i];
1620 int k = m_runIdx[i];
1622 if (maxvarSC[i]>maxvarSC[k]) {
1623 for (
int j=k;j<i;j++) {
1624 if (m_runIdx[j]==k) maxvarSC[j] = maxvarSC[i];
1626 }
else maxvarSC[i] = maxvarSC[k];
1630 for (
int i=0;i<nMeasures;i++) {
1631 if (!outliersGL[i]) {
1632 chisqGL += RUN_CORRELATE*maxvarGL[i] + (1.0-RUN_CORRELATE)*devsGL[i]*devsGL[i];
1635 if (!outliersSC[i]) {
1636 chisqSC += RUN_CORRELATE*maxvarSC[i] + (1.0-RUN_CORRELATE)*devsSC[i]*devsSC[i];
1641 CHISQ = ((chisqGL/(STDDEV_GL*STDDEV_GL))+(chisqSC/(STDDEV_SC*STDDEV_SC)))/(nMeasuresI-npar);
1645 void fnchSCGapfSec(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) {
1654 Double_t SC = TMath::Exp(par[2]);
1655 Double_t g5 = TMath::Exp(par[1]);
1656 Double_t g5r= TMath::Exp(par[17]);
1657 Double_t g4r= TMath::Exp(par[18]);
1659 parGL[2] = (FORCE_GLO_SO ? par[3] : par[16]);
1662 parSC[3] = (FORCE_g5_same ? 1. : (FORCE_g3_same ? 1./g4r : g5r));
1663 parSC[4] = (FORCE_g4_same ? 1. : g4r);
1664 for (
int sec = 0; sec<12; sec++) {
1665 if (unfittableSec[sec])
continue;
1667 Double_t GL = TMath::Exp(par[4+sec]);
1669 parSC[1] = SC*(g5 + GL);
1671 for (
int i=0;i<nMeasures;i++) {
1673 x[1] = m_usc[i] * m_ugl[i];
1675 if (!outliersGL[i] && m_gapfS[sec][i]!=0.0) {
1676 devsGLsec[sec][i] = m_gapfS[sec][i] - funcGapf(x,parGL);
1677 maxvarGL[i] = devsGLsec[sec][i]*devsGLsec[sec][i];
1678 int k = m_runIdx[i];
1680 if (maxvarGL[i]>maxvarGL[k]) {
1681 for (
int j=k;j<i;j++) {
1682 if (m_runIdx[j]==k) maxvarGL[j] = maxvarGL[i];
1684 }
else maxvarGL[i] = maxvarGL[k];
1690 if (!outliersSC[i] && m_scS[sec][i]!=0.0) {
1691 devsSCsec[sec][i] = m_scS[sec][i] - funcSC2(x,parSC);
1692 maxvarSC[i] = devsSCsec[sec][i]*devsSCsec[sec][i];
1693 int k = m_runIdx[i];
1695 if (maxvarSC[i]>maxvarSC[k]) {
1696 for (
int j=k;j<i;j++) {
1697 if (m_runIdx[j]==k) maxvarSC[j] = maxvarSC[i];
1699 }
else maxvarSC[i] = maxvarSC[k];
1703 for (
int i=0;i<nMeasures;i++) {
1704 if (!outliersGL[i] && m_gapfS[sec][i]!=0.0) {
1705 chisqGL += RUN_CORRELATE*maxvarGL[i] + (1.0-RUN_CORRELATE)*devsGLsec[sec][i]*devsGLsec[sec][i];
1708 if (!outliersSC[i] && m_scS[sec][i]!=0.0) {
1709 chisqSC += RUN_CORRELATE*maxvarSC[i] + (1.0-RUN_CORRELATE)*devsSCsec[sec][i]*devsSCsec[sec][i];
1714 CHISQ = ((chisqGL/(STDDEV_GL*STDDEV_GL))+(chisqSC/(STDDEV_SC*STDDEV_SC)))/(nMeasuresI-npar);
1723 int Init(
const char* input) {
1724 if (SCall)
return 0;
1726 gStyle->SetGridColor(colorGrid);
1727 gStyle->SetOptStat(0);
1728 gStyle->SetPalette(1);
1734 SCall =
new TChain(
"SC",
"ChainAll");
1736 if (!input || input[0] == 0 || input[0] ==
'@') {
1740 memset(nfii,0,nfip*
sizeof(
int));
1741 TSeqCollection* listOfFiles = 0;
1742 TObjArray SCGLcombos;
1745 listOfFiles = gROOT->GetListOfFiles();
1749 SCall->Add(fis[0].Data());
1750 listOfFiles = SCall->GetListOfFiles();
1752 Int_t nfiles = (listOfFiles ? listOfFiles->GetEntries() : 0);
1754 printf(
"Error: no input specified!\n");
1757 for (i=nfiles-1;i>=0;i--) {
1759 fileI = (TFile*) (listOfFiles->At(i));
1760 SCall->Add(fileI->GetName());
1762 TChainElement*
elem = (TChainElement*) (listOfFiles->At(i));
1763 if (elem->GetEntries() == 0)
continue;
1764 fileI =
new TFile(elem->GetTitle());
1766 TKey* corrKey = fileI->GetKey(
"SCcorrection");
1768 printf(
"File is missing its corrections (excluding from grouping): %s\n",fileI->GetName());
1771 TString corrStr = corrKey->ReadObj()->GetTitle();
1772 corrKey = fileI->GetFile()->GetKey(
"GLcorrection");
1773 (corrStr +=
":") += corrKey->ReadObj()->GetTitle();
1774 corrKey = fileI->GetFile()->GetKey(
"SCEWRatio");
1776 (corrStr +=
":") += corrKey->ReadObj()->GetTitle();
1777 TObject* existing = SCGLcombos.FindObject(corrStr.Data());
1779 k = SCGLcombos.IndexOf(existing);
1780 int kent = SCi[k]->GetEntries();
1781 SCi[k]->Add(fileI->GetName());
1782 if (SCi[k]->GetEntries() == kent)
1783 printf(
"Skipping file with 0 ntuple entries: %s\n",fileI->GetName());
1786 SCi[nfi] =
new TChain(
"SC",Form(
"Chain%d : %s",nfi,corrStr.Data()));
1787 SCi[nfi]->Add(fileI->GetName());
1788 if (SCi[nfi]->GetEntries()>0) {
1789 SCGLcombos.AddLast(
new TNamed(corrStr.Data(),corrStr.Data()));
1793 printf(
"Warning! Exceeding maximum number of sets! Excluding the rest from grouping.\n");
1798 printf(
"Skipping file with 0 ntuple entries: %s\n",fileI->GetName());
1804 for (i=0;i<nfi;i++) {
1805 printf(
"Set %3d: %d files added with...\n",i,nfii[i]);
1806 TString corrStr = SCGLcombos.At(i)->GetName();
1807 corrStr.Remove(corrStr.First(
':'));
1808 if (corrStr.Length()) allZeros = kFALSE;
1809 printf(
" used sc = %s\n",corrStr.Data());
1810 corrStr = SCGLcombos.At(i)->GetName();
1811 corrStr.Remove(0,corrStr.First(
':')+1);
1812 if (corrStr.CountChar(
':')) {
1813 corrStr.Remove(0,corrStr.First(
':')+1);
1814 printf(
" used ewratio = %s\n",corrStr.Data());
1815 corrStr = SCGLcombos.At(i)->GetName();
1816 corrStr.Remove(0,corrStr.First(
':')+1);
1817 corrStr.Remove(corrStr.First(
':'));
1819 ugl[i] = corrStr.Atof();
1821 printf(
" used GL = %g\n",ugl[i]);
1826 ifstream dats(input);
1827 if (!(dats.good())) {
1828 printf(
"Error: problems opening input file specified!\n");
1831 for (i=0;i<nfi && dats.good();i++) {
1833 if (dats.eof()) { nfi=i;
continue; }
1835 if (fis[i].Contains(
'@')) {
1836 fis[i].Remove(fis[i].
First(
'@'),1);
1838 dats >> temp >> temp >> ugl[i];
1839 if (ugl[i]) allZeros = kFALSE;
1840 if (fis[i].Contains(
'!')) {
1842 fis[i].Remove(fis[i].
First(
'!'),1);
1847 if (fname[0]==
'#') { i--;
continue; }
1850 SCi[i] =
new TChain(
"SC",Form(
"Chain%d : %s",i,fis[i].Data()));
1851 int added_files = 0;
1852 if ((added_files = SCi[i]->Add(fis[i].Data())) < 1) {
1853 printf(
"Warning: no files added from %s (Set %d)\n",fis[i].Data(),i);
1855 printf(
"Set %3d: %d files added from %s\n",i,added_files,fis[i].Data());
1856 TKey* corrKey = SCi[i]->GetFile()->GetKey(
"SCcorrection");
1858 TString corrStr = corrKey->ReadObj()->GetTitle();
1859 if (corrStr.Length()) allZeros = kFALSE;
1860 printf(
" used sc = %s\n",corrStr.Data());
1861 corrKey = SCi[i]->GetFile()->GetKey(
"SCEWRatio");
1863 corrStr = corrKey->ReadObj()->GetTitle();
1864 printf(
" used ewratio = %s\n",corrStr.Data());
1866 corrKey = SCi[i]->GetFile()->GetKey(
"GLcorrection");
1867 corrStr = corrKey->ReadObj()->GetTitle();
1868 ugl[i] = corrStr.Atof();
1870 printf(
" used GL = %g\n",ugl[i]);
1872 glmode[i] = (SCi[i]->GetBranch(
"ugl") ? 2 :
1874 SCall->Add(fis[i].Data());
1878 printf(
"Found %d dataset specifications.\n",nfi);
1880 for (i=0;i<nfi;i++) {
1881 if (BY_SECTOR && !(SCi[i]->GetBranch(
"sc1"))) {
1882 printf(
"ERROR: BY_SECTOR specified, but not possible with Set %d!\n",i);
1885 SCi[i]->SetMarkerStyle(7);
1886 SCi[i]->SetMarkerColor(colorData);
1888 SCall->SetMarkerStyle(7);
1890 memset(conSC,0,nsca*
sizeof(TCanvas*));
1893 for (k=0;k<3;k++) parNameSC[k] =
new char[16];
1894 for (k=0;k<3;k++) parNameGL[k] =
new char[16];
1895 for (k=0;k<9;k++) parNameSCGL[k] =
new char[16];
1896 for (k=0;k<19;k++) parNameSCGLsec[k] =
new char[16];
1904 printf(
"Waiting...\n");
1909 void SetMinMax(
int n, Double_t* ar,
double& min,
double& max,
1910 double inclusion,
double margin) {
1913 for (
int i=0; i<n; i++) {
1914 if (min > ar[i]) min = ar[i];
1915 if (max < ar[i]) max = ar[i];
1917 if (min > inclusion) min = inclusion;
1918 else if (max < inclusion) max = inclusion;
1919 double margins = margin*(max-min);
1924 int SetMinuitPars(
const int n, TString* names, Double_t* starts, Double_t* steps,
int debug, Bool_t* fixing) {
1925 TVirtualFitter::SetDefaultFitter(
"Minuit");
1926 TVirtualFitter::SetMaxIterations(500000000);
1927 minuit = TVirtualFitter::Fitter(0,26);
1928 minuit2 = ((TFitter*) minuit)->GetMinuit();
1929 minuit2->SetPrintLevel(debug - 2);
1932 for (i=0; i<n; i++)
if (names[i].Length() > maxlen) maxlen = names[i].Length();
1933 for (i=0; i<n; i++) {
1934 names[i].Append(
' ',maxlen-names[i].Length());
1935 if (fixing && fixing[i]) {
1936 minuit->SetParameter(i, names[i].Data(), starts[i], 0, 0, 0);
1937 minuit->FixParameter(i);
1942 if (names[i].BeginsWith(
"log(g5")) {
1943 lower = starts[i] - 1.0;
1944 upper = starts[i] + 1.0;
1945 }
else if (names[i].BeginsWith(
"log")) {
1946 lower = starts[i] - 3.0;
1947 upper = starts[i] + 3.0;
1948 }
else if (names[i].Contains(
"g2")) {
1949 lower = starts[i] * 1e-1;
1950 upper = starts[i] * 1e1;
1952 minuit->SetParameter(i, names[i].Data(), starts[i], steps[i], lower, upper);
1958 void GetMinuitPar(
const int n) {
1960 double temp1,temp2,temp3;
1961 minuit->GetParameter(n,parName[n],fitPars[n],temp1,temp2,temp3);
1964 void GetMinuitPars(
const int n, Bool_t* fixing, Double_t* fixedValues) {
1967 double lowerLimit,upperLimit;
1969 for (i=0; i<n; i++) {
1970 if (fixing && fixing[i]) {
1971 fitPars[i] = fixedValues[i];
1975 minuit->GetParameter(i,parName[i],fitPars[i],fitParErrs[i],lowerLimit,upperLimit);
1976 if (lowerLimit==0 && upperLimit==0) { atLimit[i] =
false;
continue; }
1977 double limitsCenter = 0.5*(lowerLimit+upperLimit);
1978 double limitsWindow = 0.49 * (upperLimit-lowerLimit);
1979 atLimit[i] = (TMath::Abs(fitPars[i]-limitsCenter) > limitsWindow);
1984 void Log2Lin(
int i) {
1985 fitPars[i] = TMath::Exp(fitPars[i]);
1986 fitParErrs[i] *= fitPars[i];
1989 int FitWithOutlierRemoval(
int npar,
int debug) {
1992 int i,k,status,nOutliers;
1994 Double_t VAR_sets,VAR_single;
1995 Double_t nSet[nfip];
1996 Double_t VAR_singles[nfip];
1998 int nBytes = nMeasuresMax*
sizeof(Bool_t);
1999 int nBytes2 = nfip*
sizeof(Double_t);
2000 memset(outliers,0,nBytes);
2001 Bool_t outliers1[nMeasuresMax];
2002 Bool_t outliers2[nMeasuresMax];
2003 memset(devs,0,nMeasuresMax*
sizeof(Double_t));
2006 if (iter>1) memcpy(outliers2,outliers1,nBytes);
2007 if (iter>0) memcpy(outliers1,outliers,nBytes);
2008 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
2009 if (status)
return status;
2012 GetMinuitPars(npar);
2013 (*(minuit->GetFCN()))(k,&temp1,temp2,fitPars,status);
2019 memset(devs_set,0,nBytes2);
2020 memset(nSet,0,nBytes2);
2021 memset(VAR_singles,0,nBytes2);
2022 for (i=0; i<nMeasures; i++) {
2023 if (outliers[i])
continue;
2024 VAR += devs[i]*devs[i];
2027 devs_set[ifi] += devs[i];
2029 for (i=0; i<nfi; i++) {
2030 devs_set[i] /= nSet[i];
2031 VAR_sets += devs_set[i]*devs_set[i];
2033 for (i=0; i<nMeasures; i++) {
2034 if (outliers[i])
continue;
2036 VAR_singles[ifi] += (devs[i]-devs_set[ifi])*(devs[i]-devs_set[ifi]);
2038 for (i=0; i<nfi; i++) {
2039 VAR_singles[i] = TMath::Sqrt(VAR_singles[i] / nSet[i]);
2040 VAR_single += VAR_singles[i];
2043 VAR_single /= ((Double_t) nfi);
2045 VAR_sets = TMath::Sqrt(VAR_sets / ((Double_t) nfi-1));
2047 VAR = TMath::Sqrt(VAR/((Double_t) nMeasuresI-1));
2050 double N_sets = nfi - 2.0;
2051 double N_sing = (((Double_t) nMeasuresI)/((Double_t) nfi)) - 2.0;
2052 if (N_sets <= 0 || N_sing <=0) {
2053 printf(
"WARNING: could not estimate point-to-point errors due to limited samples\n");
2055 STDDEV = TMath::Sqrt(N_sets* VAR_single*VAR_single + N_sing * VAR_sets*VAR_sets);
2057 if (USE_OLD_STDDEV) STDDEV = VAR;
2061 for (i=0; i<nMeasures; i++) {
2062 if (devs[i] == 0 || TMath::Abs(devs[i]) > MAX_DEV*VAR) { outliers[i] = kTRUE; nOutliers++; }
2063 else outliers[i] = kFALSE;
2065 if (iter>0 && memcmp(outliers,outliers1,nBytes) == 0)
break;
2066 if (iter>1 && memcmp(outliers,outliers2,nBytes) == 0)
break;
2067 if (iter > nMeasures/10) {
2068 printf(
"\nWARNING: Outlier removal at 10 percent of data points...stopping here.\n");
2073 if (debug>0) printf(
"Finished outlier removal: %d (of %d) data points removed (%d iterations)\n",
2074 nOutliers,nMeasures,iter+1);
2077 GetMinuitPars(npar);
2078 status = minuit->ExecuteCommand(
"SET LIM", 0, 0);
2079 if (status)
return status;
2080 double eplus,eminus,eparab,gcc;
2081 for (k=0;k<npar;k++) {
2083 printf(
"%s\t:\t%g\t+/- %g\t(AT LIMIT!)\n",parName[k],fitPars[k],fitParErrs[k]);
2086 for (i=0;i<npar;i++)
if (i!=k) minuit->FixParameter(i);
2087 status = minuit->ExecuteCommand(
"MINIMIZE", arglist, 1);
2088 if (status)
return status;
2089 arglist[1] = (double) k+1;
2090 status = minuit->ExecuteCommand(
"MINOS", arglist, 2);
2091 if (status)
return status;
2093 minuit2->mnerrs(k,eplus,eminus,eparab,gcc);
2094 if (debug>0) printf(
"%s\t:\t%g\t+%g/%g or +/- %g\n",parName[k],fitPars[k],eplus,eminus,eparab);
2095 if (eplus!=0.0 && eminus!=0.0) fitParErrs[k] = 0.5*(eplus-eminus);
2096 else if (eplus!=0.0 || eminus!=0.0) fitParErrs[k] = eparab;
2097 printf(
"%s\t:\t%g\t+/- %g\n",parName[k],fitPars[k],fitParErrs[k]);
2098 for (i=0;i<npar;i++)
if (i!=k) minuit->ReleaseParameter(i);
2103 memcpy(outliers1,outliers,nBytes);
2104 memset(outliers,0,nBytes);
2105 (*(minuit->GetFCN()))(k,&temp1,temp2,fitPars,status);
2106 memcpy(outliers,outliers1,nBytes);
2109 for (i=0; i<nMeasures; i++) {
2110 if (!outliers[i]) VAR += devs[i]*devs[i];
2111 VAR_all += devs[i]*devs[i];
2113 VAR = TMath::Sqrt(VAR/((Double_t) nMeasuresI-1));
2114 VAR_all = TMath::Sqrt(VAR_all/((Double_t) nMeasures-1));
2119 void DrawErrorContours(
int npar, Bool_t* fix) {
2120 int i,j,k,l,status = 0;
2125 Double_t highs[128];
2127 for (k=0;k<npar;k++) {
2128 if (fix && fix[k])
continue;
2129 lows [k] = fitPars[k]-2.5*fitParErrs[k];
2130 highs[k] = fitPars[k]+2.5*fitParErrs[k];
2131 pName[k] = parName[k];
2132 pName[k].Remove(TString::kTrailing,
' ');
2134 TVirtualPad* origPad = gPad;
2135 double plmin = (USE_OLD_STDDEV ? 0.75 : 1.0/nfi);
2136 double plmax = plmin*100.;
2137 for (i=0;i<npar;i++) {
2138 if (fix && fix[i])
continue;
2141 if (fix && fix[j])
continue;
2143 printf(
"Stopping error contour drawing at limit (5 parameters)!\n");
2147 TH2D* plot =
new TH2D(Form(
"h%s_%d_%d",origPad->GetName(),i,j),
2148 Form(
"%s vs. %s",pName[j].Data(),pName[i].Data()),
2149 40,lows[i],highs[i],40,lows[j],highs[j]);
2150 for (k=0;k<40;k++) {
2151 fitPars[i] = lows[i]+(((double) k)+0.5)*(highs[i]-lows[i])/40.;
2152 for (l=0;l<40;l++) {
2153 fitPars[j] = lows[j]+(((double) l)+0.5)*(highs[j]-lows[j])/40.;
2154 (*(minuit->GetFCN()))(npar, gin, chi, fitPars, status);
2155 plot->SetBinContent(k+1,l+1,chi);
2161 origPad->cd(indx)->SetLogz();
2162 plot->SetMinimum(plmin);
2163 plot->SetMaximum(plmax);
2169 TString PCA(
int Nmax,
int debug) {
2170 printf(
"Running principal components analysis...\n");
2174 Double_t rmsl[maxp];
2175 long long rmsi[maxp];
2179 Double_t coef[nsca];
2181 Double_t* xvals[nsca];
2184 TString scas = (scastr.Length() ? scastr :
2185 "zdcx:zdcw:zdce:bbcx:bbcw:bbce:bbcyb:bbcbb:vpdx:vpde:vpdw:zdcxnk:zdcwnk:zdcenk");
2187 TObjArray* scaA = scas.Tokenize(delim);
2188 int i,n,N1 = scaA->GetEntries();
2189 TH1F rmsp(
"rmsp",
"rmsp",500,-0.01,0.01);
2190 int iter0fi = nfi-1;
2192 if (pcaN >= 0)
for (i=0;i<maxp;i++)
if (ppl[i])
delete ppl[i];
2193 memset(ppl,0,maxp*
sizeof(TPrincipal*));
2197 ppl[0] =
new TPrincipal(N1,
"D");
2198 ppl[0]->SetName(
"principal0");
2199 for (n=0; n<N1; n++) {
2200 xvals[n] =
new Double_t[nMeasuresMax];
2202 SCi[iter0fi]->Draw(scaA->At(n)->GetName(),cut,
"goff");
2203 nMeasures = SCi[iter0fi]->GetSelectedRows();
2204 memcpy(xvals[n],SCi[iter0fi]->GetV1(),nMeasures*
sizeof(Double_t));
2207 for (i=0; i<nfi; i++) {
2208 SCi[i]->Draw(Form(
"%s*%g",scaA->At(n)->GetName(),
2209 (n < N1-1 ? 1.0 : (fitPars[1]+ugl[i])/(fitPars[1]+fitPars[4]))),
2222 nMeasuresI = SCi[i]->GetSelectedRows();
2223 memcpy(&(xvals[n][nMeasures]),SCi[i]->GetV1(),nMeasuresI*
sizeof(Double_t));
2224 nMeasures += nMeasuresI;
2228 int count,Count = nMeasures;
2229 for (count=0; count<Count;count++) {
2230 for (n=0; n<N1; n++) x[n] = xvals[n][count];
2233 unsigned int combo = (
unsigned int) (TMath::Power(2,N1-1));
2234 if (debug>0) printf(
"Npoints = %d, Nsca = %d, Possible combinations = %d\n",Count,N1-1,combo-1);
2237 if (debug>1 && Count<100 && gROOT->GetVersionInt()<60900)
2238 printf(
"Please ignore any warnings about nbins from TH1::TH1 ...\n");
2241 unsigned int l,m,one = 1;
2244 double rmsmin = rmsl[l];
2245 for (m=1;m<combo;m++) {
2248 for (n=0;n<N1;n++)
if ((n==N1-1) || ((m>>n) & one)) { map[N]=n; N++; }
2249 if (N>Nmax)
continue;
2251 if (l == (
unsigned int) maxp) {
2252 printf(
"Error! Maximum number of combinations %d exceeded!\n",maxp);
2256 pp =
new TPrincipal(N,
"D");
2257 pp->SetName(Form(
"principal%d",l));
2259 for (count=0;count<Count;count++) {
2260 for (n=0; n<N; n++) x[n] = xvals[map[n]][count];
2263 pp->MakePrincipals();
2264 pp->MakeHistograms(Form(
"PCA_SC%d",l),(debug>1 ?
"xp" :
"p"));
2265 TH1F* pca_sc = (TH1F*) (gROOT->FindObject(Form(
"PCA_SC%d_p%03d",l,N-1)));
2267 const Double_t* mean = pp->GetMeanValues()->GetMatrixArray();
2268 const Double_t* evals = pp->GetEigenValues()->GetMatrixArray();
2269 const Double_t* evecs = pp->GetEigenVectors()->GetMatrixArray();
2270 const Double_t* cova = pp->GetCovarianceMatrix()->GetMatrixArray();
2271 for (n=0; n<N-1; n++) coef[n] = -evecs[(n+1)*N - 1]/evecs[N*N-1];
2274 for (n=0; n<N; n++) trace += cova[n*(N+1)];
2276 Double_t val_at_means = 0;
2277 for (n=0;n<N-1;n++) val_at_means += mean[n]*coef[n];
2278 Double_t zero_offset = val_at_means - mean[N-1];
2279 Double_t converted = zero_offset / coef[0];
2281 rmsl[l] = pca_sc->GetRMS();
2284 printf(
"TRYING TO FIND MY OWN RMS...%g == ",rmsl[l]);
2286 for (
int row=0;row<count;row++) {
2287 pp->X2P(pp->GetRow(row),p);
2290 rmsl[l] = rmsp.GetRMS();
2291 printf(
"%g\n",rmsl[l]);
2294 scl[l] = Form(
"RMS = %g :: ",rmsl[l]);
2295 scl[l] += Form(
"EV = %g :: ",evals[N-1]);
2296 scl[l] += Form(
"\n %s = ",scaA->At(N1-1)->GetName());
2297 scb[l] = Form(
"(%g*(%s",coef[0],scaA->At(map[0])->GetName());
2298 if (zero_offset!=0) {
2299 scb[l] += (converted>0 ? Form(
"-%g",converted) : Form(
"+%g",-converted));
2302 for (n=1;n<N-1;n++) scb[l] += Form(
"+(%g*(%s))",coef[n],scaA->At(map[n])->GetName());
2305 if (rmsl[l] > 0 && rmsl[l] < rmsmin) {
2307 pcaoffset = zero_offset;
2309 for (n=0;n<N-1;n++) {
2310 pcadets[n] = scaA->At(map[n])->GetName();
2311 pcacoef[n] = coef[n];
2317 if (debug>0) printf(
"Max limit on Nsca = %d, Explored combinations = %d\n",
2318 TMath::Min(Nmax,N1)-1,l);
2321 TMath::Sort((
long long) l,rmsl,rmsi);
2326 printf(
"%s\n",scl[rmsi[m]].Data());
2337 for (n=0; n<N1; n++)
delete xvals[n];
2340 return scb[rmsi[l-1]];
2343 void PrintResult(
double scp,
double escp,
double sop,
double esop,
2344 double glp,
double eglp,
double ewp,
double eewp,
const char* det) {
2346 if (!DO_PCA && det) {
2347 printf(
"%6.4g +/- %6.4g) * ((%s) - (%6.4g +/- %6.4g)",scp,escp,det,sop,esop);
2349 double lsop = (sop + pcaoffset)/pcacoef[0];
2350 double lesop = esop/pcacoef[0];
2351 printf(
"1.0 +/- %6.4g)*(%6.4g*(%s-(%6.4g +/- %6.4g))",escp/scp,pcacoef[0]*scp,
2352 pcadets[0].Data(),lsop,lesop);
2353 for (
int n=1;n<pcaN;n++) printf(
"+(%6.4g*(%s))",pcacoef[n]*scp,pcadets[n].Data());
2356 if (EW_ASYMMETRY) printf(
" with EWratio = %5.3f +/-%5.3f\n",ewp,eewp);
2357 printf(
" with GL = %5.2f +/- %5.2f\n\n",glp,eglp);
2360 void PrintResult(
double scp,
double escp,
double sop,
double esop,
2361 double* glp,
double* eglp,
const char* det) {
2363 if (!DO_PCA && det) {
2364 printf(
"%6.4g +/- %6.4g) * ((%s) - (%6.4g +/- %6.4g)",scp,escp,det,sop,esop);
2366 double lsop = (sop + pcaoffset)/pcacoef[0];
2367 double lesop = esop/pcacoef[0];
2368 printf(
"1.0 +/- %6.4g)*(%6.4g*(%s-(%6.4g +/- %6.4g))",escp/scp,pcacoef[0]*scp,
2369 pcadets[0].Data(),lsop,lesop);
2370 for (
int n=1;n<pcaN;n++) printf(
"+(%6.4g*(%s))",pcacoef[n]*scp,pcadets[n].Data());
2372 printf(
")\n with...\n");
2373 for (
int n=0;n<12; n++) {
2374 if (!unfittableSec[n])
2375 printf(
"GL (%2d) = %5.2f +/- %5.2f\n",n+(EWmode<0 ? 13 : 1),glp[n],eglp[n]);
virtual TDataSet * First() const
Return the first object in the list. Returns 0 when list is empty.