DATRW++ library: seismic data I/O with multiple formats
channeltranslation.cc
Go to the documentation of this file.
1 /*! \file channeltranslation.cc
2  * \brief translate TSOFT channel name (they are too long for SFF headers) (implementation)
3  * \ingroup group_tsoft
4  *
5  * ----------------------------------------------------------------------------
6  *
7  * \author Thomas Forbriger
8  * \date 11/11/2009
9  *
10  * translate TSOFT channel name (they are too long for SFF headers) (implementation)
11  *
12  * Copyright (c) 2009 by Thomas Forbriger (BFO Schiltach)
13  *
14  * ----
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28  * ----
29  *
30  * REVISIONS and CHANGES
31  * - 11/11/2009 V1.0 Thomas Forbriger
32  * - 02/12/2011 V1.1 added second barometer
33  * - 19/10/2012 V1.2 do not set NSP by default!
34  * - 10/01/2013 V1.3 add sensor data conversion codes for SG056
35  * extract full channel description on request
36  * - 01/04/2018 V1.4 add additional channels to translation table
37  * - 06/04/2018 V1.5 catch typo in SG056 channel configuration
38  * - 05/08/2019 V1.6 translate LHeLvl and LHe-Alt to LHX both
39  *
40  * ============================================================================
41  */
42 #define DATRW_CHANNELTRANSLATION_CC_VERSION \
43  "DATRW_CHANNELTRANSLATION_CC V1.6"
44 
45 #include <iomanip>
46 #include <datrwxx/error.h>
47 #include <datrwxx/util.h>
48 #include <datrwxx/tsoftdata.h>
49 #include <datrwxx/channeltranslation.h>
50 
51 namespace datrw {
52 
53  namespace tsoft {
54 
55  /*! \brief global variable: channel name translation table
56  * \ingroup group_tsoft
57  *
58  * This table is specific for SG056 at BFO.
59  * Sensor data conversion codes are assigned based on GWR document
60  * DDAS3_man_technical_ch5_UIPCsoftware_2010-07-16_BFO-Excerpt and
61  * Auxill_2.txt as compiled by Walter Zuern (Id: Auxill_2.txt 752
62  * 2013-01-09 12:07:01Z).
63  *
64  * Additional channels contain data derived by additional signal
65  * processing.
66  * Channel names are defined in chn_o056.cfg of the UIPC configuration.
67  *
68  * 06.04.2018
69  * catch typo in SG056 channel configuration
70  * B2r-F60 and Br2-F60 are the same data
71  *
72  * 05.08.2019
73  * with new UIPC software version (installed on 2019-07-30)
74  * LHeLvl was renamed to LHe-Alt
75  * convert both into LHX
76  */
78  {"BF:SG056:Grav-1", "BFO:GR1:SG056:Gra1", CNSP},
79  {"BF:SG056:Grav-2", "BFO:GR2:SG056:Gra2", CNSP},
80  {"BF:SG056:Baro-1", "BFO:BA1:SG056:Bar1", CNSP},
81  {"BF:SG056:Baro-2", "BFO:BA2:SG056:Bar2", CNSP},
82  // ---------------------------------------------
83  {"BF:SG056:G1-Sig", "BFO:G1S:SG056:Sig1", CNSP},
84  {"BF:SG056:G1-Mode", "BFO:G1M:SG056:Mod1", CNSP},
85  {"BF:SG056:GBal-1", "BFO:G1B:SG056:GBa1", CNSP},
86  {"BF:SG056:G2-Sig", "BFO:G2S:SG056:Sig2", CNSP},
87  {"BF:SG056:G2-Mode", "BFO:G2M:SG056:Mod2", CNSP},
88  {"BF:SG056:GBal-2", "BFO:G2B:SG056:GBa2", CNSP},
89  // ---------------------------------------------
90  {"BF:SG056:Tmpr1", "BFO:TP1:SG056:Tmp1", CNSP},
91  {"BF:SG056:RelHum1", "BFO:RH1:SG056:ReH1", CNSP},
92  {"BF:SG056:Tmpr2", "BFO:TP2:SG056:Tmp2", CNSP},
93  {"BF:SG056:RelHum2", "BFO:RH2:SG056:ReH2", CNSP},
94  // ---------------------------------------------
95  {"BF:SG056:TX-Bal", "BFO:TXB:SG056:TXBa", CNSP},
96  {"BF:SG056:TY-Bal", "BFO:TYB:SG056:TYBa", CNSP},
97  {"BF:SG056:TX-Pwr", "BFO:TXP:SG056:TXPw", POWERV},
98  {"BF:SG056:TY-Pwr", "BFO:TYP:SG056:TYPw", POWERV},
99  // ---------------------------------------------
100  {"BF:SG056:Dewr-P", "BFO:DEP:SG056:DewP", PSI_1_1},
101  {"BF:SG056:Dwr_Htr", "BFO:DHT:SG056:DHtr", C20P4},
102  {"BF:SG056:NeckT-1", "BFO:NT1:SG056:NTe1", SIDIODE3},
103  {"BF:SG056:NeckT-2", "BFO:NT2:SG056:NTe2", SIDIODE3},
104  {"BF:SG056:HtrCrnt", "BFO:HCT:SG056:HCrt", POWERV},
105  {"BF:SG056:Tmp-Bal", "BFO:TBA:SG056:TBal", CNSP},
106  // ---------------------------------------------
107  {"BF:SG056:P1GasCl", "BFO:P1C:SG056:P1GC", PSI_3000},
108  {"BF:SG056:P2GasRg", "BFO:P2R:SG056:P2GR", PSI_500},
109  {"BF:SG056:P3CmpHi", "BFO:P3H:SG056:P3CH", PSI_500},
110  {"BF:SG056:P4CmpLo", "BFO:P4L:SG056:P4CL", PSI_500},
111  {"BF:SG056:P5CmpBl", "BFO:P5B:SG056:P5CB", PSI_500},
112  // ---------------------------------------------
113  {"BF:SG056:TREEfan", "BFO:FAN:SG056:Tfan", FAN16},
114  {"BF:SG056:AD-1", "BFO:AD1:SG056:AD-1", CNSP},
115  {"BF:SG056:FB_Mod", "BFO:FBM:SG056:FBMo", CNSP},
116  {"BF:SG056:Temp_77", "BFO:T77:SG056:Te77", CNSP},
117  {"BF:SG056:Temp_6K", "BFO:T6K:SG056:Te6K", CNSP},
118  {"BF:SG056:BelyT-3", "BFO:BT3:SG056:BTe3", SIDIODE3},
119  {"BF:SG056:BodyT-4", "BFO:BT4:SG056:BTe4", SIDIODE4},
120  {"BF:SG056:Temp_G1", "BFO:TG1:SG056:TeG1", TDV},
121  {"BF:SG056:Temp_G2", "BFO:TG2:SG056:TeG2", TDV},
122  {"BF:SG056:Temp_TX", "BFO:TTX:SG056:TeTX", TDV},
123  {"BF:SG056:Temp_TY", "BFO:TTY:SG056:TeTY", TDV},
124  {"BF:SG056:Temp_AX", "BFO:TAX:SG056:TeAX", TDV},
125  {"BF:SG056:Temp_CH", "BFO:TCH:SG056:TeCH", TDV},
126  {"BF:SG056:Temp_TE", "BFO:TTE:SG056:TeTE", TDV},
127  // ---------------------------------------------
128  {"BF:SG056:T1-Ext", "BFO:T1X:SG056:T1Ex", TDV},
129  {"BF:SG056:T2-Ext", "BFO:T2X:SG056:T2Ex", TDV},
130  {"BF:SG056:T3-Ext", "BFO:T3X:SG056:T3Ex", TDV},
131  // ---------------------------------------------
132  {"BF:SG056:Temp-Gt", "BFO:TGT:SG056:TeGt", PT100V_K},
133  // ---------------------------------------------
134  {"BF:SG056:AGnd", "BFO:GND:SG056:AGnd", CNSP},
135  {"BF:SG056:LHeLvl", "BFO:LHX:SG056:LHeX", GEPLHe23},
136  // with new UIPC software version LHeLvl was called LHe-Alt
137  {"BF:SG056:LHe-Alt", "BFO:LHX:SG056:LHeX", GEPLHe23},
138  {"BF:SG056:LHe-Lvl", "BFO:LH1:SG056:LHeL", GEPLHe23},
139  {"BF:SG056:Comp_DC", "BFO:CDC:SG056:CoDC", CNSP},
140  {"BF:SG056:CH_DC", "BFO:CHD:SG056:CHDC", CNSP},
141  // ---------------------------------------------
142  {"BF:SG056:Vstd-1", "BFO:VS1:SG056:VST1", CNSP},
143  {"BF:SG056:Vstd-2", "BFO:VS2:SG056:VST2", CNSP},
144  // ---------------------------------------------
145  // additional channels derived from primary recordings
146  // ---------------------------------------------
147  // gravity and barometric pressure sampled at 60s
148  // as found in F1??????.056 in directory FLT_o056
149  {"BF:SG056:G1-F60", "BFO:G16:SG056:G160", CNSP},
150  {"BF:SG056:G2-F60", "BFO:G26:SG056:G260", CNSP},
151  {"BF:SG056:Br1-F60", "BFO:B16:SG056:B160", CNSP},
152  {"BF:SG056:Br2-F60", "BFO:B26:SG056:B260", CNSP},
153  {"BF:SG056:B2r-F60", "BFO:B26:SG056:B260", CNSP},
154  // gravity and barometric pressure sampled at 10s
155  // as found in F5??????.056 in directory FLT_o056
156  {"BF:SG056:G1-F10", "BFO:G11:SG056:G110", CNSP},
157  {"BF:SG056:G2-F10", "BFO:G21:SG056:G210", CNSP},
158  {"BF:SG056:Br1-F10", "BFO:B11:SG056:B110", CNSP},
159  {"BF:SG056:Br2-F10", "BFO:B21:SG056:B210", CNSP},
160  // residuals, synthetic tides, and drift polynomial
161  // as found in C???????.056 in directory CLC_o056
162  {"BF:SG056:G1-Resd", "BFO:G1R:SG056:G1Re", CNSP},
163  {"BF:SG056:G2-Resd", "BFO:G2R:SG056:G2Re", CNSP},
164  {"BF:SG056:G-Diff", "BFO:GRE:SG056:GRes", CNSP},
165  {"BF:SG056:G-Calc", "BFO:GCA:SG056:GCal", CNSP},
166  {"BF:SG056:G1-Poly", "BFO:G1P:SG056:G1Po", CNSP},
167  {"BF:SG056:G2-Poly", "BFO:G2P:SG056:G2Po", CNSP},
168  // ---------------------------------------------
169  {NULL, NULL, CNSP}
170  }; // Channel translationtable[]
171 
172  /*======================================================================*/
173  // functions
174 
176  {
177  std::string tci(ci.TSOFTname);
178  Tvos vos=stringtovec(tci, ":");
179  DATRW_assert(vos.size()==3, "unexpected number of fields");
180  TSOFTchannelid retval;
181  retval.location=vos[0];
182  retval.instrument=vos[1];
183  retval.datatype=vos[2];
184  return(retval);
185  } // TSOFTchannelid tchannelid(const Channel& ci)
186 
187  /*----------------------------------------------------------------------*/
188 
190  {
191  std::string sci(ci.SFFname);
192  Tvos vos=stringtovec(sci, ":");
193  DATRW_assert(vos.size()==4, "unexpected number of fields");
194  SFFchannelid retval;
195  retval.station=vos[0];
196  retval.channel=vos[1];
197  retval.instrument=vos[2];
198  retval.auxid=vos[3];
199  return(retval);
200  } // SFFchannelid schannelid(const Channel& ci)
201 
202  /*----------------------------------------------------------------------*/
203 
204  //! \brief helper function: print fixed width field
205  void pfield(std::ostream& os, const std::string& s, const int& w)
206  {
207  os.width(w);
208  os.setf(std::ios_base::left, std::ios_base::adjustfield);
209  os << s.substr(0,w) << " ";
210  } // void pfield(std::ostream& os, const std::string& s, const int& w)
211 
212  /*----------------------------------------------------------------------*/
213 
214  //! \brief helper function: formatted output
215  void pline(std::ostream& os,
216  const std::string& s1,
217  const std::string& s2,
218  const std::string& s3,
219  const std::string& s4,
220  const std::string& s5,
221  const std::string& s6,
222  const std::string& s7)
223  {
224  pfield(os, s1, 8);
225  pfield(os, s2, 10);
226  pfield(os, s3, 8);
227  os << " --> ";
228  pfield(os, s4, 7);
229  pfield(os, s5, 7);
230  pfield(os, s6, 10);
231  pfield(os, s7, 5);
232  os << std::endl;
233  } // void pline
234 
235  /*----------------------------------------------------------------------*/
236 
237  void reporttranslation(std::ostream& os)
238  {
239  const Channel* pc=translationtable;
240  os << "Translation table for TSOFT channels:" << std::endl;
241  pline(os, "TSOFT", "", "", "SFF", "", "", "");
242  pline(os, "location", "instrument", "datatype",
243  "station", "channel", "instrument", "auxid");
244  const char* line="----------";
245  pline(os, line, line, line, line, line, line, line);
246  while (pc->TSOFTname != NULL)
247  {
248  DATRW_assert(pc->TSOFTname != NULL, "UUPS");
249  TSOFTchannelid tci=tchannelid(*pc);
250  SFFchannelid sci=schannelid(*pc);
251  pline(os,
252  tci.location,
253  tci.instrument,
254  tci.datatype,
255  sci.station,
256  sci.channel,
257  sci.instrument,
258  sci.auxid);
259  ++pc;
260  }
261  os << "If none of the entries matches, we take location for station,\n"
262  << "instrument for instrument, and datatype for channel and auxid."
263  << std::endl;
264  } // void reporttranslation(std::ostream& os)
265 
266  /*----------------------------------------------------------------------*/
267 
268  void reportdatacomments(std::ostream& os)
269  {
270  os << "Comments found in 1s data file (A2100101.056):" << std::endl;
271  os << "15 LHe-Lvl 3 0.0 100.0 Volt % GEPLHe23" << std::endl;
272  os << "16 AGnd 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
273  os << "17 AD-1 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
274  os << "18 TREEfan 1 -10.0 10.0 Volt Volts 4.0" << std::endl;
275  os << "19 G1-Sig 1 -10.0 10.0 Volt nm/sec2 none" << std::endl;
276  os << "20 G1-Mode 1 -10.0 10.0 Volt Volts none" << std::endl;
277  os << "21 G2-Sig 1 -10.0 10.0 Volt nm/sec2 none" << std::endl;
278  os << "22 G2-Mode 1 -10.0 10.0 Volt Volts none" << std::endl;
279  os << "23 Dewr-P 1 -2.0 2.0 Volt PSI PSI_1_1" << std::endl;
280  os << "24 GBal-1 1 -10.0 10.0 Volt nm/sec2 none" << std::endl;
281  os << "25 TX-Pwr 1 -10.0 10.0 Volt %Power POWERV" << std::endl;
282  os << "26 TX-Bal 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
283  os << "27 NeckT-1 1 1.9 8.5 Volt Kelvin SiDiode-3" << std::endl;
284  os << "28 NeckT-2 1 1.9 8.5 Volt Kelvin SiDiode-3" << std::endl;
285  os << "29 BelyT-3 1 1.9 8.5 Volt Kelvin SiDiode-3" << std::endl;
286  os << "30 BodyT-4 1 1.9 8.5 Volt Kelvin SiDiode-4" << std::endl;
287  os << "31 LHeLvl 6 1.0 100.0 Volt % GEPLHe23" << std::endl;
288  os << "32 GBal-2 1 -10.0 10.0 Volt nm/sec2 none" << std::endl;
289  os << "33 TY-Pwr 1 -10.0 10.0 Volt %Power POWERV" << std::endl;
290  os << "34 TY-Bal 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
291  os << "35 Tmp-Bal 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
292  os << "36 HtrCrnt 1 -10.0 10.0 Volt %Power POWERV" << std::endl;
293  os << "37 Temp_6K 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
294  os << "38 Temp_77 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
295  os << "39 FB_Mod 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
296  os << "40 P1GasCl 1 -10.0 10.0 Volt PSI PSI-3000" << std::endl;
297  os << "41 P2GasRg 1 -10.0 10.0 Volt PSI PSI-500" << std::endl;
298  os << "42 P3CmpHi 1 -10.0 10.0 Volt PSI PSI-500" << std::endl;
299  os << "43 P4CmpLo 1 -10.0 10.0 Volt PSI PSI-500" << std::endl;
300  os << "44 P5CmpBl 1 -10.0 10.0 Volt PSI PSI-500" << std::endl;
301  os << "55 Temp-Gt 1 0.0 1.0 Volt Kelvin PT100V_K" << std::endl;
302  os << "56 Dwr_Htr 1 -10.0 10.0 Volt mA 20.0" << std::endl;
303  os << "57 Comp_DC 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
304  os << "58 CH_DC 1 -10.0 10.0 Volt Volts 1.0" << std::endl;
305  os << "59 Tmpr1 1 0.0 0.0 Celsius Celsius 1.0" << std::endl;
306  os << "60 Tmpr2 1 0.0 0.0 Celsius Celsius 1.0" << std::endl;
307  os << "61 RelHum1 1 0.4 1.7 Pcnt % 1.0" << std::endl;
308  os << "62 RelHum2 1 0.4 1.7 Pcnt % 1.0" << std::endl;
309  } // void reporttranslation(std::ostream& os)
310 
311  /*----------------------------------------------------------------------*/
312 
313  bool translationisunique(const bool& verbose)
314  {
315  bool retval=true;
316  const Channel* pc1=translationtable;
317  while (pc1->TSOFTname != NULL)
318  {
319  TSOFTchannelid tci1=tchannelid(*pc1);
320  SFFchannelid sci1=schannelid(*pc1);
321  const Channel* pc2=pc1;
322  ++pc2;
323  while (pc2->TSOFTname != NULL)
324  {
325  TSOFTchannelid tci2=tchannelid(*pc2);
326  SFFchannelid sci2=schannelid(*pc2);
327  if ((tci1.location==tci2.location)
328  && (tci1.instrument==tci2.instrument)
329  && (tci1.datatype==tci2.datatype))
330  {
331  std::cout << "ATTENTION: "
332  << "TSOFT entry appears twice in translation table:"
333  << std::endl;
334  std::cout << " "
335  << tci1.location << ":"
336  << tci1.instrument << ":"
337  << tci1.datatype << std::endl;
338  retval=false;
339  }
340  if ((sci1.station==sci2.station)
341  && (sci1.channel==sci2.channel)
342  && (sci1.instrument==sci2.instrument)
343  && (sci1.auxid==sci2.auxid))
344  {
345  std::cout << "ATTENTION: "
346  << "SFF entry appears twice in translation table:"
347  << std::endl;
348  std::cout << " "
349  << sci1.station << ":"
350  << sci1.channel << ":"
351  << sci1.instrument << ":"
352  << sci1.auxid << std::endl;
353  retval=false;
354  }
355  ++pc2;
356  }
357  ++pc1;
358  }
359  return(retval);
360  } // bool translationisunique(const bool& verbose)
361 
362  /*----------------------------------------------------------------------*/
363 
365  {
366  /*
367  std::cout << "translate: "
368  << ci.location << ":"
369  << ci.instrument << ":"
370  << ci.datatype << ":" << std::endl;
371  */
372  SFFchannelid retval;
373  retval.station=ci.location;
374  retval.channel=ci.datatype.substr(0,3);
375  retval.instrument=ci.instrument;
376  retval.auxid=ci.datatype.substr(3);
377  const Channel* pc=translationtable;
378  bool hot=true;
379  while (hot && (pc->TSOFTname != NULL))
380  {
381  DATRW_assert(pc->TSOFTname != NULL,
382  "UUPS... this is a programming error!");
383  TSOFTchannelid tci=tchannelid(*pc);
384  if ((tci.location==ci.location)
385  && (tci.instrument==ci.instrument)
386  && (tci.datatype==ci.datatype))
387  {
388  /*
389  std::cout << "found: "
390  << tci.location << ":"
391  << tci.instrument << ":"
392  << tci.datatype << ":" << std::endl;
393  */
394  SFFchannelid sci=schannelid(*pc);
395  retval.station=sci.station;
396  retval.channel=sci.channel;
397  retval.instrument=sci.instrument;
398  retval.auxid=sci.auxid;
399  hot=false;
400  }
401  ++pc;
402  }
403  return(retval);
404  } // SFFchannelid translate(const TSOFTchannelid& ci)
405 
406  /*----------------------------------------------------------------------*/
407 
409  {
410  SFFchannelid sid;
414  sid.auxid=datrw::util::trimws(insid.auxid);
415 
416  /*
417  std::cout << "translate: "
418  << sid.station << ":"
419  << sid.channel << ":"
420  << sid.instrument << ":"
421  << sid.auxid << std::endl;
422  */
423 
424  // initialize return value with default
425  ChannelDescription retval;
426  TSOFTchannelid& tid=retval.tid;
427  tid.location=sid.station;
428  tid.datatype=sid.channel;
429  tid.instrument=sid.instrument;
430  retval.sid=sid;
431  retval.cc=CNFD;
432 
433  const Channel* pc=translationtable;
434  bool hot=true;
435  while (hot && (pc->TSOFTname != NULL))
436  {
437  DATRW_assert(pc->TSOFTname != NULL,
438  "UUPS... this is a programming error!");
439  SFFchannelid sffid=schannelid(*pc);
440  if ((sid.station==sffid.station)
441  && (sid.instrument==sffid.instrument)
442  && (sid.channel==sffid.channel)
443  && (sid.auxid==sffid.auxid))
444  {
445  /*
446  std::cout << "found: "
447  << tci.location << ":"
448  << tci.instrument << ":"
449  << tci.datatype << ":" << std::endl;
450  */
451  tid=tchannelid(*pc);
452  retval.cc=pc->ConversionCode;
453  hot=false;
454  }
455  ++pc;
456  }
457  return(retval);
458  } // ChannelDescription channel(const SFFchannelid& sci)
459 
460  } // namespace tsoft
461 
462 } // namespace datrw
463 
464 /* ----- END OF channeltranslation.cc ----- */
ChannelDescription channel(const SFFchannelid &insid)
return channel data for given SFF channel ID
#define DATRW_assert(C, M)
Check an assertion and report by throwing an exception.
Definition: error.h:92
void reporttranslation(std::ostream &os)
report translation table
Convert Current from Dewar Pressure gauge to PSI.
std::vector< std::string > Tvos
vector of strings.
Definition: tsoftdata.h:104
const Econversion ConversionCode
conversion code for auxilliary channels
const char * SFFname
description to be used in SFF for this channel
const Channel translationtable[]
global variable: channel name translation tableThis table is specific for SG056 at BFO...
Convert Current from Gas Regulator and Helium Compressor Pressure gauge to PSI.
void pline(std::ostream &os, const std::string &s1, const std::string &s2, const std::string &s3, const std::string &s4, const std::string &s5, const std::string &s6, const std::string &s7)
helper function: formatted output
bool translationisunique(const bool &verbose)
check uniqueness of translation table
exception class declaration for libdatrwxx (prototypes)
Convert voltage across 23” AMI LHe sensor to % Helium.
Convert Voltage to % Power where.
Convert Voltage across Honeywell TD5 temperature sensor to degrees Celsius.
Convert voltage across Non-Magnetic Silicone Diode to Kelvins.
Convert voltage across Standard Silicone Diode to Kelvins.
std::string trimws(std::string s)
remove leading and trailing whitespace
Definition: util.cc:129
Root namespace of library.
Definition: aalibdatrwxx.cc:16
Convert Voltage to % Fan speed.
SFFchannelid translate(const TSOFTchannelid &ci)
return SFF channel ID for given TSOFT channel ID
utilities used by more than one type of data reader (prototypes)
Tvos stringtovec(const std::string &line, const std::string &delimiters)
helper function stringtok
Definition: tsoftdata.cc:341
Convert Current from Gas Regulator and Helium Compressor Pressure gauge to PSI.
hold TSOFT channel description
struct to hold a pair of channel names
Convert Voltage across Pt100 RTD to Kelvins.
Conversion factor 20.4 for Dewar Heater current.
SFFchannelid schannelid(const Channel &ci)
split SFF channel description
const char * TSOFTname
channel description used in TSOFT
TSOFTchannelid tchannelid(const Channel &ci)
split TSOFT channel description
void pfield(std::ostream &os, const std::string &s, const int &w)
helper function: print fixed width field
not found in channel translation table
hold SFF channel description
void reportdatacomments(std::ostream &os)
report comments from 1s files