@@ -79,9 +79,11 @@ enum {
7979class ARCFileReader : public G3Module {
8080public:
8181 ARCFileReader (const std::string &path,
82- Experiment experiment=Experiment::SPT, bool track_filename=false );
82+ Experiment experiment=Experiment::SPT, float timeout=-1 .,
83+ bool track_filename=false , size_t buffersize=1024 *1024 );
8384 ARCFileReader (const std::vector<std::string> & filename,
84- Experiment experiment=Experiment::SPT, bool track_filename=false );
85+ Experiment experiment=Experiment::SPT, float timeout=-1 .,
86+ bool track_filename=false , size_t buffersize=1024 *1024 );
8587 virtual ~ARCFileReader ();
8688
8789 void Process (G3FramePtr frame, std::deque<G3FramePtr> &out);
@@ -119,43 +121,33 @@ class ARCFileReader : public G3Module {
119121 std::string cur_file_;
120122
121123 Experiment experiment;
124+ void SetExperiment (Experiment exp);
122125 G3TimePtr GCPToTime (uint8_t *buffer, off_t offset);
123126
127+ float timeout_;
124128 bool track_filename_;
129+ size_t buffersize_;
125130
126131 SET_LOGGER (" ARCFileReader" );
127132};
128133
129134
130135ARCFileReader::ARCFileReader (const std::string &path,
131- Experiment experiment, bool track_filename) :
132- stream_(nullptr ), experiment(experiment), track_filename_(track_filename)
136+ Experiment experiment, float timeout, bool track_filename, size_t buffersize) :
137+ stream_(nullptr ), timeout_(timeout), track_filename_(track_filename),
138+ buffersize_(buffersize)
133139{
134- if (experiment == Experiment::SPT || experiment == Experiment::BK) {
135- ms_jiffie_base_ = G3Units::ms;
136- } else if (experiment == Experiment::PB) {
137- ms_jiffie_base_ = 86400 /INT_MAX;
138- } else {
139- log_fatal (" Unrecognized Experiment" );
140- }
141-
140+ SetExperiment (experiment);
142141 g3_check_input_path (path);
143142 StartFile (path);
144143}
145144
146-
147-
148145ARCFileReader::ARCFileReader (const std::vector<std::string> &filename,
149- Experiment experiment, bool track_filename) :
150- stream_(nullptr ), experiment(experiment), track_filename_(track_filename)
146+ Experiment experiment, float timeout, bool track_filename, size_t buffersize) :
147+ stream_(nullptr ), timeout_(timeout), track_filename_(track_filename),
148+ buffersize_(buffersize)
151149{
152- if (experiment == Experiment::SPT || experiment == Experiment::BK) {
153- ms_jiffie_base_ = G3Units::ms;
154- } else if (experiment == Experiment::PB) {
155- ms_jiffie_base_ = 86400 /INT_MAX;
156- } else {
157- log_fatal (" Unrecognized Experiment" );
158- }
150+ SetExperiment (experiment);
159151
160152 if (filename.size () == 0 )
161153 log_fatal (" Empty file list provided to G3Reader" );
@@ -171,21 +163,33 @@ ARCFileReader::ARCFileReader(const std::vector<std::string> &filename,
171163
172164}
173165
174-
175166ARCFileReader::~ARCFileReader ()
176167{
177168 g3_istream_close (stream_);
178169}
179170
180171
172+ void ARCFileReader::SetExperiment (Experiment exp)
173+ {
174+ experiment = exp;
175+
176+ if (experiment == Experiment::SPT || experiment == Experiment::BK) {
177+ ms_jiffie_base_ = G3Units::ms;
178+ } else if (experiment == Experiment::PB) {
179+ ms_jiffie_base_ = 86400 /INT_MAX;
180+ } else {
181+ log_fatal (" Unrecognized Experiment" );
182+ }
183+ }
184+
181185void ARCFileReader::StartFile (const std::string & path)
182186{
183187 int32_t size, opcode;
184188 uint8_t *buffer;
185189
186190 // Open file, including whatever decompression/network access/etc.
187191 // may be required
188- g3_istream_from_path (stream_, path, - 1 , 1024 * 1024 , " " );
192+ g3_istream_from_path (stream_, path, timeout_, buffersize_ , " " );
189193 fd_ = g3_istream_handle (stream_);
190194 cur_file_ = path;
191195 revision_ = 0 ;
@@ -206,7 +210,7 @@ void ARCFileReader::StartFile(const std::string & path)
206210
207211 if (opcode != ARC_SIZE_RECORD)
208212 log_fatal (" No ARC_SIZE_RECORD at beginning of %s" ,
209- path .c_str ());
213+ cur_file_ .c_str ());
210214 if ((fd_ < 0 && size != 4 ) || (fd_ >= 0 && size != 8 ))
211215 log_fatal (" Incorrectly sized ARC_SIZE_RECORD (%d)" , size);
212216 stream_.read ((char *)&size, sizeof (size)); /* Skip size field */
@@ -220,19 +224,19 @@ void ARCFileReader::StartFile(const std::string & path)
220224 opcode = ntohl (opcode);
221225 if (opcode != ARC_ARRAYMAP_RECORD)
222226 log_fatal (" No ARC_ARRAYMAP_RECORD at beginning of %s" ,
223- path .c_str ());
227+ cur_file_ .c_str ());
224228
225229 buffer = new uint8_t [size];
226230 stream_.read ((char *)buffer, size);
227231 if (stream_.eof ()) {
228232 delete [] buffer;
229233 log_fatal (" %s truncated; unable to read register map" ,
230- path .c_str ());
234+ cur_file_ .c_str ());
231235 }
232236 if (!stream_.good ()) {
233237 delete [] buffer;
234238 log_fatal (" Read error on %s while reading register map" ,
235- path .c_str ());
239+ cur_file_ .c_str ());
236240 }
237241
238242 ParseArrayMap (buffer, size);
@@ -869,10 +873,13 @@ PYBINDINGS("gcp") {
869873 " For non-SPT ARC file formats, please set Experiment to the "
870874 " appropriate value. Set track_filename to True to record the "
871875 " filename for each frame in the ._filename attribute (fragile)." ,
872- init<std::string, Experiment, bool >((arg (" filename" ),
873- arg (" experiment" )=Experiment::SPT, arg (" track_filename" )=false )))
874- .def (init<std::vector<std::string>, Experiment, bool >((arg (" filename" ),
875- arg (" experiment" )=Experiment::SPT, arg (" track_filename" )=false )))
876+ init<std::string, Experiment, float , bool , size_t >((arg (" filename" ),
877+ arg (" experiment" )=Experiment::SPT, arg (" timeout" )=-1 .,
878+ arg (" track_filename" )=false , arg (" buffersize" )=1024 *1024 )))
879+ .def (init<std::vector<std::string>, Experiment, float , bool , size_t >(
880+ (arg (" filename" ), arg (" experiment" )=Experiment::SPT,
881+ arg (" timeout" )=-1 ., arg (" track_filename" )=false ,
882+ arg (" buffersize" )=1024 *1024 )))
876883 .def_readonly (" __g3module__" , true )
877884 ;
878885}
0 commit comments