float GetWeightFLminusFR(float x,float var,LorentzVector p4W, bool Wplus ){ // variable x is cos(theta) here // TH1F* h_polarization_Wplus[4][3]; // TH1F* h_polarization_Wminus[4][3]; float pt_bins[5] = {50,100,300,500,10000}; float eta_bins[4] = {0,1,2,5}; // TString bin_names_pt[4] = {"pt_50_100_","pt_100_300_","pt_300_500_","pt_500_up_"}; // TString bin_names_eta[3] = {"eta_0_1","eta_1_2","eta_2_5"}; float fl_plus = 0; float fr_plus = 0; float f0_plus = 0; float fl_minus = 0; float fr_minus = 0; float f0_minus = 0; if ( H_polarization_Wplus[0]==0 || H_polarization_Wminus[0]==0 ) LoadPolarizationHistograms(); for(int i=0;i<4;i++){ for(int ii=0;ii<3;ii++){ if(p4W.Pt()>pt_bins[i]&&p4W.Pt()<pt_bins[i+1]&&fabs(p4W.Rapidity())>eta_bins[ii]&&fabs(p4W.Rapidity())<eta_bins[ii+1]){ if(i==3&&ii==2){ //in highest rapidity and highest ptW bin do nothing because the statistics is lousy } else{ if(Wplus){ fl_plus = H_polarization_Wplus[0]->GetBinContent(i,ii); fr_plus = H_polarization_Wplus[1]->GetBinContent(i,ii); // f0_plus = H_polarization_Wplus[2]->GetBinContent(i,ii); f0_plus = 1-fl_plus-fr_plus; }//end of Wplus if(!Wplus){ fl_minus = H_polarization_Wminus[0]->GetBinContent(i,ii); fr_minus = H_polarization_Wminus[1]->GetBinContent(i,ii); // f0_minus = H_polarization_Wminus[2]->GetBinContent(i,ii); f0_minus = 1-fl_minus-fr_minus; }//end of Wminus }//end of requiring that last bin in helicity not be used }//end of if statement for W pt and helicity }}//end of for loop float f0=0; float fl=0; float fr=0; float fl_variation = 0; float fr_variation = 0; float original_value = 0; float new_value = 0; if(Wplus){f0=f0_plus;fl=fl_plus;fr=fr_plus; fl_variation = fl+(fl-fr)*var*0.01; fr_variation = fr-(fl-fr)*var*0.01; if(fl_variation>1||fr_variation<0){fl_variation=1-f0;fr_variation=0;} /* cout<<"W plus event"<<endl; cout<<"W pt: "<<p4W.Pt()<<endl; cout<<"W y: "<<fabs(p4W.Rapidity())<<endl; cout<<"fl original: "<<fl<<", fl vary: "<<fl_variation<<endl; cout<<"fr original: "<<fr<<", fr vary: "<<fr_variation<<endl; cout<<"fo original: "<<f0<<endl; */ original_value = f0*(1-x*x)+0.5*fl*(1-x)*(1-x)+0.5*fr*(1+x)*(1+x); new_value = f0*(1-x*x)+0.5*fl_variation*(1-x)*(1-x)+0.5*fr_variation*(1+x)*(1+x); } if(!Wplus){f0=f0_minus;fl=fl_minus;fr=fr_minus; fl_variation = fl+(fl-fr)*var*0.01; fr_variation = fr-(fl-fr)*var*0.01; if(fl_variation>1||fr_variation<0){fl_variation=1-f0;fr_variation=0;} /* cout<<"W minus event"<<endl; cout<<"W pt: "<<p4W.Pt()<<endl; cout<<"W y: "<<fabs(p4W.Rapidity())<<endl; cout<<"fl original: "<<fl<<", fl vary: "<<fl_variation<<endl; cout<<"fr original: "<<fr<<", fr vary: "<<fr_variation<<endl; cout<<"fo original: "<<f0<<endl; */ original_value = f0*(1-x*x)+0.5*fr*(1-x)*(1-x)+0.5*fl*(1+x)*(1+x); new_value = f0*(1-x*x)+0.5*fr_variation*(1-x)*(1-x)+0.5*fl_variation*(1+x)*(1+x); } float w = 1; // cout<<"original_value: "<<original_value<<endl; // cout<<"new_value: "<<new_value<<endl; if((f0+fl+fr)!=0){ if(original_value!=0){ w = new_value/original_value; } else{cout<< "ERROR"<< endl; exit(1);} } // cout<<"Weight is: "<<w<<endl; return w; }