もしも、あなたがAWKの1行プログラムを使わずに、ROOTのマクロで同じことをしようと思えば、コードは以下のようになります。
% cat owondata.txt | awk 'NR>8 {print $1, $3}' >owondata_ch1.txt % cat owondata.txt | awk 'NR>8 {print $1, $4}' >owondata_ch2.txt
{ ifstream finput("owondata.txt"); // read the original file without using AWK one-liners Int_t nskip=8; std::string s; for(int i=0;i<nskip;i++) { // skip the first eight lines getline(finput, s); } const Int_t icount_max=8192; Int_t icount=0; Double_t dummy, data1[icount_max], data2[icount_max], data3[icount_max]; // save $1, $3, and $4 while(icount < icount_max) { finput >> data1[icount] >> dummy >> data2[icount] >> data3[icount]; if(finput.eof()) break; icount++; } TCanvas *c1 = new TCanvas("c1","Test",200,100,800,600); TGraph *g = new TGraph(icount, data1, data2); // ch1 data g->SetMarkerStyle( 20 ); g->SetMarkerSize( 0.5 ); g->Draw("AP"); TF1 *f1 = new TF1("f1", "[0]*sin([1]*x+[2])-[3]"); f1->SetParameter(0, 2000.0); f1->SetParameter(1, 0.022); f1->SetParameter(2, 0.0); f1->SetParameter(3, 0.0); f1->SetLineColor(kRed); g->Fit(f1); TGraph *h = new TGraph(icount, data1, data3); // ch2 data h->SetMarkerStyle( 24 ); h->SetMarkerSize( 0.5 ); h->Draw("P"); TF1 *f2 = new TF1("f2", "[0]*sin([1]*x+[2])-[3]"); f2->SetParameter(0, 2000.0); f2->SetParameter(1, 0.022); f2->SetParameter(2, 0.0); f2->SetParameter(3, 0.0); f2->SetLineColor(kYellow); h->Fit(f2); double amp, phase; amp = f2->GetParameter(0) / f1->GetParameter(0); phase = f2->GetParameter(2) - f1->GetParameter(2); std::cout << amp << ", " << phase << std::endl; TComplex v1, v2, v3, Z, z50; v1 = TComplex(1.0, 0.0); v2 = TComplex( amp*TMath::Cos(phase), amp*TMath::Sin(phase) ); v3 = 2.0*v1 - v2; z = v2/v3; z50 = 50.0*z; std::cout << v1 << ", " << v2 << ", " << v3 << ", " << z << ", " << z50 << std::endl; TComplex rho; double vswr; rho = (z-1.0)/(z+1.0); vswr = (1.0+TComplex::Abs(rho)) / (1.0-TComplex::Abs(rho)); std::cout << rho << ", " << vswr << std::endl; }
以下のようなコードは、icountをwhile loopの外で1だけ減らさない限り、うまく動作しないことに留意して下さい。
while(! finput.eof() ) } finput >> ... icount++; }