Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef tools_rroot_rall 4 #ifndef tools_rroot_rall 5 #define tools_rroot_rall 5 #define tools_rroot_rall 6 6 7 #include "streamers" 7 #include "streamers" 8 #include "fac" 8 #include "fac" 9 #include "tree" 9 #include "tree" 10 #include "../words" //for annotations. 10 #include "../words" //for annotations. 11 11 12 #define TOOLS_RROOT_NOT_OSC 12 #define TOOLS_RROOT_NOT_OSC 13 13 14 #ifndef TOOLS_RROOT_NOT_OSC 14 #ifndef TOOLS_RROOT_NOT_OSC 15 #include "osc" 15 #include "osc" 16 #endif 16 #endif 17 17 18 #include "THistogram" 18 #include "THistogram" 19 19 20 namespace tools { 20 namespace tools { 21 namespace rroot { 21 namespace rroot { 22 22 23 inline TDirectory* find_dir(directory& a_dir,c 23 inline TDirectory* find_dir(directory& a_dir,const std::string& a_name) { 24 std::ostream& out = a_dir.file().out(); 24 std::ostream& out = a_dir.file().out(); 25 key* k = a_dir.find_key(a_name); 25 key* k = a_dir.find_key(a_name); 26 if(!k) { 26 if(!k) { 27 //out << "tools::rroot::find_dir :" 27 //out << "tools::rroot::find_dir :" 28 // << " " << a_name << " not a key." 28 // << " " << a_name << " not a key." 29 // << std::endl; 29 // << std::endl; 30 return 0; 30 return 0; 31 } 31 } 32 32 33 if(k->object_class()!=TDirectory_cls()) { 33 if(k->object_class()!=TDirectory_cls()) { 34 out << "tools::rroot::find_dir :" 34 out << "tools::rroot::find_dir :" 35 << " key " << a_name << " not a TDirec 35 << " key " << a_name << " not a TDirectory." 36 << std::endl; 36 << std::endl; 37 return 0; 37 return 0; 38 } 38 } 39 uint32 sz; 39 uint32 sz; 40 char* buf = k->get_object_buffer(a_dir.file( 40 char* buf = k->get_object_buffer(a_dir.file(),sz); //we don't have ownership of buf. 41 if(!buf) { 41 if(!buf) { 42 out << "tools::rroot::find_dir :" 42 out << "tools::rroot::find_dir :" 43 << " can't get directory data buffer. 43 << " can't get directory data buffer." 44 << std::endl; 44 << std::endl; 45 return 0; 45 return 0; 46 } 46 } 47 buffer b(out,a_dir.file().byte_swap(),sz,buf 47 buffer b(out,a_dir.file().byte_swap(),sz,buf,k->key_length(),false); 48 TDirectory* tdir = new TDirectory(a_dir.file 48 TDirectory* tdir = new TDirectory(a_dir.file()); 49 if(!tdir) return 0; 49 if(!tdir) return 0; 50 if(!tdir->stream(b)) { 50 if(!tdir->stream(b)) { 51 out << "tools::rroot::find_dir :" 51 out << "tools::rroot::find_dir :" 52 << " can't stream TDirectory." 52 << " can't stream TDirectory." 53 << std::endl; 53 << std::endl; 54 delete tdir; 54 delete tdir; 55 return 0; 55 return 0; 56 } 56 } 57 return tdir; 57 return tdir; 58 } 58 } 59 59 60 inline directory* find_path_dir(directory& a_f 60 inline directory* find_path_dir(directory& a_from,const std::string& a_path) { 61 if(a_path.empty()) return 0; 61 if(a_path.empty()) return 0; 62 std::vector<std::string> ws; 62 std::vector<std::string> ws; 63 words(a_path,"/",false,ws); 63 words(a_path,"/",false,ws); 64 directory* cur_dir = &a_from; 64 directory* cur_dir = &a_from; 65 for(unsigned int index=0;index<ws.size();ind 65 for(unsigned int index=0;index<ws.size();index++) { 66 TDirectory* _dir = find_dir(*cur_dir,ws[in 66 TDirectory* _dir = find_dir(*cur_dir,ws[index]); 67 if(!_dir) return 0; 67 if(!_dir) return 0; 68 if(index==(ws.size()-1)) return _dir; 68 if(index==(ws.size()-1)) return _dir; 69 if(index) delete cur_dir; 69 if(index) delete cur_dir; 70 cur_dir = _dir; 70 cur_dir = _dir; 71 } 71 } 72 return 0; 72 return 0; 73 } 73 } 74 74 75 inline bool read_key(std::ostream& a_out,ifile 75 inline bool read_key(std::ostream& a_out,ifile& a_file,key& a_key,bool a_dump){ 76 unsigned int sz; 76 unsigned int sz; 77 char* buf = a_key.get_object_buffer(a_file,s 77 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 78 if(!buf) { 78 if(!buf) { 79 a_out << "tools::rroot::read_key : can't g 79 a_out << "tools::rroot::read_key : can't get data buffer of " << a_key.object_name() << "." << std::endl; 80 return false; 80 return false; 81 } 81 } 82 82 83 //a_out << "tools::rroot::read_key :" 83 //a_out << "tools::rroot::read_key :" 84 // << " get data buffer size " << sz << 84 // << " get data buffer size " << sz << "." 85 // << std::endl; 85 // << std::endl; 86 86 87 buffer b(a_out,a_file.byte_swap(),sz,buf,a_k 87 buffer b(a_out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 88 88 89 if(a_key.object_class()==TNamed_cls()) { 89 if(a_key.object_class()==TNamed_cls()) { 90 std::string name,title; 90 std::string name,title; 91 if(!Named_stream(b,name,title)) { 91 if(!Named_stream(b,name,title)) { 92 a_out << "tools::rroot::read_key : TName 92 a_out << "tools::rroot::read_key : TNamed streaming failed" << std::endl; 93 } else { 93 } else { 94 if(a_dump) { 94 if(a_dump) { 95 a_out << "Named : name = " << sout(nam 95 a_out << "Named : name = " << sout(name) << ", title = " << sout(title) << std::endl; 96 } 96 } 97 } 97 } 98 98 99 } else if(a_key.object_class()==TH1F_cls()) 99 } else if(a_key.object_class()==TH1F_cls()) { 100 histo::h1d* h = TH1F_stream(b); 100 histo::h1d* h = TH1F_stream(b); 101 if(!h) { 101 if(!h) { 102 a_out << "tools::rroot::read_key : TH1F 102 a_out << "tools::rroot::read_key : TH1F streaming failed" << std::endl; 103 } else { 103 } else { 104 if(a_dump) h->hprint(a_out); 104 if(a_dump) h->hprint(a_out); 105 } 105 } 106 delete h; 106 delete h; 107 107 108 } else if(a_key.object_class()==TH1D_cls()) 108 } else if(a_key.object_class()==TH1D_cls()) { 109 histo::h1d* h = TH1D_stream(b); 109 histo::h1d* h = TH1D_stream(b); 110 if(!h) { 110 if(!h) { 111 a_out << "tools::rroot::read_key :" 111 a_out << "tools::rroot::read_key :" 112 << " TH1D streaming failed" 112 << " TH1D streaming failed" 113 << std::endl; 113 << std::endl; 114 } else { 114 } else { 115 if(a_dump) h->hprint(a_out); 115 if(a_dump) h->hprint(a_out); 116 } 116 } 117 delete h; 117 delete h; 118 118 119 } else if(a_key.object_class()==TH2F_cls()) 119 } else if(a_key.object_class()==TH2F_cls()) { 120 histo::h2d* h = TH2F_stream(b); 120 histo::h2d* h = TH2F_stream(b); 121 if(!h) { 121 if(!h) { 122 a_out << "tools::rroot::read_key :" 122 a_out << "tools::rroot::read_key :" 123 << " TH2F streaming failed" 123 << " TH2F streaming failed" 124 << std::endl; 124 << std::endl; 125 } else { 125 } else { 126 if(a_dump) h->hprint(a_out); 126 if(a_dump) h->hprint(a_out); 127 } 127 } 128 delete h; 128 delete h; 129 129 130 } else if(a_key.object_class()==TH2D_cls()) 130 } else if(a_key.object_class()==TH2D_cls()) { 131 histo::h2d* h = TH2D_stream(b); //we get o 131 histo::h2d* h = TH2D_stream(b); //we get ownership of h. 132 if(!h) { 132 if(!h) { 133 a_out << "tools::rroot::read_key :" 133 a_out << "tools::rroot::read_key :" 134 << " TH2D streaming failed" 134 << " TH2D streaming failed" 135 << std::endl; 135 << std::endl; 136 } else { 136 } else { 137 if(a_dump) h->hprint(a_out); 137 if(a_dump) h->hprint(a_out); 138 } 138 } 139 delete h; 139 delete h; 140 140 141 } else if(a_key.object_class()==TH3D_cls()) 141 } else if(a_key.object_class()==TH3D_cls()) { 142 histo::h3d* h = TH3D_stream(b); //we get o 142 histo::h3d* h = TH3D_stream(b); //we get ownership of h. 143 if(!h) { 143 if(!h) { 144 a_out << "tools::rroot::read_key :" 144 a_out << "tools::rroot::read_key :" 145 << " TH3D streaming failed" 145 << " TH3D streaming failed" 146 << std::endl; 146 << std::endl; 147 } else { 147 } else { 148 if(a_dump) h->hprint(a_out); 148 if(a_dump) h->hprint(a_out); 149 } 149 } 150 delete h; 150 delete h; 151 151 152 } else if(a_key.object_class()==TProfile_cls 152 } else if(a_key.object_class()==TProfile_cls()) { 153 histo::p1d* p = TProfile_stream(b); 153 histo::p1d* p = TProfile_stream(b); 154 if(!p) { 154 if(!p) { 155 a_out << "tools::rroot::read_key :" 155 a_out << "tools::rroot::read_key :" 156 << " TProfile streaming failed" 156 << " TProfile streaming failed" 157 << std::endl; 157 << std::endl; 158 } else { 158 } else { 159 if(a_dump) p->hprint(a_out); 159 if(a_dump) p->hprint(a_out); 160 } 160 } 161 delete p; 161 delete p; 162 162 163 } else if(a_key.object_class()==TProfile2D_c 163 } else if(a_key.object_class()==TProfile2D_cls()) { 164 histo::p2d* p = TProfile2D_stream(b); 164 histo::p2d* p = TProfile2D_stream(b); 165 if(!p) { 165 if(!p) { 166 a_out << "tools::rroot::read_key :" 166 a_out << "tools::rroot::read_key :" 167 << " TProfile2D streaming failed" 167 << " TProfile2D streaming failed" 168 << std::endl; 168 << std::endl; 169 } else { 169 } else { 170 if(a_dump) p->hprint(a_out); 170 if(a_dump) p->hprint(a_out); 171 } 171 } 172 delete p; 172 delete p; 173 173 174 } else if(a_key.object_class()==TTree_cls()) 174 } else if(a_key.object_class()==TTree_cls()) { 175 b.set_map_objs(true); //for "root_ls -ls" 175 b.set_map_objs(true); //for "root_ls -ls" on esb evetest.root files. 176 fac _fac(a_out); 176 fac _fac(a_out); 177 tree tree(a_file,_fac); 177 tree tree(a_file,_fac); 178 if(!tree.stream(b)) { 178 if(!tree.stream(b)) { 179 a_out << "tools::rroot::read_key :" 179 a_out << "tools::rroot::read_key :" 180 << " TTree streaming failed" 180 << " TTree streaming failed" 181 << std::endl; 181 << std::endl; 182 } else { 182 } else { 183 //tree->dump(a_out); 183 //tree->dump(a_out); 184 if(a_dump) { 184 if(a_dump) { 185 tree.dump(a_out,""," "); 185 tree.dump(a_out,""," "); 186 186 187 uint64 entries = tree.entries(); 187 uint64 entries = tree.entries(); 188 188 189 /* 189 /* 190 {for(uint32 j=0;j<10;j++){ //to test me 190 {for(uint32 j=0;j<10;j++){ //to test memory. 191 for(uint32 i=0;i<entries;i++){ 191 for(uint32 i=0;i<entries;i++){ 192 uint32 n; 192 uint32 n; 193 if(!tree.find_entry(i,n)) { 193 if(!tree.find_entry(i,n)) { 194 a_out << " can't find entry " << i 194 a_out << " can't find entry " << i 195 << std::endl; 195 << std::endl; 196 } 196 } 197 } 197 } 198 }} 198 }} 199 */ 199 */ 200 200 201 {for(uint32 i=0;i<5;i++){ 201 {for(uint32 i=0;i<5;i++){ 202 if(!tree.show(a_out,i)) { 202 if(!tree.show(a_out,i)) { 203 a_out << " show failed for entry " 203 a_out << " show failed for entry " << i 204 << std::endl; 204 << std::endl; 205 } 205 } 206 }} 206 }} 207 {for(uint64 i=mx<int64>(5,entries-5);i< 207 {for(uint64 i=mx<int64>(5,entries-5);i<entries;i++){ 208 if(!tree.show(a_out,(uint32)i)) { 208 if(!tree.show(a_out,(uint32)i)) { 209 a_out << " show failed for entry " 209 a_out << " show failed for entry " << i 210 << std::endl; 210 << std::endl; 211 } 211 } 212 }} 212 }} 213 213 214 } 214 } 215 } 215 } 216 216 217 #ifndef TOOLS_RROOT_NOT_OSC 217 #ifndef TOOLS_RROOT_NOT_OSC 218 } else if(a_key.object_class()==osc::s_h1d() 218 } else if(a_key.object_class()==osc::s_h1d()) { 219 219 220 histo::h1d h("",10,0,1); 220 histo::h1d h("",10,0,1); 221 if(!from_osc(b,osc::s_h1d(),h)) { 221 if(!from_osc(b,osc::s_h1d(),h)) { 222 a_out << "tools::rroot::read_key :" 222 a_out << "tools::rroot::read_key :" 223 << " " << osc::s_h1d() << " stream 223 << " " << osc::s_h1d() << " streaming failed" 224 << std::endl; 224 << std::endl; 225 } else { 225 } else { 226 if(a_dump) h.hprint(a_out); 226 if(a_dump) h.hprint(a_out); 227 } 227 } 228 228 229 } else if(a_key.object_class()==osc::s_h2d() 229 } else if(a_key.object_class()==osc::s_h2d()) { 230 230 231 histo::h2d h("",10,0,1,10,0,1); 231 histo::h2d h("",10,0,1,10,0,1); 232 if(!from_osc(b,osc::s_h2d(),h)) { 232 if(!from_osc(b,osc::s_h2d(),h)) { 233 a_out << "tools::rroot::read_key :" 233 a_out << "tools::rroot::read_key :" 234 << " " << osc::s_h2d() << " stream 234 << " " << osc::s_h2d() << " streaming failed" 235 << std::endl; 235 << std::endl; 236 } else { 236 } else { 237 if(a_dump) h.hprint(a_out); 237 if(a_dump) h.hprint(a_out); 238 } 238 } 239 239 240 } else if(a_key.object_class()==osc::s_h3d() 240 } else if(a_key.object_class()==osc::s_h3d()) { 241 241 242 histo::h3d h("",10,0,1,10,0,1,10,0,1); 242 histo::h3d h("",10,0,1,10,0,1,10,0,1); 243 if(!from_osc(b,osc::s_h3d(),h)) { 243 if(!from_osc(b,osc::s_h3d(),h)) { 244 a_out << "tools::rroot::read_key :" 244 a_out << "tools::rroot::read_key :" 245 << " " << osc::s_h3d() << " stream 245 << " " << osc::s_h3d() << " streaming failed" 246 << std::endl; 246 << std::endl; 247 } else { 247 } else { 248 if(a_dump) h.hprint(a_out); 248 if(a_dump) h.hprint(a_out); 249 } 249 } 250 250 251 } else if(a_key.object_class()==osc::s_p1d() 251 } else if(a_key.object_class()==osc::s_p1d()) { 252 252 253 histo::p1d h("",10,0,1); 253 histo::p1d h("",10,0,1); 254 if(!from_osc(b,osc::s_p1d(),h)) { 254 if(!from_osc(b,osc::s_p1d(),h)) { 255 a_out << "tools::rroot::read_key :" 255 a_out << "tools::rroot::read_key :" 256 << " " << osc::s_p1d() << " stream 256 << " " << osc::s_p1d() << " streaming failed" 257 << std::endl; 257 << std::endl; 258 } else { 258 } else { 259 if(a_dump) h.hprint(a_out); 259 if(a_dump) h.hprint(a_out); 260 } 260 } 261 261 262 } else if(a_key.object_class()==osc::s_p2d() 262 } else if(a_key.object_class()==osc::s_p2d()) { 263 263 264 histo::p2d h("",10,0,1,10,0,1); 264 histo::p2d h("",10,0,1,10,0,1); 265 if(!from_osc(b,osc::s_p2d(),h)) { 265 if(!from_osc(b,osc::s_p2d(),h)) { 266 a_out << "tools::rroot::read_key :" 266 a_out << "tools::rroot::read_key :" 267 << " " << osc::s_p2d() << " stream 267 << " " << osc::s_p2d() << " streaming failed" 268 << std::endl; 268 << std::endl; 269 } else { 269 } else { 270 if(a_dump) h.hprint(a_out); 270 if(a_dump) h.hprint(a_out); 271 } 271 } 272 #endif 272 #endif 273 273 274 } else if(a_key.object_class()==THistogram_c 274 } else if(a_key.object_class()==THistogram_cls()) { //produced with osc/AIDA through BatchLab/Rio/THistogram. 275 275 276 pd_data_t data; 276 pd_data_t data; 277 annotations_t annotations; 277 annotations_t annotations; 278 if(!read_THistogram(b,data,annotations)) { 278 if(!read_THistogram(b,data,annotations)) { 279 a_out << "tools::rroot::read_key : read_ 279 a_out << "tools::rroot::read_key : read_THistogram() failed." << std::endl; 280 } else { 280 } else { 281 if(histo::h1d* _h1d = THistogram_to_h1d( 281 if(histo::h1d* _h1d = THistogram_to_h1d(data)) { 282 if(a_dump) _h1d->hprint(a_out); 282 if(a_dump) _h1d->hprint(a_out); 283 delete _h1d; 283 delete _h1d; 284 } else if(histo::h2d* _h2d = THistogram_ 284 } else if(histo::h2d* _h2d = THistogram_to_h2d(data)) { 285 if(a_dump) _h2d->hprint(a_out); 285 if(a_dump) _h2d->hprint(a_out); 286 delete _h2d; 286 delete _h2d; 287 } else if(histo::p1d* _p1d = THistogram_ 287 } else if(histo::p1d* _p1d = THistogram_to_p1d(data)) { 288 if(a_dump) _p1d->hprint(a_out); 288 if(a_dump) _p1d->hprint(a_out); 289 delete _p1d; 289 delete _p1d; 290 } else if(histo::p2d* _p2d = THistogram_ 290 } else if(histo::p2d* _p2d = THistogram_to_p2d(data)) { 291 if(a_dump) _p2d->hprint(a_out); 291 if(a_dump) _p2d->hprint(a_out); 292 delete _p2d; 292 delete _p2d; 293 } else { 293 } else { 294 a_out << "tools::rroot::read_key : can 294 a_out << "tools::rroot::read_key : can't convert THistogram dat to h1d,h2d,p1d or p2d." << std::endl; 295 } 295 } 296 } 296 } 297 297 298 } else if(a_key.object_class()==TDirectory_c 298 } else if(a_key.object_class()==TDirectory_cls()) { 299 299 300 //we should not pass here. 300 //we should not pass here. 301 301 302 } else { 302 } else { 303 a_out << "tools::rroot::read_key :" 303 a_out << "tools::rroot::read_key :" 304 << " dont't know how to read key wit 304 << " dont't know how to read key with object class " 305 << sout(a_key.object_class()) 305 << sout(a_key.object_class()) 306 << std::endl; 306 << std::endl; 307 } 307 } 308 return true; 308 return true; 309 } 309 } 310 310 311 //typedef std::map<std::string,std::string> an 311 //typedef std::map<std::string,std::string> annotations_t; 312 inline bool key_to_annotations(ifile& a_file,k 312 inline bool key_to_annotations(ifile& a_file,key& a_key,std::map<std::string,std::string>& a_annotations,bool a_warn = true) { 313 a_annotations.clear(); 313 a_annotations.clear(); 314 std::ostream& out = a_key.out(); 314 std::ostream& out = a_key.out(); 315 if(a_key.object_class()!=TNamed_cls()) { 315 if(a_key.object_class()!=TNamed_cls()) { 316 if(a_warn) out << "tools::rroot::key_to_an 316 if(a_warn) out << "tools::rroot::key_to_annotations : key not a TNamed." << std::endl; 317 return false; 317 return false; 318 } 318 } 319 unsigned int sz; 319 unsigned int sz; 320 char* buf = a_key.get_object_buffer(a_file,s 320 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 321 if(!buf) { 321 if(!buf) { 322 out << "tools::rroot::key_to_annotations : 322 out << "tools::rroot::key_to_annotations : can't get data buffer of " << a_key.object_name() << "." << std::endl; 323 return false; 323 return false; 324 } 324 } 325 buffer b(out,a_file.byte_swap(),sz,buf,a_key 325 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 326 std::string histo_name; 326 std::string histo_name; 327 std::string sas; 327 std::string sas; 328 if(!Named_stream(b,histo_name,sas)) return f 328 if(!Named_stream(b,histo_name,sas)) return false; 329 std::vector<std::string> ws; 329 std::vector<std::string> ws; 330 words(sas,"\n",true,ws); 330 words(sas,"\n",true,ws); 331 size_t wordn = ws.size(); 331 size_t wordn = ws.size(); 332 if(2*(wordn/2)!=wordn) { 332 if(2*(wordn/2)!=wordn) { 333 out << "tools::rroot::key_to_annotations : 333 out << "tools::rroot::key_to_annotations : wordn should be even in " << sout(sas) << "." << std::endl; 334 return false; 334 return false; 335 } 335 } 336 std::vector<std::string>::const_iterator it; 336 std::vector<std::string>::const_iterator it; 337 for(it=ws.begin();it!=ws.end();) { 337 for(it=ws.begin();it!=ws.end();) { 338 const std::string& key = *it;it++; 338 const std::string& key = *it;it++; 339 const std::string& value = *it;it++; 339 const std::string& value = *it;it++; 340 a_annotations[key] = value; 340 a_annotations[key] = value; 341 } 341 } 342 return true; 342 return true; 343 } 343 } 344 344 345 inline histo::h1d* key_to_h1d(ifile& a_file,ke 345 inline histo::h1d* key_to_h1d(ifile& a_file,key& a_key,bool a_warn = true) { 346 std::ostream& out = a_key.out(); 346 std::ostream& out = a_key.out(); 347 if( (a_key.object_class()!=TH1D_cls()) && (a 347 if( (a_key.object_class()!=TH1D_cls()) && (a_key.object_class()!=TH1F_cls()) ) { 348 if(a_warn) out << "tools::rroot::key_to_h1 348 if(a_warn) out << "tools::rroot::key_to_h1d : key not a TH1D and not a TH1F." << std::endl; 349 return 0; 349 return 0; 350 } 350 } 351 unsigned int sz; 351 unsigned int sz; 352 char* buf = a_key.get_object_buffer(a_file,s 352 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 353 if(!buf) { 353 if(!buf) { 354 out << "tools::rroot::key_to_h1d : can't g 354 out << "tools::rroot::key_to_h1d : can't get data buffer of " << a_key.object_name() << "." << std::endl; 355 return 0; 355 return 0; 356 } 356 } 357 buffer b(out,a_file.byte_swap(),sz,buf,a_key 357 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 358 if(a_key.object_class()==TH1D_cls()) { 358 if(a_key.object_class()==TH1D_cls()) { 359 return TH1D_stream(b); 359 return TH1D_stream(b); 360 } else { 360 } else { 361 return TH1F_stream(b); 361 return TH1F_stream(b); 362 } 362 } 363 } 363 } 364 364 365 inline histo::h2d* key_to_h2d(ifile& a_file,ke 365 inline histo::h2d* key_to_h2d(ifile& a_file,key& a_key,bool a_warn = true){ 366 std::ostream& out = a_key.out(); 366 std::ostream& out = a_key.out(); 367 if( (a_key.object_class()!=TH2D_cls()) && (a 367 if( (a_key.object_class()!=TH2D_cls()) && (a_key.object_class()!=TH2F_cls()) ) { 368 if(a_warn) out << "tools::rroot::key_to_h2 368 if(a_warn) out << "tools::rroot::key_to_h2d : key not a TH2D and not a TH2F." << std::endl; 369 return 0; 369 return 0; 370 } 370 } 371 unsigned int sz; 371 unsigned int sz; 372 char* buf = a_key.get_object_buffer(a_file,s 372 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 373 if(!buf) { 373 if(!buf) { 374 out << "tools::rroot::key_to_h2d : can't g 374 out << "tools::rroot::key_to_h2d : can't get data buffer of " << a_key.object_name() << "." << std::endl; 375 return 0; 375 return 0; 376 } 376 } 377 buffer b(out,a_file.byte_swap(),sz,buf,a_key 377 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 378 if(a_key.object_class()==TH2D_cls()) { 378 if(a_key.object_class()==TH2D_cls()) { 379 return TH2D_stream(b); 379 return TH2D_stream(b); 380 } else { 380 } else { 381 return TH2F_stream(b); 381 return TH2F_stream(b); 382 } 382 } 383 } 383 } 384 384 385 inline histo::h3d* key_to_h3d(ifile& a_file,ke 385 inline histo::h3d* key_to_h3d(ifile& a_file,key& a_key){ 386 std::ostream& out = a_key.out(); 386 std::ostream& out = a_key.out(); 387 if(a_key.object_class()!=TH3D_cls()) { 387 if(a_key.object_class()!=TH3D_cls()) { 388 out << "tools::rroot::key_to_h3d :" 388 out << "tools::rroot::key_to_h3d :" 389 << " key not a TH3D." 389 << " key not a TH3D." 390 << std::endl; 390 << std::endl; 391 return 0; 391 return 0; 392 } 392 } 393 unsigned int sz; 393 unsigned int sz; 394 char* buf = a_key.get_object_buffer(a_file,s 394 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 395 if(!buf) { 395 if(!buf) { 396 out << "tools::rroot::key_to_h3d :" 396 out << "tools::rroot::key_to_h3d :" 397 << " can't get data buffer of " << a_k 397 << " can't get data buffer of " << a_key.object_name() << "." 398 << std::endl; 398 << std::endl; 399 return 0; 399 return 0; 400 } 400 } 401 buffer b(out,a_file.byte_swap(),sz,buf,a_key 401 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 402 return TH3D_stream(b); 402 return TH3D_stream(b); 403 } 403 } 404 404 405 inline histo::p1d* key_to_p1d(ifile& a_file,ke 405 inline histo::p1d* key_to_p1d(ifile& a_file,key& a_key){ 406 std::ostream& out = a_key.out(); 406 std::ostream& out = a_key.out(); 407 if(a_key.object_class()!=TProfile_cls()) { 407 if(a_key.object_class()!=TProfile_cls()) { 408 out << "tools::rroot::key_to_p1d :" 408 out << "tools::rroot::key_to_p1d :" 409 << " key not a TProfile." 409 << " key not a TProfile." 410 << std::endl; 410 << std::endl; 411 return 0; 411 return 0; 412 } 412 } 413 unsigned int sz; 413 unsigned int sz; 414 char* buf = a_key.get_object_buffer(a_file,s 414 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 415 if(!buf) { 415 if(!buf) { 416 out << "tools::rroot::key_to_p1d :" 416 out << "tools::rroot::key_to_p1d :" 417 << " can't get data buffer of " << a_k 417 << " can't get data buffer of " << a_key.object_name() << "." 418 << std::endl; 418 << std::endl; 419 return 0; 419 return 0; 420 } 420 } 421 buffer b(out,a_file.byte_swap(),sz,buf,a_key 421 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 422 return TProfile_stream(b); 422 return TProfile_stream(b); 423 } 423 } 424 424 425 inline histo::p2d* key_to_p2d(ifile& a_file,ke 425 inline histo::p2d* key_to_p2d(ifile& a_file,key& a_key){ 426 std::ostream& out = a_key.out(); 426 std::ostream& out = a_key.out(); 427 if(a_key.object_class()!=TProfile2D_cls()) { 427 if(a_key.object_class()!=TProfile2D_cls()) { 428 out << "tools::rroot::key_to_p2d :" 428 out << "tools::rroot::key_to_p2d :" 429 << " key not a TProfile2D." 429 << " key not a TProfile2D." 430 << std::endl; 430 << std::endl; 431 return 0; 431 return 0; 432 } 432 } 433 unsigned int sz; 433 unsigned int sz; 434 char* buf = a_key.get_object_buffer(a_file,s 434 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 435 if(!buf) { 435 if(!buf) { 436 out << "tools::rroot::key_to_p2d :" 436 out << "tools::rroot::key_to_p2d :" 437 << " can't get data buffer of " << a_k 437 << " can't get data buffer of " << a_key.object_name() << "." 438 << std::endl; 438 << std::endl; 439 return 0; 439 return 0; 440 } 440 } 441 buffer b(out,a_file.byte_swap(),sz,buf,a_key 441 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 442 return TProfile2D_stream(b); 442 return TProfile2D_stream(b); 443 } 443 } 444 444 445 inline tree* key_to_tree(ifile& a_file,ifac& a 445 inline tree* key_to_tree(ifile& a_file,ifac& a_fac,key& a_key,bool a_warn = true) { 446 std::ostream& out = a_key.out(); 446 std::ostream& out = a_key.out(); 447 if(a_key.object_class()!=TTree_cls()) { 447 if(a_key.object_class()!=TTree_cls()) { 448 if(a_warn) out << "tools::rroot::key_to_tr 448 if(a_warn) out << "tools::rroot::key_to_tree : key not a TTree." << std::endl; 449 return 0; 449 return 0; 450 } 450 } 451 unsigned int sz; 451 unsigned int sz; 452 char* buf = a_key.get_object_buffer(a_file,s 452 char* buf = a_key.get_object_buffer(a_file,sz); //we don't have ownership of buf. 453 if(!buf) { 453 if(!buf) { 454 out << "tools::rroot::key_to_tree : can't 454 out << "tools::rroot::key_to_tree : can't get data buffer of " << a_key.object_name() << "." << std::endl; 455 return 0; 455 return 0; 456 } 456 } 457 buffer b(out,a_file.byte_swap(),sz,buf,a_key 457 buffer b(out,a_file.byte_swap(),sz,buf,a_key.key_length(),false); 458 b.set_map_objs(true); //for ioda/comres/tree 458 b.set_map_objs(true); //for ioda/comres/tree.py, tree.lua. 459 tree* _tree = new tree(a_file,a_fac); 459 tree* _tree = new tree(a_file,a_fac); 460 if(!_tree->stream(b)) { 460 if(!_tree->stream(b)) { 461 out << "tools::rroot::key_to_tree : TTree 461 out << "tools::rroot::key_to_tree : TTree streaming failed" << std::endl; 462 delete _tree; 462 delete _tree; 463 return 0; 463 return 0; 464 } 464 } 465 return _tree; 465 return _tree; 466 } 466 } 467 467 468 inline void read(std::ostream& a_out, 468 inline void read(std::ostream& a_out, 469 ifile& a_file, 469 ifile& a_file, 470 const std::vector<key*>& a_ke 470 const std::vector<key*>& a_keys, 471 bool a_recursive, 471 bool a_recursive, 472 bool a_ls, 472 bool a_ls, 473 bool a_dump, 473 bool a_dump, 474 unsigned int a_spaces) { 474 unsigned int a_spaces) { 475 475 476 {std::vector<key*>::const_iterator it; 476 {std::vector<key*>::const_iterator it; 477 for(it=a_keys.begin();it!=a_keys.end();++it) 477 for(it=a_keys.begin();it!=a_keys.end();++it) { 478 key& k = *(*it); 478 key& k = *(*it); 479 if(k.object_class()!=TDirectory_cls()) { 479 if(k.object_class()!=TDirectory_cls()) { 480 if(a_ls||a_dump) { 480 if(a_ls||a_dump) { 481 {for(unsigned int index=0;index<a_spac 481 {for(unsigned int index=0;index<a_spaces;index++) a_out << " ";} 482 std::string label = k.object_name(); 482 std::string label = k.object_name(); 483 a_out << "object : " << sout(label) 483 a_out << "object : " << sout(label) 484 << ", class : " << k.object_clas 484 << ", class : " << k.object_class() 485 << std::endl; 485 << std::endl; 486 //k.dump(a_out); 486 //k.dump(a_out); 487 } 487 } 488 if(!read_key(a_out,a_file,k,a_dump)) ret 488 if(!read_key(a_out,a_file,k,a_dump)) return; 489 } 489 } 490 }} 490 }} 491 491 492 {std::vector<key*>::const_iterator it; 492 {std::vector<key*>::const_iterator it; 493 for(it=a_keys.begin();it!=a_keys.end();++it) 493 for(it=a_keys.begin();it!=a_keys.end();++it) { 494 key& k = *(*it); 494 key& k = *(*it); 495 if(k.object_class()==TDirectory_cls()) { 495 if(k.object_class()==TDirectory_cls()) { 496 496 497 if(a_ls||a_dump) { 497 if(a_ls||a_dump) { 498 {for(unsigned int index=0;index<a_spac 498 {for(unsigned int index=0;index<a_spaces;index++) a_out << " ";} 499 std::string label = k.object_name(); 499 std::string label = k.object_name(); 500 a_out << "directory : " << label << st 500 a_out << "directory : " << label << std::endl; 501 } 501 } 502 502 503 if(!a_recursive) continue; 503 if(!a_recursive) continue; 504 504 505 uint32 sz; 505 uint32 sz; 506 char* buf = k.get_object_buffer(a_file,s 506 char* buf = k.get_object_buffer(a_file,sz); 507 if(!buf) { 507 if(!buf) { 508 a_out << "read :" 508 a_out << "read :" 509 << " can't get directory data b 509 << " can't get directory data buffer." 510 << std::endl; 510 << std::endl; 511 } else { 511 } else { 512 buffer b(a_out,a_file.byte_swap(),sz,b 512 buffer b(a_out,a_file.byte_swap(),sz,buf,k.key_length(),false); 513 TDirectory dir(a_file); 513 TDirectory dir(a_file); 514 if(!dir.stream(b)) { 514 if(!dir.stream(b)) { 515 a_out << "read :" 515 a_out << "read :" 516 << " can't stream TDirectory." 516 << " can't stream TDirectory." 517 << std::endl; 517 << std::endl; 518 } else { 518 } else { 519 const std::vector<key*>& keys = dir. 519 const std::vector<key*>& keys = dir.keys(); 520 read(a_out,a_file,keys,a_recursive,a 520 read(a_out,a_file,keys,a_recursive,a_ls,a_dump,a_spaces+1); 521 } 521 } 522 } 522 } 523 } 523 } 524 }} 524 }} 525 } 525 } 526 526 527 }} 527 }} 528 528 529 #endif 529 #endif