StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
readTextFile.cxx
1 #include "readTextFile.h"
2 
3 /*
4 const char* textfile="links/P00hk.nofield.refitOS.undoPTCME.slice/dip5.typec.slice.txt";
5 const char* outfile="links/P00hk.nofield.refitOS.undoPTCME.slice/dip5.typec.slice.new.root";
6 */
7 
8 const char* textfile="REAL/finish_central_cut1.hist.txt";
9 const char* outfile="REAL/finish_central_cut1_new.hist.root";
10 
11 int debug=0;
12 int main(int argc,char** argv)
13 {
14 
15  char* argvZ[] = {"-b"}; // batch mode, no gui
16  Int_t argcZ = 1;
17  TApplication r00t("r00t", &argcZ, argvZ);
18 
19  extern char* optarg;
20  const char* options = "i:o:";
21  Int_t chr, i=0,o=0;
22  char textFile[300],outFile[300];
23  while ((chr = getopt(argc, argv, options)) >= 0){
24  switch(chr){
25  case 'i': strcpy(textFile,optarg); i=1; break;
26  case 'o': strcpy(outFile,optarg); o=1; break;
27  }
28  }
29  if(!(i*o)){
30  cout << "-i infile -o outfile" << endl;
31  exit(-1);
32  }
33 
34  cout << "reading textFile=" << textFile << endl;
35  cout << "writing to " << outFile << endl;
36 
37  TFile outRoot(outFile,"RECREATE");
38  if(!outRoot.IsOpen()) {
39  cout << "Cannot open " << outFile << endl; return -1;
40  }
41  ifstream iss(textFile);
42  if(!iss) {
43  cout << "Cannot open " << textFile << endl;
44  return -1;
45  }
46  int count(0),limit(1000);
47  TString buffer; char name[100],title[100];
48  const int bufSz=100;
49  char* buf=new char[bufSz];
50  bool isarray=false,isnew=false;
51  //double array[300];
52  int nBin[3]={0},dim(0),iBin=0;
53  float min[3]={0},max[3]={0};
54  TH1* h=0;
55  while(!iss.eof()){
56 
57  iss.getline(buf,bufSz-1);
58 
59  // if(debug)cout << "the line is**" << buf << "**" << endl;
60 
61  if(strstr(buf,"name:")){
62  buffer=buf;
63  parse(buffer,"name:");
64  strcpy(name,buffer.Data());
65  isnew=true;
66  if(h){
67  iBin=0;
68  for(int i=0; i<3;i++){
69  nBin[i]=0; min[i]=0; max[i]=0;
70  }
71  int stat = h->Write();
72  if(!stat) {
73  cout << "could not write to " << outFile << endl;
74  }
75  delete h;
76  }
77  continue;
78  }
79  if(strstr(buf,"title:")){
80  buffer=buf;
81  parse(buffer,"title:");
82  strcpy(title,buffer.Data());
83  continue;
84  }
85  if(strstr(buf,"dim:")){
86  buffer=buf;
87  parse(buffer,"dim:");
88  dim=atoi(buffer);
89  continue;
90  }
91  if(strstr(buf,"ary:")){
92  buffer=buf;
93  parse(buffer,"ary:");
94  isarray=atoi(buffer);
95  continue;
96  }
97  if(strstr(buf,"bins:")){
98  buffer=buf;
99  parse(buffer,"bins:");
100  nBin[iBin++]=atoi(buffer.Data());
101  continue;
102  }
103 
104  if(strstr(buf,"min:")){
105  buffer=buf;
106  parse(buffer,"min:");
107  min[iBin-1]=atof(buffer.Data());
108  continue;
109  }
110  if(strstr(buf,"max:")){
111  buffer=buf;
112  parse(buffer,"max:");
113  max[iBin-1]=atof(buffer.Data());
114  continue;
115  }
116  if(strstr(buf,"bin")){
117  if(isnew){
118  isnew=false;
119  if(debug)
120  cout << "name=" <<name << " title=" << title
121  << " dim=" << dim << endl;
122  if(!isarray){
123  switch(dim){
124  case 1: h=new TH1D(name,title,nBin[0],min[0],max[0]); break;
125  case 2: h=new TH2D(name,title,
126  nBin[0],min[0],max[0],
127  nBin[1],min[1],max[1]); break;
128  case 3: h=new TH3D(name,title,
129  nBin[0],min[0],max[0],
130  nBin[1],min[1],max[1],
131  nBin[2],min[2],max[2]); break;
132  default: cout << "Wrong dim=" << dim << endl; exit(1);
133  }
134  for(int i=0; i<dim; i++){
135  cout << "nbin=" << nBin[i] << ",min="<<min[i] << ",max=" << max[i] << endl;
136  }
137  }
138  else{
139  cout << "Cannot handle array bins" << endl; exit(1);
140  }
141  }
142  //TString temp,temp2;
143 
144  buffer=buf;
145  buffer.ReplaceAll("bin=","");
146  strcpy(buf,buffer.Data());
147 
148  char* a = strtok(buf," ");
149  int bin=atoi(a);
150  a=strtok(NULL," ");
151  double value=atof(a);
152  a=strtok(NULL," ");
153  double error=atof(a);
154 
155 
156  if(debug)
157  cout << "bin=" << bin << " value=" << value
158  << " error=" << error<<endl;
159 
160 
161  if(!h){cout << "h not created?" << endl; return -1;}
162  h->SetBinContent(bin,value);
163  h->SetBinError(bin,error);
164 
165  }
166 
167  // if(debug && ++count>limit) break;
168 
169  } // while
170  // write the last histogram
171  h->Write();
172 
173  cout << "done" << endl;
174  outRoot.Close();
175 
176  return 0;
177 }
178 
179 void parse(TString& a,char* b){
180  a.ReplaceAll(b,""); a.ReplaceAll(" ","");
181 }
182 
183 
184 
185 TString split(TString& a){
186  TString temp=a.Data();
187  temp.Replace(temp.First(' '),temp.Length(),"");
188  a.Replace(0,a.First(' ')+1,"");
189  return temp;
190 }
191 
192 void removeLead(TString& a){
193  while(a.First(' ')==0){
194  a.Remove(0,1);
195  }
196 }
197 
198 void removeTrail(TString& a){
199  a.Remove(a.First(' '));
200 }