fix compilation
[u/mrichter/AliRoot.git] / ITS / ITSSPDPHYSda.cxx
CommitLineData
803e6db5 1/*
2Contact: henrik.tydesjo@cern.ch
3Link: tydes.home.cern.ch/tydes/doc/CalibrationOverview/CalibrationAlgorithms/
4Run Type: PHYSICS
5DA Type: MON
6Number of events needed: Depending on muliplicity per event
7Input Files: spd_physics_params , ./calibResults/DeadReferenceTmp/* , ./calibResults/DeadToFXS/*
8Output Files: ./calibResults/NoisyReference/* , ./calibResults/DeadReference/* , ./calibResults/NoisyToFXS/* , ./calibResults/DeadReferenceTmp/*,./calibResults/DeadToFXS/*
9Trigger 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
23#ifndef SPD_DA_OFF
24extern "C" {
25#include "daqDA.h"
26}
27#endif
28#include "event.h"
29#include "monitor.h"
30#include "AliRawReaderDate.h"
31#include "AliITSRawStreamSPD.h"
32#include "AliITSOnlineSPDphys.h"
33#include "AliITSOnlineSPDphysAnalyzer.h"
34#include "AliITSOnlineCalibrationSPDhandler.h"
35#include "AliLog.h"
36#include <iostream>
37#include <fstream>
7d25cc4b 38#include <time.h>
803e6db5 39#include <TROOT.h>
40#include <TPluginManager.h>
41#include <TObjArray.h>
478d804c 42#include <TObjString.h>
803e6db5 43#include <TString.h>
44
478d804c 45
803e6db5 46int main(int argc, char **argv) {
47 if (argc<2) {
f42c2e3b 48 printf("SPD DA ERROR: Wrong number of arguments\n");
803e6db5 49 return -1;
50 }
51
7d25cc4b 52 UInt_t nrErrors = 0;
53
54 // directory structure, hard coded // FOR OFFLINE VERSION:
803e6db5 55 char *saveDirDead = "./calibResults/Dead"; // may NOT delete content
56 char *saveDirDeadToFXS = "./calibResults/DeadToFXS"; // may delete content
57 char *saveDirDeadRef = "./calibResults/DeadReference"; // may delete content
58 char *saveDirDeadRefTmp = "./calibResults/DeadReferenceTmp"; // may NOT delete content
59 char *saveDirNoisyToFXS = "./calibResults/NoisyToFXS"; // may delete content
60 char *saveDirNoisyRef = "./calibResults/NoisyReference"; // may delete content
61 char *saveDirIdsToFXS = "./calibResults/IdsToFXS"; // may delete content
62 char *configFilesDir = "./configFiles"; // may delete content
7d25cc4b 63 // clean up and make sure the directory structure is put up correctly:
64#ifndef SPD_DA_OFF
65 system("rm ./calibResults -rf >& /dev/null");
66 system("rm ./ITS -rf >& /dev/null");
67#else
68 system("rm ./calibResults/DeadToFXS -rf >& /dev/null");
69 system("rm ./calibResults/DeadReference -rf >& /dev/null");
70 system("rm ./calibResults/NoisyToFXS -rf >& /dev/null");
71 system("rm ./calibResults/NoisyReference -rf >& /dev/null");
72 system("rm ./calibResults/IdsToFXS -rf >& /dev/null");
73#endif
803e6db5 74 system("mkdir ./calibResults >& /dev/null");
75 system("mkdir ./calibResults/Dead >& /dev/null");
76 system("mkdir ./calibResults/DeadToFXS >& /dev/null");
77 system("mkdir ./calibResults/DeadReference >& /dev/null");
78 system("mkdir ./calibResults/DeadReferenceTmp >& /dev/null");
79 system("mkdir ./calibResults/NoisyToFXS >& /dev/null");
80 system("mkdir ./calibResults/NoisyReference >& /dev/null");
81 system("mkdir ./calibResults/IdsToFXS >& /dev/null");
82 system("mkdir ./configFiles >& /dev/null");
7d25cc4b 83#ifndef SPD_DA_OFF
84 system("mkdir ./ITS >& /dev/null");
85 system("mkdir ./ITS/Calib >& /dev/null");
86 system("mkdir ./ITS/Calib/SPDNoisy >& /dev/null");
87#endif
803e6db5 88 // parameters config file
89 TString paramsFileName = Form("%s/physics_params.txt",configFilesDir);
90
91 // This line is needed in case of a stand-alone application w/o
92 // $ROOTSYS/etc/system.rootrc file
93 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
94 "*",
95 "TStreamerInfo",
96 "RIO",
97 "TStreamerInfo()");
98
99 // turn off annoying warning messages
6d7793cf 100 // NB: Should not be handled here
45526b5e 101 AliLog* logger = AliLog::GetRootLogger();
6d7793cf 102 logger->SetGlobalDebugLevel(-20);
803e6db5 103
104 // ********* STEP 0: Get configuration files from db (if there are any) , then read parameters*********
105 UInt_t nrTuningParams = 0;
106 TObjArray paramNames; paramNames.SetOwner(kTRUE);
107 TObjArray paramVals; paramVals.SetOwner(kTRUE);
108
109 // tuning parameters:
110 Int_t par_status = 0;
111#ifndef SPD_DA_OFF
112 TString idp = "spd_physics_params";
113 par_status=daqDA_DB_getFile(idp.Data(),paramsFileName.Data());
114 if (par_status) {
f42c2e3b 115 printf("SPD DA: Failed to get config file %s: status=%d. Using default tuning parameters.\n",idp.Data(),par_status);
7d25cc4b 116 TString rmCmd = Form("rm -f %s",paramsFileName.Data());
117 system(rmCmd.Data());
803e6db5 118 }
119#endif
120 if (par_status==0) {
121 ifstream paramsFile;
122 paramsFile.open(paramsFileName.Data(), ifstream::in);
123 if (paramsFile.fail()) {
f42c2e3b 124 printf("SPD DA: No config file (%s) present. Using default tuning parameters.\n",paramsFileName.Data());
803e6db5 125 }
126 else {
127 while(1) {
128 Char_t paramN[50];
129 Char_t paramV[50];
130 paramsFile >> paramN;
131 if (paramsFile.eof()) break;
132 paramsFile >> paramV;
478d804c 133 paramNames.AddAtAndExpand(new TObjString(paramN),nrTuningParams);
134 paramVals.AddAtAndExpand(new TObjString(paramV),nrTuningParams);
803e6db5 135 nrTuningParams++;
136 if (paramsFile.eof()) break;
137 }
138 paramsFile.close();
139 }
140 }
141 // for (UInt_t i=0; i<nrTuningParams; i++) {
478d804c 142 // // printf("Entry %d: N=%s , V=%s\n",i,((TString*)paramNames.At(i))->Data(),((TString*)paramVals.At(i))->Data());
143 // printf("Entry %d: N=%s , V=%s\n",i,((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
803e6db5 144 // }
145
146
147
148
149
b696414b 150 // create calibration handler (needed already at step 1 in order to fill which eq,hs,chips are active
151 AliITSOnlineCalibrationSPDhandler* handler = new AliITSOnlineCalibrationSPDhandler();
f42c2e3b 152
b696414b 153 // Read silent=dead+inactive info from previous calibrations
f42c2e3b 154#ifndef SPD_DA_OFF
f42c2e3b 155 for (UInt_t eq=0; eq<20; eq++) {
156 Int_t getPreviousDead_status = 0;
157 TString idpd = Form("spd_previous_dead_%d",eq);
158 TString fileName = Form("%s/SPD_Dead_%d.root",saveDirDead,eq);
159 getPreviousDead_status = daqDA_DB_getFile(idpd.Data(),fileName.Data());
7d25cc4b 160 // printf("daqDA_DB_getFile(%s,%s)\n",idpd.Data(),fileName.Data());
161 if (getPreviousDead_status) {
f42c2e3b 162 printf("SPD DA: Failed to get dead file %s: status=%d. Dead search will start from zero for this eq.\n",idpd.Data(),getPreviousDead_status);
7d25cc4b 163 TString rmCmd = Form("rm -f %s",fileName.Data());
164 system(rmCmd.Data());
f42c2e3b 165 }
166 }
167#endif
b696414b 168 handler->SetFileLocation(saveDirDead);
169 handler->ReadSilentFromFiles();
f42c2e3b 170 printf("SPD DA: Number of single dead pixels from previous runs: %d\n",handler->GetNrDead());
b696414b 171
7d25cc4b 172 // Read hit-maps from previous runs
173#ifndef SPD_DA_OFF
174 for (UInt_t eq=0; eq<20; eq++) {
175 Int_t getPreviousHitmap_status = 0;
176 TString idph = Form("spd_previous_hitmap_%d",eq);
177 TString fileName = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eq);
178 getPreviousHitmap_status = daqDA_DB_getFile(idph.Data(),fileName.Data());
179 // printf("daqDA_DB_getFile(%s,%s)\n",idph.Data(),fileName.Data());
180 if (getPreviousHitmap_status) {
181 printf("SPD DA: Failed to get previous hitmap file %s: status=%d. Dead search will start with empty hitmap for this eq.\n",idph.Data(),getPreviousHitmap_status);
182 TString rmCmd = Form("rm -f %s",fileName.Data());
183 system(rmCmd.Data());
184 }
185 }
186#endif
187
b696414b 188
189
190
803e6db5 191 // ********* STEP 1: Produce phys container files (Reference Data). ***********************************
192
193#ifndef SPD_DA_OFF
194 if (getenv("DATE_RUN_NUMBER")==0) {
f42c2e3b 195 printf("SPD DA ERROR: DATE_RUN_NUMBER not properly set.\n");
803e6db5 196 return -1;
197 }
198 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
199#else
200 int runNr = atoi(argv[1]);
201 int startSeg = 2;
202#endif
203
204
205 // container objects
206 AliITSOnlineSPDphys *physObj[20];
207 Bool_t bPhysInit[20];
478d804c 208 for (UInt_t eq=0; eq<20; eq++) {
209 physObj[eq]=NULL;
210 bPhysInit[eq]=kFALSE;
803e6db5 211 }
212
213
f42c2e3b 214 UInt_t eventNr=0;
215
803e6db5 216 // loop over run segments in case of offline mode
217#ifdef SPD_DA_OFF
218 for (int segNr=startSeg; segNr<argc; segNr++) {
219#endif
220
221 int status;
222
223 /* define data source : */
224#ifndef SPD_DA_OFF
225 status=monitorSetDataSource( argv[1] ); // should be "^SPD" in order to get full detector online
226#else
227 status=monitorSetDataSource( argv[segNr] );
228#endif
229 if (status!=0) {
f42c2e3b 230 printf("SPD DA ERROR: monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
803e6db5 231 return -1;
232 }
233 /* declare monitoring program */
234 status=monitorDeclareMp("ITS_SPD_PHYS");
235 if (status!=0) {
f42c2e3b 236 printf("SPD DA ERROR: monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
803e6db5 237 return -1;
238 }
239 /* define wait event timeout - 1s max */
240 monitorSetNowait();
241 monitorSetNoWaitNetworkTimeout(1000);
242
243
803e6db5 244 /* main loop (infinite) */
245 for(;;) {
246
247 struct eventHeaderStruct *event;
248 eventTypeType eventT;
249
250 /* check shutdown condition */
251#ifndef SPD_DA_OFF
252 if (daqDA_checkShutdown()) {break;}
253#endif
254
255 /* get next event (blocking call until timeout) */
256 status=monitorGetEventDynamic((void **)&event);
257 if (status==MON_ERR_EOF) {
f42c2e3b 258 printf ("SPD DA: End of File detected\n");
803e6db5 259 break; /* end of monitoring file has been reached */
260 }
261
262 if (status!=0) {
f42c2e3b 263 printf("SPD DA: monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
803e6db5 264 break;
265 }
266
267 /* retry if got no event */
268 if (event==NULL) {
269 continue;
270 }
271
272 eventT=event->eventType;
273 if (eventT == PHYSICS_EVENT){
274
803e6db5 275 // printf("eventNr %d\n",eventNr);
276
277 AliRawReader *reader = new AliRawReaderDate((void*)event);
278 AliITSRawStreamSPD *str = new AliITSRawStreamSPD(reader);
279
803e6db5 280 while (str->Next()) {
281
478d804c 282 Int_t eq = reader->GetDDLID();
b696414b 283 // check that this hs is active in handler object
478d804c 284 if (!(handler->IsActiveEq(eq))) {
f42c2e3b 285 printf("SPD DA: Found Eq (%d) , previously inactive\n",eq);
478d804c 286 handler->ActivateEq(eq);
b696414b 287 }
478d804c 288 if (eq>=0 && eq<20) {
289 if (!bPhysInit[eq]) { // this code is duplicated for the moment... (see also below)
290 TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eq);
291 physObj[eq] = new AliITSOnlineSPDphys(fileName.Data());
292 physObj[eq]->AddRunNr(runNr);
293 physObj[eq]->SetEqNr(eq);
294 bPhysInit[eq]=kTRUE;
803e6db5 295 }
b696414b 296
803e6db5 297 UInt_t hs = str->GetHalfStaveNr();
b696414b 298 // check that this hs is active in handler object
478d804c 299 if (!(handler->IsActiveHS(eq,hs))) {
f42c2e3b 300 printf("SPD DA: Found HS (%d,%d) , previously inactive\n",eq,hs);
478d804c 301 handler->ActivateHS(eq,hs);
b696414b 302 }
803e6db5 303 UInt_t chip = str->GetChipAddr();
b696414b 304 // check that this chip is active in handler object
478d804c 305 if (!(handler->IsActiveChip(eq,hs,chip))) {
f42c2e3b 306 printf("SPD DA: Found Chip (%d,%d,%d) , previously inactive\n",eq,hs,chip);
478d804c 307 handler->ActivateChip(eq,hs,chip);
b696414b 308 }
478d804c 309 physObj[eq]->IncrementHits(hs,chip,str->GetChipCol(),str->GetChipRow());
803e6db5 310
311 }
312 }
b696414b 313
314
478d804c 315 // check which eq and hs are active, for first event only
b696414b 316 if (eventNr==0) {
478d804c 317 for (UInt_t eq=0; eq<20; eq++) {
b696414b 318 // activate Eq and HSs in handler object
478d804c 319 if (str->IsActiveEq(eq)) {
320 handler->ActivateEq(eq);
b696414b 321 for (UInt_t hs=0; hs<6; hs++) {
478d804c 322 if (str->IsActiveHS(eq,hs)) {
323 handler->ActivateHS(eq,hs);
324 for (UInt_t chip=0; chip<10; chip++) {
325 if (str->IsActiveChip(eq,hs,chip)) {
326 handler->ActivateChip(eq,hs,chip);
327 }
328 else {
329 handler->ActivateChip(eq,hs,chip,kFALSE);
330 }
331 }
332 }
333 else {
334 handler->ActivateHS(eq,hs,kFALSE);
335 }
b696414b 336 }
478d804c 337 if (!bPhysInit[eq]) { // this code is duplicated for the moment... (see also above)
338 TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eq);
339 physObj[eq] = new AliITSOnlineSPDphys(fileName.Data());
340 physObj[eq]->AddRunNr(runNr);
341 physObj[eq]->SetEqNr(eq);
342 bPhysInit[eq]=kTRUE;
b696414b 343 }
344 }
345 else {
478d804c 346 handler->ActivateEq(eq,kFALSE);
b696414b 347 }
803e6db5 348 }
349 }
350
b696414b 351
352 for (UInt_t eq=0; eq<20; eq++) {
353 if (bPhysInit[eq]) {
354 physObj[eq]->IncrementNrEvents();
355 }
356 }
803e6db5 357
358 delete str;
359 delete reader;
360
b696414b 361 eventNr++;
362
803e6db5 363 }
364
365 /* free resources */
366 free(event);
367
368 }
369
370
371#ifdef SPD_DA_OFF
f42c2e3b 372 printf("SPD DA: progress: %d\n",(unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
803e6db5 373 }
374#endif
f42c2e3b 375
803e6db5 376 // clean up phys objects (also saves them)
b696414b 377 for (UInt_t eq=0; eq<20; eq++) {
378 if (physObj[eq]!=NULL) delete physObj[eq];
803e6db5 379 }
380
f42c2e3b 381 printf("SPD DA: %d events collected for this run.\n",eventNr);
803e6db5 382
383
384
385
386 // ********* STEP 2: Analyze phys container files. ************************************************
387
7d25cc4b 388 time_t timeStamp = time(NULL);
478d804c 389 // printf("*** Start step2 , %d\n",time(NULL) - timeStamp);
390
803e6db5 391 UInt_t firstRunNrDead = runNr;
392
393
394 UInt_t nrEnoughStatNoisy = 0;
395 UInt_t nrEqActiveNoisy = 0;
396 Bool_t eqActiveNoisy[20];
397
398 // *** *** *** start loop over equipments (eq_id)
b696414b 399 for (UInt_t eq=0; eq<20; eq++) {
400 eqActiveNoisy[eq] = kFALSE;
803e6db5 401
402 // create analyzer for this eq
b696414b 403 TString fileName = Form("%s/SPDphys_run_%d_eq_%d.root",saveDirNoisyRef,runNr,eq);
803e6db5 404 AliITSOnlineSPDphysAnalyzer *noisyAnalyzer = new AliITSOnlineSPDphysAnalyzer(fileName.Data(),handler);
405
406 // check data in container
b696414b 407 if (noisyAnalyzer->GetEqNr() != eq) {
803e6db5 408 if (noisyAnalyzer->GetEqNr() != 999) {
7d25cc4b 409 printf("SPD DA ERROR: Mismatching EqId in Container data and filename (%d!=%d). Skipping eq.\n",noisyAnalyzer->GetEqNr(),eq);
803e6db5 410 }
411 delete noisyAnalyzer;
412 continue;
413 }
414
415 nrEqActiveNoisy++;
b696414b 416 eqActiveNoisy[eq] = kTRUE;
803e6db5 417
418 // configure analyzer with tuning parameters etc:
419 for (UInt_t i=0; i<nrTuningParams; i++) {
478d804c 420 noisyAnalyzer->SetParam(((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
803e6db5 421 }
422
f42c2e3b 423 printf("SPD DA: SPD phys STEP 2: Noisy search for eq %d\n",eq);
803e6db5 424
425 // search for noisy pixels:
426 nrEnoughStatNoisy += noisyAnalyzer->ProcessNoisyPixels();
427
428 // copy this phys obj to temporary dead reference dir to process after noisy search
b696414b 429 TString fileNameDead = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eq);
803e6db5 430 AliITSOnlineSPDphys* physObj = new AliITSOnlineSPDphys(fileNameDead.Data());
431 physObj->AddPhys(noisyAnalyzer->GetOnlinePhys());
432 if (physObj->GetNrRuns()>0) {
433 UInt_t firstRunNr = physObj->GetRunNr(0);
434 if (firstRunNrDead>firstRunNr) {
435 firstRunNrDead=firstRunNr;
436 }
437 }
438 // remove noisy pixels from dead hitmap
439 for (UInt_t hs=0; hs<6; hs++) {
440 for (UInt_t chip=0; chip<10; chip++) {
b696414b 441 for (UInt_t ind=0; ind<handler->GetNrNoisyC(eq,hs,chip); ind++) {
442 UInt_t col = handler->GetNoisyColAtC(eq,hs,chip,ind);
443 UInt_t row = handler->GetNoisyRowAtC(eq,hs,chip,ind);
803e6db5 444 physObj->AddHits(hs,chip,col,row,-noisyAnalyzer->GetOnlinePhys()->GetHits(hs,chip,col,row));
445 }
446 }
447 }
448
449 delete physObj;
450 delete noisyAnalyzer;
451
452#ifndef SPD_DA_OFF
7d25cc4b 453 // daqDA_progressReport((unsigned int)((eq+1)*2.5));
454 printf("SPD DA: progress: %d , %ld\n",(unsigned int)(50+(eq+1)*2.5), time(NULL) - timeStamp);
803e6db5 455#else
7d25cc4b 456 // printf("SPD DA: progress: %d\n",(unsigned int)(50+(eq+1)*1.25));
457 printf("SPD DA: progress: %d , %ld\n",(unsigned int)(50+(eq+1)*1.25), time(NULL) - timeStamp);
803e6db5 458#endif
459 }
460 // *** *** *** end loop over equipments (eq_id)
461
f42c2e3b 462 printf("SPD DA: Noisy search finished. %d noisy pixels found. %d chips had enough statistics.\n",
478d804c 463 handler->GetNrNoisy(),nrEnoughStatNoisy);
803e6db5 464 handler->SetFileLocation(saveDirNoisyToFXS);
f42c2e3b 465 UInt_t nrNoisyFilesProduced = handler->WriteNoisyToFiles();
7d25cc4b 466#ifndef SPD_DA_OFF
467 // save noisy to local OCDB
468 handler->WriteNoisyToDB(runNr,9999999,".");
469 // store local OCDB file in daq Det DB
470 TString ocdb_fileName = Form("./ITS/Calib/SPDNoisy/Run%d_9999999_v0_s0.root",runNr);
471 TString idod = "spd_noisy_ocdb";
472 Int_t ocdb_store_status = daqDA_DB_storeFile(ocdb_fileName.Data(),idod.Data());
473 // printf("daqDA_DB_storeFile(%s,%s)\n",ocdb_fileName.Data(),idod.Data());
474 if (ocdb_store_status) {
475 printf("SPD DA ERROR: Failed to store noisy ocdb file %s in daqDetDB: status=%d.\n",idod.Data(),ocdb_store_status);
476 }
477#endif
803e6db5 478
479
480
481
482
803e6db5 483 UInt_t nrEnoughStatChips = 0;
484 UInt_t nrDeadChips = 0;
485 UInt_t nrInefficientChips = 0;
486 UInt_t nrEqActiveDead = 0;
487 Bool_t eqActiveDead[20];
488
489 // *** *** *** start loop over equipments (eq_id)
b696414b 490 for (UInt_t eq=0; eq<20; eq++) {
491 eqActiveDead[eq] = kFALSE;
803e6db5 492
493 // setup analyzer for dead search
b696414b 494 TString fileNameDead = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eq);
803e6db5 495 AliITSOnlineSPDphys* physObj = new AliITSOnlineSPDphys(fileNameDead.Data());
496 AliITSOnlineSPDphysAnalyzer* deadAnalyzer = new AliITSOnlineSPDphysAnalyzer(physObj,handler);
497 // check data in container
b696414b 498 if (deadAnalyzer->GetEqNr() != eq) {
803e6db5 499 if (deadAnalyzer->GetEqNr() != 999) {
7d25cc4b 500 printf("SPD DA ERROR: Mismatching EqId in Dead Container data and filename (%d!=%d). Skipping eq.\n",deadAnalyzer->GetEqNr(),eq);
803e6db5 501 }
502 delete deadAnalyzer;
478d804c 503 nrDeadChips+=60; // since this eq is inactive...
803e6db5 504 continue;
505 }
506
507 nrEqActiveDead++;
b696414b 508 eqActiveDead[eq] = kTRUE;
803e6db5 509
510 // configure analyzer with tuning parameters etc:
511 for (UInt_t i=0; i<nrTuningParams; i++) {
478d804c 512 deadAnalyzer->SetParam(((TObjString*)paramNames.At(i))->GetString().Data(),((TObjString*)paramVals.At(i))->GetString().Data());
803e6db5 513 }
514
7d25cc4b 515 UInt_t nrEventsCollected = physObj->GetNrEvents();
516 printf("SPD DA: SPD phys STEP 2: Dead search for eq %d (%d events)\n",eq,nrEventsCollected);
803e6db5 517
518 // search for dead pixels:
519 nrEnoughStatChips += deadAnalyzer->ProcessDeadPixels();
520 nrDeadChips += deadAnalyzer->GetNrDeadChips();
521 nrInefficientChips += deadAnalyzer->GetNrInefficientChips();
522
523 delete deadAnalyzer;
524
478d804c 525
803e6db5 526#ifndef SPD_DA_OFF
7d25cc4b 527 // daqDA_progressReport((unsigned int)(50+(eq+1)*2.5));
528 printf("SPD DA: progress: %d , %ld\n",(unsigned int)(50+(eq+1)*2.5), time(NULL) - timeStamp);
803e6db5 529#else
7d25cc4b 530 // printf("SPD DA: progress: %d\n",(unsigned int)(75+(eq+1)*1.25));
531 printf("SPD DA: progress: %d , %ld\n",(unsigned int)(75+(eq+1)*1.25), time(NULL) - timeStamp);
803e6db5 532#endif
533 }
f42c2e3b 534 // *** *** *** end loop over equipments (eq)
803e6db5 535
478d804c 536
537
803e6db5 538
f42c2e3b 539 printf("SPD DA: Dead search finished.\n");
540 printf("SPD DA: %d single dead pixels , %d dead or inactive pixels in total.\n",handler->GetNrDead(),handler->GetNrSilent());
541 printf("SPD DA: %d chips had enough statistics. %d chips are dead. %d chips are inefficient.\n",nrEnoughStatChips,nrDeadChips,nrInefficientChips);
803e6db5 542 handler->SetFileLocation(saveDirDead);
b696414b 543 handler->WriteSilentToFilesAlways();
803e6db5 544 handler->SetFileLocation(saveDirDeadToFXS);
b696414b 545 handler->WriteSilentToFilesAlways();
546
803e6db5 547
7d25cc4b 548 // printf("SPD DA: Opening id list file\n");
549 printf("SPD DA: Opening id list file , %ld\n",time(NULL) - timeStamp);
803e6db5 550 TString idsFXSFileName = Form("%s/FXSids_run_%d.txt",saveDirIdsToFXS,runNr);
551 ofstream idsFXSfile;
552 idsFXSfile.open(idsFXSFileName.Data());
553
554
f42c2e3b 555 // store dead+inactive pixels in DB, used as starting point for later runs
556#ifndef SPD_DA_OFF
7d25cc4b 557 printf("store previous dead in DB , %ld\n",time(NULL) - timeStamp);
f42c2e3b 558 for (UInt_t eq=0; eq<20; eq++) {
559 Int_t storePreviousDead_status = 0;
560 TString idpd = Form("spd_previous_dead_%d",eq);
561 TString fileName = Form("%s/SPD_Dead_%d.root",saveDirDead,eq);
562 storePreviousDead_status = daqDA_DB_storeFile(fileName.Data(),idpd.Data());
563 // printf("daqDA_DB_storeFile(%s,%s)\n",fileName.Data(),idpd.Data());
469c929f 564 if (storePreviousDead_status) {
f42c2e3b 565 printf("SPD DA ERROR: Failed to store dead file %s in daqDetDB: status=%d.\n",idpd.Data(),storePreviousDead_status);
566 }
567 }
568#endif
569
570
b696414b 571 // send (dead) reference data for this run to FXS - only if there is no chip in category "needsMoreStat"
f42c2e3b 572 if (nrEnoughStatChips>0 && nrEnoughStatChips+nrDeadChips+nrInefficientChips == 1200) {
573 printf("SPD DA: Dead calibration is complete.\n");
574 printf("SPD DA: Preparing dead reference data\n");
803e6db5 575 // send reference data for dead pixels to FXS
576 TString tarFiles = "";
b696414b 577 for (UInt_t eq=0; eq<20; eq++) {
578 if (eqActiveDead[eq]) {
f42c2e3b 579 printf("SPD DA: Preparing dead pixels for eq %d\n",eq);
803e6db5 580 // move file to ref dir
b696414b 581 TString fileName = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eq);
582 TString newFileName = Form("%s/SPDphys_dead_run_%d_%d_eq_%d.root",saveDirDeadRef,firstRunNrDead,runNr,eq);
803e6db5 583 TString command = Form("mv -f %s %s",fileName.Data(),newFileName.Data());
584 system(command.Data());
b696414b 585 tarFiles.Append(Form("SPDphys_dead_run_%d_%d_eq_%d.root ",firstRunNrDead,runNr,eq));
7d25cc4b 586 // create empty hitmap file to send to DB later
587 AliITSOnlineSPDphys* physObj = new AliITSOnlineSPDphys(fileName.Data());
588 physObj->SetEqNr(eq);
589 delete physObj;
803e6db5 590 }
591 }
7d25cc4b 592 if (tarFiles.Length() > 0) { // make sure there are some files to send
f42c2e3b 593 TString send_command = Form("cd %s; tar -cf ref_phys_dead.tar %s",saveDirDeadRef,tarFiles.Data());
594 system(send_command.Data());
595 TString fileName = Form("%s/ref_phys_dead.tar",saveDirDeadRef);
596 TString id = "SPD_ref_phys_dead";
803e6db5 597#ifndef SPD_DA_OFF
f42c2e3b 598 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
599 if (status!=0) {
600 printf("SPD DA ERROR: Failed to export file %s , status %d\n",fileName.Data(),status);
7d25cc4b 601 nrErrors++;
f42c2e3b 602 }
803e6db5 603#endif
f42c2e3b 604 idsFXSfile << Form("%s\n",id.Data());
605 }
803e6db5 606 }
607
7d25cc4b 608 // store hitmaps (maybe empty) in DB, used as starting point for later runs:
609#ifndef SPD_DA_OFF
610 printf("store previous hitmaps in DB , %ld\n",time(NULL) - timeStamp);
611 for (UInt_t eq=0; eq<20; eq++) {
612 Int_t storePreviousHitmap_status = 0;
613 TString idph = Form("spd_previous_hitmap_%d",eq);
614 TString fileName = Form("%s/SPDphys_dead_run_0_0_eq_%d.root",saveDirDeadRefTmp,eq);
615 storePreviousHitmap_status = daqDA_DB_storeFile(fileName.Data(),idph.Data());
616 // printf("daqDA_DB_storeFile(%s,%s)\n",fileName.Data(),idph.Data());
617 if (storePreviousHitmap_status) {
618 printf("SPD DA ERROR: Failed to store hitmap file %s in daqDetDB: status=%d.\n",idph.Data(),storePreviousHitmap_status);
619 }
620 }
621#endif
622
803e6db5 623
478d804c 624
b696414b 625 // send (noisy) reference data for this run to FXS
7d25cc4b 626 // printf("SPD DA: Preparing physics reference data for this run\n");
627 printf("SPD DA: Preparing physics reference data for this run , %ld\n",time(NULL) - timeStamp);
803e6db5 628 TString tarFiles = "";
b696414b 629 for (UInt_t eq=0; eq<20; eq++) {
630 if (eqActiveNoisy[eq]) {
631 tarFiles.Append(Form("SPDphys_run_%d_eq_%d.root ",runNr,eq));
803e6db5 632 }
633 }
f42c2e3b 634 if (tarFiles.Length() > 0) { // make sure there are any files to send
635 TString send_command = Form("cd %s; tar -cf ref_phys.tar %s",saveDirNoisyRef,tarFiles.Data());
636 system(send_command.Data());
637 TString fileName = Form("%s/ref_phys.tar",saveDirNoisyRef);
638 TString id = "SPD_ref_phys";
803e6db5 639#ifndef SPD_DA_OFF
f42c2e3b 640 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
641 if (status!=0) {
642 printf("SPD DA ERROR: Failed to export file %s , status %d\n",fileName.Data(),status);
7d25cc4b 643 nrErrors++;
f42c2e3b 644 }
803e6db5 645#endif
f42c2e3b 646 idsFXSfile << Form("%s\n",id.Data());
647 }
803e6db5 648
478d804c 649
650
803e6db5 651 // send dead pixels to FXS
7d25cc4b 652 // printf("SPD DA: Preparing dead files for FXS\n");
653 printf("SPD DA: Preparing dead files for FXS , %ld\n",time(NULL) - timeStamp);
803e6db5 654 // send a tared file of all the dead files
f42c2e3b 655 TString send_command = Form("cd %s; tar -cf dead_phys.tar *",saveDirDeadToFXS);
803e6db5 656 // printf("\n\n%s\n\n",command.Data());
657 system(send_command.Data());
f42c2e3b 658 TString fileName = Form("%s/dead_phys.tar",saveDirDeadToFXS);
659 TString id = "SPD_phys_dead";
803e6db5 660#ifndef SPD_DA_OFF
661 Int_t send_status = daqDA_FES_storeFile(fileName.Data(),id.Data());
662 if (send_status!=0) {
f42c2e3b 663 printf("SPD DA ERROR: Failed to export file %s , status %d\n",fileName.Data(),send_status);
7d25cc4b 664 nrErrors++;
803e6db5 665 }
666#endif
667 idsFXSfile << Form("%s\n",id.Data());
803e6db5 668
669
478d804c 670
803e6db5 671 // send noisy pixels to FXS
f42c2e3b 672 if (nrNoisyFilesProduced > 0) { // make sure there is at least one file created
7d25cc4b 673 // printf("SPD DA: Preparing noisy files for FXS\n");
674 printf("SPD DA: Preparing noisy files for FXS , %ld\n",time(NULL) - timeStamp);
803e6db5 675 // send a tared file of all the noisy files
676 TString command = Form("cd %s; tar -cf noisy_phys.tar *",saveDirNoisyToFXS);
677 // printf("\n\n%s\n\n",command.Data());
678 system(command.Data());
679 TString fileName = Form("%s/noisy_phys.tar",saveDirNoisyToFXS);
680 TString id = "SPD_phys_noisy";
681#ifndef SPD_DA_OFF
682 status = daqDA_FES_storeFile(fileName.Data(),id.Data());
683 if (status!=0) {
f42c2e3b 684 printf("SPD DA ERROR: Failed to export file %s , status %d\n",fileName.Data(),status);
7d25cc4b 685 nrErrors++;
803e6db5 686 }
687#endif
688 idsFXSfile << Form("%s\n",id.Data());
689 }
690
691
478d804c 692
803e6db5 693 // send ids file to FXS
694 idsFXSfile.close();
695 id = "SPD_id_list";
696#ifndef SPD_DA_OFF
697 status = daqDA_FES_storeFile(idsFXSFileName.Data(),id.Data());
698 if (status!=0) {
f42c2e3b 699 printf("SPD DA ERROR: Failed to export file %s , status %d\n",idsFXSFileName.Data(),status);
7d25cc4b 700 nrErrors++;
803e6db5 701 }
702#endif
703
704
705
706
707 delete handler;
708
7d25cc4b 709 printf("SPD DA: End of all operations, %d errors, %ld\n", nrErrors, time(NULL) - timeStamp);
478d804c 710
7d25cc4b 711 if (nrErrors>0) return -1;
803e6db5 712
713 return 0;
7d25cc4b 714
b696414b 715}