ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/ZbTools.C
(Generate patch)

Comparing UserCode/cbrown/Development/Plotting/Modules/ZbTools.C (file contents):
Revision 1.1 by buchmann, Mon Jun 25 13:34:21 2012 UTC vs.
Revision 1.3 by buchmann, Thu Jul 12 12:53:41 2012 UTC

# Line 36 | Line 36 | void print_yield(TCut cut) {
36    TH1F *data  = allsamples.Draw("data",    "mll",1,0,10000000, "m_{ll} [GeV]", "events", cut,data,luminosity);
37    cout << "  Yields for " << (const char*) cut << endl;
38    cout << "     data: " << data->Integral() << endl;
39 <  THStack mcm = allsamples.DrawStack("mc", "mll",1,0,10000000, "m_{ll} [GeV}", "events", cut,mc,luminosity);
39 >  THStack mcm = allsamples.DrawStack("mc", "mll",1,0,10000000, "m_{ll} [GeV]", "events", cut,mc,luminosity);
40    int nhists = mcm.GetHists()->GetEntries();
41    cout << "Going to loop over " << nhists << " histograms " << endl;
42    TFile *test = new TFile("test.root","RECREATE");
# Line 50 | Line 50 | void print_yield(TCut cut) {
50    delete data;
51   }
52  
53 < void draw_kin_variable(string variable, TCut cut, int nbins, float min, float max, string xlabel, string saveas, bool dologscale) {
53 > void draw_kin_variable(string variable, TCut cut, int nbins, float min, float max, string xlabel, string saveas, bool dologscale, string speciallabel="") {
54    
55    TCanvas *ckin = new TCanvas("ckin","kin variable canvas");
56    ckin->SetLogy(dologscale);
57    TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
58    datahisto->SetMarkerSize(DataMarkerSize);
59    THStack mcstack = allsamples.DrawStack("mcstack",variable,nbins,min,max, xlabel, "events",cut,mc,luminosity);
60 <  datahisto->SetMaximum(5.3*datahisto->GetMaximum());
60 >  if(dologscale) datahisto->SetMaximum(3*datahisto->GetMaximum());
61 >  else datahisto->SetMaximum(1.5*datahisto->GetMaximum());
62 >  TText *speciall;
63 >  if(speciallabel!="") {
64 >    speciall = new TText(0.2,0.8,speciallabel.c_str());
65 >    speciall->Draw();
66 >  }
67    datahisto->Draw("e1");
68    ckin->Update();
69    mcstack.Draw("same");
# Line 84 | Line 90 | void draw_kin_variable(string variable,
90    
91    datahisto->Delete();
92    delete ckin;
87  
88  
89  
90  write_warning(__FUNCTION__,"Not implemented yet");
91  write_warning(__FUNCTION__,"Need to store overall data_over_mc");
93   }
94    
95   Value getfrom2Dmap(TH2F *map, int ixbin, int iybin) {
# Line 158 | Line 159 | void data_mc_agreement_2d() {
159      
160      stringstream saveas;
161      saveas << "Zplusb_data_over_mc___" << binningx[ix-1] << "to" << binningx[ix];
162 +    DrawPrelim();
163      CompleteSave(agrcan,saveas.str());
164   //    agrcan->SaveAs("tester.png");
165    }
# Line 169 | Line 171 | void data_mc_agreement_2d() {
171   void print_all_b_yields() {
172    cout << "Basic selection with a b jet" << endl;
173    print_yield(ZplusBsel&&"pfJetGoodNumBtag>0");
174 <  cout << "Leading jet is a b " << endl;
174 >  cout << "Leading jet is a b-jet " << endl;
175    print_yield(ZplusBsel&&LeadingB);
176    cout << "|#eta_{b}|<1.3 " << endl;
177    print_yield(ZplusBsel&&LeadingB&&EtaB);
178    cout << "|#delta#phi(b<Z)|>2.7" << endl;
179    print_yield(ZplusBsel&&LeadingB&&EtaB&&PhiZcut);
180 <  cout << "10<ptZ<100 GeV" << endl;
180 >  cout << "10<ptZ<1000 GeV" << endl;
181    print_yield(ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000");
182    cout << "#alpha < 0.3" << endl;
183    print_yield(ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.3");
# Line 199 | Line 201 | void draw_Zb_kin_vars() {
201  
202   void draw_mpf_vars() {
203    ZbData::data_over_mc.clear();
204 <  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.3",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p3",0);
205 <  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.2",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p2",0);
206 <  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.15",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p15",0);
207 <  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.1",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p1",0);
208 <  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.05",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p05",0);
209 <  
210 <  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.3",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p3",0);
211 <  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.2",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p2",0);
212 <  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.15",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p15",0);
213 <  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.1",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p1",0);
214 <  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.05",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz__mpf_alpha_smaller_0p05",0);
204 >  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.3",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p3",0,"#alpha<0.3, 10 GeV < p_{T}^{Z} < 1000 GeV");
205 >  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.2",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p2",0,"#alpha<0.2, 10 GeV < p_{T}^{Z} < 1000 GeV");
206 >  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.15",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p15",0,"#alpha<0.15, 10 GeV < p_{T}^{Z} < 1000 GeV");
207 >  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.1",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p1",0,"#alpha<0.1, 10 GeV < p_{T}^{Z} < 1000 GeV");
208 >  draw_kin_variable("mpf",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.05",20,0,2,"Z+b MPF","mpf_alpha_smaller_0p05",0,"#alpha<0.05, 10 GeV < p_{T}^{Z} < 1000 GeV");
209 >  
210 >  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.3",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p3",0,"#alpha<0.3, 10 GeV < p_{T}^{Z} < 1000 GeV");
211 >  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.2",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p2",0,"#alpha<0.2, 10 GeV < p_{T}^{Z} < 1000 GeV");
212 >  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.15",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p15",0,"#alpha<0.15, 10 GeV < p_{T}^{Z} < 1000 GeV");
213 >  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.1",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz___alpha_smaller_0p1",0,"#alpha<0.1, 10 GeV < p_{T}^{Z} < 1000 GeV");
214 >  draw_kin_variable("pfJetGoodPt[0]/pt",ZplusBsel&&LeadingB&&EtaB&&PhiZcut&&"pt>10&&pt<1000"&&"alpha<0.05",20,0,2,"p_{T} b-jet / p_{T} Z","ptb_over_ptz__mpf_alpha_smaller_0p05",0,"#alpha<0.05, 10 GeV < p_{T}^{Z} < 1000 GeV");
215   }  
216  
217 < void do_basic_ZB_analysis() {
217 > Value get_Zb_data_over_mc(string variable, TCut cut) {
218 > //  write_warning(__FUNCTION__,"Debugging this function, therefore always returning 3.1415+/-1.010101"); return Value(3.1415,1.010101);
219 >  TH1F *hdata  = allsamples.Draw("hdata",variable,1000,0,30, "#alpha [GeV]", "events", cut,data,luminosity);
220 >  TH1F *hmc    = allsamples.Draw("hmc" , variable,1000,0,30, "#alpha [GeV]", "events", cut,mc,  luminosity);
221 >  
222 >  float a=hdata->GetMean();
223 >  float b=hmc->GetMean();
224 >  float da=hdata->GetMeanError();
225 >  float db=hmc->GetMeanError();
226 >  float factor = a / b;
227 >  float error = TMath::Sqrt(  (1/(b*b)) * (da*da) + ((a*a)/(b*b))*db*db);
228 >  delete hdata;
229 >  delete hmc;
230 >  return Value(factor,error);
231 > }
232 >  
233 >  
234 >
235 > void new_data_mc_agreement_2d() {
236 >  gStyle->SetOptFit(0);
237 >  TCut basecut(ZplusBsel&&LeadingB&&EtaB&&PhiZcut);
238 >  
239 >  const int nalphacuts=5;
240 >  float alphacuts[nalphacuts] = {0.1,0.15,0.2,0.25,0.3};
241 >  const int nptcuts=5;
242 >  float ptcuts[nptcuts]={10,50,100,200,1000};
243 >  
244 >  float MPF_Results[nalphacuts][nptcuts];
245 >  float MPF_Errors[nalphacuts][nptcuts];
246 >  float RABS_Results[nalphacuts][nptcuts];
247 >  float RABS_Errors[nalphacuts][nptcuts];
248 >  
249 >  
250 >  for(int ia=0;ia<nalphacuts;ia++) {
251 >    for(int ipt=0;ipt<nptcuts-1;ipt++) {
252 >      stringstream specialcut;
253 >      specialcut << "((pt>" << ptcuts[ipt] << " && pt< " << ptcuts[ipt+1] << ") && (alpha<" << alphacuts[ia] << "))";
254 >      Value MPF_data_over_mc = get_Zb_data_over_mc("mpf",TCut(basecut && specialcut.str().c_str()));
255 >      Value RABS_data_over_mc = get_Zb_data_over_mc("pfJetGoodPt[0]/pt",TCut(basecut && specialcut.str().c_str()));
256 >      
257 >      MPF_Results[ia][ipt]=MPF_data_over_mc.getValue();
258 >      MPF_Errors[ia][ipt]=MPF_data_over_mc.getError();
259 >      
260 >      RABS_Results[ia][ipt]=RABS_data_over_mc.getValue();
261 >      RABS_Errors[ia][ipt]=RABS_data_over_mc.getError();
262 >      
263 >      cout << "alpha cut at " << alphacuts[ia] << " and pt range " << ptcuts[ipt] << " , " << ptcuts[ipt+1] << " \t : \t" << specialcut.str() << " \t \t --> " << MPF_data_over_mc << " (MPF) " << RABS_data_over_mc << " (RABS)" << endl;
264 >    }
265 >  }
266 >  
267 >  float MPF_ExtraPolatedResults[nptcuts];
268 >  float RABS_ExtraPolatedResults[nptcuts];
269 >  
270 >  TCanvas *can = new TCanvas("can");
271 >  
272 >  TGraphErrors *MPF_FinalGraph = new TGraphErrors();
273 >  TGraphErrors *RABS_FinalGraph = new TGraphErrors();
274 >  
275 >  for(int ipt=0;ipt<nptcuts-1;ipt++) {
276 >    
277 >    stringstream filename;
278 >    filename << "Extrapolation/Zplusb_data_over_mc___" << ptcuts[ipt] << "_to_" << ptcuts[ipt+1];
279 >    cout << "Going to create histo for " << filename.str() << endl;
280 >    TGraphErrors *mpf_gr =new TGraphErrors();
281 >    TGraphErrors *rabs_gr =new TGraphErrors();
282 >    for(int ia=0;ia<nalphacuts;ia++) {
283 >      mpf_gr->SetPoint(ia,alphacuts[ia],MPF_Results[ia][ipt]);
284 >      mpf_gr->SetPointError(ia,0,MPF_Errors[ia][ipt]);
285 >      rabs_gr->SetPoint(ia,alphacuts[ia],RABS_Results[ia][ipt]);
286 >      rabs_gr->SetPointError(ia,0,RABS_Errors[ia][ipt]);
287 >    }
288 >    
289 >    mpf_gr->SetMarkerStyle(21);
290 >    mpf_gr->SetMarkerColor(kBlue);
291 >    mpf_gr->Draw("AP");
292 >    mpf_gr->Fit("pol1","QE"); // quiet, use minos
293 >    mpf_gr->GetXaxis()->SetTitle("#alpha");
294 >    mpf_gr->GetXaxis()->CenterTitle();
295 >    mpf_gr->GetYaxis()->SetTitle("data/mc");
296 >    mpf_gr->GetYaxis()->CenterTitle();
297 >    TF1 *mpf_pol=(TF1*)mpf_gr->GetFunction("pol1");
298 >    float mpf_a=mpf_pol->GetParameter(0);
299 >    float mpf_b=mpf_pol->GetParameter(1);
300 >    MPF_FinalGraph->SetPoint(ipt,0.5*(ptcuts[ipt]+ptcuts[ipt+1]),mpf_a);
301 >    MPF_FinalGraph->SetPointError(ipt,0,mpf_pol->GetParError(0));
302 >    
303 >    MPF_ExtraPolatedResults[ipt]=mpf_a;
304 >    
305 >    stringstream mpf_info;
306 >    mpf_info <<  "#splitline{#splitline{#splitline{" << ptcuts[ipt] << " GeV < p_{T}^{Z} < " << ptcuts[ipt+1] << " GeV }{ (MPF) }}{Extrapolated value: " << std::setprecision(3) << mpf_a << "}}{#chi^{2}/NDF : " << mpf_pol->GetChisquare() << " / " << mpf_pol->GetNDF() << "}";
307 >    
308 >    TText *mpf_mark = write_title(mpf_info.str());
309 >    mpf_mark->SetX(0.75);
310 >    mpf_mark->SetTextSize(0.03);
311 >    mpf_mark->SetY(0.75);
312 >    mpf_mark->Draw();
313 >    
314 >    string filenamebkp=filename.str();
315 >    filename << "__MPF";
316 >    DrawPrelim();
317 >    CompleteSave(can,filename.str());
318 >    cout << "MPF : " << mpf_a << " + " << mpf_b << " * alpha " << endl;
319 >    
320 >    filename.str("");
321 >    
322 >    rabs_gr->SetMarkerStyle(21);
323 >    rabs_gr->SetMarkerColor(kBlue);
324 >    rabs_gr->Fit("pol1","QE"); // quiet, use minos
325 >    rabs_gr->Draw("AP");
326 >    rabs_gr->GetXaxis()->SetTitle("#alpha");
327 >    rabs_gr->GetXaxis()->CenterTitle();
328 >    rabs_gr->GetYaxis()->SetTitle("data/mc");
329 >    rabs_gr->GetYaxis()->CenterTitle();
330 >    
331 >    TF1 *rabs_pol=(TF1*)rabs_gr->GetFunction("pol1");
332 >    float rabs_a=rabs_pol->GetParameter(0);
333 >    float rabs_b=rabs_pol->GetParameter(1);
334 >    RABS_FinalGraph->SetPoint(ipt,0.5*(ptcuts[ipt]+ptcuts[ipt+1]),rabs_a);
335 >    RABS_FinalGraph->SetPointError(ipt,0,rabs_pol->GetParError(0));
336 >    
337 >    cout << "!+!+!+!+!+!+!+!+!+ Just added a point to the final plot : " << rabs_a << " +/- " << rabs_pol->GetParError(0) << endl;
338 >    
339 >    
340 >    stringstream rabs_info;
341 >    rabs_info << "#splitline{#splitline{#splitline{" << ptcuts[ipt] << " GeV < p_{T}^{Z} < " << ptcuts[ipt+1] << " GeV }{ (R_{abs}) }}{Extrapolated value: " << std::setprecision(3) << rabs_a << "}}{#chi^{2}/NDF : " << rabs_pol->GetChisquare() << " / " << rabs_pol->GetNDF() << "}";
342 >    TText *rabs_mark = write_title(rabs_info.str());
343 >    rabs_mark->SetX(0.75);
344 >    rabs_mark->SetTextSize(0.03);
345 >    rabs_mark->SetY(0.75);
346 >    rabs_mark->Draw();
347 >    
348 >    
349 >
350 >    RABS_ExtraPolatedResults[ipt]=rabs_a;
351 >    filename << filenamebkp << "__RABS";
352 >    DrawPrelim();
353 >    CompleteSave(can,filename.str());
354 >    cout << "RABS : " << rabs_a << " + " << rabs_b << " * alpha " << endl;
355 >  }
356 >  
357 >  MPF_FinalGraph->SetMarkerStyle(21);
358 >  MPF_FinalGraph->SetMarkerColor(kRed);
359 >  MPF_FinalGraph->Fit("pol0","QE"); // quiet, use minos
360 >  
361 >  TF1 *mpf_pol0=(TF1*)MPF_FinalGraph->GetFunction("pol0");
362 >  MPF_FinalGraph->Draw("AP");
363 >  MPF_FinalGraph->GetXaxis()->SetTitle("p_{T}^{Z}");
364 >  MPF_FinalGraph->GetXaxis()->CenterTitle();
365 >  MPF_FinalGraph->GetYaxis()->SetTitle("data/mc");
366 >  MPF_FinalGraph->GetYaxis()->CenterTitle();
367 >  MPF_FinalGraph->Draw("AP");
368 >  
369 >  stringstream mpf_result;
370 >  mpf_result << "#splitline{C_{abs}= " << std::setprecision(5) << 1/mpf_pol0->GetParameter(0) << " #pm " << std::setprecision(2) << mpf_pol0->GetParError(0)/(mpf_pol0->GetParameter(0)*mpf_pol0->GetParameter(0)) << "}{ (MPF)}";
371 >  TText *rmpf_final_mark = write_title(mpf_result.str());
372 >  rmpf_final_mark->SetX(0.75);
373 >  rmpf_final_mark->SetY(0.75);
374 >  rmpf_final_mark->SetTextSize(0.03);
375 >  rmpf_final_mark->Draw();
376 >  DrawPrelim();
377 >  
378 >  stringstream filename2;
379 >  filename2 << "Extrapolation/FINAL_RESULT_MPF";
380 >  CompleteSave(can,filename2.str());
381 >  
382 >  
383 >  RABS_FinalGraph->SetMarkerStyle(21);
384 >  RABS_FinalGraph->SetMarkerStyle(21);
385 >  RABS_FinalGraph->SetMarkerColor(kRed);
386 >  RABS_FinalGraph->Fit("pol0","QE"); // quiet, use minos
387 >  RABS_FinalGraph->Draw("AP");
388 >  RABS_FinalGraph->GetXaxis()->SetTitle("p_{T}^{Z}");
389 >  RABS_FinalGraph->GetXaxis()->CenterTitle();
390 >  RABS_FinalGraph->GetYaxis()->SetTitle("data/mc");
391 >  RABS_FinalGraph->GetYaxis()->CenterTitle();
392 >  RABS_FinalGraph->Draw("AP");
393 >  TF1 *rabs_pol0=(TF1*)RABS_FinalGraph->GetFunction("pol0");
394 >  stringstream rabs_result;
395 >  rabs_result << "#splitline{C_{abs}= " << std::setprecision(5) << 1/rabs_pol0->GetParameter(0) << " #pm " << std::setprecision(2) << rabs_pol0->GetParError(0)/(rabs_pol0->GetParameter(0)*rabs_pol0->GetParameter(0)) << "}{ (R_{abs})}";;
396 >  TText *rabs_final_mark = write_title(rabs_result.str());
397 >  rabs_final_mark->SetX(0.75);
398 >  rabs_final_mark->SetY(0.75);
399 >  rabs_final_mark->SetTextSize(0.03);
400 >  rabs_final_mark->Draw();
401 >  DrawPrelim();
402 >  
403 >  filename2.str("");
404 >  filename2 << "Extrapolation/FINAL_RESULT_RABS";
405 >  CompleteSave(can,filename2.str());
406 >  
407 >  
408 >  delete can;
409    
410    
411 + }
412 +
413 +
414 +
415 + void do_basic_ZB_analysis() {
416 +  TCanvas *zbcanvas = new TCanvas("zbcanvas","zbcanvas");
417 +  write_warning(__FUNCTION__,"TESTING NEW DATA MC AGREEMENT");
418 +  
419 +  /*
420 +  write_warning(__FUNCTION__,"Not doing b yields (already implemented)");
421 + //  print_all_b_yields();
422 +  write_warning(__FUNCTION__,"Not drawing mpf variables (already implemented)");
423 + //  draw_mpf_vars();
424 +  write_warning(__FUNCTION__,"Not drawing mpf variables (already implemented)");
425 +  draw_Zb_kin_vars();
426    
427    data_mc_agreement_2d();
428 +  */
429 +  new_data_mc_agreement_2d();
430    
431 <  write_warning(__FUNCTION__,"Replaced B jet dphi cut with jet dphi cut - need to put this back!");
431 >  delete zbcanvas;
432   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines