0

I am new to programming and ROOT (CERN), so go easy on me. Simply, I want to convert a ~900 MB (11M lines x 10 columns) .csv file into a nicely organized .root TTree. Could someone provide the best way to go about this?

Here is an example line of data with headers (it's 2010 US census block population and population density data):

"Census County Code","Census Tract Code","Census Block Code","County/State","Block Centroid Latitude (degrees)","Block Centroid W Longitude (degrees)","Block Land Area (sq mi)","Block Land Area (sq km)","Block Population","Block Population Density (people/sq km)"

1001,201,1000,Autauga AL,32.469683,-86.480959,0.186343,0.482626154,61,126.3918241

I've pasted the what I've wrote so far below.

I particularly can’t figure out this error when running: "C:41:1: error: unknown type name ‘UScsvToRoot’”.

This may be really really stupid, but how do you read in strings in ROOT (for reading in the County/State name)? Like what is the data type? Do I just have to use char’s? I’m blanking.

#include "Riostream.h"
#include "TString.h"
#include "TFile.h"
#include "TNtuple.h"
#include "TSystem.h"

void UScsvToRoot() {

   TString dir = gSystem->UnixPathName(__FILE__);
   dir.ReplaceAll("UScsvToRoot.C","");
   dir.ReplaceAll("/./","/");
   ifstream in;
   in.open(Form("%sUSPopDens.csv",dir.Data()));

   Int_t countyCode,tractCode,blockCode;
   // how to import County/State string?
   Float_t lat,long,areaMi,areaKm,pop,popDens;
   Int_t nlines = 0;
   TFile *f = new TFile("USPopDens.root","RECREATE");
   TNtuple *ntuple = new TNtuple("ntuple","data from csv file","countyCode:tractCode:blockCode:countyState:lat:long:areaMi:areaKm:pop:popDens");

   while (1) {
      in >> countyCode >> tractCode >> blockCode >> countyState >> lat >> long >> areaMi >> areaKm >> pop >> popDens;
      if (!in.good()) break;
      ntuple->Fill(countyCode,tractCode,blockCode,countyState,lat,long,areaMi,areaKm,pop,popDens);
      nlines++;
   }

   in.close();

   f->Write();
}`
4

3 に答える 3

3

わかりましたので、これを試してみますが、前もっていくつかコメントします。

root に関する質問については、 root のホームページにアクセスしてからフォーラムにアクセスすることを強く検討してください。stackoverflow は優れた情報源ですが、ルート フレームワークに関する特定の質問は、ルート ホームページに適しています。

root を初めて使用する場合は、チュートリアル ページを参照してください。root のさまざまな機能の使用方法に関する多くの例があります。

また、すべてのルート クラスに関するドキュメントがあるルート リファレンス ガイドも利用する必要があります。

コードに:使用しているクラスのドキュメントTNtupleを見ると、説明に次のように明確に記載されていることがわかります。

float 変数のリストのみに制限された単純なツリー。

そのため、文字列を に格納しようとしても機能しTNtupleません。そのためには、より一般的なクラスを使用する必要がありますTTree

ファイルを読み取ってツリーに情報を保存するには、次の 2 つのオプションがあります。ブランチを手動で定義してから、ファイルをループするときにツリーを埋めるかのいずれかです。

void UScsvToRoot() {
   TString dir = gSystem->UnixPathName(__FILE__);
   dir.ReplaceAll("UScsvToRoot.C","");
   dir.ReplaceAll("/./","/");
   ifstream in;
   in.open(Form("%sUSPopDens.csv",dir.Data()));

   Int_t countyCode,tractCode,blockCode;
   char countyState[1024];
   Float_t lat,lon,areaMi,areaKm,pop,popDens;
   Int_t nlines = 0;
   TFile *f = new TFile("USPopDens.root","RECREATE");
   TTree *tree = new TTree("ntuple","data from csv file");

   tree->Branch("countyCode",&countyCode,"countyCode/I");
   tree->Branch("tractCode",&tractCode,"tractCode/I");
   tree->Branch("blockCode",&blockCode,"blockCode/I");
   tree->Branch("countyState",countyState,"countyState/C");
   tree->Branch("lat",&lat,"lat/F");
   tree->Branch("long",&lon,"lon/F");
   tree->Branch("areaMi",&areaMi,"areaMi/F");
   tree->Branch("areaKm",&areaKm,"areaKm/F");
   tree->Branch("pop",&pop,"pop/F");
   tree->Branch("popDens",&popDens,"popDens/F");

   while (1) {
      in >> countyCode >> tractCode >> blockCode >> countyState >> lat >> lon >> areaMi >> areaKm >> pop >> popDens;
      if (!in.good()) break;
      tree->Fill();
      nlines++;
   }

   in.close();

   f->Write();
}

コマンドTTree::Branchは基本的にルートに伝えます

  • あなたの支店の名前
  • root が情報を読み取る変数のアドレス
  • 支店の形式

TBranch文字列情報を含む は、TTree のドキュメントC見ると、次のようなタイプです。

  • C : 0 文字で終了する文字列

注意: 文字配列に特定のサイズを指定しました。データに適したサイズを確認する必要があります。

使用できる他の可能性は、ifstream を廃止し、このように採用するのReadFileメソッドを単純に利用することです。TTree

#include "Riostream.h"
#include "TString.h"
#include "TFile.h"
#include "TTree.h"
#include "TSystem.h"

void UScsvToRoot() {

   TString dir = gSystem->UnixPathName(__FILE__);
   dir.ReplaceAll("UScsvToRoot.C","");
   dir.ReplaceAll("/./","/");

   TFile *f = new TFile("USPopDens.root","RECREATE");
   TTree *tree = new TTree("ntuple","data from csv file");
   tree->ReadFile("USPopDens.csv","countyCode/I:tractCode/I:blockCode/I:countyState/C:lat/F:lon/F:areaMi/F:areaKm/F:pop/F:popDens/F",',');
   f->Write();
}

詳細については、ルート ユーザー ガイドの TTress に関するセクションを参照してください。とりわけ、TTree:ReadFile を使用した例もあります。

これが役立つかどうか教えてください

于 2015-07-24T13:38:58.463 に答える