void fit(boot &A,boot &B,boot &C,bvec &X,bvec &Y) { //copy X X_fit=new double[nens]; for(int iens=0;iens<nens;iens++) X_fit[iens]=X[iens].med(); Y_fit=new double[nens]; err_Y_fit=new double[nens]; TMinuit minu; minu.SetPrintLevel(-1); minu.DefineParameter(0,"A",0.0,0.0001,0,0); minu.DefineParameter(1,"B",0.0,0.0001,0,0); minu.DefineParameter(2,"C",0.0,0.0001,0,0); minu.SetFCN(chi2_wr); double C2; for(int iboot=0;iboot<nboot+1;iboot++) { if(iboot>0) minu.SetPrintLevel(-1); minu.DefineParameter(3,"a380",lat[0][iboot],0.0001,0,0); minu.DefineParameter(4,"a390",lat[1][iboot],0.0001,0,0); minu.DefineParameter(5,"a405",lat[2][iboot],0.0001,0,0); minu.DefineParameter(6,"a420",lat[3][iboot],0.0001,0,0); minu.FixParameter(3); minu.FixParameter(4); minu.FixParameter(5); minu.FixParameter(6); for(int iens=0;iens<nens;iens++) { Y_fit[iens]=Y.data[iens].data[iboot]; err_Y_fit[iens]=Y.data[iens].err(); } //minimize minu.Migrad(); //get back parameters double dum; minu.GetParameter(0,A.data[iboot],dum); minu.GetParameter(1,B.data[iboot],dum); minu.GetParameter(2,C.data[iboot],dum); double lat_med[4]={lat[0].med(),lat[1].med(),lat[2].med(),lat[3].med()}; if(iboot==0) C2=chi2(A.data[iboot],B[iboot],C[iboot],lat_med); } //calculate the chi2 cout<<"A = ("<<A<<"), B=("<<B<<"), C=("<<C<<")"<<endl; cout<<"Chi2 = "<<C2<<" / "<<nens-3<<" = "<<C2/(nens-3)<<endl; delete[] X_fit; delete[] Y_fit; delete[] err_Y_fit; }
std::vector<double> run_fit(double parOOR, double parOEFG, double parOFTMR, double parOTO, double parSRS) { TMinuit minuit; double arglist[10]; int iflag; arglist[0] = -1; minuit.mnexcm("SET PRINT",arglist,1,iflag); minuit.mnexcm("SET NOW",arglist,0,iflag); minuit.SetFCN(fcn); arglist[0] = 2; minuit.mnexcm("SET STR",arglist,1,iflag); minuit.mnparm(0,"parOOR",parOOR,0.1,0,0,iflag);//or minuit.mnparm(1,"parEFG",parOEFG,0.1,0,0,iflag);//efgp minuit.mnparm(2,"parFTMR",parOFTMR,0.1,0,0,iflag);//ftr minuit.mnparm(3,"parTO",parOTO,0.1,0,0,iflag);//top minuit.mnparm(4,"parSRS",parSRS,0.1,0,0,iflag);//srs if (parSRS == 0) minuit.FixParameter(4); arglist[0] = 10000; arglist[1] = 0.0001; minuit.mnexcm("MIGRAD",arglist,2,iflag); minuit.mnexcm("HESSE",arglist,0,iflag); double fmin, fedm,errdef; int npari, nparx, istat; minuit.mnstat(fmin,fedm,errdef,npari,nparx,istat); double val,err; std::vector<double> ret_ary; for(int p = 0; p < 5; p++) { minuit.GetParameter(p, val, err); ret_ary.push_back(val); } ret_ary.push_back(fmin); return ret_ary; }
void fit(boot &A,boot &B,boot &C,boot &D) { //copy ml ml_fit=new double[nens]; for(int iens=0;iens<nens;iens++) ml_fit[iens]=ml[iens].med(); //alloc dM2Pi and dM2K dM2Pi_fit=new double[nens]; err_dM2Pi_fit=new double[nens]; dM2K_fit=new double[nens]; err_dM2K_fit=new double[nens]; TMinuit minu; minu.SetPrintLevel(-1); int npars=4; minu.DefineParameter(0,"A",0.0,0.0001,0,0); minu.DefineParameter(1,"B",0.0,0.0001,0,0); minu.DefineParameter(2,"C",0.0,0.0001,0,0); minu.DefineParameter(3,"D",0.0,0.0001,0,0); minu.SetFCN(chi2_wr); double C2; for(int iboot=0;iboot<nboot+1;iboot++) { if(iboot>0) minu.SetPrintLevel(-1); minu.DefineParameter(4,"a380",lat[0][iboot],0.0001,0,0); minu.DefineParameter(5,"a390",lat[1][iboot],0.0001,0,0); minu.DefineParameter(6,"a405",lat[2][iboot],0.0001,0,0); minu.DefineParameter(7,"a420",lat[3][iboot],0.0001,0,0); minu.FixParameter(4); minu.FixParameter(5); minu.FixParameter(6); minu.FixParameter(7); for(int iens=0;iens<nens;iens++) { dM2Pi_fit[iens]=dM2Pi.data[iens].data[iboot]; err_dM2Pi_fit[iens]=dM2Pi.data[iens].err(); dM2K_fit[iens]=dM2K.data[iens].data[iboot]; err_dM2K_fit[iens]=dM2K.data[iens].err(); } //minimize minu.Migrad(); //get back parameters double dum; minu.GetParameter(0,A.data[iboot],dum); minu.GetParameter(1,B.data[iboot],dum); minu.GetParameter(2,C.data[iboot],dum); minu.GetParameter(3,D.data[iboot],dum); double lat_med[4]={lat[0].med(),lat[1].med(),lat[2].med(),lat[3].med()}; if(iboot==nboot) C2=chi2(A.data[iboot],B[iboot],C[iboot],D[iboot],lat_med,true); } //calculate the chi2 cout<<"A=("<<A<<"), B=("<<B<<"), C=("<<C<<"), D=("<<D<<")"<<endl; cout<<"Chi2 = "<<C2<<" / "<<2*nens-npars<<" = "<<C2/(2*nens-npars)<<endl; delete[] ml_fit; delete[] dM2Pi_fit; delete[] err_dM2Pi_fit; delete[] dM2K_fit; delete[] err_dM2K_fit; }
void parab_fit(double ch2,jack &a,jack &b,jack &c,double *X,jvec Y,const char *path,bool fl_parab=1) { ofstream out(path); out<<"@type xydy\n"; double MX=0; //copy X nc_fit=Y.nel; X_fit=new double[nc_fit]; for(int iel=0;iel<nc_fit;iel++) if(use[iel]) { X_fit[iel]=X[iel]; out<<X[iel]<<" "<<Y[iel]<<endl; if(X[iel]>MX) MX=X[iel]; } Y_fit=new double[nc_fit]; err_Y_fit=new double[nc_fit]; TMinuit minu; minu.SetPrintLevel(0); int npars=3; minu.DefineParameter(0,"A",0.0,0.0001,0,0); minu.DefineParameter(1,"B",0.0,0.0001,0,0); minu.DefineParameter(2,"C",0.0,0.0001,0,0); if(!fl_parab) { minu.FixParameter(0); npars--; } minu.SetFCN(chi2_wr); for(int ijack=0;ijack<=njack;ijack++) { minu.DefineParameter(2,"C",fixed_A[ijack],0.0001,0,0); minu.FixParameter(2); if(ijack>0) minu.SetPrintLevel(-1); for(int iel=0;iel<nc_fit;iel++) { Y_fit[iel]=Y.data[iel].data[ijack]; err_Y_fit[iel]=Y[iel].err(); } //minimize minu.Migrad(); //get back parameters double dum; minu.GetParameter(0,a.data[ijack],dum); minu.GetParameter(1,b.data[ijack],dum); minu.GetParameter(2,c.data[ijack],dum); } out<<"&\n@type xy\n"; for(double t=0;t<MX;t+=MX/100) out<<t<<" "<<parab(a[njack],b[njack],c[njack],t)<<endl; out.close(); }
void runAngleOpt() { gSystem->AddIncludePath("-I${ANITA_UTIL_INSTALL_DIR}/include"); double startVal=0; double stepSize=0.1; double minVal=-2; double maxVal=2; Double_t p0 = 0; //Load libraries. Need to have ANITA_UTIL_INSTALL_DIR/lib and ROOTSYS/lib in the LD_LIBRARY_PATH gSystem->Load("libfftw3.so"); gSystem->Load("libMathMore.so"); gSystem->Load("libPhysics.so"); gSystem->Load("libGeom.so"); gSystem->Load("libMinuit.so"); gSystem->Load("libRootFftwWrapper.so"); gSystem->Load("libAnitaEvent.so"); gSystem->Load("libAnitaCorrelator.so"); AnitaGeomTool *fGeomTool = AnitaGeomTool::Instance(); gSystem->CompileMacro("anglePlotterOpt.C","k"); Double_t relDeltaOut=0; TMinuit *myMin = new TMinuit(1); myMin->SetObjectFit(anglePlotterOpt); myMin->SetFCN(iHateRoot); //setArray(); for(int u = 0; u < 1; u++){ int middle = 16; for(int y = 16; y <32; y++){ int leftOpt, rightOpt; fGeomTool->getThetaPartners(middle,leftOpt,rightOpt); myMin->DefineParameter(0, "antNum", middle, stepSize, minVal, maxVal); myMin->FixParameter(0); myMin->DefineParameter(1, "deltaT", startVal, stepSize, minVal, maxVal); Double_t deltaT,deltaTErr; //*********MINUIT METHOD******************* myMin->SetPrintLevel(-1); myMin->Migrad(); myMin->GetParameter(1,deltaT,deltaTErr); setValue(rightOpt,deltaT); // printArray(); // cout << middle << " " << rightOpt << " " << deltaT << endl; cout << "deltaTArrayMod[" << rightOpt << "] = " << deltaT << ";" << endl; middle = rightOpt; } } // myMin->DeleteArrays(); // myMin->DeleteArrays(); }
void testZeeMCSmearWithScale(string datareco = "jan16 or nov30",int phtcorr = 231, int test_fitdet= 1, string test_smearmethod = "corrSmear or uncorrSmear",string test_fitmethod = "lh or lhpoisson",int fixscale = 0,int fitstra = 1, int testpaircat=0, double test_fitlow = 70, double test_fithigh = 110, double test_binwidth = 1.0){ int phtcorr_test = phtcorr; if( phtcorr_test == 486){ phtcorr = 485; } fitdet = test_fitdet; smearMethod = test_smearmethod ; testOnlyCat = testpaircat; fitrangeLow = test_fitlow; fitrangeHigh = test_fithigh; binwidth = test_binwidth; fitmethod = test_fitmethod; gStyle->SetOptStat(0); gStyle->SetNdivisions(508,"X"); gStyle->SetNdivisions(512,"Y"); int mc = 1; fillMapIndex(); TString filename; fChainMC = new TChain("Analysis"); fChainData = new TChain("Analysis"); string dataset; int iflag = 2; if( datareco == "nov30"){ iflag = 1; dataset = "DoubleElectronRun2011AB30Nov2011v1AOD"; }else if( datareco == "jan16"){ iflag = 2; dataset = "DoubleElectronRun2011AB16Jan2012v1AOD"; }else{ cout<<"dataset ? " << datareco.c_str()<<endl; return; } ///MC filename = TString(Form("/home/raid2/yangyong/data/CMSSW/v1/CMSSW_4_2_8/src/zSelector/dielectrontree/makeDiElectronTree.v3.DYJetsToLL_TuneZ2_M50_7TeVmadgraphtauolaFall11PU_S6_START42_V14Bv1AODSIMallstat.etcut20.corr%d.eleid1.datapu6.mcpu1.r1to92.scale0.root",phtcorr)); cout<<filename<<endl; fChainMC->Add(filename); //fChainMC->SetBranchAddress("isRealData", &isRealData); fChainMC->SetBranchAddress("elescr9", elescr9); fChainMC->SetBranchAddress("elesceta", elesceta); fChainMC->SetBranchAddress("eleen", eleen); //fChainMC->SetBranchAddress("eleen0", eleen0); fChainMC->SetBranchAddress("mpair", &mpair); // fChainMC->SetBranchAddress("mpair0", &mpair0); fChainMC->SetBranchAddress("eleeta", eleeta); fChainMC->SetBranchAddress("eleieta", eleieta); fChainMC->SetBranchAddress("eleiphi", eleiphi); fChainMC->SetBranchAddress("runNumber", &runNumber); fChainMC->SetBranchAddress("evtNumber", &evtNumber); fChainMC->SetBranchAddress("lumiBlock", &lumiBlock); fChainMC->SetBranchAddress("eleetrue", eleetrue); // fChainMC->SetBranchAddress("eleetruenofsr", eleetruenofsr); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc003", eleetrueplusfsrdrbc003); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc004", eleetrueplusfsrdrbc004); fChainMC->SetBranchAddress("eleetrueplusfsrdrbc005", eleetrueplusfsrdrbc005); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc006", eleetrueplusfsrdrbc006); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc007", eleetrueplusfsrdrbc007); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc008", eleetrueplusfsrdrbc008); // fChainMC->SetBranchAddress("eleetrueplusfsrdrbc009", eleetrueplusfsrdrbc009); fChainMC->SetBranchAddress("eleetrueplusfsrdrbc01", eleetrueplusfsrdrbc01); // fChainMC->SetBranchAddress("eletrueelematched", eletrueelematched); // fChainMC->SetBranchAddress("eletrueelematchednofsr", eletrueelematchednofsr); fChainMC->SetBranchAddress("weight", &weight); //Data filename = TString(Form("/home/raid2/yangyong/data/CMSSW/v1/CMSSW_4_2_8/src/zSelector/dielectrontree/makeDiElectronTree.v3.%s.etcut20.corr%d.eleid1.datapu0.mcpu0.r1to131.scale0.root",dataset.c_str(),phtcorr)); cout<<filename<<endl; fChainData->Add(filename); fChainData->SetBranchAddress("isRealData", &isRealData); fChainData->SetBranchAddress("elescr9", elescr9); fChainData->SetBranchAddress("elesceta", elesceta); fChainData->SetBranchAddress("eleen", eleen); fChainData->SetBranchAddress("eleen0", eleen0); fChainData->SetBranchAddress("mpair", &mpair); fChainData->SetBranchAddress("mpair0", &mpair0); fChainData->SetBranchAddress("eleeta", eleeta); fChainData->SetBranchAddress("eleieta", eleieta); fChainData->SetBranchAddress("eleiphi", eleiphi); fChainData->SetBranchAddress("runNumber", &runNumber); fChainData->SetBranchAddress("evtNumber", &evtNumber); fChainData->SetBranchAddress("lumiBlock", &lumiBlock); NMC = fChainMC->GetEntries(); NData = fChainData->GetEntries(); cout<<"nMC " << NMC <<" "<< NData <<endl; filename = TString(Form("testZeeMCSmearWithScale.%s.%s.%s.testpair%d.fitrange%dto%d.binwidth%2.2f.fitdet%d.corr%d.fitstra%d.fixscale%d.etcut%d.root",datareco.c_str(),test_smearmethod.c_str(),test_fitmethod.c_str(),testpaircat,int(fitrangeLow+0.1),int(fitrangeHigh+0.1),binwidth,fitdet,phtcorr_test,fitstra,fixscale,etcut)); TFile *fnew = new TFile(filename,"recreate"); //filename = TString(Form("testZeeMCSmearWithScale.%s.%s.%s.testpair%d.fitrange%dto%d.binwidth%2.2f.fitdet%d.corr%d.fitstra%d.fixscale%d.etcut%d.txt",datareco.c_str(),test_smearmethod.c_str(),test_fitmethod.c_str(),testpaircat,int(fitrangeLow+0.1),int(fitrangeHigh+0.1),binwidth,fitdet,phtcorr,fitstra,fixscale,etcut)); //txtout.open(filename,ios::out); TTree *mytree = new TTree("Analysis",""); float mcfitpar[8] = {0}; float mcfitparErr[8] = {0}; int mcfitStatus; float fAmin; mytree->Branch("mcfitpar",mcfitpar,"mcfitpar[8]/F"); mytree->Branch("mcfitparErr",mcfitparErr,"mcfitparErr[8]/F"); mytree->Branch("mcfitStatus",&mcfitStatus,"mcfitStatus/I"); mytree->Branch("fAmin",&fAmin,"fAmin/F"); rv_mass = new RooRealVar("rv_mass","mass",100,0,1E6); rv_weight = new RooRealVar("rv_weight","weight",1.0,0,1E6); for(int j=0;j<20;j++){ string sname = string(Form("mpairmc_indscpair%d",j)); makeRootDataSetAndTH1F(sname,int( (fitrangeHigh-fitrangeLow)/binwidth+0.1),fitrangeLow,fitrangeHigh); sname = string(Form("mpairdata_indscpair%d",j)); makeRootDataSetAndTH1F(sname,int( (fitrangeHigh-fitrangeLow)/binwidth+0.1),fitrangeLow,fitrangeHigh); } int sc1cat; int sc2cat; cout<<" nMC " <<NMC <<endl; for(int n=0; n< NMC; n++){ fChainMC->GetEntry(n); if(phtcorr==94){ if(evtNumber%2==0) continue; } ///same as 485, for test purpose only if(phtcorr_test==486){ if(evtNumber%2==0) continue; } if(n%500000==0) cout<<"n " << n <<endl; if(fitdet==1){ if( fabs(elesceta[0])>1.48 || fabs(elesceta[1])>1.48) continue; }else if( fitdet==2){ if( fabs(elesceta[0])<1.48 || fabs(elesceta[1])<1.48) continue; } ///scale r9 in MC for(int j=0; j<2; j++){ if(fabs(elesceta[j])<1.48) elescr9[j] *= 1.004; else elescr9[j] *= 1.006; } ///get pair index sc1cat = scCategoryEight(elesceta[0],elescr9[0]); sc2cat = scCategoryEight(elesceta[1],elescr9[1]); if(sc2cat < sc1cat){ exChangeTwoNumber(sc1cat,sc2cat); } int indpair; if(fitdet==1){ indpair = map_indscpairBarrel[sc1cat][sc2cat]; }else{ indpair = map_indscpairEndcap[sc1cat][sc2cat]; } //test one category if(testOnlyCat >=0 && indpair != testOnlyCat) continue; float e1true; if( fabs(elesceta[0])<1.48){ e1true = eleetrueplusfsrdrbc005[0]; }else{ e1true = eleetrueplusfsrdrbc01[0]; } float e2true; if( fabs(elesceta[1])<1.48){ e2true = eleetrueplusfsrdrbc005[1]; }else{ e2true = eleetrueplusfsrdrbc01[1]; } if(e1true <1 || e2true<1) continue; vindpair.push_back(indpair); sc1cat = scCategoryEight(elesceta[0],elescr9[0]); sc2cat = scCategoryEight(elesceta[1],elescr9[1]); if(fitdet==2){ //Endcap, starting with 4,5,6,7 sc1cat -=4; sc2cat -=4; } vsc1cat.push_back(sc1cat); vsc2cat.push_back(sc2cat); vele1eta.push_back(eleeta[0]); vele1ieta.push_back(eleieta[0]); vele1iphi.push_back(eleiphi[0]); vele2eta.push_back(eleeta[1]); vele2ieta.push_back(eleieta[1]); vele2iphi.push_back(eleiphi[1]); vele1en.push_back(eleen[0]); vele2en.push_back(eleen[1]); vmpair.push_back(mpair); vweight.push_back(weight); vele1etrue.push_back(e1true); vele2etrue.push_back(e2true); if( eleen[0]* sin(2*atan(exp(-eleeta[0]))) < etcut) continue; if( eleen[1]* sin(2*atan(exp(-eleeta[1]))) < etcut) continue; string sname = string(Form("mpairmc_indscpair%d",indpair)); fillRootDataSetAndTH1F(sname,mpair,weight); } setMap_cat_runbin(); loadRunbyRunScaleCorrectionNoR9(iflag,phtcorr); loadScaleCorrectionR9(iflag,phtcorr); for(int n=0; n< NData; n++){ fChainData->GetEntry(n); if(n%500000==0) cout<<"n " << n <<endl; if(fitdet==1){ if( fabs(elesceta[0])>1.48 || fabs(elesceta[1])>1.48) continue; }else if( fitdet==2){ if( fabs(elesceta[0])<1.48 || fabs(elesceta[1])<1.48) continue; } float scorr = 1.0; for(int j=0; j<2; j++){ float dEoE = energyScaleRunNoR9(elesceta[j]); float dEoE1 = energyScaleR9(elesceta[j],elescr9[j]); eleen[j] *= 1.0/(1+dEoE) * 1.0/(1+dEoE1); scorr *= 1.0/(1+dEoE) * 1.0/(1+dEoE1); } mpair *= sqrt(scorr); if( eleen[0]*sin(2*atan(exp(-eleeta[0]))) < etcut) continue; if( eleen[1]*sin(2*atan(exp(-eleeta[1]))) < etcut) continue; sc1cat = scCategoryEight(elesceta[0],elescr9[0]); sc2cat = scCategoryEight(elesceta[1],elescr9[1]); if(sc2cat < sc1cat){ exChangeTwoNumber(sc1cat,sc2cat); } int indpair; if(fitdet==1){ indpair = map_indscpairBarrel[sc1cat][sc2cat]; }else{ indpair = map_indscpairEndcap[sc1cat][sc2cat]; } string sname = string(Form("mpairdata_indscpair%d",indpair)); fillRootDataSetAndTH1F(sname,mpair,1); } for(int j=0;j<10;j++){ string sname = string(Form("mpairmc_indscpair%d",j)); string snamed = string(Form("mpairdata_indscpair%d",j)); cout<<"mpair catpair " << th1f_map[sname]->GetEntries()<<" "<< th1f_map[snamed]->GetEntries()<<endl; } generateGaussRandom(); //return; TMinuit *minuit; int npar = 8; minuit = new TMinuit(npar); //minuit->SetFCN(function); //minuit->SetFCN(function1); minuit->SetFCN(function2); //settings Double_t arglist[1]; Int_t ierflg = 0; //double STEPMN = 0.01; double STEPMN = 0.0001; // 1 for Chi square // 0.5 for negative log likelihood if(fitmethod== "lh" || fitmethod == "lhpoisson"){ minuit->SetErrorDef(0.5); }else{ minuit->SetErrorDef(1); } double fitpar[10]; double fitparErr[10]; double smearcat[4] = {1.1,1.1,1.1,1.1}; double smearcatMax[4] = {3,3,3,3}; double deltaEcat[4] = {0,0,0,0}; if(smearMethod=="uncorrSmear"){ smearcatMax[0] = 0.05; smearcatMax[1] = 0.05; smearcatMax[2] = 0.05; smearcatMax[3] = 0.05; smearcat[0] = 0.007; smearcat[1] = 0.01; smearcat[2] = 0.015; smearcat[3] = 0.02; if(fitdet==2){ smearcat[0] = 0.02; smearcat[1] = 0.02; smearcat[2] = 0.02; smearcat[3] = 0.02; } } for(int j=0; j<4; j++){ TString parname = TString (Form("smearcat%d",j)); if(smearMethod=="corrSmear"){ minuit->mnparm(j, parname, smearcat[j], STEPMN, 0.5,smearcatMax[j],ierflg); }else if(smearMethod=="uncorrSmear"){ minuit->mnparm(j, parname, smearcat[j], STEPMN, 0,smearcatMax[j],ierflg); } fitpar[j] = smearcat[j]; //initialized values } for(int j=4; j<npar; j++){ TString parname = TString (Form("scalecat%d",j-4)); minuit->mnparm(j, parname, deltaEcat[j-4], STEPMN, -0.03,0.03,ierflg); fitpar[j] = deltaEcat[j-4]; //initialized values } if(fixscale==1){ for(int j=4; j<npar; j++){ minuit->FixParameter(j); } } if(testpaircat==1){ minuit->FixParameter(0); minuit->FixParameter(2); minuit->FixParameter(3); minuit->FixParameter(4); minuit->FixParameter(6); minuit->FixParameter(7); }else if( testpaircat==0){ minuit->FixParameter(1); minuit->FixParameter(2); minuit->FixParameter(3); minuit->FixParameter(5); minuit->FixParameter(6); minuit->FixParameter(7); } else if( testpaircat==2){ minuit->FixParameter(0); minuit->FixParameter(1); minuit->FixParameter(3); minuit->FixParameter(4); minuit->FixParameter(5); minuit->FixParameter(7); } else if( testpaircat==3){ minuit->FixParameter(0); minuit->FixParameter(1); minuit->FixParameter(2); minuit->FixParameter(4); minuit->FixParameter(5); minuit->FixParameter(6); } arglist[0] = 0.0001; minuit->mnexcm("SET EPS",arglist,1,ierflg); //minuit->mnsimp(); ////arglist[0] = 1; ///minuit->mnexcm("SET STR",arglist,1,ierflg); //minuit->mnexcm("MIGRAD", arglist ,1,ierflg); arglist[0] = fitstra; minuit->mnexcm("SET STR",arglist,1,ierflg); bool dofit = true; if( dofit){ minuit->Migrad(); if (!minuit->fCstatu.Contains("CONVERGED")) { mcfitStatus = 1; //first try not converged. minuit->Migrad(); }else{ mcfitStatus = 0; } } double ftest[1000]; double atest[1000]; //minuit->GetParameter(0,fitpar[0],fitparErr[0]); if (!minuit->fCstatu.Contains("CONVERGED")) { printf("No convergence at fitting, routine Fit \n"); printf("Minuit return string: %s \n",minuit->fCstatu.Data()); mcfitStatus = 2; //2nd try not converged. }else{ mcfitStatus = -1; } fAmin = minuit->fAmin; for(int j=0; j<npar; j++){ minuit->GetParameter(j,fitpar[j],fitparErr[j]); mcfitpar[j] = fitpar[j]; mcfitparErr[j] = fitparErr[j]; } double par[10]; for(int j=0;j<npar;j++){ par[j] = fitpar[j]; } bool printScan = false; //bool printScan = true; par[0] = 0.0076; if(printScan && testpaircat>=0){ double fmin = function2(par,true); float x1 = fitpar[testpaircat] - 0.1; float x2 = fitpar[testpaircat] + 0.1; float teststep = 0.01; if(smearMethod=="uncorrSmear"){ x1 = fitpar[testpaircat] - 0.005 >0 ? fitpar[testpaircat] - 0.005: 0; x2 = fitpar[testpaircat] +0.005; teststep = 0.001; } double dmin1 = 1; double dmin2 = 1; double fitparErrLow[10]; double fitparErrHigh[10]; int ntest = 0; for(float x = x1; x <= x2; x += teststep){ cout<<"x " << x <<endl; par[testpaircat] = x ; //double f = function2(par,false); double f = function2(par,true); if(fabs(f-fmin-1)< dmin1 && x < fitpar[testpaircat]){ dmin1 = fabs(f-fmin-0.5); fitparErrLow[testpaircat] = fitpar[testpaircat] -x; } if(fabs(f-fmin-1)< dmin2 && x > fitpar[testpaircat]){ dmin2 = fabs(f-fmin-0.5); fitparErrHigh[testpaircat] = x-fitpar[testpaircat]; } atest[ntest] = x; ftest[ntest] = f; ntest ++; } cout<<"fitpar[testpaircat]" << fitpar[testpaircat]<<" +/- "<<fitparErr[testpaircat]<<" - "<< fitparErrLow[testpaircat]<<" + "<< fitparErrHigh[testpaircat]<<endl; TCanvas *can0 = new TCanvas("can0","c000",200,10,550,500); setTCanvasNice(can0); TGraph *gr = new TGraph(ntest,atest,ftest); gr->Draw("ap"); //TF1 *ff = new TF1("ff","[0]+[1]*x+[2]*x*x",0,0.0); //gr->Fit(ff,"r"); can0->Print("testconverge1.pdf"); can0->Print("testconverge1.C"); } mytree->Fill(); mytree->Write(); fnew->Write(); fnew->Close(); }
void runQuickOptAllAntFixedZ() { gSystem->AddIncludePath("-I${ANITA_UTIL_INSTALL_DIR}/include"); double startVal=0; double stepSize=0.05; double minVal=-0.5; double maxVal=0.5; Double_t p0 = 0; //Load libraries. Need to have ANITA_UTIL_INSTALL_DIR/lib and ROOTSYS/lib in the LD_LIBRARY_PATH gSystem->Load("libfftw3.so"); gSystem->Load("libMathMore.so"); gSystem->Load("libPhysics.so"); gSystem->Load("libGeom.so"); gSystem->Load("libMinuit.so"); gSystem->Load("libRootFftwWrapper.so"); gSystem->Load("libAnitaEvent.so"); gSystem->Load("libAnitaCorrelator.so"); AnitaGeomTool *fGeomTool = AnitaGeomTool::Instance(); gSystem->CompileMacro("quickOptAllAntFixedZ.C","k"); fillArrays(eventNumberIndex, thetaWaveIndex, phiWaveIndex, antIndex1, antIndex2, maxCorrTimeIndex, adjacent); Double_t relDeltaOut=0; TMinuit *myMin = new TMinuit(192); myMin->SetObjectFit(quickOptAllAntFixedZ); myMin->SetFCN(iHateRoot); // myMin->SetMaxIterations(2); //myMin->SetErrorDef(1000); // int ierflg; // double eps[1] = {2.}; // myMin->mnexcm("SET EPS", eps, 1, ierflg); //setArray(); double startValR[MAX_ANTENNAS] ={0}; double startValZ[MAX_ANTENNAS] ={0}; double startValPhi[MAX_ANTENNAS] ={0}; double startValCableDelays[MAX_ANTENNAS] ={0}; for(int y = 0; y <MAX_ANTENNAS; y++){ char name[30]; sprintf(name,"r%d",y); myMin->DefineParameter(y, name, startValR[y], stepSize, -0.1, 0.1); sprintf(name,"z%d",y); myMin->DefineParameter(y+MAX_ANTENNAS, name, startValZ[y], stepSize, -0.1, 0.1); myMin->FixParameter(y+MAX_ANTENNAS); sprintf(name,"phi%d",y); myMin->DefineParameter(y+MAX_ANTENNAS*2, name, startValPhi[y], stepSize, -0.1, 0.1); sprintf(name,"cable%d",y); myMin->DefineParameter(y+MAX_ANTENNAS*3, name, startValCableDelays[y], stepSize, -0.5, 0.5); } Double_t deltaR[MAX_ANTENNAS],deltaRErr[MAX_ANTENNAS]; Double_t deltaZ[MAX_ANTENNAS],deltaZErr[MAX_ANTENNAS]; Double_t deltaPhi[MAX_ANTENNAS],deltaPhiErr[MAX_ANTENNAS]; Double_t deltaCableDelays[MAX_ANTENNAS],deltaCableDelaysErr[MAX_ANTENNAS]; //*********MINUIT METHOD******************* // myMin->SetPrintLevel(-1); myMin->Migrad(); // int error_flag; // myMin->mnexcm("MINOS",0,0,error_flag); ofstream newfile("newLindaNumbersCableDelays_ALLANTENNAS_RMS_GRAD_FixedZ.txt"); for(int u = 0; u <MAX_ANTENNAS; u++){ myMin->GetParameter(u,deltaR[u],deltaRErr[u]); cout << "deltaR[" << u << "] = " << deltaR[u] << " +/- " << deltaRErr[u] << endl; myMin->GetParameter(u+MAX_ANTENNAS,deltaZ[u],deltaZErr[u]); cout << " deltaZ[" << u << "] = " << deltaZ[u] << " +/- " << deltaZErr[u] << endl; myMin->GetParameter(u+MAX_ANTENNAS*2,deltaPhi[u],deltaPhiErr[u]); cout << " deltaPhi[" << u << "] = " << deltaPhi[u] << " +/- " << deltaPhiErr[u] << endl; myMin->GetParameter(u+MAX_ANTENNAS*3,deltaCableDelays[u],deltaCableDelaysErr[u]); cout << " deltaCableDelays[" << u << "] = " << deltaCableDelays[u] << " +/- " << deltaCableDelaysErr[u] << endl; newfile << u << " " << deltaR[u]<< " " << deltaZ[u]<< " " << deltaPhi[u]<< " " << deltaCableDelays[u] << endl; } cout << "Easy table" << endl; for(int u = 0; u <MAX_ANTENNAS; u++) cout << u << " & " << deltaR[u]<< " & " << deltaZ[u]<< " & " << deltaPhi[u]<< " & " << deltaCableDelays[u] << endl; }
int main(int argc, char *argv[]) { setenv("TZ","UTC",1); tzset(); gROOT->SetStyle("Plain"); static struct RecEvent RecEvent30; static struct RecEvent RecEvent17; static struct channel_profiles channel_profiles30; static struct channel_profiles channel_profiles17; static struct h3 h330; static struct h3 h317; //get pointer to data TChain *TRecEvent30 = new TChain ("TRecEvent"); CreateTRecEventChain30(TRecEvent30); cout << "TRecEvent entries = " << TRecEvent30->GetEntries() << endl; CreateTRecEvent(TRecEvent30, &RecEvent30); CreateTGrande(TRecEvent30, &h330, false); TChain *TRecEvent17 = new TChain ("TRecEvent"); CreateTRecEventChain17(TRecEvent17); cout << "TRecEvent entries = " << TRecEvent17->GetEntries() << endl; CreateTRecEvent(TRecEvent17, &RecEvent17); CreateTGrande(TRecEvent17, &h317, false); char cut[2048]; sprintf(cut, "Eg>0"); sprintf(cut, "Eg>8.5 && abs(Zenith1Third)+2*Zenith1Third_err>Zeg && abs(Zenith1Third)-2*Zenith1Third_err<Zeg && LDFSlope<0"); // sprintf(cut, "Eg>6 && abs(Zenith1Third)+2*Zenith1Third_err>Zeg && abs(Zenith1Third)-2*Zenith1Third_err<Zeg && event_id!=2768428"); //slope!! cout << "cut = " << cut << endl; TRecEvent30->Draw(">>ListRecEvent30",cut); TEventList *EventList30 = (TEventList*) gDirectory->Get("ListRecEvent30"); if(EventList30==NULL) cerr << "error - EventList30 has null entries" << endl; TRecEvent30->SetEventList(EventList30); cout << "30: events to analyse = " << EventList30->GetN() << endl; TRecEvent17->Draw(">>ListRecEvent17",cut); TEventList *EventList17 = (TEventList*) gDirectory->Get("ListRecEvent17"); if(EventList17==NULL) cerr << "error - EventList17 has null entries" << endl; TRecEvent17->SetEventList(EventList17); cout << "17: events to analyse = " << EventList17->GetN() << endl; TChain *Tchannel_profile30 = new TChain("Tchannel_profile"); int NoChannels30; Tchannel_profile30->AddFile("~/analysis/AnaFlag/AF_D30_run21-49_v28.root"); CreateTchannel_profiles(Tchannel_profile30, &channel_profiles30); NoChannels30 = Tchannel_profile30->GetEntries(); cout << "Tchannel_profile30 entries = " << NoChannels30 << endl; TChain *Tchannel_profile17 = new TChain("Tchannel_profile"); int NoChannels17; Tchannel_profile17->AddFile("~/analysis/AnaFlag/AF_D17_run12-60_v28.root"); CreateTchannel_profiles(Tchannel_profile17, &channel_profiles17); NoChannels17 = Tchannel_profile17->GetEntries(); cout << "Tchannel_profile17 entries = " << NoChannels17 << endl; gEntries = 0; float errScale = 1; float errScale2 = 0.14; //0.0737; //0.048*1; bool bNS = false, bEW = false; //fill data pointers for(int i=0; i<EventList30->GetN(); i++){ TRecEvent30->GetEntry(EventList30->GetEntry(i)); bNS = false; bEW = false; for(int k=0; k<RecEvent30.DetCh; k++){ for(int j=0; j<NoChannels30; j++){ Tchannel_profile30->GetEntry(j); if((int)channel_profiles30.ch_id == RecEvent30.channel_id[k]){ if( strncmp(channel_profiles30.polarisation,"East",4) == 0 ){ bEW = true; gFieldStrengthEW[gEntries] = RecEvent30.FieldStrengthChannel[k]; gFieldStrengthEWErr[gEntries] = RecEvent30.ChannelErrBackground[k]*errScale + RecEvent30.FieldStrengthChannel[k]*errScale2; gFieldStrengthAnt[gEntries] = RecEvent30.FieldStrengthAntenna[k]; gDistanceShowerAxis[gEntries] = RecEvent30.DistanceShowerAxis[k]; } else{ bNS = true; gFieldStrengthNS[gEntries] = RecEvent30.FieldStrengthChannel[k]; gFieldStrengthNSErr[gEntries] = RecEvent30.ChannelErrBackground[k]*errScale + RecEvent30.FieldStrengthChannel[k]*errScale2; gFieldStrengthAnt[gEntries] = RecEvent30.FieldStrengthAntenna[k]; gDistanceShowerAxis[gEntries] = RecEvent30.DistanceShowerAxis[k]; } if(bNS && bEW){ gAzimuth[gEntries] = h330.Azg; while(gAzimuth[gEntries]>360) gAzimuth[gEntries] -= 360; gBAngle[gEntries] = RecEvent30.BAngle; while(gBAngle[gEntries]>360) gBAngle[gEntries] -= 360; gZenith[gEntries] = h330.Zeg; gEg[gEntries] = h330.Eg; if(0){ cout << gAzimuth[gEntries] << " -- " << gBAngle[gEntries] << endl; cout << channel_profiles30.polarisation << endl; cout << gFieldStrengthNS[gEntries] << " -- " << gFieldStrengthEW[gEntries] << " ----- " << gFieldStrengthNS[gEntries]/gFieldStrengthEW[gEntries] << endl; cout << gFieldStrengthAnt[gEntries] << endl; cout << h330.Zeg << " -- " << RecEvent30.Zenith1Third << " -- " << RecEvent30.Zenith1Third_err << endl; cout << RecEvent30.event_id << endl; cout << endl; } gEntries++; bNS = false; bEW = false; } break; } } } } if(true) for(int i=0; i<EventList17->GetN(); i++){ TRecEvent17->GetEntry(EventList17->GetEntry(i)); bNS = false; bEW = false; for(int k=0; k<RecEvent17.DetCh; k++){ for(int j=0; j<NoChannels17; j++){ Tchannel_profile17->GetEntry(j); if((int)channel_profiles17.ch_id == RecEvent17.channel_id[k]){ if( strncmp(channel_profiles17.polarisation,"East",4) == 0 ){ bEW = true; gFieldStrengthEW[gEntries] = RecEvent17.FieldStrengthChannel[k]; gFieldStrengthEWErr[gEntries] = RecEvent17.ChannelErrBackground[k]*errScale + RecEvent17.FieldStrengthChannel[k]*errScale2; gFieldStrengthAnt[gEntries] = RecEvent17.FieldStrengthAntenna[k]; gDistanceShowerAxis[gEntries] = RecEvent17.DistanceShowerAxis[k]; } else{ bNS = true; gFieldStrengthNS[gEntries] = RecEvent17.FieldStrengthChannel[k]; gFieldStrengthNSErr[gEntries] = RecEvent17.ChannelErrBackground[k]*errScale + RecEvent17.FieldStrengthChannel[k]*errScale2; gFieldStrengthAnt[gEntries] = RecEvent17.FieldStrengthAntenna[k]; gDistanceShowerAxis[gEntries] = RecEvent17.DistanceShowerAxis[k]; } if(bNS && bEW){ gAzimuth[gEntries] = h317.Azg; while(gAzimuth[gEntries]>360) gAzimuth[gEntries] -= 360; gBAngle[gEntries] = RecEvent17.BAngle; while(gBAngle[gEntries]>360) gBAngle[gEntries] -= 360; gZenith[gEntries] = h317.Zeg; gEg[gEntries] = h317.Eg; if(0){ cout << "index = " << i << endl; cout << gAzimuth[gEntries] << " -- " << gBAngle[gEntries] << endl; cout << channel_profiles17.polarisation << endl; cout << gFieldStrengthNS[gEntries] << " -- " << gFieldStrengthEW[gEntries] << " ----- " << gFieldStrengthNS[gEntries]/gFieldStrengthEW[gEntries] << endl; cout << gFieldStrengthAnt[gEntries] << endl; cout << h317.Zeg << " -- " << RecEvent17.Zenith1Third << " -- " << RecEvent17.Zenith1Third_err << endl; cout << endl; } gEntries++; bNS = false; bEW = false; } break; } } } } cout << gEntries << endl; if(NoChannels30+NoChannels17 > gMaxCh || gEntries > gMaxEvents) { cout << "constants limit reached" << endl; exit(1); } TMinuit *gMinuit = new TMinuit(10); gMinuit->SetPrintLevel(-1); Double_t arglist[10]; Int_t ierflg = 0; int NoPar = 6; bool AntFit = false; if(AntFit){ // Antenna Fit Settings //++++++++++++++++++++++ cout << "Antenna Fit" << endl; cout << "+++++++++++" << endl; gMinuit->SetFCN(FcnParFS); // no effect arglist[0] = 1; gMinuit->mnexcm("SET ERR", arglist ,1,ierflg); arglist[0] = 1; gMinuit->mnexcm("SET STRATEGY", arglist, 1, ierflg); gMinuit->mnparm(0, "scale", 1., 0.01, 0, 0, ierflg); gMinuit->mnparm(1, "r0", 400., 1, 0, 0, ierflg); gMinuit->mnparm(2, "Epower", 1., 0.01, 0.8, 1.2, ierflg); // gMinuit->mnparm(2, "Epower", 1., 0.1, 0, 0, ierflg); gMinuit->mnparm(3, "Zphase", 0., 0.1, -TMath::Pi()*2, TMath::Pi()*2, ierflg); gMinuit->mnparm(4, "Bphase", 0., 0.1, -TMath::Pi()*2, TMath::Pi()*2, ierflg); gMinuit->mnparm(5, "offset", 2., 0.1, 0, 0, ierflg); // gMinuit->FixParameter(0); // gMinuit->FixParameter(2); gMinuit->FixParameter(3); gMinuit->FixParameter(4); gMinuit->FixParameter(5); } else{ // Channel Fit Settings //+++++++++++++++++++++ cout << "Channel Fit" << endl; cout << "+++++++++++" << endl; gMinuit->SetFCN(FcnParFSChannel); // no effect arglist[0] = 1; gMinuit->mnexcm("SET ERR", arglist ,1,ierflg); arglist[0] = 1; gMinuit->mnexcm("SET STRATEGY", arglist, 1, ierflg); gMinuit->mnparm(0, "scale", 1., 0.01, 0.1, 100, ierflg); gMinuit->mnparm(1, "r0", 400., 1, 100, 1000, ierflg); gMinuit->mnparm(2, "Epower", 1., 0.01, 0.8, 1.2, ierflg); // gMinuit->mnparm(2, "Epower", 1., 0.01, 0, 0, ierflg); gMinuit->mnparm(3, "Zphase", 0., 0.1, -TMath::Pi()*2, TMath::Pi()*2, ierflg); gMinuit->mnparm(4, "Bphase", 0., 0.1, -TMath::Pi()*2, TMath::Pi()*2, ierflg); gMinuit->mnparm(5, "offset", 2., 0.1, 0, 0, ierflg); // gMinuit->FixParameter(0); // gMinuit->FixParameter(2); gMinuit->FixParameter(3); gMinuit->FixParameter(4); gMinuit->FixParameter(5); } //scan par space for(int i=0; i<1; i++){ gMinuit->mnexcm("SCA", arglist, 0, ierflg); } // Now ready for minimization step arglist[0] = 50000; // steps of iteration arglist[1] = 1.; // tolerance gMinuit->mnexcm("MIGRAD", arglist ,2,ierflg); //MIGRAD cout << " MINIMIZE flag is " << ierflg << endl; if(ierflg!=0){ cout << "+++++++++++++++++++++" << endl; cout << "+ ups.. check again +" << endl; cout << "+++++++++++++++++++++" << endl; } // MIGRAD: error optimiser if(ierflg==0 && 0){ arglist[0] = 500000; gMinuit->mnexcm("MIGRAD", arglist ,1,ierflg); cout << " MIGRAD flag is " << ierflg << endl; if(ierflg!=0){ cout << "+++++++++++++++++++++" << endl; cout << "+ ups.. check again +" << endl; cout << "+++++++++++++++++++++" << endl; } } // Minos: error optimiser if(ierflg==0 && 0){ arglist[0] = 500000; gMinuit->mnexcm("MINOS", arglist ,1,ierflg); cout << " MINOS flag is " << ierflg << endl; if(ierflg!=0){ cout << "+++++++++++++++++++++" << endl; cout << "+ ups.. check again +" << endl; cout << "+++++++++++++++++++++" << endl; } } // Print results Double_t amin,edm,errdef; Int_t nvpar,nparx,icstat; gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat); gMinuit->mnprin(3,amin); cout << "prob = " << TMath::Prob(amin,gEntriesUsed-gMinuit->GetNumFreePars())*100 << " %" << endl; cout << "ndf = " << gEntriesUsed-gMinuit->GetNumFreePars() << endl; cout << "output" << endl; // gMinuit->mnexcm("SHO COV", arglist ,0,ierflg); // gMinuit->mnexcm("SHO COR", arglist ,0,ierflg); // gMinuit->mnexcm("SHO EIG", arglist ,0,ierflg); //get fit parameters double par[15], epar; for(int i=0; i<NoPar; i++){ gMinuit->GetParameter(i,par[i],epar); } TFile *output = new TFile("FitParFieldStrength_out.root","RECREATE"); int tcount = 0; float tmpBAngle, tmpZenith; float r0x[gMaxEvents], r0y[gMaxEvents]; float bx[gMaxEvents], by[gMaxEvents]; for(int i=0; i<gEntries; i++){ if(gFieldStrengthAnt[i]>0 && gFieldStrengthNS[i]>0 && gFieldStrengthEW[i]>0){ tmpBAngle = gBAngle[i] * TMath::Pi() / 180.; tmpZenith = gZenith[i] * TMath::Pi() / 180.; r0x[tcount] = -gDistanceShowerAxis[i]; r0y[tcount] = (log( (gFieldStrengthAnt[i]/gEffBand) / ( par[0]*cos(tmpZenith+par[3])*(par[5]+sin(tmpBAngle+par[4]))*powf(10,par[2]*(gEg[i]-8)))) ); //if(r0y[tcount] < -4 && r0x[tcount] > 50) cout << "E = " << gEg[i] << " -- i = " << i << endl; bx[tcount] = tmpBAngle; by[tcount] = gFieldStrengthAnt[i]/gEffBand / (par[0]*cos(tmpZenith+par[3])*exp(-gDistanceShowerAxis[i]/par[1])*powf(10,par[2]*(gEg[i]-8))) - par[5]; // if(by[tcount]>1.5) cout << " E = " << gEg[i] << " -- i = " << i << endl; tcount++; } } TCanvas *can1 = new TCanvas("can1"); can1->Divide(2,2); TGraph *gr0 = new TGraph(tcount,r0x, r0y); gr0->SetName("gr0"); gr0->SetMarkerStyle(20); gr0->SetTitle("lateral distribution"); TGraph *gb = new TGraph(tcount,bx, by); gb->SetName("gb"); gb->SetMarkerStyle(20); gb->SetTitle("geomagnetic angle"); can1->cd(1); gr0->Draw("ap"); can1->cd(2); gb->Draw("ap"); gr0->Write(); gb->Write(); can1->Write(); output->Close(); }
void testEnergySmearZee(int barrelorEndcap=1, int energyRegrVer = 0, int test_eleID = 2, int testcat=-1 ,int fixscale = 1, double test_fitlow = 70, double test_fithigh = 110, double test_binwidth = 0.5, int test_Ntrial=50){ Ntrial = test_Ntrial; eleID = test_eleID; test_cat = testcat; fitrangeLow = test_fitlow; fitrangeHigh = test_fithigh; binwidth = test_binwidth; TString inputdatafile = "/afs/cern.ch/work/s/sixie/public/LeptonScaleAndResolution/ZeeEvents/ZeeNtuple_HCP2012.root"; TString inputmcfile = "/afs/cern.ch/work/s/sixie/public/LeptonScaleAndResolution/ZeeEvents/ZeeNtuple_Summer12DY53X.root"; TString filename = TString(Form("testEnergySmearZee_barend%d_regver%d_eleID%d_fitrange%dto%d_binwidth%2.2f_Ntrial%d.root",barrelorEndcap,energyRegrVer,eleID, int(fitrangeLow+0.1),int(fitrangeHigh+0.1),binwidth, Ntrial)); TFile *fnew = new TFile(filename,"recreate"); nbins = int( (fitrangeHigh-fitrangeLow)/binwidth+0.1); for(int j=0; j<10; j++){ TString histname = TString(Form("th1f_Mee_data_%d",j)); th1f_Mee_data[j] =new TH1F(histname,histname,nbins,fitrangeLow,fitrangeHigh); histname = TString(Form("th1f_Mee_mc0_%d",j)); th1f_Mee_mc0[j] =new TH1F(histname,histname,nbins,fitrangeLow,fitrangeHigh); } fChainData = new TChain("ZeeEvent"); fChainMC = new TChain("ZeeEvent"); //data fChainData->Add(inputdatafile); fChainMC->Add(inputmcfile); setbranchaddress(); int totalEntriesMC = fChainMC->GetEntries(); int totalEntriesData = fChainData->GetEntries(); cout<<" totalEntriesMC /data " << totalEntriesMC << " "<< totalEntriesData <<endl; //totalEntriesData = 1E6; load_energyScaleCorrection_eta_RunByRun(); load_energyScaleCorrection_etaR9bin(); cout<< " fill data histograms " <<endl; for(int entry=0; entry< totalEntriesData; entry++){ fChainData->GetEntry(entry); if(entry%100000==0) cout<<"entry " << entry <<endl; if(barrelorEndcap==1 && (fabs(Ele1SCEta)>1.49 || fabs(Ele2SCEta)>1.49)) continue; if(barrelorEndcap==2 && (fabs(Ele1SCEta)<1.49 || fabs(Ele2SCEta)<1.49)) continue; /// if(eleID==1 || eleID==2){ if( Ele1PassMediumSimpleCuts ==0 || Ele2PassMediumSimpleCuts == 0) continue; } //here missing run-by-run corrections. TBD int sccat1 = scCategoryEight(Ele1SCEta,Ele1R9); int sccat2 = scCategoryEight(Ele2SCEta,Ele2R9); if( barrelorEndcap==2){ sccat1 -=4; sccat2 -=4; } int mcat = MeesmearCategory(sccat1,sccat2); if(testcat >=0 && testcat != mcat) continue; float e1 = Ele1Energy; float e2 = Ele2Energy; if(energyRegrVer==0){ e1 = Ele1EnergyRegressionV0; e2 = Ele2EnergyRegressionV0; } else if(energyRegrVer==1){ e1 = Ele1EnergyRegressionV1; e2 = Ele2EnergyRegressionV1; } else if(energyRegrVer==2){ e1 = Ele1EnergyRegressionV2; e2 = Ele2EnergyRegressionV2; } float corr1 = energyScaleCorrection_eta_RunByRun(Ele1SCEta,run); e1 *= ( 1- corr1); float corr2 = energyScaleCorrection_eta_RunByRun(Ele2SCEta,run); e2 *= ( 1- corr2); corr1 = energyScaleCorrection_etaR9bin(Ele1SCEta,Ele1R9); e1 *= (1-corr1); corr2 = energyScaleCorrection_etaR9bin(Ele2SCEta,Ele2R9); e2 *= (1-corr2); float et1 = e1 * sin(2*atan(exp(-Ele1Eta))); float et2 = e2 * sin(2*atan(exp(-Ele2Eta))); if(eleID==1){ if(et1<15 || et2 <15) continue; } if(eleID==2){ if(et1<20 || et2 <20) continue; } float mee = calcZmass(e1,Ele1Eta,Ele1Phi,e2,Ele2Eta,Ele2Phi); th1f_Mee_data[mcat]->Fill(mee); } //totalEntriesMC = 1E6; int nMC = 0; ///MC for(int entry=0; entry< totalEntriesMC; entry++){ fChainMC->GetEntry(entry); if(entry%100000==0) cout<<"entry " << entry <<endl; if( event%2==0) continue; ///used for training. if(barrelorEndcap==1 && (fabs(Ele1SCEta)>1.49 || fabs(Ele2SCEta)>1.49)) continue; if(barrelorEndcap==2 && (fabs(Ele1SCEta)<1.49 || fabs(Ele2SCEta)<1.49)) continue; /// if(eleID==1 || eleID==2){ if( Ele1PassMediumSimpleCuts ==0 || Ele2PassMediumSimpleCuts == 0) continue; } int sccat1 = scCategoryEight(Ele1SCEta,Ele1R9); int sccat2 = scCategoryEight(Ele2SCEta,Ele2R9); if( barrelorEndcap==2){ sccat1 -=4; sccat2 -=4; } int mcat = MeesmearCategory(sccat1,sccat2); if(testcat >=0 && testcat != mcat) continue; nMC ++; float e1 = Ele1Energy; float e2 = Ele2Energy; if(energyRegrVer==0){ e1 = Ele1EnergyRegressionV0; e2 = Ele2EnergyRegressionV0; } else if(energyRegrVer==1){ e1 = Ele1EnergyRegressionV1; e2 = Ele2EnergyRegressionV1; } else if(energyRegrVer==2){ e1 = Ele1EnergyRegressionV2; e2 = Ele2EnergyRegressionV2; } float mee = calcZmass(e1,Ele1Eta,Ele1Phi,e2,Ele2Eta,Ele2Phi); v_e1.push_back(e1); v_e2.push_back(e2); v_sc1cat.push_back(sccat1); v_sc2cat.push_back(sccat2); v_mee.push_back(mee); v_mcat.push_back(mcat); v_wt.push_back(weight); v_e1eta.push_back(Ele1Eta); v_e2eta.push_back(Ele2Eta); float et1 = e1 * sin(2*atan(exp(-Ele1Eta))); float et2 = e2 * sin(2*atan(exp(-Ele2Eta))); if(eleID==1){ if(et1<15 || et2 <15) continue; } if(eleID==2){ if(et1<20 || et2 <20) continue; } th1f_Mee_mc0[mcat]->Fill(mee,weight); } cout<<"mc "<< th1f_Mee_mc0[0]->GetEntries()<<" " << th1f_Mee_mc0[0]->Integral()<<endl; Nrand = Ntrial * nMC; cout<<"filling random " << Ntrial * nMC <<endl; grand = new TRandom3(12345); for(int j=0; j< Nrand; j++){ v_rand1.push_back( grand->Gaus() ); v_rand2.push_back( grand->Gaus() ); } // par_fit[0] = 0.005; // for(int j=0;j<10;j++){ // function(par_fit); // par_fit[0] += 0.0005; // } TTree *mytree = new TTree("Analysis",""); float mcfitpar[8] = {0}; float mcfitparErr[8] = {0}; int mcfitStatus; float fAmin; mytree->Branch("mcfitpar",mcfitpar,"mcfitpar[8]/F"); mytree->Branch("mcfitparErr",mcfitparErr,"mcfitparErr[8]/F"); mytree->Branch("mcfitStatus",&mcfitStatus,"mcfitStatus/I"); mytree->Branch("fAmin",&fAmin,"fAmin/F"); //return; TMinuit *minuit; int npar = 8; minuit = new TMinuit(npar); minuit->SetFCN(fcn); //settings Double_t arglist[1]; Int_t ierflg = 0; //double STEPMN = 0.01; double STEPMN = 0.0001; double fitpar[10]; double fitparErr[10]; double smearcat[4] = {0.02,0.02,0.02,0.02}; double smearcatMax[4] = {0.1,0.1,0.1,0.1}; double deltaEcat[4] = {0,0,0,0}; smearcatMax[0] = 0.05; smearcatMax[1] = 0.05; smearcatMax[2] = 0.05; smearcatMax[3] = 0.05; smearcat[0] = 0.005; smearcat[1] = 0.01; smearcat[2] = 0.015; smearcat[3] = 0.02; if(barrelorEndcap==2){ smearcat[0] = 0.02; smearcat[1] = 0.02; smearcat[2] = 0.02; smearcat[3] = 0.02; } for(int j=0; j<4; j++){ TString parname = TString (Form("smearcat%d",j)); minuit->mnparm(j, parname, smearcat[j], STEPMN, 0,smearcatMax[j],ierflg); fitpar[j] = smearcat[j]; //initialized values } for(int j=4; j<npar; j++){ TString parname = TString (Form("scalecat%d",j-4)); minuit->mnparm(j, parname, deltaEcat[j-4], STEPMN, -0.03,0.03,ierflg); fitpar[j] = deltaEcat[j-4]; //initialized values } if(fixscale==1){ for(int j=4; j<npar; j++){ minuit->FixParameter(j); } } int testpaircat = testcat; if(testpaircat==1){ minuit->FixParameter(0); minuit->FixParameter(2); minuit->FixParameter(3); minuit->FixParameter(4); minuit->FixParameter(6); minuit->FixParameter(7); }else if( testpaircat==0){ minuit->FixParameter(1); minuit->FixParameter(2); minuit->FixParameter(3); minuit->FixParameter(5); minuit->FixParameter(6); minuit->FixParameter(7); } else if( testpaircat==2){ minuit->FixParameter(0); minuit->FixParameter(1); minuit->FixParameter(3); minuit->FixParameter(4); minuit->FixParameter(5); minuit->FixParameter(7); } else if( testpaircat==3){ minuit->FixParameter(0); minuit->FixParameter(1); minuit->FixParameter(2); minuit->FixParameter(4); minuit->FixParameter(5); minuit->FixParameter(6); } arglist[0] = 0.0001; minuit->mnexcm("SET EPS",arglist,1,ierflg); arglist[0] = 1; minuit->mnexcm("SET STR",arglist,1,ierflg); bool dofit = true; if( dofit){ minuit->Migrad(); if (!minuit->fCstatu.Contains("CONVERGED")) { mcfitStatus = 1; //first try not converged. minuit->Migrad(); }else{ mcfitStatus = 0; } //minuit->mnmnos(); } if (!minuit->fCstatu.Contains("CONVERGED")) { printf("No convergence at fitting, routine Fit \n"); printf("Minuit return string: %s \n",minuit->fCstatu.Data()); mcfitStatus = 2; //2nd try not converged. }else{ mcfitStatus = -1; } fAmin = minuit->fAmin; for(int j=0; j<npar; j++){ minuit->GetParameter(j,fitpar[j],fitparErr[j]); mcfitpar[j] = fitpar[j]; mcfitparErr[j] = fitparErr[j]; } mytree->Fill(); mytree->Write(); fnew->Write(); fnew->Close(); }
void runQuickOptAllAntStepsLDBHPOL() { gSystem->AddIncludePath("-I${ANITA_UTIL_INSTALL_DIR}/include"); double startVal=0; double stepSize=0.01; double minVal=-0.5; double maxVal=0.5; Double_t p0 = 0; //Load libraries. Need to have ANITA_UTIL_INSTALL_DIR/lib and ROOTSYS/lib in the LD_LIBRARY_PATH gSystem->Load("libfftw3.so"); gSystem->Load("libMathMore.so"); gSystem->Load("libPhysics.so"); gSystem->Load("libGeom.so"); gSystem->Load("libMinuit.so"); gSystem->Load("libRootFftwWrapper.so"); gSystem->Load("libAnitaEvent.so"); gSystem->Load("libAnitaCorrelator.so"); AnitaGeomTool *fGeomTool = AnitaGeomTool::Instance(); fGeomTool->useKurtAnita3Numbers(1); gSystem->CompileMacro("quickOptAllAntStepsLDBHPOL.C","k"); fillArrays(eventNumberIndex, thetaWaveIndex, phiWaveIndex, antIndex1, antIndex2, maxCorrTimeIndex, adjacent); Double_t relDeltaOut=0; TMinuit *myMin = new TMinuit(192); myMin->SetObjectFit(quickOptAllAntStepsLDBHPOL); myMin->SetFCN(iHateRoot); // myMin->SetMaxIterations(2); //myMin->SetErrorDef(1000); // int ierflg; // double eps[1] = {2.}; // myMin->mnexcm("SET EPS", eps, 1, ierflg); //setArray(); double minValCableDelays[MAX_ANTENNAS] ={0}; double maxValCableDelays[MAX_ANTENNAS] ={0}; Double_t deltaR[MAX_ANTENNAS] = {0}; Double_t deltaRErr[MAX_ANTENNAS] = {0}; Double_t deltaZ[MAX_ANTENNAS] = {0}; Double_t deltaZErr[MAX_ANTENNAS] = {0}; Double_t deltaPhi[MAX_ANTENNAS] = {0}; Double_t deltaPhiErr[MAX_ANTENNAS] = {0}; Double_t deltaCableDelays[MAX_ANTENNAS] = {0}; Double_t deltaCableDelaysErr[MAX_ANTENNAS] = {0}; // Double_t globalDeltaz = 0.242575; Double_t globalDeltaz = 0.03; //Min global deltaZ[] = -0.242575 +/- 0.00198264 for(int y = 0; y <MAX_ANTENNAS; y++){ deltaR[y] = 0;//-0.05; deltaCableDelays[y] = 0. - (y==47)*0.35; minValCableDelays[y] = deltaCableDelays[y] - 0.15; maxValCableDelays[y] = deltaCableDelays[y] + 0.15; deltaZ[y] = 0;//(y<16)*(-globalDeltaz) + (y>15)*globalDeltaz; char name[30]; sprintf(name,"r%d",y); myMin->DefineParameter(y, name, deltaR[y], stepSize, -0.3, 0.3); sprintf(name,"z%d",y); myMin->DefineParameter(y+MAX_ANTENNAS, name, deltaZ[y], stepSize, -0.3, 0.3); sprintf(name,"phi%d",y); myMin->DefineParameter(y+MAX_ANTENNAS*2, name, deltaPhi[y], stepSize, -0.3, 0.3); sprintf(name,"cable%d",y); myMin->DefineParameter(y+MAX_ANTENNAS*3, name, deltaCableDelays[y], stepSize, minValCableDelays[y], maxValCableDelays[y]); } for(int y = 0; y <MAX_ANTENNAS; y++){ myMin->FixParameter(y); // fixed R myMin->FixParameter(y+MAX_ANTENNAS); // fixed Z myMin->FixParameter(y+MAX_ANTENNAS*2); // fixed phi // myMin->FixParameter(y+MAX_ANTENNAS*3); // fixed t } myMin->FixParameter(MAX_ANTENNAS*3); // fixed t0 //*********MINUIT METHOD******************* // myMin->SetPrintLevel(-1); myMin->Migrad(); // int error_flag; // myMin->mnexcm("MINOS",0,0,error_flag); for(int u = 0; u <MAX_ANTENNAS; u++){ myMin->GetParameter(u+MAX_ANTENNAS*3,deltaCableDelays[u],deltaCableDelaysErr[u]); cout << " deltaCableDelays[" << u << "] = " << deltaCableDelays[u] << " +/- " << deltaCableDelaysErr[u] << endl; // myMin->GetParameter(u+MAX_ANTENNAS,deltaZ[u],deltaZErr[u]); // cout << " deltaZ[" << u << "] = " << deltaZ[u] << " +/- " << deltaZErr[u] << endl; } cout << " ################## first step done ##############" << endl; TMinuit *myMin2 = new TMinuit(192); myMin2->SetObjectFit(quickOptAllAntStepsLDBHPOL); myMin2->SetFCN(iHateRoot); for(int y = 0; y <MAX_ANTENNAS; y++){ char name[30]; sprintf(name,"r%d",y); myMin2->DefineParameter(y, name, deltaR[y], stepSize, -0.15, 0.15); sprintf(name,"z%d",y); myMin2->DefineParameter(y+MAX_ANTENNAS, name, deltaZ[y], stepSize, -0.3, 0.3); sprintf(name,"phi%d",y); myMin2->DefineParameter(y+MAX_ANTENNAS*2, name, deltaPhi[y], stepSize, -0.15, 0.15); sprintf(name,"cable%d",y); myMin2->DefineParameter(y+MAX_ANTENNAS*3, name, deltaCableDelays[y], stepSize, minValCableDelays[y], maxValCableDelays[y]); } for(int y = 0; y <MAX_ANTENNAS; y++){ myMin2->FixParameter(y); // fixed R myMin2->FixParameter(y+MAX_ANTENNAS); // fixed Z // myMin2->FixParameter(y+MAX_ANTENNAS*2); // fixed phi myMin2->FixParameter(y+MAX_ANTENNAS*3); // fixed t } myMin2->Migrad(); for(int u = 0; u <MAX_ANTENNAS; u++){ // myMin2->GetParameter(u,deltaR[u],deltaRErr[u]); // cout << "deltaR[" << u << "] = " << deltaR[u] << " +/- " << deltaRErr[u] << endl; myMin2->GetParameter(u+MAX_ANTENNAS*2,deltaPhi[u],deltaPhiErr[u]); cout << " deltaPhi[" << u << "] = " << deltaPhi[u] << " +/- " << deltaPhiErr[u] << endl; } cout << " ################## second step done ##############" << endl; TMinuit *myMin3 = new TMinuit(192); myMin3->SetObjectFit(quickOptAllAntStepsLDBHPOL); myMin3->SetFCN(iHateRoot); for(int y = 0; y <MAX_ANTENNAS; y++){ char name[30]; sprintf(name,"r%d",y); myMin3->DefineParameter(y, name, deltaR[y], stepSize, -0.15,0.15); sprintf(name,"z%d",y); myMin3->DefineParameter(y+MAX_ANTENNAS, name, deltaZ[y], stepSize, -0.3, 0.3); sprintf(name,"phi%d",y); myMin3->DefineParameter(y+MAX_ANTENNAS*2, name, deltaPhi[y], stepSize, -0.3, 0.3); sprintf(name,"cable%d",y); myMin3->DefineParameter(y+MAX_ANTENNAS*3, name, deltaCableDelays[y], stepSize, minValCableDelays[y], maxValCableDelays[y]); } for(int y = 0; y <MAX_ANTENNAS; y++){ // myMin3->FixParameter(y); // fixed R myMin3->FixParameter(y+MAX_ANTENNAS); // fixed Z myMin3->FixParameter(y+MAX_ANTENNAS*2); // fixed phi myMin3->FixParameter(y+MAX_ANTENNAS*3); // fixed t } myMin3->Migrad(); for(int u = 0; u <MAX_ANTENNAS; u++){ // myMin3->GetParameter(u+MAX_ANTENNAS*2,deltaPhi[u],deltaPhiErr[u]); // cout << " deltaPhi[" << u << "] = " << deltaPhi[u] << " +/- " << deltaPhiErr[u] << endl; myMin3->GetParameter(u,deltaR[u],deltaRErr[u]); cout << "deltaR[" << u << "] = " << deltaR[u] << " +/- " << deltaRErr[u] << endl; } cout << " ################## third step done ##############" << endl; TMinuit *myMin4 = new TMinuit(192); myMin4->SetObjectFit(quickOptAllAntStepsLDBHPOL); myMin4->SetFCN(iHateRoot); for(int y = 0; y <MAX_ANTENNAS; y++){ sprintf(name,"r%d",y); myMin4->DefineParameter(y, name, deltaR[y],stepSize, -0.3, 0.3); sprintf(name,"z%d",y); myMin4->DefineParameter(y+MAX_ANTENNAS, name, deltaZ[y], stepSize, -0.15, 0.15); sprintf(name,"phi%d",y); myMin4->DefineParameter(y+MAX_ANTENNAS*2, name, deltaPhi[y], stepSize, -0.3, 0.3); sprintf(name,"cable%d",y); myMin4->DefineParameter(y+MAX_ANTENNAS*3, name, deltaCableDelays[y], stepSize, minValCableDelays[y], maxValCableDelays[y]); } for(int y = 0; y <MAX_ANTENNAS; y++){ myMin4->FixParameter(y); // fixed R //myMin4->FixParameter(y+MAX_ANTENNAS); // fixed Z myMin4->FixParameter(y+MAX_ANTENNAS*2); // fixed phi myMin4->FixParameter(y+MAX_ANTENNAS*3); // fixed t } //*********MINUIT METHOD******************* // myMin->SetPrintLevel(-1); myMin4->Migrad(); // int error_flag; // myMin->mnexcm("MINOS",0,0,error_flag); std::time_t now = std::time(NULL); std::tm * ptm = std::localtime(&now); char buffer[32]; std::strftime(buffer, 32, "%Y_%m_%d_time_%H_%M_%S", ptm); ofstream newfile(Form("RETEST/newLindaNumbers_LDBHPOL_NEW12_fixedBug_%s.txt", buffer)); for(int u = 0; u <MAX_ANTENNAS; u++){ myMin4->GetParameter(u,deltaR[u],deltaRErr[u]); cout << "deltaR[" << u << "] = " << deltaR[u] << " +/- " << deltaRErr[u] << endl; myMin4->GetParameter(u+MAX_ANTENNAS,deltaZ[u],deltaZErr[u]); cout << " deltaZ[" << u << "] = " << deltaZ[u] << " +/- " << deltaZErr[u] << endl; myMin4->GetParameter(u+MAX_ANTENNAS*2,deltaPhi[u],deltaPhiErr[u]); cout << " deltaPhi[" << u << "] = " << deltaPhi[u] << " +/- " << deltaPhiErr[u] << endl; myMin4->GetParameter(u+MAX_ANTENNAS*3,deltaCableDelays[u],deltaCableDelaysErr[u]); cout << " deltaCableDelays[" << u << "] = " << deltaCableDelays[u] << " +/- " << deltaCableDelaysErr[u] << endl; newfile << u << " " << deltaR[u]<< " " << deltaZ[u]<< " " << deltaPhi[u]<< " " << deltaCableDelays[u] << endl; } cout << "Easy table" << endl; for(int u = 0; u <MAX_ANTENNAS; u++) cout << u << " & " << deltaR[u]<< " & " << deltaZ[u]<< " & " << deltaPhi[u]<< " & " << deltaCableDelays[u] << endl; }
void fit(boot &A,boot &B,boot &C,boot &D,bvec &X,bvec &Y) { //copy X X_fit=new double[nens]; for(int iens=0;iens<nens;iens++) X_fit[iens]=X[iens].med(); Y_fit=new double[nens]; err_Y_fit=new double[nens]; TMinuit minu; minu.SetPrintLevel(-1); int npars=4; minu.DefineParameter(0,"A",0.0,0.0001,0,0); minu.DefineParameter(1,"B",0.0,0.0001,0,0); minu.DefineParameter(2,"C",0.0,0.0001,0,0); minu.DefineParameter(3,"D",0.0,0.0001,0,0); if(!include_a4) { minu.FixParameter(3); npars--; } if(!include_ml_term) { minu.FixParameter(1); npars--; } minu.SetFCN(chi2_wr); double C2; for(int iboot=0;iboot<nboot+1;iboot++) { if(iboot>0) minu.SetPrintLevel(-1); minu.DefineParameter(4,"a380",lat[0][iboot],0.0001,0,0); minu.DefineParameter(5,"a390",lat[1][iboot],0.0001,0,0); minu.DefineParameter(6,"a405",lat[2][iboot],0.0001,0,0); minu.DefineParameter(7,"a420",lat[3][iboot],0.0001,0,0); minu.FixParameter(4); minu.FixParameter(5); minu.FixParameter(6); minu.FixParameter(7); for(int iens=0;iens<nens;iens++) { Y_fit[iens]=Y.data[iens].data[iboot]; err_Y_fit[iens]=Y.data[iens].err(); } //minimize minu.Migrad(); //get back parameters double dum; minu.GetParameter(0,A.data[iboot],dum); minu.GetParameter(1,B.data[iboot],dum); minu.GetParameter(2,C.data[iboot],dum); minu.GetParameter(3,D.data[iboot],dum); double lat_med[4]={lat[0].med(),lat[1].med(),lat[2].med(),lat[3].med()}; if(iboot==nboot) { contr_flag=1; C2=chi2(A.data[iboot],B[iboot],C[iboot],D[iboot],lat_med); contr_flag=0; } } int ninc_ens=0; for(int iens=0;iens<nens;iens++) if(ibeta[iens]!=0 || include_380) ninc_ens++; //calculate the chi2 cout<<"A=("<<A<<"), B=("<<B<<"), C=("<<C<<"), D=("<<D<<")"<<endl; cout<<"Chi2 = "<<C2<<" / "<<ninc_ens-npars<<" = "<<C2/(ninc_ens-npars)<<endl; delete[] X_fit; delete[] Y_fit; delete[] err_Y_fit; }