2 Contact: henrik.tydesjo@cern.ch
3 Link: tydes.home.cern.ch/tydes/doc/CalibrationOverview/CalibrationAlgorithms/
4 Run Type: DAQ_MIN_TH_SCAN,DAQ_MEAN_TH_SCAN,DAQ_UNIFORMITY_SCAN,DAQ_NOISY_PIX_SCAN,DAQ_PIX_DELAY_SCAN
6 Number of events needed: Depending on scan type
7 Input Files: spd_standal_params,spd_perm_noisy , ./calibResults/ScanNoisy/* , raw data
8 Output Files: ./calibResults/ScanReference/* , ./calibResults/ScanDCSconfigToFXS/* , ./calibResults/ScanNoisyToFXS/* , ./calibResults/ScanNoisy/*
9 Trigger types used: PHYSICS
12 ////////////////////////////////////////////////////////////////////////////////
13 // This program can be compiled in two modes. //
15 // 1. With the DAQ DA framework on. This is the default operating mode. //
16 // Call this program with the name of the executable followed by the //
17 // data files to process. //
19 // 2. Without the DAQ DA framework on. Define the SPD_DA_OFF environment var. //
20 // Call this program with the name of the executable followed by the //
21 // runNr and the data files to process. //
23 ////////////////////////////////////////////////////////////////////////////////
32 #include "AliRawReaderDate.h"
33 #include "AliITSRawStreamSPD.h"
34 #include "AliITSOnlineSPDscan.h"
35 #include "AliITSOnlineSPDscanSingle.h"
36 #include "AliITSOnlineSPDscanMultiple.h"
37 #include "AliITSOnlineSPDscanMeanTh.h"
38 #include "AliITSOnlineSPDscanAnalyzer.h"
39 #include "AliITSOnlineCalibrationSPDhandler.h"
44 #include <TPluginManager.h>
45 #include <TObjArray.h>
46 #include <TObjString.h>
50 int main(int argc, char **argv) {
52 printf("Wrong number of arguments\n");
56 // directory structure, hard coded
57 char *saveDirNoisy = "./calibResults/ScanNoisy"; // may NOT delete content
58 char *saveDirNoisyToFXS = "./calibResults/ScanNoisyToFXS"; // may delete content
59 char *saveDirDCSconfigToFXS= "./calibResults/ScanDCSconfigToFXS"; // may delete content
60 char *saveDirRef = "./calibResults/ScanReference"; // may delete content
61 char *saveDirIdsToFXS = "./calibResults/IdsToFXS"; // may delete content
62 char *configFilesDir = "./configFiles"; // may delete content
64 // make sure the directory structure is correct:
65 system("mkdir ./calibResults >& /dev/null");
66 system("mkdir ./calibResults/ScanNoisy >& /dev/null");
67 system("mkdir ./calibResults/ScanNoisyToFXS >& /dev/null");
68 system("mkdir ./calibResults/ScanDCSconfigToFXS >& /dev/null");
69 system("mkdir ./calibResults/ScanReference >& /dev/null");
70 system("mkdir ./calibResults/IdsToFXS >& /dev/null");
71 system("mkdir ./configFiles >& /dev/null");
72 // prameters config files
73 TString paramsFileName = Form("%s/standal_params.txt",configFilesDir);
74 TString permNoisyFileName = Form("%s/perm_noisy.txt",configFilesDir);
76 TFitter *fitter = new TFitter(3);
77 TVirtualFitter::SetFitter(fitter);
79 // This line is needed in case of a stand-alone application w/o
80 // $ROOTSYS/etc/system.rootrc file
81 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
87 // turn off annoying warning messages
88 // NB: Should not be handled here
89 AliLog* logger = AliLog::GetRootLogger();
90 logger->SetGlobalDebugLevel(-20);
93 enum calib_types{MINTH,MEANTH,DAC,UNIMA,NOISE,DELAY};
96 // ********* STEP 0: Get configuration files from db (if there are any) , then read parameters*********
97 UInt_t nrTuningParams = 0;
98 TObjArray paramNames; paramNames.SetOwner(kTRUE);
99 TObjArray paramVals; paramVals.SetOwner(kTRUE);
101 // tuning parameters:
104 TString idp = "spd_standal_params";
105 status=daqDA_DB_getFile(idp.Data(),paramsFileName.Data());
107 printf("Failed to get config file %s: status=%d. Using default tuning parameters.\n",idp.Data(),status);
108 TString rmCmd = Form("rm -f %s",paramsFileName.Data());
109 system(rmCmd.Data());
114 paramsFile.open(paramsFileName.Data(), ifstream::in);
115 if (paramsFile.fail()) {
116 printf("No config file (%s) present. Using default tuning parameters.\n",paramsFileName.Data());
122 paramsFile >> paramN;
123 if (paramsFile.eof()) break;
124 paramsFile >> paramV;
125 paramNames.AddAtAndExpand(new TObjString(paramN),nrTuningParams);
126 paramVals.AddAtAndExpand(new TObjString(paramV),nrTuningParams);
128 if (paramsFile.eof()) break;
133 // for (UInt_t i=0; i<nrTuningParams; i++) {
134 // // printf("Entry %d: N=%s , V=%s\n",i,((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
135 // printf("Entry %d: N=%s , V=%s\n",i,((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
139 Int_t permstatus = 0;
141 TString idn = "spd_perm_noisy";
142 permstatus=daqDA_DB_getFile(idn.Data(),permNoisyFileName.Data());
144 printf("Failed to get config file %s: status=%d. No permanently noisy pixels will be added.\n",idn.Data(),permstatus);
145 TString rmCmd = Form("rm -f %s",permNoisyFileName.Data());
146 system(rmCmd.Data());
153 // ********* STEP 1: Produce scan container files (Reference Data). ***********************************
157 if (getenv("DATE_RUN_NUMBER")==0) {
158 printf("DATE_RUN_NUMBER not properly set.\n");
161 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
163 int runNr = atoi(argv[1]);
168 AliITSOnlineSPDscan *scanObj[20];
169 Bool_t bScanInit[20];
170 for (UInt_t eqId=0; eqId<20; eqId++) {
172 bScanInit[eqId]=kFALSE;
174 // header data variables
176 Bool_t halfStaveScanned[20][6];
178 Bool_t dataFormat[20];
180 Bool_t chipPresent[20][6][10];
189 UInt_t dacHigh[20][6];
190 UInt_t dacLow[20][6];
192 Bool_t minTHchipPresent[20][10];
193 // current scan step flag
194 Int_t currentStep[20];
195 for (UInt_t eqId=0; eqId<20; eqId++) currentStep[eqId] = 9999;
197 // loop over run segments
198 for (int segNr=startSeg; segNr<argc; segNr++) {
202 /* define data source : this is argument 1 */
203 status=monitorSetDataSource( argv[segNr] );
205 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
208 /* declare monitoring program */
209 status=monitorDeclareMp("ITS_SPD_CAL");
211 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
214 /* define wait event timeout - 1s max */
216 monitorSetNoWaitNetworkTimeout(1000);
221 /* main loop (infinite) */
224 struct eventHeaderStruct *event;
225 eventTypeType eventT;
227 /* check shutdown condition */
229 if (daqDA_checkShutdown()) {break;}
231 /* get next event (blocking call until timeout) */
232 status=monitorGetEventDynamic((void **)&event);
233 if (status==MON_ERR_EOF) {
234 printf ("End of File detected\n");
235 break; /* end of monitoring file has been reached */
238 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
241 /* retry if got no event */
246 eventT=event->eventType;
247 if (eventT == PHYSICS_EVENT) {
250 // printf("eventNr %d\n",eventNr);
252 AliRawReader *reader = new AliRawReaderDate((void*)event);
253 AliITSRawStreamSPD *str = new AliITSRawStreamSPD(reader);
255 for (UInt_t eqId=0; eqId<20; eqId++) {
258 reader->Select("ITSSPD",eqId,eqId);
260 // Hit Event flags, specific for one event
261 Bool_t hitEventHSIncremented[6];
262 Bool_t hitEventChipIncremented[6][10];
263 for (UInt_t hs=0; hs<6; hs++) {
264 hitEventHSIncremented[hs] = kFALSE;
265 for (UInt_t chip=0; chip<10; chip++) {
266 hitEventChipIncremented[hs][chip] = kFALSE;
270 if (str->ReadCalibHeader()>0) {
271 // first check the type:
272 if (bScanInit[eqId] && type[eqId]!=str->GetHtype()) {
273 printf("Calib header problem. Type changed (%d -> %d)!\n",type[eqId],str->GetHtype());
277 routerNr[eqId] = str->GetHrouterNr();
278 type[eqId] = str->GetHtype();
279 dataFormat[eqId] = str->GetHdataFormat();
280 triggers[eqId] = str->GetHtriggers();
281 dacStart[eqId] = str->GetHdacStart();
282 dacEnd[eqId] = str->GetHdacEnd();
283 dacStep[eqId] = str->GetHdacStep();
284 dacId[eqId] = str->GetHdacId();
285 rowStart[eqId] = str->GetHrowStart();
286 rowEnd[eqId] = str->GetHrowEnd();
287 rowValue[eqId] = str->GetHrowValue();
288 dacValue[eqId] = str->GetHdacValue(); // this will change below for MEANTH scan
290 for (UInt_t hs=0; hs<6; hs++) {
291 halfStaveScanned[eqId][hs] = str->GetHhalfStaveScanned(hs);
292 dacHigh[eqId][hs] = str->GetHdacHigh(hs);
293 dacLow[eqId][hs] = str->GetHdacLow(hs);
294 TPAmp[eqId][hs] = str->GetHTPAmp(hs);
295 for (UInt_t chip=0; chip<10; chip++) {
296 chipPresent[eqId][hs][chip] = str->GetHchipPresent(hs,chip);
297 if (type[eqId]==MEANTH && chipPresent[eqId][hs][chip]) dacValue[eqId] = str->GetHdacLow(hs);
300 for (UInt_t chip=0; chip<10; chip++) {
301 minTHchipPresent[eqId][chip] = str->GetHminTHchipPresent(chip);
304 currentStep[eqId] = (dacValue[eqId]-dacStart[eqId])/dacStep[eqId];
305 if (type[eqId]==DELAY) {
306 currentStep[eqId]=currentStep[eqId]*2;
307 dacValue[eqId]=dacValue[eqId]*2;
308 if (dacHigh[eqId][0]==128) { // misc_ctrl value
309 currentStep[eqId]=currentStep[eqId]+1;
310 dacValue[eqId]=dacValue[eqId]+1;
315 if (routerNr[eqId]!=eqId) {
316 printf("Router nr problem? Router nr %d != EqID %d\n",routerNr[eqId],eqId);
319 if (!bScanInit[eqId]) {
320 // initialize container object
321 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
322 switch (type[eqId]) {
325 scanObj[eqId] = new AliITSOnlineSPDscanSingle(fileName.Data());
326 ((AliITSOnlineSPDscanSingle*)scanObj[eqId])->ClearThis();
327 bScanInit[eqId]=kTRUE;
332 scanObj[eqId] = new AliITSOnlineSPDscanMultiple(fileName.Data());
333 scanObj[eqId]->ClearThis();
334 bScanInit[eqId]=kTRUE;
337 scanObj[eqId] = new AliITSOnlineSPDscanMeanTh(fileName.Data());
338 scanObj[eqId]->ClearThis();
339 bScanInit[eqId]=kTRUE;
342 printf("Unknown scan type: %d.\n",type[eqId]);
344 // some multiple scan data
345 if (type[eqId]==MINTH || type[eqId]==MEANTH || type[eqId]==DAC || type[eqId]==DELAY) {
346 ((AliITSOnlineSPDscanMultiple*)scanObj[eqId])->SetDacId(dacId[eqId]);
349 scanObj[eqId]->SetRunNr((UInt_t)runNr);
350 scanObj[eqId]->SetRouterNr(routerNr[eqId]);
351 for (UInt_t hs=0; hs<6; hs++) {
352 scanObj[eqId]->SetHalfStaveScanned(hs,halfStaveScanned[eqId][hs]);
354 scanObj[eqId]->SetType(type[eqId]);
355 scanObj[eqId]->SetDataFormat(dataFormat[eqId]);
356 for (Int_t hs=0; hs<6; hs++) {
357 for (UInt_t chip=0; chip<10; chip++) {
358 scanObj[eqId]->SetChipPresent(hs,chip,chipPresent[eqId][hs][chip]);
361 scanObj[eqId]->SetRowStart(rowStart[eqId]);
362 scanObj[eqId]->SetRowEnd(rowEnd[eqId]);
363 scanObj[eqId]->SetDacStart(dacStart[eqId]);
364 scanObj[eqId]->SetDacEnd(dacEnd[eqId]);
365 scanObj[eqId]->SetDacStep(dacStep[eqId]);
368 if (type[eqId]==MINTH) {
369 scanObj[eqId]->SetTriggers(currentStep[eqId],triggers[eqId]);
371 if (type[eqId]==UNIMA || type[eqId]==NOISE) {
372 if (currentStep[eqId]==9999) printf("SPDcalibratorStep1 (eq %d): single step\n",eqId);
375 if (type[eqId]==MINTH || type[eqId]==MEANTH || type[eqId]==DAC || type[eqId]==DELAY) {
376 ((AliITSOnlineSPDscanMultiple*)scanObj[eqId])->SetDacValue(currentStep[eqId],dacValue[eqId]);
377 if (type[eqId]==DELAY) {
378 printf("SPDcalibratorStep1 (eq %d): DAC %d/%d , step %d\n",eqId,dacValue[eqId]/2,dacHigh[eqId][0],currentStep[eqId]);
381 printf("SPDcalibratorStep1 (eq %d): DAC %d , step %d\n",eqId,dacValue[eqId],currentStep[eqId]);
384 if (type[eqId]==MEANTH) {
385 for (Int_t hs=0; hs<6; hs++) {
386 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetDacLow(currentStep[eqId],hs,dacLow[eqId][hs]);
387 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetDacHigh(currentStep[eqId],hs,dacHigh[eqId][hs]);
388 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetTPAmp(currentStep[eqId],hs,TPAmp[eqId][hs]);
395 if (bScanInit[eqId]) {
396 while (str->Next()) {
397 UInt_t hs = str->GetHalfStaveNr();
398 UInt_t chip = str->GetChipAddr();
399 //***remove last condition when minthpresent put correctly in calib header?
401 if (type[eqId]!=MINTH || minTHchipPresent[eqId][chip] || runNr<=416900) {
403 if (type[eqId]!=MINTH || minTHchipPresent[eqId][chip] || runNr<=416900) {
405 //*************************************************************************
406 scanObj[eqId]->IncrementHits(currentStep[eqId],hs,chip,str->GetChipCol(),str->GetChipRow());
408 if (!hitEventHSIncremented[hs]) {
409 scanObj[eqId]->IncrementHitEventsTot(currentStep[eqId],hs);
410 hitEventHSIncremented[hs]=kTRUE;
413 if (!hitEventChipIncremented[hs][chip]) {
414 scanObj[eqId]->IncrementHitEvents(currentStep[eqId],hs,chip);
415 hitEventChipIncremented[hs][chip]=kTRUE;
421 if (type[eqId]!=MINTH) { // for minth, triggers are set from header info
422 scanObj[eqId]->IncrementTriggers(currentStep[eqId]);
440 daqDA_progressReport((unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
442 printf("progress: %d\n",(unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
448 // clean up scan objects (which also saves them) , check if something happened...
449 Bool_t somethingHappened = kFALSE;
450 for (UInt_t eqId=0; eqId<20; eqId++) {
451 if (scanObj[eqId]!=NULL) {
452 delete scanObj[eqId];
453 somethingHappened = kTRUE;
456 if (!somethingHappened) {
457 printf("WARNING: No data processed. Are the calibration headers missing?\n");
463 // ********* STEP 2: Analyze scan container files. ************************************************
465 // clear noisyToFXS and DCSconfigToFXS dirs:
466 TString command = Form("cd %s; rm -f *",saveDirNoisyToFXS);
467 system(command.Data());
468 TString command2 = Form("cd %s; rm -f *",saveDirDCSconfigToFXS);
469 system(command2.Data());
470 UInt_t nrNoisyFilesProduced=0;
471 UInt_t nrDCSconfigFilesProduced=0;
473 AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler();
474 AliITSOnlineSPDscanAnalyzer *analyzer = NULL;
475 AliITSOnlineCalibrationSPDhandler* handlerPermNoisy = NULL;
476 // fill permanent noisy list to add later...
478 handlerPermNoisy = new AliITSOnlineCalibrationSPDhandler();
479 UInt_t permNoisy = handlerPermNoisy->ReadNoisyFromText(permNoisyFileName.Data(),240); // 240 = read for all modules
481 printf("%d noisy pixels read from permanent list.\n",permNoisy);
485 Bool_t reset_made = kFALSE;
487 // *** *** *** start loop over equipments (eq_id)
488 for (int eqId=0; eqId<20; eqId++) {
490 // create analyzer for this eq
491 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
492 analyzer = new AliITSOnlineSPDscanAnalyzer(fileName.Data(),handler);
494 // configure analyzer with tuning parameters etc:
495 for (UInt_t i=0; i<nrTuningParams; i++) {
496 analyzer->SetParam(((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
499 UInt_t type = analyzer->GetType();
500 UInt_t dacId = analyzer->GetDacId();
501 UInt_t routerNr = analyzer->GetRouterNr();
504 printf("SPD scan calibrator Step2: eqId %d, type %d, dacId %d\n",eqId,type,dacId);
506 else printf("SPD scan calibrator Step2: eqId %d type %d\n",eqId,type);
511 // algorithms for the different types of scans:
517 else if (type==NOISE) {
518 // read previous noisy list (clear if overwriting)
519 handler->SetFileLocation(saveDirNoisy);
520 if (analyzer->IsOverWriteSet() && !reset_made) {
521 handler->ResetNoisy();
522 handler->WriteToFilesAlways();
526 handler->ReadFromFiles();
528 if (analyzer->ProcessNoisyPixels(/*saveDirNoisy*/)) {
530 handler->AddNoisyFrom(handlerPermNoisy);
532 // init dcs config text file
533 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
535 dcsfile.open(dcsConfigFileName.Data());
536 dcsfile << "[SPD SCAN]\n";
537 dcsfile << "RunNumber=" << runNr << "\n";
538 dcsfile << "Type=" << type << "\n";
539 dcsfile << "Router=" << routerNr << "\n";
540 dcsfile << "ActualDetConfiguration=" << "0,-1,-1\n"; // dummy values for now
541 dcsfile << "[NOISY]\n";
542 nrDCSconfigFilesProduced++;
544 for (UInt_t hs=0; hs<6; hs++) {
545 for (UInt_t chip=0; chip<10; chip++) {
546 if (analyzer->IsChipPresent(hs,chip) || analyzer->IsOverWriteSet()) {
547 dcsfile << "-" << eqId << "," << hs << "," << chip << "\n";
548 UInt_t nrNoisy = handler->GetNrNoisyC(eqId,hs,chip);
549 for (UInt_t ind=0; ind<nrNoisy; ind++) {
550 UInt_t col = handler->GetNoisyColAtC(eqId,hs,chip,ind);
551 UInt_t row = handler->GetNoisyRowAtC(eqId,hs,chip,ind);
552 dcsfile << col << "," << row << "\n";
557 handler->SetFileLocation(saveDirNoisy);
558 handler->WriteNoisyToFile(eqId);
559 handler->SetFileLocation(saveDirNoisyToFXS);
560 handler->WriteNoisyToFile(eqId);
561 nrNoisyFilesProduced++;
567 else if (type==MINTH || (type==DAC && dacId==39)) {
568 // init dcs config text file
569 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
571 dcsfile.open(dcsConfigFileName.Data());
572 dcsfile << "[SPD SCAN]\n";
573 dcsfile << "RunNumber=" << runNr << "\n";
574 dcsfile << "Type=" << type << "\n";
575 dcsfile << "Router=" << routerNr << "\n";
576 dcsfile << "ActualDetConfiguration=" << "0,-1,-1\n"; // dummy values for now
577 dcsfile << "[DACvalues]\n";
578 nrDCSconfigFilesProduced++;
579 for (UInt_t hs=0; hs<6; hs++) {
580 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
582 if (analyzer->GetOnlineScan()->GetChipPresent(hs,chipNr)) {
583 minTh = analyzer->GetMinTh(hs,chipNr);
585 dcsfile << "39," << eqId << "," << hs << "," << chipNr << "=" << minTh << "\n";
588 printf("MinTh failed for Eq %d , HS %d , Chip %d\n",eqId,hs,chipNr);
596 else if (type==DELAY) {
597 // init dcs config text file
598 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
600 dcsfile.open(dcsConfigFileName.Data());
601 dcsfile << "[SPD SCAN]\n";
602 dcsfile << "RunNumber=" << runNr << "\n";
603 dcsfile << "Type=" << type << "\n";
604 dcsfile << "Router=" << routerNr << "\n";
605 dcsfile << "ActualDetCoonfiguration=" << "0,-1,-1\n"; // dummy values for now
606 dcsfile << "[DACvalues]\n";
607 nrDCSconfigFilesProduced++;
608 for (UInt_t hs=0; hs<6; hs++) {
609 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
610 Int_t clockCycle = -1;
611 Int_t delayCtrl = -1;
613 if (analyzer->GetOnlineScan()->GetChipPresent(hs,chipNr)) {
614 clockCycle = analyzer->GetDelay(hs,chipNr);
615 delayCtrl = clockCycle/2;
617 if (clockCycle!=-1) {
618 if (clockCycle%2==1) miscCtrl = 128;
619 dcsfile << "42," << eqId << "," << hs << "," << chipNr << "=" << delayCtrl << "\n";
620 dcsfile << "43," << eqId << "," << hs << "," << chipNr << "=" << miscCtrl << "\n";
623 printf("Delay failed for Eq %d , HS %d , Chip %d\n",eqId,hs,chipNr);
634 daqDA_progressReport((unsigned int)(50+(eqId+1)*2.5));
636 printf("progress: %d\n",(unsigned int)(50+(eqId+1)*2.5));
640 // *** *** *** end loop over equipments (eq_id)
644 if (handlerPermNoisy!=NULL) {
645 delete handlerPermNoisy;
648 printf("Opening id list file\n");
649 TString idsFXSFileName = Form("%s/FXSids_run_%d.txt",saveDirIdsToFXS,runNr);
651 idsFXSfile.open(idsFXSFileName.Data());
655 // send noisy data to FXS
656 if (nrNoisyFilesProduced>0) {
657 printf("Preparing noisy files\n");
658 // send a tared file of all new noisy maps
659 TString command = Form("cd %s; tar -cf noisy_scan.tar *",saveDirNoisyToFXS);
660 // printf("\n\n%s\n\n",command.Data());
661 system(command.Data());
662 TString fileName = Form("%s/noisy_scan.tar",saveDirNoisyToFXS);
663 TString id = "SPD_scan_noisy";
665 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
667 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
671 idsFXSfile << Form("%s\n",id.Data());
674 // send dcs config files to FXS
675 if (nrDCSconfigFilesProduced>0) {
676 printf("Preparing DCS config files\n");
677 // send a tared file of all the dcsConfig text files
678 TString command = Form("cd %s; tar -cf dcsConfig.tar *",saveDirDCSconfigToFXS);
679 // printf("\n\n%s\n\n",command.Data());
680 system(command.Data());
681 TString fileName = Form("%s/dcsConfig.tar",saveDirDCSconfigToFXS);
682 TString id = "SPD_dcsConfig";
684 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
686 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
690 //idsFXSfile << Form("%s\n",id.Data()); // do NOT write this id (this is not for preprocessor)
693 // send reference data to FXS
694 for (UInt_t eqId=0; eqId<20; eqId++) {
695 if (bScanInit[eqId]) {
696 printf("Preparing reference data for eq %d\n",eqId);
697 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
698 TString id = Form("SPD_ref_scan_%d",eqId);
700 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
702 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
706 idsFXSfile << Form("%s\n",id.Data());
711 printf("Preparing id list file\n");
713 TString id = "SPD_id_list";
715 status = daqDA_FES_storeFile(idsFXSFileName.Data(),id.Data());
717 printf("Failed to export file %s , status %d\n",idsFXSFileName.Data(),status);
723 printf("DA finished.\n");