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