]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/ITSSPDSCANda.cxx
- Introduce fixed step size for material retrieval from TGeo, default is 1mm,
[u/mrichter/AliRoot.git] / ITS / ITSSPDSCANda.cxx
CommitLineData
6727e2db 1/*
803e6db5 2Contact: henrik.tydesjo@cern.ch
3Link: tydes.home.cern.ch/tydes/doc/CalibrationOverview/CalibrationAlgorithms/
4Run Type: DAQ_MIN_TH_SCAN,DAQ_MEAN_TH_SCAN,DAQ_UNIFORMITY_SCAN,DAQ_NOISY_PIX_SCAN,DAQ_PIX_DELAY_SCAN,DAQ_FO_UNIF_SCAN
5DA Type: LDC
6Number of events needed: Depending on scan type
7Input Files: spd_standal_params,spd_perm_noisy , ./calibResults/ScanNoisy/* , raw data
8Output Files: ./calibResults/ScanReference/* , ./calibResults/ScanDCSconfigToFXS/* , ./calibResults/ScanNoisyToFXS/* , ./calibResults/ScanNoisy/*
9Trigger types used: PHYSICS
6727e2db 10*/
11
1fd93b67 12////////////////////////////////////////////////////////////////////////////////
6727e2db 13// This program can be compiled in two modes. //
1fd93b67 14// //
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. //
18// //
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. //
22// //
23////////////////////////////////////////////////////////////////////////////////
3ec5024c 24
3f917533 25#ifndef SPD_DA_OFF
3ec5024c 26extern "C" {
27#include "daqDA.h"
28}
3f917533 29#endif
3ec5024c 30#include "event.h"
31#include "monitor.h"
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"
53ae21ce 39#include "AliITSOnlineCalibrationSPDhandler.h"
3ec5024c 40#include "AliLog.h"
41#include <iostream>
42#include <fstream>
43#include <TROOT.h>
44#include <TPluginManager.h>
53ae21ce 45#include <TObjArray.h>
478d804c 46#include <TObjString.h>
53ae21ce 47#include <TString.h>
1c039f23 48#include <TFitter.h>
3ec5024c 49
50int main(int argc, char **argv) {
51 if (argc<2) {
52 printf("Wrong number of arguments\n");
53 return -1;
54 }
55
6727e2db 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
4f88491f 61 char *saveDirIdsToFXS = "./calibResults/IdsToFXS"; // may delete content
6727e2db 62 char *configFilesDir = "./configFiles"; // may delete content
4f88491f 63
6727e2db 64 // make sure the directory structure is correct:
1fd93b67 65 system("mkdir ./calibResults >& /dev/null");
6727e2db 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");
4f88491f 70 system("mkdir ./calibResults/IdsToFXS >& /dev/null");
6727e2db 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);
53ae21ce 75
1c039f23 76 TFitter *fitter = new TFitter(3);
77 TVirtualFitter::SetFitter(fitter);
78
3ec5024c 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",
82 "*",
83 "TStreamerInfo",
84 "RIO",
85 "TStreamerInfo()");
86
87 // turn off annoying warning messages
88 new AliLog;
1fd93b67 89 AliLog::Instance()->SetGlobalDebugLevel(-20);
3ec5024c 90
91 // calib scan types
92 enum calib_types{MINTH,MEANTH,DAC,UNIMA,NOISE,DELAY};
93
94
4ee23d3d 95 // ********* STEP 0: Get configuration files from db (if there are any) , then read parameters*********
53ae21ce 96 UInt_t nrTuningParams = 0;
97 TObjArray paramNames; paramNames.SetOwner(kTRUE);
98 TObjArray paramVals; paramVals.SetOwner(kTRUE);
99
100 // tuning parameters:
101 Int_t status = 0;
102#ifndef SPD_DA_OFF
103 TString idp = "spd_standal_params";
6727e2db 104 status=daqDA_DB_getFile(idp.Data(),paramsFileName.Data());
53ae21ce 105 if (status) {
106 printf("Failed to get config file %s: status=%d. Using default tuning parameters.\n",idp.Data(),status);
7d25cc4b 107 TString rmCmd = Form("rm -f %s",paramsFileName.Data());
108 system(rmCmd.Data());
53ae21ce 109 }
110#endif
111 if (status==0) {
112 ifstream paramsFile;
6727e2db 113 paramsFile.open(paramsFileName.Data(), ifstream::in);
53ae21ce 114 if (paramsFile.fail()) {
6727e2db 115 printf("No config file (%s) present. Using default tuning parameters.\n",paramsFileName.Data());
53ae21ce 116 }
117 else {
118 while(1) {
119 Char_t paramN[50];
120 Char_t paramV[50];
121 paramsFile >> paramN;
122 if (paramsFile.eof()) break;
123 paramsFile >> paramV;
478d804c 124 paramNames.AddAtAndExpand(new TObjString(paramN),nrTuningParams);
125 paramVals.AddAtAndExpand(new TObjString(paramV),nrTuningParams);
53ae21ce 126 nrTuningParams++;
127 if (paramsFile.eof()) break;
128 }
129 paramsFile.close();
130 }
131 }
132 // for (UInt_t i=0; i<nrTuningParams; i++) {
478d804c 133 // // printf("Entry %d: N=%s , V=%s\n",i,((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
134 // printf("Entry %d: N=%s , V=%s\n",i,((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
53ae21ce 135 // }
136
137 // perm noisy list:
138 Int_t permstatus = 0;
139#ifndef SPD_DA_OFF
140 TString idn = "spd_perm_noisy";
6727e2db 141 permstatus=daqDA_DB_getFile(idn.Data(),permNoisyFileName.Data());
53ae21ce 142 if (permstatus) {
6727e2db 143 printf("Failed to get config file %s: status=%d. No permanently noisy pixels will be added.\n",idn.Data(),permstatus);
7d25cc4b 144 TString rmCmd = Form("rm -f %s",permNoisyFileName.Data());
145 system(rmCmd.Data());
53ae21ce 146 }
147#endif
148
149
150
151
152 // ********* STEP 1: Produce scan container files (Reference Data). ***********************************
3ec5024c 153 int startSeg = 1;
154
1fd93b67 155#ifndef SPD_DA_OFF
43cfb793 156 if (getenv("DATE_RUN_NUMBER")==0) {
157 printf("DATE_RUN_NUMBER not properly set.\n");
158 return -1;
159 }
3ec5024c 160 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
161#else
162 int runNr = atoi(argv[1]);
163 startSeg = 2;
164#endif
165
166 // container objects
167 AliITSOnlineSPDscan *scanObj[20];
168 Bool_t bScanInit[20];
169 for (UInt_t eqId=0; eqId<20; eqId++) {
170 scanObj[eqId]=NULL;
171 bScanInit[eqId]=kFALSE;
172 }
173 // header data variables
174 UInt_t routerNr[20];
175 Bool_t halfStaveScanned[20][6];
176 UInt_t type[20];
177 Bool_t dataFormat[20];
178 UInt_t triggers[20];
179 Bool_t chipPresent[20][6][10];
180 UInt_t dacStart[20];
181 UInt_t dacEnd[20];
182 UInt_t dacStep[20];
183 UInt_t dacId[20];
184 UInt_t rowStart[20];
185 UInt_t rowEnd[20];
186 UInt_t rowValue[20];
187 UInt_t dacValue[20];
188 UInt_t dacHigh[20][6];
189 UInt_t dacLow[20][6];
190 UInt_t TPAmp[20][6];
1fd93b67 191 Bool_t minTHchipPresent[20][10];
3ec5024c 192 // current scan step flag
193 Int_t currentStep[20];
194 for (UInt_t eqId=0; eqId<20; eqId++) currentStep[eqId] = 9999;
195
196 // loop over run segments
197 for (int segNr=startSeg; segNr<argc; segNr++) {
198
3ec5024c 199 int status;
200
201 /* define data source : this is argument 1 */
202 status=monitorSetDataSource( argv[segNr] );
203 if (status!=0) {
204 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
205 return -1;
206 }
207 /* declare monitoring program */
208 status=monitorDeclareMp("ITS_SPD_CAL");
209 if (status!=0) {
210 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
211 return -1;
212 }
213 /* define wait event timeout - 1s max */
214 monitorSetNowait();
215 monitorSetNoWaitNetworkTimeout(1000);
6727e2db 216
217
3ec5024c 218 UInt_t eventNr=0;
219
3ec5024c 220 /* main loop (infinite) */
221 for(;;) {
6727e2db 222
223 struct eventHeaderStruct *event;
224 eventTypeType eventT;
225
3ec5024c 226 /* check shutdown condition */
1fd93b67 227#ifndef SPD_DA_OFF
3ec5024c 228 if (daqDA_checkShutdown()) {break;}
1fd93b67 229#endif
3ec5024c 230 /* get next event (blocking call until timeout) */
231 status=monitorGetEventDynamic((void **)&event);
232 if (status==MON_ERR_EOF) {
233 printf ("End of File detected\n");
234 break; /* end of monitoring file has been reached */
235 }
236 if (status!=0) {
237 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
238 break;
239 }
240 /* retry if got no event */
241 if (event==NULL) {
3ec5024c 242 continue;
243 }
244
245 eventT=event->eventType;
6727e2db 246 if (eventT == PHYSICS_EVENT) {
247
3ec5024c 248 eventNr++;
1fd93b67 249 // printf("eventNr %d\n",eventNr);
6727e2db 250
3ec5024c 251 AliRawReader *reader = new AliRawReaderDate((void*)event);
252 AliITSRawStreamSPD *str = new AliITSRawStreamSPD(reader);
6727e2db 253
3ec5024c 254 for (UInt_t eqId=0; eqId<20; eqId++) {
6727e2db 255
3ec5024c 256 reader->Reset();
257 reader->Select("ITSSPD",eqId,eqId);
6727e2db 258
3ec5024c 259 // Hit Event flags, specific for one event
260 Bool_t hitEventHSIncremented[6];
261 Bool_t hitEventChipIncremented[6][10];
262 for (UInt_t hs=0; hs<6; hs++) {
263 hitEventHSIncremented[hs] = kFALSE;
264 for (UInt_t chip=0; chip<10; chip++) {
265 hitEventChipIncremented[hs][chip] = kFALSE;
266 }
267 }
6727e2db 268
3f917533 269 if (str->ReadCalibHeader()>0) {
3ec5024c 270 // first check the type:
271 if (bScanInit[eqId] && type[eqId]!=str->GetHtype()) {
272 printf("Calib header problem. Type changed (%d -> %d)!\n",type[eqId],str->GetHtype());
273 }
274
275 // read calib values
1fd93b67 276 routerNr[eqId] = str->GetHrouterNr();
277 type[eqId] = str->GetHtype();
278 dataFormat[eqId] = str->GetHdataFormat();
279 triggers[eqId] = str->GetHtriggers();
280 dacStart[eqId] = str->GetHdacStart();
281 dacEnd[eqId] = str->GetHdacEnd();
282 dacStep[eqId] = str->GetHdacStep();
283 dacId[eqId] = str->GetHdacId();
284 rowStart[eqId] = str->GetHrowStart();
285 rowEnd[eqId] = str->GetHrowEnd();
286 rowValue[eqId] = str->GetHrowValue();
287 dacValue[eqId] = str->GetHdacValue();
3ec5024c 288 for (UInt_t hs=0; hs<6; hs++) {
1fd93b67 289 halfStaveScanned[eqId][hs] = str->GetHhalfStaveScanned(hs);
290 dacHigh[eqId][hs] = str->GetHdacHigh(hs);
291 dacLow[eqId][hs] = str->GetHdacLow(hs);
292 TPAmp[eqId][hs] = str->GetHTPAmp(hs);
3ec5024c 293 for (UInt_t chip=0; chip<10; chip++) {
1fd93b67 294 chipPresent[eqId][hs][chip] = str->GetHchipPresent(hs,chip);
3ec5024c 295 }
296 }
1fd93b67 297 for (UInt_t chip=0; chip<10; chip++) {
298 minTHchipPresent[eqId][chip] = str->GetHminTHchipPresent(chip);
299 }
3ec5024c 300
301 currentStep[eqId] = (dacValue[eqId]-dacStart[eqId])/dacStep[eqId];
302 if (type[eqId]==DELAY) {
303 currentStep[eqId]=currentStep[eqId]*2;
304 dacValue[eqId]=dacValue[eqId]*2;
305 if (dacHigh[eqId][0]==128) { // misc_ctrl value
306 currentStep[eqId]=currentStep[eqId]+1;
307 dacValue[eqId]=dacValue[eqId]+1;
308 }
309 }
310
311 // router nr check:
312 if (routerNr[eqId]!=eqId) {
313 printf("Router nr problem? Router nr %d != EqID %d\n",routerNr[eqId],eqId);
314 }
315
316 if (!bScanInit[eqId]) {
317 // initialize container object
53ae21ce 318 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
3ec5024c 319 switch (type[eqId]) {
320 case NOISE:
321 case UNIMA:
53ae21ce 322 scanObj[eqId] = new AliITSOnlineSPDscanSingle(fileName.Data());
3ec5024c 323 ((AliITSOnlineSPDscanSingle*)scanObj[eqId])->ClearThis();
324 bScanInit[eqId]=kTRUE;
325 break;
326 case MINTH:
327 case DAC:
328 case DELAY:
53ae21ce 329 scanObj[eqId] = new AliITSOnlineSPDscanMultiple(fileName.Data());
3ec5024c 330 scanObj[eqId]->ClearThis();
331 bScanInit[eqId]=kTRUE;
332 break;
333 case MEANTH:
53ae21ce 334 scanObj[eqId] = new AliITSOnlineSPDscanMeanTh(fileName.Data());
3ec5024c 335 scanObj[eqId]->ClearThis();
336 bScanInit[eqId]=kTRUE;
337 break;
338 default:
339 printf("Unknown scan type: %d.\n",type[eqId]);
340 }
341 // some multiple scan data
342 if (type[eqId]==MINTH || type[eqId]==MEANTH || type[eqId]==DAC || type[eqId]==DELAY) {
343 ((AliITSOnlineSPDscanMultiple*)scanObj[eqId])->SetDacId(dacId[eqId]);
344 }
345 // some common data
346 scanObj[eqId]->SetRunNr((UInt_t)runNr);
347 scanObj[eqId]->SetRouterNr(routerNr[eqId]);
348 for (UInt_t hs=0; hs<6; hs++) {
349 scanObj[eqId]->SetHalfStaveScanned(hs,halfStaveScanned[eqId][hs]);
350 }
351 scanObj[eqId]->SetType(type[eqId]);
352 scanObj[eqId]->SetDataFormat(dataFormat[eqId]);
353 for (Int_t hs=0; hs<6; hs++) {
354
355 // remove later when the chip present is set correctly !!!!!!!!!!!!!!!!!!!!!!!!!!!
356 Bool_t halfStavePresent = str->GetHalfStavePresent(hs);
357 // remove later when the chip present is set correctly !!!!!!!!!!!!!!!!!!!!!!!!!!!
358
359 for (UInt_t chip=0; chip<10; chip++) {
360 scanObj[eqId]->SetChipPresent(hs,chip,chipPresent[eqId][hs][chip]);
361
362 // remove later when the chip present is set correctly !!!!!!!!!!!!!!!!!!!!!!!!!!!
363 if (halfStavePresent) scanObj[eqId]->SetChipPresent(hs,chip,kTRUE);
364 // remove later when the chip present is set correctly !!!!!!!!!!!!!!!!!!!!!!!!!!!
365
366 }
367 }
368 scanObj[eqId]->SetRowStart(rowStart[eqId]);
369 scanObj[eqId]->SetRowEnd(rowEnd[eqId]);
370 scanObj[eqId]->SetDacStart(dacStart[eqId]);
371 scanObj[eqId]->SetDacEnd(dacEnd[eqId]);
372 scanObj[eqId]->SetDacStep(dacStep[eqId]);
373 }
374
375 if (type[eqId]==MINTH) {
376 scanObj[eqId]->SetTriggers(currentStep[eqId],triggers[eqId]);
377 }
378 if (type[eqId]==UNIMA || type[eqId]==NOISE) {
379 if (currentStep[eqId]==9999) printf("SPDcalibratorStep1 (eq %d): single step\n",eqId);
380 currentStep[eqId]=0;
381 }
382 if (type[eqId]==MINTH || type[eqId]==MEANTH || type[eqId]==DAC || type[eqId]==DELAY) {
383 ((AliITSOnlineSPDscanMultiple*)scanObj[eqId])->SetDacValue(currentStep[eqId],dacValue[eqId]);
384 if (type[eqId]==DELAY) {
385 printf("SPDcalibratorStep1 (eq %d): DAC %d/%d , step %d\n",eqId,dacValue[eqId]/2,dacHigh[eqId][0],currentStep[eqId]);
386 }
387 else {
388 printf("SPDcalibratorStep1 (eq %d): DAC %d , step %d\n",eqId,dacValue[eqId],currentStep[eqId]);
389 }
390 }
391 if (type[eqId]==MEANTH) {
392 for (Int_t hs=0; hs<6; hs++) {
393 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetDacLow(currentStep[eqId],hs,dacLow[eqId][hs]);
394 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetDacHigh(currentStep[eqId],hs,dacHigh[eqId][hs]);
395 ((AliITSOnlineSPDscanMeanTh*)scanObj[eqId])->SetTPAmp(currentStep[eqId],hs,TPAmp[eqId][hs]);
396 }
397 }
398
399
400 }
53ae21ce 401
3ec5024c 402 if (bScanInit[eqId]) {
403 while (str->Next()) {
404 UInt_t hs = str->GetHalfStaveNr();
405 UInt_t chip = str->GetChipAddr();
53ae21ce 406 //***remove last condition when minthpresent put correctly in calib header?
1fd93b67 407#ifndef SPD_DA_OFF
53ae21ce 408 if (type[eqId]!=MINTH || minTHchipPresent[eqId][chip] || runNr<=416900) {
1fd93b67 409#else
53ae21ce 410 if (type[eqId]!=MINTH || minTHchipPresent[eqId][chip] || runNr<=416900) {
1fd93b67 411#endif
6727e2db 412 //*************************************************************************
3ec5024c 413 scanObj[eqId]->IncrementHits(currentStep[eqId],hs,chip,str->GetChipCol(),str->GetChipRow());
6727e2db 414
3ec5024c 415 if (!hitEventHSIncremented[hs]) {
416 scanObj[eqId]->IncrementHitEventsTot(currentStep[eqId],hs);
417 hitEventHSIncremented[hs]=kTRUE;
418 }
6727e2db 419
3ec5024c 420 if (!hitEventChipIncremented[hs][chip]) {
421 scanObj[eqId]->IncrementHitEvents(currentStep[eqId],hs,chip);
422 hitEventChipIncremented[hs][chip]=kTRUE;
423 }
424 }
425
426 }
427
428 if (type[eqId]!=MINTH) { // for minth, triggers are set from header info
429 scanObj[eqId]->IncrementTriggers(currentStep[eqId]);
430 }
431
432 }
433
434 }
435
436 delete str;
437 delete reader;
438
439 }
440
441 /* free resources */
442 free(event);
443
444 }
445
1fd93b67 446#ifndef SPD_DA_OFF
3ec5024c 447 daqDA_progressReport((unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
448#else
449 printf("progress: %d\n",(unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
450#endif
451
452 }
453
6727e2db 454
1c039f23 455 // clean up scan objects (which also saves them) , check if something happened...
456 Bool_t somethingHappened = kFALSE;
3ec5024c 457 for (UInt_t eqId=0; eqId<20; eqId++) {
1c039f23 458 if (scanObj[eqId]!=NULL) {
459 delete scanObj[eqId];
460 somethingHappened = kTRUE;
461 }
462 }
463 if (!somethingHappened) {
464 printf("WARNING: No data processed. Are the calibration headers missing?\n");
3ec5024c 465 }
3ec5024c 466
467
468
469
53ae21ce 470 // ********* STEP 2: Analyze scan container files. ************************************************
471
472 // clear noisyToFXS and DCSconfigToFXS dirs:
473 TString command = Form("cd %s; rm -f *",saveDirNoisyToFXS);
474 system(command.Data());
475 TString command2 = Form("cd %s; rm -f *",saveDirDCSconfigToFXS);
476 system(command2.Data());
477 UInt_t nrNoisyFilesProduced=0;
478 UInt_t nrDCSconfigFilesProduced=0;
3ec5024c 479
6727e2db 480 AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler();
481 AliITSOnlineSPDscanAnalyzer *analyzer = NULL;
482 AliITSOnlineCalibrationSPDhandler* handlerPermNoisy = NULL;
483 // fill permanent noisy list to add later...
484 if (permstatus==0) {
485 handlerPermNoisy = new AliITSOnlineCalibrationSPDhandler();
486 UInt_t permNoisy = handlerPermNoisy->ReadNoisyFromText(permNoisyFileName.Data(),240); // 240 = read for all modules
487 if (permNoisy>0) {
488 printf("%d noisy pixels read from permanent list.\n",permNoisy);
489 }
490 }
491
4f88491f 492 Bool_t reset_made = kFALSE;
3ec5024c 493
494 // *** *** *** start loop over equipments (eq_id)
495 for (int eqId=0; eqId<20; eqId++) {
496
53ae21ce 497 // create analyzer for this eq
498 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
6727e2db 499 analyzer = new AliITSOnlineSPDscanAnalyzer(fileName.Data(),handler);
53ae21ce 500
501 // configure analyzer with tuning parameters etc:
502 for (UInt_t i=0; i<nrTuningParams; i++) {
478d804c 503 analyzer->SetParam(((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
53ae21ce 504 }
3ec5024c 505
4ee23d3d 506 UInt_t type = analyzer->GetType();
507 UInt_t dacId = analyzer->GetDacId();
508 UInt_t routerNr = analyzer->GetRouterNr();
3ec5024c 509 if (type!=99) {
510 if (type==DAC) {
6727e2db 511 printf("SPD scan calibrator Step2: eqId %d, type %d, dacId %d\n",eqId,type,dacId);
3ec5024c 512 }
6727e2db 513 else printf("SPD scan calibrator Step2: eqId %d type %d\n",eqId,type);
3ec5024c 514 }
4ee23d3d 515
516
3ec5024c 517
53ae21ce 518 // algorithms for the different types of scans:
3ec5024c 519
520 if (type==UNIMA) {
53ae21ce 521
3ec5024c 522 }
53ae21ce 523
3ec5024c 524 else if (type==NOISE) {
4f88491f 525 // read previous noisy list (clear if overwriting)
6727e2db 526 handler->SetFileLocation(saveDirNoisy);
4f88491f 527 if (analyzer->IsOverWriteSet() && !reset_made) {
528 handler->ResetNoisy();
529 handler->WriteToFilesAlways();
530 reset_made=kTRUE;
531 }
532 else {
533 handler->ReadFromFiles();
534 }
6727e2db 535 if (analyzer->ProcessNoisyPixels(/*saveDirNoisy*/)) {
536 if (permstatus==0) {
537 handler->AddNoisyFrom(handlerPermNoisy);
538 }
53ae21ce 539 // init dcs config text file
540 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
541 ofstream dcsfile;
542 dcsfile.open(dcsConfigFileName.Data());
543 dcsfile << "[SPD SCAN]\n";
544 dcsfile << "RunNumber=" << runNr << "\n";
545 dcsfile << "Type=" << type << "\n";
4ee23d3d 546 dcsfile << "Router=" << routerNr << "\n";
6727e2db 547 dcsfile << "ActualDetConfiguration=" << "0,-1,-1\n"; // dummy values for now
53ae21ce 548 dcsfile << "[NOISY]\n";
549 nrDCSconfigFilesProduced++;
4f88491f 550
551 for (UInt_t hs=0; hs<6; hs++) {
552 for (UInt_t chip=0; chip<10; chip++) {
553 if (analyzer->IsChipPresent(hs,chip) || analyzer->IsOverWriteSet()) {
554 dcsfile << "-" << eqId << "," << hs << "," << chip << "\n";
555 UInt_t nrNoisy = handler->GetNrNoisyC(eqId,hs,chip);
556 for (UInt_t ind=0; ind<nrNoisy; ind++) {
557 UInt_t col = handler->GetNoisyColAtC(eqId,hs,chip,ind);
558 UInt_t row = handler->GetNoisyRowAtC(eqId,hs,chip,ind);
559 dcsfile << col << "," << row << "\n";
53ae21ce 560 }
53ae21ce 561 }
3ec5024c 562 }
563 }
4f88491f 564 handler->SetFileLocation(saveDirNoisy);
565 handler->WriteNoisyToFile(eqId);
566 handler->SetFileLocation(saveDirNoisyToFXS);
567 handler->WriteNoisyToFile(eqId);
568 nrNoisyFilesProduced++;
569
53ae21ce 570 dcsfile.close();
3ec5024c 571 }
572 }
53ae21ce 573
3ec5024c 574 else if (type==MINTH || (type==DAC && dacId==39)) {
53ae21ce 575 // init dcs config text file
576 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
577 ofstream dcsfile;
578 dcsfile.open(dcsConfigFileName.Data());
579 dcsfile << "[SPD SCAN]\n";
580 dcsfile << "RunNumber=" << runNr << "\n";
581 dcsfile << "Type=" << type << "\n";
4ee23d3d 582 dcsfile << "Router=" << routerNr << "\n";
4f88491f 583 dcsfile << "ActualDetConfiguration=" << "0,-1,-1\n"; // dummy values for now
53ae21ce 584 dcsfile << "[DACvalues]\n";
585 nrDCSconfigFilesProduced++;
3ec5024c 586 for (UInt_t hs=0; hs<6; hs++) {
587 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
53ae21ce 588 Int_t minTh = -1;
589 if (analyzer->GetOnlineScan()->GetChipPresent(hs,chipNr)) {
590 minTh = analyzer->GetMinTh(hs,chipNr);
591 if (minTh!=-1) {
592 dcsfile << "39," << eqId << "," << hs << "," << chipNr << "=" << minTh << "\n";
593 }
594 else {
595 printf("MinTh failed for Eq %d , HS %d , Chip %d\n",eqId,hs,chipNr);
596 }
597 }
3ec5024c 598 }
3ec5024c 599 }
53ae21ce 600 dcsfile.close();
3ec5024c 601 }
53ae21ce 602
3ec5024c 603 else if (type==DELAY) {
53ae21ce 604 // init dcs config text file
605 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,eqId);
606 ofstream dcsfile;
607 dcsfile.open(dcsConfigFileName.Data());
608 dcsfile << "[SPD SCAN]\n";
609 dcsfile << "RunNumber=" << runNr << "\n";
610 dcsfile << "Type=" << type << "\n";
4ee23d3d 611 dcsfile << "Router=" << routerNr << "\n";
53ae21ce 612 dcsfile << "ActualDetCoonfiguration=" << "0,-1,-1\n"; // dummy values for now
613 dcsfile << "[DACvalues]\n";
614 nrDCSconfigFilesProduced++;
3ec5024c 615 for (UInt_t hs=0; hs<6; hs++) {
616 for (UInt_t chipNr=0; chipNr<10; chipNr++) {
53ae21ce 617 Int_t clockCycle = -1;
618 Int_t delayCtrl = -1;
619 Int_t miscCtrl = -1;
620 if (analyzer->GetOnlineScan()->GetChipPresent(hs,chipNr)) {
621 clockCycle = analyzer->GetDelay(hs,chipNr);
622 delayCtrl = clockCycle/2;
623 miscCtrl = 192;
624 if (clockCycle!=-1) {
625 if (clockCycle%2==1) miscCtrl = 128;
626 dcsfile << "42," << eqId << "," << hs << "," << chipNr << "=" << delayCtrl << "\n";
627 dcsfile << "43," << eqId << "," << hs << "," << chipNr << "=" << miscCtrl << "\n";
628 }
629 else {
630 printf("Delay failed for Eq %d , HS %d , Chip %d\n",eqId,hs,chipNr);
631 }
632 }
3ec5024c 633 }
3ec5024c 634 }
53ae21ce 635 dcsfile.close();
3ec5024c 636 }
637
3ec5024c 638 delete analyzer;
639
1fd93b67 640#ifndef SPD_DA_OFF
3ec5024c 641 daqDA_progressReport((unsigned int)(50+(eqId+1)*2.5));
642#else
643 printf("progress: %d\n",(unsigned int)(50+(eqId+1)*2.5));
644#endif
645
646 }
647 // *** *** *** end loop over equipments (eq_id)
648
4f88491f 649
6727e2db 650 delete handler;
651 if (handlerPermNoisy!=NULL) {
652 delete handlerPermNoisy;
653 }
654
1c039f23 655 printf("Opening id list file\n");
4f88491f 656 TString idsFXSFileName = Form("%s/FXSids_run_%d.txt",saveDirIdsToFXS,runNr);
657 ofstream idsFXSfile;
658 idsFXSfile.open(idsFXSFileName.Data());
659
3ec5024c 660
6727e2db 661
662 // send noisy data to FXS
1fd93b67 663 if (nrNoisyFilesProduced>0) {
1c039f23 664 printf("Preparing noisy files\n");
1fd93b67 665 // send a tared file of all new noisy maps
6727e2db 666 TString command = Form("cd %s; tar -cf noisy_scan.tar *",saveDirNoisyToFXS);
667 // printf("\n\n%s\n\n",command.Data());
53ae21ce 668 system(command.Data());
6727e2db 669 TString fileName = Form("%s/noisy_scan.tar",saveDirNoisyToFXS);
670 TString id = "SPD_scan_noisy";
4f88491f 671#ifndef SPD_DA_OFF
53ae21ce 672 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
1fd93b67 673 if (status!=0) {
53ae21ce 674 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
1fd93b67 675 return -1;
676 }
53ae21ce 677#endif
4f88491f 678 idsFXSfile << Form("%s\n",id.Data());
3ec5024c 679 }
53ae21ce 680
6727e2db 681 // send dcs config files to FXS
53ae21ce 682 if (nrDCSconfigFilesProduced>0) {
1c039f23 683 printf("Preparing DCS config files\n");
53ae21ce 684 // send a tared file of all the dcsConfig text files
685 TString command = Form("cd %s; tar -cf dcsConfig.tar *",saveDirDCSconfigToFXS);
686 // printf("\n\n%s\n\n",command.Data());
687 system(command.Data());
53ae21ce 688 TString fileName = Form("%s/dcsConfig.tar",saveDirDCSconfigToFXS);
689 TString id = "SPD_dcsConfig";
4f88491f 690#ifndef SPD_DA_OFF
53ae21ce 691 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
692 if (status!=0) {
693 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
694 return -1;
695 }
3ec5024c 696#endif
4f88491f 697 //idsFXSfile << Form("%s\n",id.Data()); // do NOT write this id (this is not for preprocessor)
53ae21ce 698 }
699
6727e2db 700 // send reference data to FXS
6727e2db 701 for (UInt_t eqId=0; eqId<20; eqId++) {
702 if (bScanInit[eqId]) {
1c039f23 703 printf("Preparing reference data for eq %d\n",eqId);
6727e2db 704 TString fileName = Form("%s/SPDcal_run_%d_eq_%d.root",saveDirRef,runNr,eqId);
705 TString id = Form("SPD_ref_scan_%d",eqId);
4f88491f 706#ifndef SPD_DA_OFF
6727e2db 707 Int_t status = daqDA_FES_storeFile(fileName.Data(),id.Data());
708 if (status!=0) {
709 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
710 return -1;
711 }
4f88491f 712#endif
713 idsFXSfile << Form("%s\n",id.Data());
6727e2db 714 }
715 }
6727e2db 716
717
1c039f23 718 printf("Preparing id list file\n");
4f88491f 719 idsFXSfile.close();
1c039f23 720 TString id = "SPD_id_list";
721#ifndef SPD_DA_OFF
722 status = daqDA_FES_storeFile(idsFXSFileName.Data(),id.Data());
723 if (status!=0) {
724 printf("Failed to export file %s , status %d\n",idsFXSFileName.Data(),status);
725 return -1;
726 }
727#endif
6727e2db 728
3ec5024c 729
1c039f23 730 printf("DA finished.\n");
3ec5024c 731
732 return 0;
478d804c 733}