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

Comparing UserCode/cbrown/Development/Plotting/Modules/ShapeLimit.C (file contents):
Revision 1.4 by buchmann, Wed Apr 25 12:59:53 2012 UTC vs.
Revision 1.8 by buchmann, Mon Apr 30 08:37:01 2012 UTC

# Line 38 | Line 38 | const char* strip_flip_away(string flipp
38    return flipped_name.c_str();
39   }
40  
41 < void prepare_limit_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF, int flipped) {
42 < TH1F *dataob;
43 < if(flipped) dataob = (TH1F*)f->Get("flipped_data_obs");
44 < else dataob = (TH1F*)f->Get("data_obs");
45 < TH1F *signal;
46 <
47 < if(flipped) signal = (TH1F*)f->Get("flipped_signal");
48 < else signal = (TH1F*)f->Get("signal");
49 <
50 < TH1F *background1;
51 < if(flipped) background1 = (TH1F*)f->Get("flipped_TTbarBackground");
52 < else background1 = (TH1F*)f->Get("TTbarBackground");
53 <
54 < TH1F *background2;
55 < if(flipped) background2 = (TH1F*)f->Get("flipped_ZJetsBackground");
56 < else background2 = (TH1F*)f->Get("ZJetsBackground");
41 > void EliminateNegativeEntries(TH1F *histo) {
42 >  for(int i=1;i<=histo->GetNbinsX();i++) {
43 >    if(histo->GetBinContent(i)<0) histo->SetBinContent(i,0);
44 >  }
45 > }
46 >
47 > void prepare_limit_datacard(string RunDirectory, TFile *f, float uJSU, float uPDF) {
48 > TH1F *dataob = (TH1F*)f->Get("data_obs");
49 > TH1F *signal = (TH1F*)f->Get("signal");
50 > TH1F *Tbackground = (TH1F*)f->Get("TTbarBackground");
51 > TH1F *Zbackground  = (TH1F*)f->Get("ZJetsBackground");
52  
53   assert(dataob);
54   assert(signal);
55 < assert(background1);
56 < assert(background2);
55 > assert(Tbackground);
56 > assert(Zbackground);
57  
58   ofstream datacard;
59   write_warning(__FUNCTION__,"Need to rethink systematics we want to use !");
# Line 76 | Line 71 | void prepare_limit_datacard(string RunDi
71   datacard << "bin             1          1          1\n";
72   datacard << "process         signal     TTbarBackground     ZJetsBackground\n";
73   datacard << "process         0          1          2\n";
74 < datacard << "rate            "<<signal->Integral()<<"         "<<background1->Integral()<<"         "<<background2->Integral()<<"\n";
74 > datacard << "rate            "<<signal->Integral()<<"         "<<Tbackground->Integral()<<"         "<<Zbackground->Integral()<<"\n";
75   datacard << "--------------------------------\n";
76   datacard << "lumi     lnN    " << 1+ PlottingSetup::lumiuncert << "       -       -    luminosity uncertainty\n"; // only affects MC -> signal!
77   datacard << "Stat   shape    -          1          -    statistical uncertainty (ttbar)\n";
# Line 122 | Line 117 | TH1F* QuickDraw(TTree *events, string hn
117    return histo;
118   }
119  
125 /*void do_stat_up(TH1F *h, float sign=1.0) {
126  for(int i=1;i<=h->GetNbinsX();i++) {
127    h->SetBinContent(i,h->GetBinContent(i)+sign*h->GetBinError(i));
128  }
129  h->Write();
130 }
131
132 void do_stat_dn(TH1F *h) {
133  do_stat_up(h,-1.0);
134 }*/
120  
121   void SQRT(TH1F *h) {
122    for (int i=1;i<=h->GetNbinsX();i++) {
# Line 176 | Line 161 | void generate_shapes_for_systematic(bool
161    }
162      
163    if(signalonly) {
164 <    cout << "Processing a signal with mcjzb: " << mcjzb << " (identifier: " << identifier << ")" << endl;
164 >    dout << "Processing a signal with mcjzb: " << mcjzb << " (identifier: '" << identifier << "')" << endl;
165      TH1F *ZOSSFP = QuickDraw(signalevents,"ZOSSFP",mcjzb,binning,     "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
166      TH1F *ZOSOFP = QuickDraw(signalevents,"ZOSOFP",mcjzb,binning,     "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
167      TH1F *ZOSSFN = QuickDraw(signalevents,"ZOSSFN","-"+mcjzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,addcut,mc,luminosity,xsec);
# Line 208 | Line 193 | void generate_shapes_for_systematic(bool
193      Lobs->Add(ZOSSFP);
194      Lpred->Add(ZOSSFN);
195      
196 <    cout << "SITUATION FOR SIGNAL: " << endl;
197 <    cout << " OSSF     JZB> 0 : " << ZOSSFP->Integral() << "     JZB < 0 :" << ZOSSFN->Integral() << endl;
198 <    cout << " OSOF     JZB> 0 : " << ZOSOFP->Integral() << "     JZB < 0 :" << ZOSOFN->Integral() << endl;
196 >    dout << "SITUATION FOR SIGNAL: " << endl;
197 >    dout << " OSSF     JZB> 0 : " << ZOSSFP->Integral() << "     JZB < 0 :" << ZOSSFN->Integral() << endl;
198 >    dout << " OSOF     JZB> 0 : " << ZOSOFP->Integral() << "     JZB < 0 :" << ZOSOFN->Integral() << endl;
199      if(PlottingSetup::RestrictToMassPeak) {
200 <      cout << " OSSF SB  JZB> 0 : " << SBOSSFP->Integral() << "     JZB < 0 :" << SBOSSFN->Integral() << endl;
201 <      cout << " OSOF SB  JZB> 0 : " << SBOSOFP->Integral() << "     JZB < 0 :" << SBOSOFN->Integral() << endl;
200 >      dout << " OSSF SB  JZB> 0 : " << SBOSSFP->Integral() << "     JZB < 0 :" << SBOSSFN->Integral() << endl;
201 >      dout << " OSOF SB  JZB> 0 : " << SBOSOFP->Integral() << "     JZB < 0 :" << SBOSOFN->Integral() << endl;
202      }
203  
204      
# Line 267 | Line 252 | void generate_shapes_for_systematic(bool
252        
253        for(int i=1;i<=signalStatDn->GetNbinsX();i++) {
254          float staterr = TMath::Sqrt(Lpred->GetBinContent(i) + Lobs->GetBinContent(i));
255 <        cout << "Stat err in bin " << i << " : " << staterr << endl;
256 <        cout << "    prediction: " << Lpred->GetBinContent(i) << " , observation: " << Lobs->GetBinContent(i) << " --> signal: " << signal->GetBinContent(i) << endl;
257 <        cout << "    we obtain : " << signal->GetBinContent(i)-staterr << " , " << signal->GetBinContent(i)+staterr << endl;
258 <        signalStatDn->SetBinContent(i,signal->GetBinContent(i)-staterr);
255 >        dout << "Stat err in bin " << i << " : " << staterr << endl;
256 >        dout << "    prediction: " << Lpred->GetBinContent(i) << " , observation: " << Lobs->GetBinContent(i) << " --> signal: " << signal->GetBinContent(i) << endl;
257 >        dout << "    we obtain : " << signal->GetBinContent(i)-staterr << " , " << signal->GetBinContent(i)+staterr << endl;
258 >        if(signal->GetBinContent(i)-staterr>0) signalStatDn->SetBinContent(i,signal->GetBinContent(i)-staterr);
259 >        else signalStatDn->SetBinContent(i,0);
260          signalStatUp->SetBinContent(i,signal->GetBinContent(i)+staterr);
261          signal->SetBinError(i,staterr);
262        }
# Line 291 | Line 277 | void generate_shapes_for_systematic(bool
277        
278        for(int i=1;i<=flippedsignalStatDn->GetNbinsX();i++) {
279          float staterr = TMath::Sqrt(flippedLpred->GetBinContent(i) + flippedLobs->GetBinContent(i));
280 <        flippedsignalStatDn->SetBinContent(i,flippedsignal->GetBinContent(i)-staterr);
280 >        if(flippedsignal->GetBinContent(i)-staterr>0) flippedsignalStatDn->SetBinContent(i,flippedsignal->GetBinContent(i)-staterr);
281 >        else flippedsignalStatDn->SetBinContent(i,0);
282          flippedsignalStatUp->SetBinContent(i,flippedsignal->GetBinContent(i)+staterr);
283          flippedsignal->SetBinError(i,staterr);
284        }
# Line 323 | Line 310 | void generate_shapes_for_systematic(bool
310    
311      
312    if(dataonly) {
313 <    cout << "Processing data with datajzb: " << datajzb << endl;
313 >    dout << "Processing data with datajzb: " << datajzb << endl;
314      TH1F *ZOSSFP = allsamples.Draw("ZOSSFP",datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
315      TH1F *ZOSOFP = allsamples.Draw("ZOSOFP",datajzb,binning, "JZB", "events",cutmass&&cutOSOF&&limitnJetcut&&basiccut,data,luminosity);
316      TH1F *ZOSSFN = allsamples.Draw("ZOSSFN","-"+datajzb,binning, "JZB", "events",cutmass&&cutOSSF&&limitnJetcut&&basiccut,data,luminosity);
# Line 457 | Line 444 | void generate_shapes_for_systematic(bool
444        SQRT(predstaterr);
445        TH1F *bgStatUp = (TH1F*)pred->Clone("background_StatUp");
446        bgStatUp->Add(predstaterr);
447 +      EliminateNegativeEntries(bgStatUp);
448        bgStatUp->Write();
449        TH1F *bgStatDn = (TH1F*)pred->Clone("background_StatDown");
450        bgStatDn->Add(predstaterr,-1);
451 +      EliminateNegativeEntries(bgStatDn);
452        bgStatDn->Write();
453   //      delete bgStatDn;
454   //      delete bgStatUp;
# Line 476 | Line 465 | void generate_shapes_for_systematic(bool
465        SQRT(flippedpredstaterr);
466        TH1F *fbgStatUp = (TH1F*)flippedpred->Clone("flipped_background_StatUp");
467        fbgStatUp->Add(predstaterr);
468 +      EliminateNegativeEntries(fbgStatUp);
469        fbgStatUp->Write();
470        TH1F *fbgStatDn = (TH1F*)flippedpred->Clone("flipped_background_StatDown");
471        fbgStatDn->Add(predstaterr,-1);
472 +      EliminateNegativeEntries(fbgStatDn);
473        fbgStatDn->Write();
474   //      delete fbgStatDn;
475   //      delete fbgStatUp;
# Line 491 | Line 482 | void generate_shapes_for_systematic(bool
482        SQRT(Tpredstaterr);
483        TH1F *TpredStatUp = (TH1F*)Tpred->Clone("TTbarBackground_StatUp");
484        TpredStatUp->Add(Tpredstaterr);
485 +      EliminateNegativeEntries(TpredStatUp);
486        TpredStatUp->Write();
487        TH1F *TpredStatDn = (TH1F*)Tpred->Clone("TTbarBackground_StatDown");
488        TpredStatDn->Add(Tpredstaterr,-1);
489 +      EliminateNegativeEntries(TpredStatDn);
490        TpredStatDn->Write();
491   //      delete TpredStatDn;
492   //      delete TpredStatUp;
# Line 506 | Line 499 | void generate_shapes_for_systematic(bool
499        SQRT(fTpredstaterr);
500        TH1F *fTpredStatUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatUp");
501        fTpredStatUp->Add(fTpredstaterr);
502 +      EliminateNegativeEntries(fTpredStatUp);
503        fTpredStatUp->Write();
504        TH1F *fTpredStatDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_StatDown");
505        fTpredStatDn->Add(fTpredstaterr,-1);
506 +      EliminateNegativeEntries(fTpredStatDn);
507        fTpredStatDn->Write();
508   //      delete fTpredStatDn;
509   //      delete fTpredStatUp;
# Line 522 | Line 517 | void generate_shapes_for_systematic(bool
517        SQRT(Zpredstaterr);
518        TH1F *ZpredStatUp = (TH1F*)Zpred->Clone("ZJetsBackground_StatUp");
519        ZpredStatUp->Add(Zpredstaterr);
520 +      EliminateNegativeEntries(ZpredStatUp);
521        ZpredStatUp->Write();
522        TH1F *ZpredStatDn = (TH1F*)Zpred->Clone("ZJetsBackground_StatDown");
523        ZpredStatDn->Add(Zpredstaterr,-1);
524 +      EliminateNegativeEntries(ZpredStatDn);
525        ZpredStatDn->Write();
526   //      delete ZpredStatDn;
527   //      delete ZpredStatUp;
# Line 537 | Line 534 | void generate_shapes_for_systematic(bool
534        SQRT(fTpredstaterr);
535        TH1F *fZpredStatUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatUp");
536        fZpredStatUp->Add(fZpredstaterr);
537 +      EliminateNegativeEntries(fZpredStatUp);
538        fZpredStatUp->Write();
539        TH1F *fZpredStatDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_StatDown");
540        fZpredStatDn->Add(fZpredstaterr,-1);
541 +      EliminateNegativeEntries(fZpredStatDn);
542        fZpredStatDn->Write();
543   //      delete fZpredStatDn;
544   //      delete fZpredStatUp;
# Line 559 | Line 558 | void generate_shapes_for_systematic(bool
558        SQRT(predsyserr);
559        TH1F *bgSysUp = (TH1F*)pred->Clone("background_SysUp");
560        bgSysUp->Add(predsyserr);
561 +      EliminateNegativeEntries(bgSysUp);
562        bgSysUp->Write();
563        TH1F *bgSysDn = (TH1F*)pred->Clone("background_SysDown");
564        bgSysDn->Add(predsyserr,-1);
565 +      EliminateNegativeEntries(bgSysDn);
566        bgSysDn->Write();
567        delete predsyserr;
568        
# Line 577 | Line 578 | void generate_shapes_for_systematic(bool
578        SQRT(fpredsyserr);
579        TH1F *fbgSysUp = (TH1F*)flippedpred->Clone("flipped_background_SysUp");
580        fbgSysUp->Add(fpredsyserr);
581 +      EliminateNegativeEntries(fbgSysUp);
582        fbgSysUp->Write();
583        TH1F *fbgSysDn = (TH1F*)flippedpred->Clone("flipped_background_SysDown");
584        fbgSysDn->Add(fpredsyserr,-1);
585 +      EliminateNegativeEntries(fbgSysDn);
586        fbgSysDn->Write();
587        delete fpredsyserr;
588        
# Line 592 | Line 595 | void generate_shapes_for_systematic(bool
595        SQRT(Tpredsyserr);
596        TH1F *TpredSysUp = (TH1F*)Tpred->Clone("TTbarBackground_SysUp");
597        TpredSysUp->Add(Tpredsyserr);
598 +      EliminateNegativeEntries(TpredSysUp);
599        TpredSysUp->Write();
600        TH1F *TpredSysDn = (TH1F*)Tpred->Clone("TTbarBackground_SysDown");
601        TpredSysDn->Add(Tpredsyserr,-1);
602 +      EliminateNegativeEntries(TpredSysDn);
603        TpredSysDn->Write();
604        delete Tpredsyserr;
605        
# Line 606 | Line 611 | void generate_shapes_for_systematic(bool
611        SQRT(fTpredsyserr);
612        TH1F *fTpredSysUp = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysUp");
613        fTpredSysUp->Add(fTpredsyserr);
614 +      EliminateNegativeEntries(fTpredSysUp);
615        fTpredSysUp->Write();
616        TH1F *fTpredSysDn = (TH1F*)flippedTpred->Clone("flipped_TTbarBackground_SysDown");
617        fTpredSysDn->Add(fTpredsyserr,-1);
618 +      EliminateNegativeEntries(fTpredSysDn);
619        fTpredSysDn->Write();
620        delete fTpredsyserr;
621        
# Line 623 | Line 630 | void generate_shapes_for_systematic(bool
630        SQRT(Zpredsyserr);
631        TH1F *ZpredSysUp = (TH1F*)Zpred->Clone("ZJetsBackground_SysUp");
632        ZpredSysUp->Add(Zpredsyserr);
633 +      EliminateNegativeEntries(ZpredSysUp);
634        ZpredSysUp->Write();
635        TH1F *ZpredSysDn = (TH1F*)Zpred->Clone("ZJetsBackground_SysDown");
636        ZpredSysDn->Add(Zpredsyserr,-1);
637 +      EliminateNegativeEntries(ZpredSysDn);
638        ZpredSysDn->Write();
639        delete Zpredsyserr;
640        
# Line 638 | Line 647 | void generate_shapes_for_systematic(bool
647        SQRT(fZpredsyserr);
648        TH1F *fZpredSysUp = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysUp");
649        fZpredSysUp->Add(fZpredsyserr);
650 +      EliminateNegativeEntries(fZpredSysUp);
651        fZpredSysUp->Write();
652        TH1F *fZpredSysDn = (TH1F*)flippedZpred->Clone("flipped_ZJetsBackground_SysDown");
653        fZpredSysDn->Add(fZpredsyserr,-1);
654 +      EliminateNegativeEntries(fZpredSysDn);
655        fZpredSysDn->Write();
656        delete fZpredsyserr;
657      }
658      
659   /*if(identifier=="") {
660    for(int i=0;i<binning.size()-1;i++) {
661 <    cout << "[ " << binning[i] << " , " << binning[i+1] << "] : O " << obs->GetBinContent(i+1) << " P " << pred->GetBinContent(i+1) << " (Z: " << Zpred->GetBinContent(i+1) << " , T: " << Tpred->GetBinContent(i+1) << ")" << endl;
661 >    dout << "[ " << binning[i] << " , " << binning[i+1] << "] : O " << obs->GetBinContent(i+1) << " P " << pred->GetBinContent(i+1) << " (Z: " << Zpred->GetBinContent(i+1) << " , T: " << Tpred->GetBinContent(i+1) << ")" << endl;
662    }
663   }*/
664      delete ZOSSFP;
# Line 679 | Line 690 | ShapeDroplet LimitsFromShapes(bool asymp
690    
691    ensure_directory_exists(RunDirectory);
692    
693 <  TFile *datafile = new TFile("../StoredShapes.root","READ");
693 >  TFile *datafile = new TFile((PlottingSetup::cbafbasedir+"/DistributedModelCalculations/StoredShapes.root").c_str(),"READ");
694    if(datafile->IsZombie()) {
695      write_error(__FUNCTION__,"Fatal error: The stored shapes are not available!");
696      assert(!datafile->IsZombie());
697    }
698 <  cout << "Run Directory: " << RunDirectory << endl;
698 >  dout << "Run Directory: " << RunDirectory << endl;
699    TFile *limfile = new TFile((RunDirectory+"/PRElimitfile.root").c_str(),"RECREATE");
700    
701    TIter nextkey(datafile->GetListOfKeys());
# Line 717 | Line 728 | ShapeDroplet LimitsFromShapes(bool asymp
728    bool docomplicatedmSUGRAxsreweighting=false; //if you modify this value please also adapt it in Systematics.C not only here in ShapeLimit.C
729    
730    MCefficiency(events,mceff,mcefferr,flipped,mcjzb,requireZ,Neventsinfile,SUSYScanSpace::SUSYscantype,xsec,addcut,-1);
731 <  if(mceff<0) flipped=1;
731 >  if(mceff<0) {
732 >    flipped=1;
733 >    write_info(__FUNCTION__,"Doing flipping!");
734 >  }
735    doJZBscale(events,SUSYScanSpace::SUSYscantype==mSUGRA&&docomplicatedmSUGRAxsreweighting,xsec,scaledown,scaleup,scalesyst,JZBScaleUncert,informalname,flipped,requireZ,addcut);
736    float PDFuncert=0;
737    int NPdfs = get_npdfs(events);
# Line 763 | Line 777 | ShapeDroplet LimitsFromShapes(bool asymp
777        obj->Write();
778    }
779  
780 <  prepare_limit_datacard(RunDirectory,final_limfile,JZBscale,PDFuncert,flipped);
780 >  prepare_limit_datacard(RunDirectory,final_limfile,JZBscale,PDFuncert);
781    
782    final_limfile->Close();
783    limfile->Close();
# Line 776 | Line 790 | ShapeDroplet LimitsFromShapes(bool asymp
790    else command << "bash CreateModel.sh " << RunDirectory << " susydatacard.txt" << " 2 0 " << int(0.5 * firstGuess) << " " << int(2*firstGuess); // ASYMPTOTIC LIMITS
791    dout <<"Going to run : " << command.str() << endl;
792    int CreatedModelFileExitCode = gSystem->Exec(command.str().c_str());
793 <  cout << "exit code of limit algorithm (CreateModel.sh) : " << CreatedModelFileExitCode << endl;
794 <  assert(CreatedModelFileExitCode==0);
793 >  dout << "exit code of limit algorithm (CreateModel.sh) : " << CreatedModelFileExitCode << endl;
794 >  if(!(CreatedModelFileExitCode==0)) {
795 >    write_warning(__FUNCTION__,"Something bad happened. It looks like a shape analysis is not the way to go. ");
796 >    ShapeDroplet alpha;
797 >    alpha.observed=-12345; // this is the flag to say watch out something went wrong with the signal ...
798 >    alpha.SignalIntegral=1;
799 >    return alpha;
800 >  }
801    ShapeDroplet alpha;
802    alpha.readDroplet(RunDirectory+"/ShapeDropletResult.txt");
803    alpha.PDF=PDFuncert;
# Line 787 | Line 807 | ShapeDroplet LimitsFromShapes(bool asymp
807    dout << alpha << endl;
808  
809    dout << "Everything is saved in " << RunDirectory << endl;
810 <  dout << "Will transfer model and datacard over for possible post-processing" << endl;
811 <  dout << "   1) Make sure models directory exists ... " << std::flush;
810 >  dout << "Cleaning up ... " << std::flush;
811 > /*  dout << "   1) Make sure models directory exists ... " << std::flush;
812    gSystem->Exec("mkdir -p models/");
813    dout << " ok!" << endl;
814    dout << "   2) Deleting any previous model files with the same name ... " << std::flush;
# Line 810 | Line 830 | ShapeDroplet LimitsFromShapes(bool asymp
830    copycommand3 << "cp " << RunDirectory << "/limitfile.root models/model_" << name << "_histo.root";
831    gSystem->Exec(copycommand3.str().c_str());
832    dout << " ok!" << endl;
833 <  dout << "   4) Removing original working directory (" << RunDirectory << ") ... " << std::flush;
834 < write_warning(__FUNCTION__,"Watch out : need to uncomment the line below to remove the original working directory again");
815 < //  gSystem->Exec(("rm -r "+RunDirectory).c_str());
833 >  dout << "   4) Removing original working directory (" << RunDirectory << ") ... " << std::flush;*/
834 >  gSystem->Exec(("rm -r "+RunDirectory).c_str());
835    dout << " ok!" << endl;
836    delete limcan;
837    return alpha;
# Line 827 | Line 846 | void PrepareDataShapes(string datajzb, v
846    bool dataonly=true;
847    bool signalonly=false;
848    string mcjzb="JZBforMCinPrepareDataShapes";//this string is not used.
849 <  float jzbpeakerrormc=0;
849 > //  float jzbpeakerrormc=0;
850    generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"",mcjzb,datajzb,noJES,jzbbins,limcan,"",xsec);
851    // don't need these effects for obs & pred, only for signal!
852   //  generate_shapes_for_systematic(signalonly,dataonly,datafile,faketree,"peakUp",newjzbexpression(mcjzb,jzbpeakerrormc),newjzbexpression(datajzb,jzbpeakerrordata),noJES,jzbbins,limcan,"",xsec);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines