HIPO  4.3.0
High Performance Output data format for experimental physics
wrapper.cpp
Go to the documentation of this file.
1 
5 #include <iostream>
6 #include "reader.h"
7 #include "event.h"
8 #include "fusion.h"
9 
13 
14 std::map<std::string, hipo::bank *> eventStore;
15 
16 
18 
19 extern "C" {
20 
21  void hipo_file_open_( const char *filename, int length){
22  char *buffer = (char *) malloc(length+1);
23  memcpy(buffer,filename,length);
24  buffer[length] = '\0';
25  printf("[FORTRAN] opening file : %s\n", buffer);
26  hipo_FORT_Reader.open(buffer);
28  free(buffer);
29  }
30 
31  void hipo_file_open(const char *filename){
32  hipo_FORT_Reader.open(filename);
34  }
35 
36  int hipo_file_next_(int* fstatus){
37  bool status = hipo_FORT_Reader.next();
38  if(status==false){
39  *fstatus = 12;
40  return 12;
41  }
43  std::map<std::string, hipo::bank *>::iterator it;
44  for ( it = eventStore.begin(); it != eventStore.end(); it++ )
45  {
46  it->second->reset(); // string's value
47  }
48  *fstatus = 0;
49  return 0;
50  }
51 
52  void hipo_read_bank_(const char *bankname, int *bankRows, int banknameLength){
53  char *buffer = (char * ) malloc(banknameLength+1);
54  memcpy(buffer,bankname,banknameLength);
55  buffer[banknameLength] = '\0';
56  if(eventStore.count(std::string(buffer))==0){
57  if(hipo_FORT_Dictionary.hasSchema(buffer)==true){
58  hipo::bank *bank_ptr = new hipo::bank(hipo_FORT_Dictionary.getSchema(buffer));
59  eventStore[buffer] = bank_ptr;
60  printf("---> map : initializing bank \"%24s\" (%6d, %5d) to the store\n",
61  buffer,hipo_FORT_Dictionary.getSchema(buffer).getGroup(),
63  } else {
64  *bankRows = 0;
65  free(buffer);
66  return;
67  }
68  }
69 
71  *bankRows = eventStore[buffer]->getRows();
72  free(buffer);
73  }
74 /*
75  void hipo_read_bank_byid_(int *group, int *item){
76  int igroup = *group;
77  int iitem = *item;
78 
79  if(eventStore.count(igroup)==0){
80  printf("********* bank does not exist %d\n",igroup);
81  std::vector<std::string> schemaList = hipo_FORT_Dictionary.getSchemaList();
82  for(int i = 0; i < schemaList.size(); i++){
83  int schGroup = hipo_FORT_Dictionary.getSchema(schemaList[i].c_str()).getGroup();
84  if(schGroup==igroup){
85  printf(" found group = %d\n",schGroup);
86  printf("---> map : initializing bank \"%24s\" (%6d) to the store\n",
87  schemaList[i].c_str(),schGroup);
88  hipo::bank *bank_ptr = new hipo::bank(hipo_FORT_Dictionary.getSchema(schemaList[i].c_str()));
89  eventStore[schGroup] = bank_ptr;
90  }
91  }
92  }
93  }*/
94 
95  void get_bank_rows_(int *group, int *bankRows){
96  /*int igroup = *group;
97  if(eventStore.count(igroup)==0) *bankRows = 0;
98  *bankRows = eventStore[igroup]->getRows();*/
99  }
100 
101  void hipo_read_float_(const char *group, const char *item, int *nread, float *buffer, int *maxRows,
102  int length_group, int length_item){
103 
104  char *buffer_group = (char * ) malloc(length_group+1);
105  memcpy(buffer_group,group,length_group);
106  buffer_group[length_group] = '\0';
107 
108  char *buffer_item = (char * ) malloc(length_item+1);
109  memcpy(buffer_item,item,length_item);
110  buffer_item[length_item] = '\0';
111 
112  //printf("---->>>>> reading float (%s) (%s)\n",buffer_group,buffer_item);
113  /*int id_g = *group;
114  int id_i = ;
115  int max = *maxRows;
116  //printf("READIN FLOAT %d %d \n",*group,*item);
117  //std::vector<float> vec = hipo_FORT_Reader.getEvent()->getFloat(id_g,id_i);
118  //printf("RESULT SIZE = %d \n",vec.size());
119  for(int i = 0; i < vec.size(); i++){
120  if(i<max) buffer[i] = vec[i];
121  }
122  *nread = vec.size();*/
123  if(eventStore.count(buffer_group)==0){
124  *nread = 0;
125  free(buffer_group);
126  free(buffer_item);
127  return;
128  }
129 
130  hipo::bank *bank = eventStore[buffer_group];
131  int nrows = bank->getRows();
132  if(nrows>(*maxRows)) nrows = *(maxRows);
133  //printf("---->>>>> reading float (%s) (%s) (%d)\n",buffer_group,buffer_item,nrows);
134  for(int i = 0; i < nrows; i++){
135  buffer[i] = bank->getFloat(buffer_item, i);
136  }
137  *nread = nrows;
138 
139  free(buffer_group);
140  free(buffer_item);
141  }
142 
143  void hipo_read_double_(const char *group, const char *item, int *nread, double *buffer, int *maxRows,
144  int length_group, int length_item){
145 
146  char *buffer_group = (char * ) malloc(length_group+1);
147  memcpy(buffer_group,group,length_group);
148  buffer_group[length_group] = '\0';
149 
150  char *buffer_item = (char * ) malloc(length_item+1);
151  memcpy(buffer_item,item,length_item);
152  buffer_item[length_item] = '\0';
153 
154 
155  if(eventStore.count(buffer_group)==0){
156  *nread = 0;
157  free(buffer_group);
158  free(buffer_item);
159  return;
160  }
161 
162  hipo::bank *bank = eventStore[buffer_group];
163  int nrows = bank->getRows();
164  if(nrows>(*maxRows)) nrows = *(maxRows);
165  //printf("---->>>>> reading float (%s) (%s) (%d)\n",buffer_group,buffer_item,nrows);
166  for(int i = 0; i < nrows; i++){
167  buffer[i] = bank->getDouble(buffer_item, i);
168  }
169  *nread = nrows;
170 
171  free(buffer_group);
172  free(buffer_item);
173  }
174 
175  void hipo_read_int_(const char *group, const char *item, int *nread, int *buffer, int *maxRows,
176  int length_group, int length_item){
177 
178  char *buffer_group = (char * ) malloc(length_group+1);
179  memcpy(buffer_group,group,length_group);
180  buffer_group[length_group] = '\0';
181 
182  char *buffer_item = (char * ) malloc(length_item+1);
183  memcpy(buffer_item,item,length_item);
184  buffer_item[length_item] = '\0';
185 
186  if(eventStore.count(buffer_group)==0){
187  *nread = 0;
188  free(buffer_group);
189  free(buffer_item);
190  return;
191  }
192 
193  hipo::bank *bank = eventStore[buffer_group];
194  int nrows = bank->getRows();
195  if(nrows>(*maxRows)) nrows = *(maxRows);
196  //printf("---->>>>> reading float (%s) (%s) (%d)\n",buffer_group,buffer_item,nrows);
197  for(int i = 0; i < nrows; i++){
198  buffer[i] = bank->getInt(buffer_item, i);
199  }
200  *nread = nrows;
201  free(buffer_group);
202  free(buffer_item);
203  }
204 
205  void hipo_read_long_(const char *group, const char *item, int *nread, int64_t *buffer, int *maxRows,
206  int length_group, int length_item){
207 
208  char *buffer_group = (char * ) malloc(length_group+1);
209  memcpy(buffer_group,group,length_group);
210  buffer_group[length_group] = '\0';
211 
212  char *buffer_item = (char * ) malloc(length_item+1);
213  memcpy(buffer_item,item,length_item);
214  buffer_item[length_item] = '\0';
215 
216  if(eventStore.count(buffer_group)==0){
217  *nread = 0;
218  free(buffer_group);
219  free(buffer_item);
220  return;
221  }
222 
223  hipo::bank *bank = eventStore[buffer_group];
224  int nrows = bank->getRows();
225  if(nrows>(*maxRows)) nrows = *(maxRows);
226  //printf("---->>>>> reading float (%s) (%s) (%d)\n",buffer_group,buffer_item,nrows);
227  for(int i = 0; i < nrows; i++){
228  buffer[i] = bank->getLong(buffer_item, i);
229  }
230  *nread = nrows;
231  free(buffer_group);
232  free(buffer_item);
233  }
234  /*void hipo_read_int_(int *group, int *item, int *nread, int *buffer, int *maxRows){
235 
236  }*/
237 
238 
239  int fusion_open(const char *filename){
240  int handle = hFusion.open(filename); return handle;
241  }
242 
243  int fusion_open_with_tag(const char *filename, int tag){
244  int handle = hFusion.open(filename, tag); return handle;
245  }
246 
247  int fusion_next(int handle){ return hFusion.next(handle)==true?1:0;}
248 
249  int fusion_schema_length(int handle, const char *bank){
250  std::string schema = hFusion.schema(handle,bank);
251  return (int) schema.length();
252  }
253 
254  void fusion_schema_string(int handle, const char *bank, char *format){
255  std::string schema = hFusion.schema(handle,bank);
256  std::strcpy(format,schema.c_str());
257  }
258 
259  void fusion_define(int handle, const char *bank){ hFusion.define(handle,bank);}
260  void fusion_describe(int handle, const char *bank){ hFusion.describe(handle,bank);}
261  int fusion_bankSize(int handle, const char *bank){ return hFusion.getSize(handle,bank);}
262 
263  int fusion_get_int(int handle, const char *bank, const char *entry, int row){
264  return hFusion.getInt(handle,bank,entry,row);
265  }
266 
267  void fusion_get_byte_array(int handle, const char *bank, int entry, int8_t *ptr, int rows){
268  hFusion.getByteArray(handle,bank,entry,ptr,rows);
269  }
270 
271  void fusion_get_short_array(int handle, const char *bank, int entry, int16_t *ptr, int rows){
272  hFusion.getShortArray(handle,bank,entry,ptr,rows);
273  }
274 
275  void fusion_get_int_array(int handle, const char *bank, int entry, int32_t *ptr, int rows){
276  hFusion.getIntArray(handle,bank,entry,ptr,rows);
277  }
278 
279  void fusion_get_float_array(int handle, const char *bank, int entry, float *ptr, int rows){
280  hFusion.getFloatArray(handle,bank,entry,ptr,rows);
281  }
282 
283  int64_t fusion_get_long(int handle, const char *bank, const char *entry, int row){
284  return hFusion.getLong(handle,bank,entry,row);
285  }
286  float fusion_get_float(int handle, const char *bank, const char *entry, int row){
287  float value = hFusion.getFloat(handle,bank,entry,row);
288  //printf(" result from wrapper = %f\n",value);
289  return value;
290  }
291 
292  float fusion_get_double(int handle, const char *bank, const char *entry, int row){
293  float value = (float) hFusion.getDouble(handle,bank,entry,row);
294  //printf(" result from wrapper = %f\n",value);
295  return value;
296  }
297 
298  int fusion_entry_type(int handle, const char *bank, const char *entry){
299  return hFusion.getType(handle,bank,entry);
300  }
301 
302  float *fusion_create_array(int size){
303  float *array = new float[size];
304  for(int i = 0; i < size; i++) array[i]=(i+1)*2;
305  return array;
306  }
307 
308  int64_t fusion_get_entries(int handle){
309  return hFusion.getEntries(handle);
310  }
311 
312  void fusion_show(int handle, const char *bank){
313  hipo::bank &b = hFusion.getBank(handle, bank);
314  b.show();
315  }
316 }
Represents a HIPO bank, a tabular data structure with rows and typed columns.
Definition: bank.h:352
int getInt(int item, int index) const noexcept
Definition: bank.h:714
long getLong(int item, int index) const noexcept
Definition: bank.h:706
int getRows() const noexcept
Definition: bank.h:446
void show() const override
show this bank's contents; only the rows in its current rowlist instance are shown
Definition: bank.cpp:516
float getFloat(int item, int index) const noexcept
Definition: bank.h:686
double getDouble(int item, int index) const noexcept
Definition: bank.h:694
Collection of schema definitions, typically read from a HIPO file header.
Definition: dictionary.h:248
bool hasSchema(const char *name)
Check whether a schema with the given name exists.
Definition: dictionary.h:264
schema & getSchema(const char *name)
Retrieve a schema by name.
Definition: dictionary.h:271
Represents a HIPO event, a container for multiple structures/banks.
Definition: event.h:77
void getStructure(hipo::structure &str, int group, int item)
Extract a structure from the event by group and item identifiers.
Definition: event.cpp:72
Multi-file HIPO data access manager using integer handles.
Definition: fusion.h:114
void define(int fid, const char *bank)
Register a bank for reading in the given file.
Definition: fusion.cpp:106
int getInt(int handle, const char *bank, const char *entry, int row)
Definition: fusion.cpp:125
int getSize(int fid, const char *bank)
Definition: fusion.cpp:117
int getType(int handle, const char *bank, const char *entry)
Definition: fusion.cpp:143
int64_t getLong(int handle, const char *bank, const char *entry, int row)
Definition: fusion.cpp:129
double getDouble(int handle, const char *bank, const char *entry, int row)
Definition: fusion.cpp:139
void describe(int fid, const char *bank)
Print schema description for a bank in the given file.
Definition: fusion.cpp:113
void getShortArray(int handle, const char *bank, int entry, int16_t *ptr, int length)
Copy a short column into an array from the file identified by handle.
Definition: fusion.h:151
int open(const char *filename)
Open a HIPO file and return its handle.
Definition: fusion.cpp:94
float getFloat(int handle, const char *bank, const char *entry, int row)
Definition: fusion.cpp:133
void getByteArray(int handle, const char *bank, int entry, int8_t *ptr, int length)
Copy a byte column into an array from the file identified by handle.
Definition: fusion.h:147
std::string schema(int fid, const char *bank)
Definition: fusion.cpp:110
void getFloatArray(int handle, const char *bank, int entry, float *ptr, int length)
Copy a float column into an array from the file identified by handle.
Definition: fusion.h:159
int64_t getEntries(int handle)
Definition: fusion.h:175
hipo::bank & getBank(int handle, const char *bank)
Definition: fusion.h:177
void getIntArray(int handle, const char *bank, int entry, int32_t *ptr, int length)
Copy an integer column into an array from the file identified by handle.
Definition: fusion.h:155
bool next(int handle)
Advance to the next event in the given file.
Definition: fusion.cpp:121
Sequential reader for HIPO files.
Definition: reader.h:250
void read(hipo::event &dataevent)
Read the current event into the given event object.
Definition: reader.cpp:233
void readDictionary(hipo::dictionary &dict)
Read the schema dictionary from the file header.
Definition: reader.cpp:311
bool next()
Advance to the next event.
Definition: reader.cpp:334
void open(const char *filename)
Open a HIPO file for reading.
Definition: reader.cpp:81
int getItem()
Get the item identifier.
Definition: dictionary.h:131
int getGroup()
Get the group identifier.
Definition: dictionary.h:128
HIPO event container and manipulation interface.
Multi-file HIPO data source management with integer handle interface.
Sequential and random-access reader for HIPO files with event filtering and dictionary support.
std::map< std::string, hipo::bank * > eventStore
Definition: wrapper.cpp:14
void hipo_file_open(const char *filename)
Definition: wrapper.cpp:31
int fusion_open_with_tag(const char *filename, int tag)
Definition: wrapper.cpp:243
int fusion_next(int handle)
Definition: wrapper.cpp:247
float * fusion_create_array(int size)
Definition: wrapper.cpp:302
float fusion_get_float(int handle, const char *bank, const char *entry, int row)
Definition: wrapper.cpp:286
int64_t fusion_get_long(int handle, const char *bank, const char *entry, int row)
Definition: wrapper.cpp:283
void hipo_read_double_(const char *group, const char *item, int *nread, double *buffer, int *maxRows, int length_group, int length_item)
Definition: wrapper.cpp:143
void hipo_read_float_(const char *group, const char *item, int *nread, float *buffer, int *maxRows, int length_group, int length_item)
Definition: wrapper.cpp:101
void fusion_get_byte_array(int handle, const char *bank, int entry, int8_t *ptr, int rows)
Definition: wrapper.cpp:267
void get_bank_rows_(int *group, int *bankRows)
Definition: wrapper.cpp:95
int fusion_entry_type(int handle, const char *bank, const char *entry)
Definition: wrapper.cpp:298
void hipo_read_long_(const char *group, const char *item, int *nread, int64_t *buffer, int *maxRows, int length_group, int length_item)
Definition: wrapper.cpp:205
hipo::reader hipo_FORT_Reader
Definition: wrapper.cpp:10
void fusion_schema_string(int handle, const char *bank, char *format)
Definition: wrapper.cpp:254
hipo::event hipo_FORT_Event
Definition: wrapper.cpp:11
void fusion_get_int_array(int handle, const char *bank, int entry, int32_t *ptr, int rows)
Definition: wrapper.cpp:275
int fusion_get_int(int handle, const char *bank, const char *entry, int row)
Definition: wrapper.cpp:263
void hipo_file_open_(const char *filename, int length)
Definition: wrapper.cpp:21
int fusion_schema_length(int handle, const char *bank)
Definition: wrapper.cpp:249
void fusion_show(int handle, const char *bank)
Definition: wrapper.cpp:312
void fusion_define(int handle, const char *bank)
Definition: wrapper.cpp:259
hipo::dictionary hipo_FORT_Dictionary
Definition: wrapper.cpp:12
int64_t fusion_get_entries(int handle)
Definition: wrapper.cpp:308
int fusion_open(const char *filename)
Definition: wrapper.cpp:239
float fusion_get_double(int handle, const char *bank, const char *entry, int row)
Definition: wrapper.cpp:292
void fusion_describe(int handle, const char *bank)
Definition: wrapper.cpp:260
void hipo_read_bank_(const char *bankname, int *bankRows, int banknameLength)
Definition: wrapper.cpp:52
int fusion_bankSize(int handle, const char *bank)
Definition: wrapper.cpp:261
void fusion_get_float_array(int handle, const char *bank, int entry, float *ptr, int rows)
Definition: wrapper.cpp:279
hipo::fusion hFusion
Definition: wrapper.cpp:17
int hipo_file_next_(int *fstatus)
Definition: wrapper.cpp:36
void fusion_get_short_array(int handle, const char *bank, int entry, int16_t *ptr, int rows)
Definition: wrapper.cpp:271
void hipo_read_int_(const char *group, const char *item, int *nread, int *buffer, int *maxRows, int length_group, int length_item)
Definition: wrapper.cpp:175