Ejemplo n.º 1
0
vector<double> fit()
{
  vector<double> out(2*nbeta+1);
  
  TMinuit minu;
  //minu.SetPrintLevel(-1);
  minu.SetFCN(ch2);
  //set tolerance
  double tol=1e-16;
  int iflag;
  //minu.SetMaxIterations(10000000);
  //minu.mnexcm("SET ERR",&tol,1,iflag);
  
  for(int ib=0;ib<nbeta;ib++)
    {
      minu.DefineParameter(2*ib+0,"infi",1,0.001,0,0);
      minu.DefineParameter(2*ib+1,"coef",1,0.001,0,0);
    }
  minu.DefineParameter(2*nbeta,"M",0,0.001,0,0);
  
  minu.Migrad();
  
  double dum;
  for(int ib=0;ib<=2*nbeta;ib++) minu.GetParameter(ib,out[ib],dum);
  
  return out;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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 runTopRingOpt() {

  gSystem->AddIncludePath("-I${ANITA_UTIL_INSTALL_DIR}/include");

  double startVal=0;               
  double stepSize=0.1;       
  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("topRingOpt.C","k");
  
  Double_t relDeltaOut=0;

  TMinuit *myMin = new TMinuit(150);
  myMin->SetObjectFit(topRingOpt);
  myMin->SetFCN(iHateRoot);
  //setArray();

  double startValDeltaT[16] ={0};
  double startValR[16] ={0};
  double startValPhi[16] ={0};

 //    startValDeltaT[0] =  -0.0519515;     startValR[0] =   -0.0101463;         startValPhi[0] =      -0.00473836 ;   
//     startValDeltaT[1] =     -0.0597062;   startValR[1] =      -0.02577;       startValPhi[1] =   0.00864501 ; 
//     startValDeltaT[2] =     -0.081435;     startValR[2] =     -0.000224044;    startValPhi[2] =   -0.000630649;
//     startValDeltaT[3] =     0.0118873;     startValR[3] =      0.019945;       startValPhi[3] =    0.014016;   
//     startValDeltaT[4] =      0.017917;      startValR[4] =     -0.00297559;    startValPhi[4] =    0.0224936 ;
//     startValDeltaT[5] =      0.0377119;     startValR[5] =     -0.014872;       startValPhi[5] =   0.0163349; 
//     startValDeltaT[6] =     -0.0426158;     startValR[6] =    -0.0562555;      startValPhi[6] =    0.0220065 ; 
//     startValDeltaT[7] =     -0.0221673;     startValR[7] =    -0.034104 ;      startValPhi[7] =    0.0158545 ; 
//     startValDeltaT[8] =      0.0263739;     startValR[8] =     0.00248804;      startValPhi[8] =    0.013246 ; 
//     startValDeltaT[9] =      -0.0938419;    startValR[9] =     -0.00344703;     startValPhi[9] =    -0.00718616; 
//     startValDeltaT[10] =      0.145264;      startValR[10] =     -0.0121874 ;     startValPhi[10] =     0.0156988 ;  
//     startValDeltaT[11] =      0.118105;      startValR[11] =     -0.0337033 ;      startValPhi[11] =   -0.00324182 ;
//     startValDeltaT[12] =      0.321805;      startValR[12] =     0.0134362  ;      startValPhi[12] =   -0.00190277 ;
//     startValDeltaT[13] =      0.0197693;     startValR[13] =     -0.000656063;      startValPhi[13] =   -0.0162318  ;
//     startValDeltaT[14] =      -0.115263;     startValR[14] =     0.0495637   ;      startValPhi[14] =   -0.0198119 ; 
//     startValDeltaT[15] =      -0.255707;   startValR[15] =     0.00189892  ;     startValPhi[15] =     0.0383932  ;
    


 for(int y = 0; y <16; y++){

   ofstream newfile("newSimonNumbers.txt");

   char name[30];
   sprintf(name,"r%d",y);
	myMin->DefineParameter(y, name, startValR[y], stepSize, minVal, maxVal);
   sprintf(name,"z%d",y);
	myMin->DefineParameter(y+16, name, startValDeltaT[y], stepSize, minVal, maxVal);
	   sprintf(name,"phi%d",y);
	myMin->DefineParameter(y+32, name, startValPhi[y], stepSize, minVal, maxVal);
 }


  
	Double_t deltaR[32],deltaRErr[32];
	Double_t deltaZ[32],deltaZErr[32];
	Double_t deltaPhi[32],deltaPhiErr[32];
  
	//*********MINUIT METHOD*******************
	myMin->SetPrintLevel(-1);
	myMin->Migrad();   

	for(int u = 0; u <16; u++){
	  myMin->GetParameter(u,deltaR[u],deltaRErr[u]);
	  //cout << "deltaR[" << u << "] = " << deltaR[u] ;
	
	
	  myMin->GetParameter(u+16,deltaZ[u],deltaZErr[u]);
	  //cout << " deltaZ[" << u << "] = " << deltaZ[u] ;
	
	  myMin->GetParameter(u+32,deltaPhi[u],deltaPhiErr[u]);
	  //cout << " deltaPhi[" << u << "] = " << deltaPhi[u] << ";" << endl;

	  newfile << u << "  " << deltaZ[u]<< "  " << deltaR[u]<< "  " << deltaPhi[u]<< "  " << 0 << endl;


	}


  
}
Ejemplo n.º 7
0
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;

  
}
Ejemplo n.º 9
0
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;

  
}
Ejemplo n.º 11
0
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;
}