This function provides an example of how one might massage a csv data file to read into a ROOT TTree via TTree::ReadStream.
This could be useful if the data read out from some DAQ program doesn't 'quite' match the formatting expected by ROOT (e.g. comma- separated, tab-separated with white-space strings, headers not matching the expected format, etc.)
This example is shipped with a data file that looks like:
# Example data to read out. Some data have oddities that might need to
# dealt with, including the 'NaN' in Electrode 4 and the empty string in Date/Time (last row)
08112010.160622 7 5.719000E-10 8.790500 24.237700 -0.008332 0 0 0 0
8112010.160626 7 5.710000E-10 8.828400 24.237500 -0.008818 0 0 0 0
08112010.160626 7 5.719000E-10 8.828400 24.237500 -0.008818 0 0 0 0
08112010.160627 7 5.719000E-10 9.014300 24.237400 -0.028564 0 0 0
NaN
08112010.160627 7 5.711000E-10 8.786000 24.237400 -0.008818 0 0 0 0
08112010.160628 7 5.702000E-10 8.786000 24.237400 -0.009141 0 0 0 0
08112010.160633 7 5.710000E-10 9.016200 24.237200 -0.008818 0 0 0 0
7 5.710000E-10 8.903400 24.237200 -0.008818 0 0 0 0
These data require some massaging, including:
- Date/Time has a blank ('') entry that must be handled
- The headers are not in the correct format
- Tab-separated entries with additional white space
- NaN entries
from __future__ import print_function
import ROOT
import sys
import os
header_mapping_dictionary = {
'Date/Time' : ('Datetime' , str) ,
'Synchro' : ('Synchro' , int) ,
'Capacity' : ('Capacitance' , float) ,
'Temp.Cold Head' : ('TempColdHead' , float) ,
'Temp. Electrode' : ('TempElectrode' , float) ,
'HV Supply Voltage' : ('HVSupplyVoltage', float) ,
'Electrode 1' : ('Electrode1' , int) ,
'Electrode 2' : ('Electrode2' , int) ,
'Electrode 3' : ('Electrode3' , int) ,
'Electrode 4' : ('Electrode4' , int) ,
}
type_mapping_dictionary = {
str : 'C',
int : 'I',
float : 'F'
}
branch_descriptor =
':'.
join([header_mapping_dictionary[row][0]+
'/'+
type_mapping_dictionary[header_mapping_dictionary[row][1]]
for row in header_row])
output_file =
ROOT.TFile(output_ROOT_file_name,
'recreate')
print("Outputting %s -> %s" % (afile, output_ROOT_file_name))
file_lines = [
'\t'.
join([val
if (
val.find(
' ') == -1
and val !=
'')
for line in file_lines[1:] if line[0] != '#' ]
file_as_string = (
'\n'.
join(file_lines)).replace(
'NaN', str(0.0))
if __name__ == '__main__':
print(
"Usage: %s file_to_parse.dat" %
sys.argv[0])
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
- Author
- Michael Marino
Definition in file parse_CSV_file_with_TTree_ReadStream.py.