25 fTimeZone = getenv(
"TZ");
26 setenv(
"TZ",
":Europe/Rome", 1);
34 setenv(
"TZ", fTimeZone, 1);
47 fIter = fFileList.begin();
48 fPreTriggerSamples = GetInt(
"PreTriggerSamples",128);
49 fIsNoise = GetBool(
"NoiseFile",
false);
50 fDebugOn = GetBool(
"DebugOn",
false,
false);
71 int partial = filesIter-files.begin();
72 if (partial!=fPartialToJump)
74 Info(
"Jumping to event %d. Closing partial %d. Opening %d",event, partial, fPartialToJump);
75 gzclose(fCurrentFile);
76 filesIter = files.begin()+fPartialToJump;
77 fCurrentFile = gzopen(filesIter->filename.data(),
"rb");
80 z_off_t off = gzseek(fCurrentFile, event*frecord_size, SEEK_SET);
86 sprintf(buf,
"Cannot jump to event : %llu", event);
87 fErr.SetDescription(buf);
101 if(fEventNumber == 0){
102 fCurrentFile = gzopen(filesIter->filename.data(),
"rb");
106 int ret = gzread(fCurrentFile,&p,frecord_size);
108 if ( ret != frecord_size) {
110 Debug(
"End of file %s at event %d",filesIter->filename.data(),fEventNumber);
111 gzclose(fCurrentFile);
113 if(filesIter != filesEnd){
114 fCurrentFile = gzopen(filesIter->filename.data(),
"rb");
120 if (fIter != fFileList.end()){
122 fCurrentFile = gzopen(filesIter->filename.data(),
"rb");
139 QSampleInfo &sampleInfo = pulseInfo.GetMasterSample();
140 pulseInfo.SetChannelId(p.
chan + 1);
154 std::string headFlag = p.
cHeader;
155 headFlag = headFlag.substr(0,8);
159 if((headFlag ==
"HEADSRCE") || (headFlag ==
"headsrce")){
171 else if((headFlag ==
"HEADSRCH") || (headFlag ==
"headsrch")){
183 else if((headFlag ==
"HEADSRCL") || (headFlag ==
"headsrcl")){
195 else if((headFlag ==
"HEADSIGN") or (headFlag ==
"headsign") or
196 (headFlag ==
"HEADFLAG") or (headFlag ==
"headflag")){
206 else if((headFlag ==
"HEADTRND") or (headFlag ==
"headtrnd") or
207 (headFlag ==
"HEADNOIS") or (headFlag ==
"headnois") ){
217 Debug(
" record structure: %s at event %d, channel %d",headFlag.c_str(), fEventNumber,p.
chan);
231 unsigned long long tNs = (
unsigned long long)(timetenthms*1e5);
232 time.SetFromStartRunNs(tNs);
234 int month=atoi(fDate.substr(0,2).c_str());
235 int day=atoi(fDate.substr(3,2).c_str());
236 int year=atoi(fDate.substr(6,4).c_str());
237 int hour=atoi(fDate.substr(11,2).c_str());
238 int min=atoi(fDate.substr(14,2).c_str());
239 int sec=atoi(fDate.substr(17,2).c_str());
240 time.SetStartRunUnix(year,month,day,hour,
min,sec);
244 readerDebug.
fTime = time;
247 static UInt_t offset;
255 samplesADC.Resize(fNumSamples);
257 samplesADC[0] += offset;
259 samplesADC[1] = ((int)p.
sampl[0] + samplesADC[0]);
260 for(Int_t i = 2; i < fNumSamples; i++){
261 samplesADC[i] = (int)(p.
sampl[i-1] + samplesADC[i-1]);
265 samplesADC[1] = ((int)p.
sampl[0] );
266 for(Int_t i = 2; i < fNumSamples; i++){
267 samplesADC[i] = (int)(p.
sampl[i-1] );
270 pulse.SetSamplesADC(samplesADC);
277 if(fName != fFileUName){
279 OpenNewFile(fName +
".hdr");
281 std::string suffix = fName.substr(fName.length()-5 ,5);
283 if(suffix.at(0) ==
'c') {
286 else if(suffix.at(0) ==
'q') {
290 Info(
"Current file is %s", fFileUName.c_str());
292 int runInt = strtol(fRunNumber.c_str(),0,10)+(int)fDetector*100000;
297 readerDebug.
fRun = runInt;
311 fName = fIter->c_str();
313 fRunNumber.erase(0,fRunNumber.size()-4);
317 sprintf(s,
"%s.hdr",fName.c_str());
318 Info(
"Opening file: %s",s);
321 FILE *fp = fopen(s,
"rt");
322 if ( !fp && !fIsNoise ) {
323 Panic(
"Cannot find file %s",s);
328 if(GetBool(
"NewHDR",
false,
false)) {
329 float minADC, maxADC;
330 fscanf(fp,
"%f %f\n",&minADC,&maxADC);
331 fMinAdcRange = minADC;
332 fMaxAdcRange = maxADC;
333 fscanf(fp,
"%d\n",&fNumSamples);
334 fscanf(fp,
"%i\n",&pulseDurationMs);
337 fscanf(fp,
"%d %d %i\n",&minADC,&maxADC, &fNumSamples);
338 fMinAdcRange = minADC;
339 fMaxAdcRange = maxADC;
340 fscanf(fp,
"%i\n",&pulseDurationMs);
345 char c1[50],c2[50], d[50];
346 while(fscanf(fp,
"%s %s \n",c1,c2)!=EOF){
348 if(std::string(c1)==
"Start"&&std::string(c2)==
"date"){
349 fscanf(fp,
"%s \n",d);
350 fDate=d+std::string(
" ");
353 if(std::string(c1)==
"Start"&&std::string(c2)==
"time"){
354 fscanf(fp,
"%s \n",d);
361 Debug(
"header file closed");
362 Debug(
"%s",fDate.c_str());
365 Info(
"Header fime not found: using default values for ADC range, number of samples, sampling frequency and date");
370 fDate =
"01-01-1980 00:00:00";
373 frecord_size = 8 + 2 + 4 + (2 * fNumSamples);
377 if(fIsNoise ==
false){
380 sprintf(s,
"%s.%03d.gz",fName.c_str(),NumFiles);
381 FILE *fp = fopen(s,
"rb");
384 sprintf(s,
"%s.%03d_d.gz",fName.c_str(),NumFiles);
391 Debug(
"Found file %s.%03d_d.gz",fName.c_str(),NumFiles);
404 sprintf(s,
"%s.noi",fName.c_str());
405 FILE *fp = fopen(s,
"rb");
408 sprintf(s,
"%s.noi_d.gz",fName.c_str());
415 Debug(
"Found file %s.noi_d.gz",fName.c_str(),NumFiles);
422 Panic(
"No noise file found: exiting");
427 filesIter=files.begin();
428 filesEnd=files.end();
431 Debug(
"%d files found for header=%s",NumFiles,fName.c_str());
433 Panic(
"%d files found for header=%s",NumFiles,fName.c_str());
435 Debug(
"NumSamples %d, SamplFreq %f, MinADC %f, MaxADC %f",fNumSamples,
fSamplingFrequency, fMinAdcRange, fMaxAdcRange);
chanRunData fSamplingFrequency
#define REGISTER_MODULE(clazz)
double min(const Diana::QVector &v)
Milano-DAQ binary data reader.
virtual ~MQinoDataReader()
void Done()
Done method is called after event loop. This method must be implemented by inheriting classes.
bool Do(QEventAssembler &evi)
Do method is called for each event, getting the QEventAssembler as argument. This method must be impl...
const QError & JumpToEvent(Long64_t event)
Called when another module ask for a specific eventnumber in the next Do(). Implementation of this me...
void NewRun()
read header whenever tha run is changed
void Init(QEventAssembler &evi)
Init method is called before event loop, getting the QEventAssembler as argument This method must be ...
error class with error type and description
Visitor class of QEvent that provides full handling of QEvent.
QEvent & GetEvent()
Get the QEvent.
void Get(const char *owner, WriteHandle< Q > &handle)
Get QObject from the event in write mode. This method has to be called in the event loop,...
void Add(const char *owner, WriteHandle< Q > &handle)
Add QObject to the event. This method has to be called before the event loop, e.g....
void Get(const char *owner, ReadHandle< Q > &handle) const
Get a QObject Handle in read mode.
void Add(WriteHandle< Q > &handle)
Add a QObject to the event.
virtual bool IsValid() const
Check object validity.
debug data for test sequences
Raw event: bolometer channel, trigger positions and types.
Raw event: sampled waveform.
contains information on flagged samples
void SetPulserDelay(Int_t delay)
set pulser delay in ms
void SetIsNoise()
Set event type to Noise.
void SetEventNumber(Int_t eventNumber)
Set EventNumber.
void SetIsPulser()
Set event type to Pulser.
void SetTriggerNumber(Int_t n)
Set trigger number (1 to 4)
void SetSampleIndex(Int_t index)
Set SampleIndex.
void SetIsSignal()
Set event type to Signal.
write handle to access and add QEvent QObject's.
structure for raw data Qino format
unsigned short pulseTime1
unsigned short pulseTime2