]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/ITSSPDPHYSda.cxx
Initialisation.
[u/mrichter/AliRoot.git] / ITS / ITSSPDPHYSda.cxx
CommitLineData
6727e2db 1/*
2- "Contact:" - henrik.tydesjo@cern.ch
3- "Link:" -
4- "Run Type:" - PHYSICS
5- "DA Type:" - MON
6- "Number of events needed:"
7- "Input Files:" - daq db config files: spd_physics_params , previous dead ref: ./calibResults/DeadReferenceTmp/* , previous dead lists: ./calibResults/DeadToFXS/*
8- "Output Files:" - Ref Data: ./calibResults/NoisyReference/* , Ref Data: ./calibResults/DeadReference/* , noisy lists: ./calibResults/NoisyToFXS/* , persistent files: ./calibResults/DeadReferenceTmp/*,./calibResults/DeadToFXS/*
9- "Trigger types used:" PHYSICS
10*/
11
12////////////////////////////////////////////////////////////////////////////////
13// This program can be compiled in two modes. //
14// //
15// 1. Online. With the DAQ DA framework. This is the default operating mode. //
16// //
17// 2. Offline. Without the DAQ DA framework. Define the SPD_DA_OFF //
18// environment var. Call this program with the name of the executable //
19// followed by the runNr and the data files to process. //
20// //
21////////////////////////////////////////////////////////////////////////////////
22
23extern "C" {
24#include "daqDA.h"
25}
26#include "event.h"
27#include "monitor.h"
28#include "AliRawReaderDate.h"
29#include "AliITSRawStreamSPD.h"
30#include "AliITSOnlineSPDphys.h"
31#include "AliITSOnlineSPDphysAnalyzer.h"
32#include "AliITSOnlineCalibrationSPDhandler.h"
33#include "AliLog.h"
34#include <iostream>
35#include <fstream>
36#include <TROOT.h>
37#include <TPluginManager.h>
38#include <TObjArray.h>
39#include <TString.h>
40
41int main(int argc, char **argv) {
42 if (argc<2) {
43 printf("Wrong number of arguments\n");
44 return -1;
45 }
46
47 // directory structure, hard coded
4f88491f 48 char *saveDirDead = "./calibResults/Dead"; // may NOT delete content
49 char *saveDirDeadToFXS = "./calibResults/DeadToFXS"; // may delete content
6727e2db 50 char *saveDirDeadRef = "./calibResults/DeadReference"; // may delete content
51 char *saveDirDeadRefTmp = "./calibResults/DeadReferenceTmp"; // may NOT delete content
52 char *saveDirNoisyToFXS = "./calibResults/NoisyToFXS"; // may delete content
53 char *saveDirNoisyRef = "./calibResults/NoisyReference"; // may delete content
4f88491f 54 char *saveDirIdsToFXS = "./calibResults/IdsToFXS"; // may delete content
6727e2db 55 char *configFilesDir = "./configFiles"; // may delete content
56 // make sure the directory structure is put up correctly:
57 system("mkdir ./calibResults >& /dev/null");
4f88491f 58 system("mkdir ./calibResults/Dead >& /dev/null");
6727e2db 59 system("mkdir ./calibResults/DeadToFXS >& /dev/null");
60 system("mkdir ./calibResults/DeadReference >& /dev/null");
61 system("mkdir ./calibResults/DeadReferenceTmp >& /dev/null");
62 system("mkdir ./calibResults/NoisyToFXS >& /dev/null");
63 system("mkdir ./calibResults/NoisyReference >& /dev/null");
4f88491f 64 system("mkdir ./calibResults/IdsToFXS >& /dev/null");
6727e2db 65 system("mkdir ./configFiles >& /dev/null");
66 // parameters config file
67 TString paramsFileName = Form("%s/physics_params.txt",configFilesDir);
68
69 // This line is needed in case of a stand-alone application w/o
70 // $ROOTSYS/etc/system.rootrc file
71 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
72 "*",
73 "TStreamerInfo",
74 "RIO",
75 "TStreamerInfo()");
76
77 // turn off annoying warning messages
78 new AliLog;
79 AliLog::Instance()->SetGlobalDebugLevel(-20);
80
81
82 // ********* STEP 0: Get configuration files from db (if there are any) , then read parameters*********
83 UInt_t nrTuningParams = 0;
84 TObjArray paramNames; paramNames.SetOwner(kTRUE);
85 TObjArray paramVals; paramVals.SetOwner(kTRUE);
86
87 // tuning parameters:
88 Int_t par_status = 0;
89#ifndef SPD_DA_OFF
90 TString idp = "spd_physics_params";
91 par_status=daqDA_DB_getFile(idp.Data(),paramsFileName.Data());
92 if (par_status) {
93 printf("Failed to get config file %s: status=%d. Using default tuning parameters.\n",idp.Data(),par_status);
94 }
95#endif
96 if (par_status==0) {
97 ifstream paramsFile;
98 paramsFile.open(paramsFileName.Data(), ifstream::in);
99 if (paramsFile.fail()) {
100 printf("No config file (%s) present. Using default tuning parameters.\n",paramsFileName.Data());
101 }
102 else {
103 while(1) {
104 Char_t paramN[50];
105 Char_t paramV[50];
106 paramsFile >> paramN;
107 if (paramsFile.eof()) break;
108 paramsFile >> paramV;
109 TString* paramNS = new TString(paramN);
110 TString* paramVS = new TString(paramV);
111 paramNames.AddAtAndExpand((TObject*)paramNS,nrTuningParams);
112 paramVals.AddAtAndExpand((TObject*)paramVS,nrTuningParams);
113 nrTuningParams++;
114 if (paramsFile.eof()) break;
115 }
116 paramsFile.close();
117 }
118 }
119 // for (UInt_t i=0; i<nrTuningParams; i++) {
120 // printf("Entry %d: N=%s , V=%s\n",i,((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
121 // }
122
123
124
125
126
127 // ********* STEP 1: Produce phys container files (Reference Data). ***********************************
128
129#ifndef SPD_DA_OFF
130 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
131#else
132 int runNr = atoi(argv[1]);
133 int startSeg = 2;
134#endif
135
136
137 // container objects
138 AliITSOnlineSPDphys *physObj[20];
139 Bool_t bPhysInit[20];
140 for (UInt_t eqId=0; eqId<20; eqId++) {
141 physObj[eqId]=NULL;
142 bPhysInit[eqId]=kFALSE;
143 }
144
145
146 // loop over run segments in case of offline mode
147#ifdef SPD_DA_OFF
148 for (int segNr=startSeg; segNr<argc; segNr++) {
149#endif
150
151 int status;
152
153 /* define data source : */
154#ifndef SPD_DA_OFF
155 status=monitorSetDataSource( argv[1] ); // should be "^SPD" in order to get full detector online
156#else
157 status=monitorSetDataSource( argv[segNr] );
158#endif
159 if (status!=0) {
160 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
161 return -1;
162 }
163 /* declare monitoring program */
164 status=monitorDeclareMp("ITS_SPD_PHYS");
165 if (status!=0) {
166 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
167 return -1;
168 }
169 /* define wait event timeout - 1s max */
170 monitorSetNowait();
171 monitorSetNoWaitNetworkTimeout(1000);
172
173
174 UInt_t eventNr=0;
175
176 /* main loop (infinite) */
177 for(;;) {
178
179 struct eventHeaderStruct *event;
180 eventTypeType eventT;
181
182 /* check shutdown condition */
183#ifndef SPD_DA_OFF
184 if (daqDA_checkShutdown()) {break;}
185#endif
186
187 /* get next event (blocking call until timeout) */
188 status=monitorGetEventDynamic((void **)&event);
189 if (status==MON_ERR_EOF) {
190 printf ("End of File detected\n");
191 break; /* end of monitoring file has been reached */
192 }
193
194 if (status!=0) {
195 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
196 break;
197 }
198
199 /* retry if got no event */
200 if (event==NULL) {
201 continue;
202 }
203
204 eventT=event->eventType;
205 if (eventT == PHYSICS_EVENT){
206
207 eventNr++;
208 // printf("eventNr %d\n",eventNr);
209
210 AliRawReader *reader = new AliRawReaderDate((void*)event);
211 AliITSRawStreamSPD *str = new AliITSRawStreamSPD(reader);
212
213 // for (UInt_t eqId=0; eqId<20; eqId++) {
214 // reader->Reset();
215 // reader->Select("ITSSPD",eqId,eqId);
216
217 while (str->Next()) {
218
219 Int_t eqId = reader->GetDDLID();
220 if (eqId>=0 && eqId<20) {
221 if (!bPhysInit[eqId]) {
222 TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eqId);
223 physObj[eqId] = new AliITSOnlineSPDphys(fileName.Data());
224 physObj[eqId]->AddRunNr(runNr);
225 physObj[eqId]->SetEqNr(eqId);
226 bPhysInit[eqId]=kTRUE;
227 }
228
229 UInt_t hs = str->GetHalfStaveNr();
230 UInt_t chip = str->GetChipAddr();
231 physObj[eqId]->IncrementHits(hs,chip,str->GetChipCol(),str->GetChipRow());
232
233 }
234 }
235
236 for (UInt_t eqId=0; eqId<20; eqId++) {
237 if (bPhysInit[eqId]) {
238 physObj[eqId]->IncrementNrEvents();
239 }
240 }
241
242 // }
243
244 delete str;
245 delete reader;
246
247 }
248
249 /* free resources */
250 free(event);
251
252 }
253
254
255#ifdef SPD_DA_OFF
256 printf("progress: %d\n",(unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
257 }
258#endif
259
260 // clean up phys objects (also saves them)
261 for (UInt_t eqId=0; eqId<20; eqId++) {
262 if (physObj[eqId]!=NULL) delete physObj[eqId];
263 }
264
265
266
267
268
269 // ********* STEP 2: Analyze phys container files. ************************************************
270
271 // clear noisyToFXS dir:
272 TString command;
273 command = Form("cd %s; rm -f *",saveDirNoisyToFXS);
274 system(command.Data());
4f88491f 275 // clear deadToFXS dir:
276 command = Form("cd %s; rm -f *",saveDirDeadToFXS);
6727e2db 277 system(command.Data());
278
279
280 // create calibration handler and read dead from previous calibrations
281 AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler();
4f88491f 282 handler->SetFileLocation(saveDirDead);
6727e2db 283 handler->ReadDeadFromFiles();
284
285
286 UInt_t firstRunNrDead = runNr;
287
288
289 UInt_t nrEnoughStatNoisy = 0;
290 UInt_t nrEqActiveNoisy = 0;
291 Bool_t eqActiveNoisy[20];
292
293 // *** *** *** start loop over equipments (eq_id)
294 for (UInt_t eqId=0; eqId<20; eqId++) {
295 eqActiveNoisy[eqId] = kFALSE;
296
297 // create analyzer for this eq
298 TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eqId);
299 AliITSOnlineSPDphysAnalyzer *noisyAnalyzer = new AliITSOnlineSPDphysAnalyzer(fileName.Data(),handler);
300
301 // check data in container
302 if (noisyAnalyzer->GetEqNr() != eqId) {
303 if (noisyAnalyzer->GetEqNr() != 999) {
304 printf("Error: Mismatching EqId in Container data and filename (%d!=%d). Skipping.\n",
305 noisyAnalyzer->GetEqNr(),eqId);
306 }
307 delete noisyAnalyzer;
308 continue;
309 }
310
311 nrEqActiveNoisy++;
312 eqActiveNoisy[eqId] = kTRUE;
313
314 // configure analyzer with tuning parameters etc:
315 for (UInt_t i=0; i<nrTuningParams; i++) {
316 noisyAnalyzer->SetParam(((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
317 }
318
319 printf("SPD phys STEP 2: Noisy search for eq %d\n",eqId);
320
321 // search for noisy pixels:
322 nrEnoughStatNoisy += noisyAnalyzer->ProcessNoisyPixels();
323
324 // copy this phys obj to temporary dead reference dir to process after noisy search
325 TString fileNameDead = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eqId);
326 AliITSOnlineSPDphys* physObj = new AliITSOnlineSPDphys(fileNameDead.Data());
327 physObj->AddPhys(noisyAnalyzer->GetOnlinePhys());
328 if (physObj->GetNrRuns()>0) {
329 UInt_t firstRunNr = physObj->GetRunNr(0);
330 if (firstRunNrDead>firstRunNr) {
331 firstRunNrDead=firstRunNr;
332 }
333 }
334 // remove noisy pixels from dead hitmap
4f88491f 335 for (UInt_t hs=0; hs<6; hs++) {
336 for (UInt_t chip=0; chip<10; chip++) {
337 for (UInt_t ind=0; ind<handler->GetNrNoisyC(eqId,hs,chip); ind++) {
338 UInt_t col = handler->GetNoisyColAtC(eqId,hs,chip,ind);
339 UInt_t row = handler->GetNoisyRowAtC(eqId,hs,chip,ind);
340 physObj->AddHits(hs,chip,col,row,-noisyAnalyzer->GetOnlinePhys()->GetHits(hs,chip,col,row));
341 }
6727e2db 342 }
343 }
344
345 delete physObj;
346 delete noisyAnalyzer;
347
348#ifndef SPD_DA_OFF
349 daqDA_progressReport((unsigned int)((eqId+1)*2.5));
350#else
351 printf("progress: %d\n",(unsigned int)(50+(eqId+1)*1.25));
352#endif
353 }
354 // *** *** *** end loop over equipments (eq_id)
355
356 printf("Noisy search finished. %d noisy pixels found. %d chips (%d) had enough statistics.\n",
357 handler->GetNrNoisy(),nrEnoughStatNoisy,nrEqActiveNoisy*60);
358 handler->SetFileLocation(saveDirNoisyToFXS);
359 handler->WriteNoisyToFiles();
360
361
362
363
364
365
366
367
368 UInt_t nrEnoughStatChips = 0;
369 UInt_t nrDeadChips = 0;
370 UInt_t nrInefficientChips = 0;
371 UInt_t nrEqActiveDead = 0;
372 Bool_t eqActiveDead[20];
373
374 // *** *** *** start loop over equipments (eq_id)
375 for (UInt_t eqId=0; eqId<20; eqId++) {
376 eqActiveDead[eqId] = kFALSE;
377
378 // setup analyzer for dead search
379 TString fileNameDead = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eqId);
380 AliITSOnlineSPDphys* physObj = new AliITSOnlineSPDphys(fileNameDead.Data());
381 AliITSOnlineSPDphysAnalyzer* deadAnalyzer = new AliITSOnlineSPDphysAnalyzer(physObj,handler);
382 // check data in container
383 if (deadAnalyzer->GetEqNr() != eqId) {
384 if (deadAnalyzer->GetEqNr() != 999) {
385 printf("Error: Mismatching EqId in Dead Container data and filename (%d!=%d). Skipping.\n",
386 deadAnalyzer->GetEqNr(),eqId);
387 }
388 delete deadAnalyzer;
389 continue;
390 }
391
392 nrEqActiveDead++;
393 eqActiveDead[eqId] = kTRUE;
394
395 // configure analyzer with tuning parameters etc:
396 for (UInt_t i=0; i<nrTuningParams; i++) {
397 deadAnalyzer->SetParam(((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
398 }
399
400 printf("SPD phys STEP 2: Dead search for eq %d\n",eqId);
401
402 // search for dead pixels:
403 nrEnoughStatChips += deadAnalyzer->ProcessDeadPixels();
404 nrDeadChips += deadAnalyzer->GetNrDeadChips();
405 nrInefficientChips += deadAnalyzer->GetNrInefficientChips();
406
407 delete deadAnalyzer;
408
409#ifndef SPD_DA_OFF
410 daqDA_progressReport((unsigned int)(50+(eqId+1)*2.5));
411#else
412 printf("progress: %d\n",(unsigned int)(75+(eqId+1)*1.25));
413#endif
414 }
415 // *** *** *** end loop over equipments (eq_id)
416
417
418 printf("Dead search finished. %d dead pixels in total.\n%d chips (%d) had enough statistics. %d chips were dead. %d chips were inefficient.\n",handler->GetNrDead(),nrEnoughStatChips,nrEqActiveDead*60,nrDeadChips,nrInefficientChips);
4f88491f 419 handler->SetFileLocation(saveDirDead);
6727e2db 420 handler->WriteDeadToFilesAlways();
6727e2db 421
4f88491f 422 handler->SetFileLocation(saveDirDeadToFXS);
423 handler->WriteDeadToFilesAlways();
424// *** old code (used if not all dead data should be uploaded)
425// UInt_t nrDeadFilesToTar = 0;
426// handler->SetFileLocation(saveDirDeadToFXS);
427// for (UInt_t eqId=0; eqId<20; eqId++) {
428// if (eqActiveDead[eqId]) {
429// handler->WriteDeadToFile(eqId);
430// nrDeadFilesToTar++;
431// }
432// }
433//***
434
435 TString idsFXSFileName = Form("%s/FXSids_run_%d.txt",saveDirIdsToFXS,runNr);
436 ofstream idsFXSfile;
437 idsFXSfile.open(idsFXSFileName.Data());
6727e2db 438
439
440 // if there is no chip in category "needsMoreStat"
441 if (nrEnoughStatChips+nrDeadChips+nrInefficientChips == nrEqActiveDead*60) {
442 // calibration is complete
443 printf("Dead calibration is complete.\n");
4f88491f 444
445
446
447 // send reference data for dead pixels to FXS
448 TString tarFiles = "";
6727e2db 449 for (UInt_t eqId=0; eqId<20; eqId++) {
450 if (eqActiveDead[eqId]) {
6727e2db 451 // move file to ref dir
4f88491f 452 TString fileName = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eqId);
6727e2db 453 TString newFileName = Form("%s/SPDphys_dead_run_%d_%d_eq_%d.root",saveDirDeadRef,firstRunNrDead,runNr,eqId);
454 TString command = Form("mv -f %s %s",fileName.Data(),newFileName.Data());
455 system(command.Data());
4f88491f 456
457 tarFiles.Append(Form("SPDphys_dead_run_%d_%d_eq_%d.root ",firstRunNrDead,runNr,eqId));
6727e2db 458 }
459 }
4f88491f 460 TString send_command = Form("cd %s; tar -cf ref_phys_dead.tar %s",saveDirDeadRef,tarFiles.Data());
461 system(send_command.Data());
462 TString fileName = Form("%s/ref_phys_dead.tar",saveDirDeadRef);
463 TString id = "SPD_ref_phys_dead";
464#ifndef SPD_DA_OFF
3b1411e4 465 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
4f88491f 466 if (status!=0) {
467 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
468 return -1;
469 }
470#endif
471 idsFXSfile << Form("%s\n",id.Data());
472// for (UInt_t eqId=0; eqId<20; eqId++) { // OLD CODE NOT TARED
473// if (eqActiveDead[eqId]) {
474// TString fileName = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eqId);
475// // move file to ref dir
476// TString newFileName = Form("%s/SPDphys_dead_run_%d_%d_eq_%d.root",saveDirDeadRef,firstRunNrDead,runNr,eqId);
477// TString command = Form("mv -f %s %s",fileName.Data(),newFileName.Data());
478// system(command.Data());
479// // send ref data to FXS
480// TString id = Form("SPD_ref_phys_dead_%d",eqId);
481//#ifndef SPD_DA_OFF
482// Int_t status = daqDA_FES_storeFile(newFileName.Data(),id.Data());
483// if (status!=0) {
484// printf("Failed to export file %s , status %d\n",newFileName.Data(),status);
485// return -1;
486// }
487//#endif
488// idsFXSfile << Form("%s\n",id.Data());
489// }
490// else {
491// TString command = Form("rm -f %s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eqId);
492// system(command.Data());
493// }
494// }
6727e2db 495 }
496
4f88491f 497
6727e2db 498 // send reference data for this run to FXS
4f88491f 499 TString tarFiles = "";
6727e2db 500 for (UInt_t eqId=0; eqId<20; eqId++) {
501 if (eqActiveNoisy[eqId]) {
4f88491f 502 tarFiles.Append(Form("SPDphys_run_%d_eq_%d.root ",runNr,eqId));
6727e2db 503 }
504 }
4f88491f 505 TString send_command = Form("cd %s; tar -cf ref_phys.tar %s",saveDirNoisyRef,tarFiles.Data());
506 system(send_command.Data());
507 TString fileName = Form("%s/ref_phys.tar",saveDirNoisyRef);
508 TString id = "SPD_ref_phys";
509#ifndef SPD_DA_OFF
3b1411e4 510 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
4f88491f 511 if (status!=0) {
512 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
513 return -1;
514 }
6727e2db 515#endif
4f88491f 516 idsFXSfile << Form("%s\n",id.Data());
517
518
519// // send reference data for this run to FXS - OLD CODE NOT TARED
520// for (UInt_t eqId=0; eqId<20; eqId++) {
521// if (eqActiveNoisy[eqId]) {
522// TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eqId);
523// TString id = Form("SPD_ref_phys_%d",eqId);
524//#ifndef SPD_DA_OFF
525// Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
526// if (status!=0) {
527// printf("Failed to export file %s , status %d\n",fileName.Data(),status);
528// return -1;
529// }
530// idsFXSfile << Form("%s\n",id.Data());
531// }
532// }
533//#endif
534
535
536 // send dead pixels to FXS
537 // if (nrDeadFilesToTar>0) { //*** old code (used if not all dead data should be uploaded)
6727e2db 538 // send a tared file of all the dead files
4f88491f 539 send_command = Form("cd %s; tar -cf dead_phys.tar *",saveDirDeadToFXS);
6727e2db 540 // printf("\n\n%s\n\n",command.Data());
541 system(send_command.Data());
4f88491f 542 fileName = Form("%s/dead_phys.tar",saveDirDeadToFXS);
543 id = "SPD_phys_dead";
6727e2db 544#ifndef SPD_DA_OFF
6727e2db 545 Int_t send_status = daqDA_FES_storeFile(fileName.Data(),id.Data());
546 if (send_status!=0) {
547 printf("Failed to export file %s , status %d\n",fileName.Data(),send_status);
548 return -1;
549 }
550#endif
4f88491f 551 idsFXSfile << Form("%s\n",id.Data());
552 // } //*** old code (used if not all dead data should be uploaded)
553
6727e2db 554
4f88491f 555 // send noisy pixels to FXS
6727e2db 556 if (handler->GetNrNoisy()>0) { // there must be at least one file created
557 // send a tared file of all the noisy files
558 TString command = Form("cd %s; tar -cf noisy_phys.tar *",saveDirNoisyToFXS);
559 // printf("\n\n%s\n\n",command.Data());
560 system(command.Data());
6727e2db 561 TString fileName = Form("%s/noisy_phys.tar",saveDirNoisyToFXS);
562 TString id = "SPD_phys_noisy";
4f88491f 563#ifndef SPD_DA_OFF
3b1411e4 564 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
6727e2db 565 if (status!=0) {
566 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
567 return -1;
568 }
569#endif
4f88491f 570 idsFXSfile << Form("%s\n",id.Data());
6727e2db 571 }
572
573
4f88491f 574 // send ids file to FXS
575 idsFXSfile.close();
576 id = "SPD_id_list";
577#ifndef SPD_DA_OFF
3b1411e4 578 status = daqDA_FES_storeFile(idsFXSFileName.Data(),id.Data());
4f88491f 579 if (status!=0) {
580 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
581 return -1;
582 }
583#endif
584
585
6727e2db 586
587
588 delete handler;
589
590
591 return 0;
592}