]>
Commit | Line | Data |
---|---|---|
dc928fbf | 1 | /* |
18ec51a0 | 2 | Contact: Jean-Luc Charvet <jean-luc.charvet@cern.ch> |
f3cfa63e | 3 | Link: http://aliceinfo.cern.ch/static/Offline/dimuon/muon_html/README_mchda.html |
18ec51a0 | 4 | Reference Run: 109302 (station 3 only) |
f3cfa63e | 5 | Run Type: PEDESTAL |
6 | DA Type: LDC | |
7 | Number of events needed: 400 events for pedestal run | |
18ec51a0 | 8 | Input Files: mutrkpedvalues and config_ldc-MTRK-S3-0 in path : /afs/cern.ch/user/j/jcharvet/public/DA_validation |
f3cfa63e | 9 | Output Files: local dir (not persistent) -> MUONTRKPEDda.ped FXS -> run<#>_MCH_<ldc>_PEDESTALS |
10 | Trigger types used: | |
dc928fbf | 11 | */ |
12 | ||
13 | /************************************************************************** | |
14 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
15 | * * | |
16 | * Author: The ALICE Off-line Project. * | |
17 | * Contributors are mentioned in the code where appropriate. * | |
18 | * * | |
19 | * Permission to use, copy, modify and distribute this software and its * | |
20 | * documentation strictly for non-commercial purposes is hereby granted * | |
21 | * without fee, provided that the above copyright notice appears in all * | |
22 | * copies and that both the copyright notice and this permission notice * | |
23 | * appear in the supporting documentation. The authors make no claims * | |
24 | * about the suitability of this software for any purpose. It is * | |
25 | * provided "as is" without express or implied warranty. * | |
26 | **************************************************************************/ | |
27 | ||
28 | /* $Id$ */ | |
29 | ||
30 | /* | |
31 | ------------------------------------------------------------------------- | |
9c2d4e89 | 32 | 2012-02-16 New version: MUONTRKPEDda.cxx,v 1.8 |
dc928fbf | 33 | ------------------------------------------------------------------------- |
34 | ||
35 | Version for MUONTRKPEDda MUON tracking | |
36 | (A. Baldisseri, J.-L. Charvet) | |
37 | ||
38 | ||
39 | Rem: AliMUON2DMap stores all channels, even those which are not connected | |
40 | if pedMean == -1, channel not connected to a pad | |
41 | ||
1b15b395 | 42 | & |
dc928fbf | 43 | |
44 | */ | |
45 | extern "C" { | |
46 | #include <daqDA.h> | |
47 | } | |
48 | ||
49 | #include "event.h" | |
50 | #include "monitor.h" | |
51 | ||
52 | #include <Riostream.h> | |
53 | #include <stdio.h> | |
54 | #include <stdlib.h> | |
55 | #include <sstream> | |
56 | #include <math.h> | |
57 | ||
58 | //AliRoot | |
59 | #include "AliMUONRawStreamTrackerHP.h" | |
60 | #include "AliRawReader.h" | |
61 | #include "AliMUONVStore.h" | |
62 | #include "AliMUON2DMap.h" | |
63 | #include "AliMUONCalibParamND.h" | |
64 | #include "AliMpIntPair.h" | |
65 | #include "AliMpConstants.h" | |
66 | #include "AliRawDataErrorLog.h" | |
67 | #include "AliMUONTrackerIO.h" | |
18ec51a0 | 68 | #include "AliLog.h" |
f9e83f1d | 69 | #include "AliMUONDspHeader.h" |
70 | #include "AliDAQ.h" | |
dc928fbf | 71 | |
72 | //ROOT | |
73 | #include "TFile.h" | |
74 | #include "TSystem.h" | |
75 | #include "TTree.h" | |
76 | #include "TH1F.h" | |
77 | #include "TString.h" | |
78 | #include "TStopwatch.h" | |
79 | #include "TMath.h" | |
80 | #include "TTimeStamp.h" | |
81 | #include "TGraphErrors.h" | |
82 | #include "TF1.h" | |
83 | #include "TROOT.h" | |
84 | #include "TPluginManager.h" | |
85 | #include "TFitter.h" | |
86 | #include "TObjString.h" | |
87 | #include "THashTable.h" | |
88 | #include <THashList.h> | |
dbbb2c64 | 89 | // |
90 | //AMORE | |
91 | // | |
92 | #ifdef ALI_AMORE | |
93 | #include <AmoreDA.h> | |
94 | #endif | |
dc928fbf | 95 | |
96 | #include "AliMUONPedestal.h" | |
97 | #include "AliMUONErrorCounter.h" | |
98 | ||
18ec51a0 | 99 | |
dc928fbf | 100 | // main routine |
f3cfa63e | 101 | int main(Int_t argc, const char **argv) |
dc928fbf | 102 | { |
9c2d4e89 | 103 | Int_t status=0, status1=0; |
dc928fbf | 104 | TStopwatch timers; |
105 | timers.Start(kTRUE); | |
106 | ||
9c2d4e89 | 107 | // Needed for streamer application |
dc928fbf | 108 | gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", |
109 | "*", | |
110 | "TStreamerInfo", | |
111 | "RIO", | |
112 | "TStreamerInfo()"); | |
dc928fbf | 113 | // needed for Minuit plugin |
114 | gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", | |
115 | "Minuit", | |
116 | "TMinuitMinimizer", | |
117 | "Minuit", | |
118 | "TMinuitMinimizer(const char*)"); | |
dc928fbf | 119 | // cout << argv[0]; |
120 | ||
121 | Int_t skipEvents = 0; | |
122 | Int_t maxEvents = 1000000; | |
123 | Int_t maxDateEvents = 1000000; | |
9c2d4e89 | 124 | Int_t errorDetail = 1; |
125 | Int_t checkTokenlost = 0; | |
126 | Int_t flag_histo=1; | |
f3cfa63e | 127 | TString inputFile; |
dc928fbf | 128 | |
129 | Int_t nDateEvents = 0; | |
9c2d4e89 | 130 | Int_t nDateRejEvents = 0; |
dc928fbf | 131 | Int_t nGlitchErrors= 0; |
132 | Int_t nParityErrors= 0; | |
133 | Int_t nPaddingErrors= 0; | |
18ec51a0 | 134 | Int_t nTokenlostErrors= 0; |
dc928fbf | 135 | Int_t recoverParityErrors = 1; |
136 | ||
137 | TString logOutputFile; | |
138 | ||
139 | Char_t flatFile[256]=""; | |
9c2d4e89 | 140 | Char_t* detail; |
dc928fbf | 141 | TString shuttleFile; |
142 | ||
143 | Int_t nEventsRecovered = 0; | |
144 | Int_t nEvents = 0; | |
145 | UInt_t runNumber = 0; | |
f9e83f1d | 146 | Int_t nConfig = 1; |
ff496840 | 147 | Int_t nEvthreshold = 100; //below this nb_evt pedestal are not calculated and forced to 4085 (sigma) |
9c2d4e89 | 148 | Int_t nSorting = 1 ; // pedestal sorting (ON by default) |
149 | Int_t statusDA = 0 ; // DA return code | |
dc928fbf | 150 | ofstream filcout; |
dc928fbf | 151 | |
152 | // decode the input line | |
153 | for (Int_t i = 1; i < argc; i++) // argument 0 is the executable name | |
154 | { | |
f3cfa63e | 155 | const char* arg = argv[i]; |
dc928fbf | 156 | |
157 | arg = argv[i]; | |
158 | if (arg[0] != '-') | |
159 | { | |
160 | // If only one argument and no "-" => DA calling from ECS | |
161 | if (argc == 2) | |
162 | { | |
f3cfa63e | 163 | inputFile=argv[i]; |
dc928fbf | 164 | } |
165 | continue; | |
166 | } | |
9c2d4e89 | 167 | nConfig=0; |
168 | //prefixLDC = "LDC" | |
dc928fbf | 169 | switch (arg[1]) |
170 | { | |
171 | case 'f' : | |
172 | i++; | |
f3cfa63e | 173 | inputFile=argv[i]; |
174 | nConfig=0; | |
dc928fbf | 175 | break; |
176 | case 'a' : | |
177 | i++; | |
178 | shuttleFile = argv[i]; | |
179 | break; | |
180 | case 's' : | |
181 | i++; | |
182 | skipEvents=atoi(argv[i]); | |
183 | break; | |
184 | case 'm' : | |
185 | i++; | |
186 | sscanf(argv[i],"%d",&maxDateEvents); | |
187 | break; | |
188 | case 'n' : | |
189 | i++; | |
190 | sscanf(argv[i],"%d",&maxEvents); | |
191 | break; | |
9c2d4e89 | 192 | case 'v' : |
193 | i++; | |
194 | sscanf(argv[i],"%d",&errorDetail); | |
195 | break; | |
196 | case 't' : | |
197 | i++; | |
198 | sscanf(argv[i],"%d",&checkTokenlost); | |
199 | break; | |
dc928fbf | 200 | case 'h' : |
201 | i++; | |
202 | printf("\n******************* %s usage **********************",argv[0]); | |
203 | printf("\nOnline (called from ECS) : %s <raw data file> (no inline options)\n",argv[0]); | |
9c2d4e89 | 204 | printf("\n%s can be used locally only with options (without DiMuon configuration file: nConfig=%d)",argv[0],nConfig); |
dc928fbf | 205 | printf("\n%s -options, the available options are :",argv[0]); |
206 | printf("\n-h help (this screen)"); | |
207 | printf("\n"); | |
208 | printf("\n Input"); | |
f3cfa63e | 209 | printf("\n-f <raw data file> (default = %s)",inputFile.Data()); |
dc928fbf | 210 | printf("\n"); |
211 | printf("\n Output"); | |
212 | printf("\n-a <Flat ASCII file> (default = %s)",shuttleFile.Data()); | |
213 | printf("\n"); | |
214 | printf("\n Options"); | |
215 | printf("\n-m <max date events> (default = %d)",maxDateEvents); | |
216 | printf("\n-s <skip events> (default = %d)",skipEvents); | |
217 | printf("\n-n <max events> (default = %d)",maxEvents); | |
9c2d4e89 | 218 | printf("\n-v <error detail> (default = %d : 0=low 1=medium 2=high)",errorDetail); |
219 | printf("\n-t <token lost check> (default = %d : 0=no , 1=yes)",checkTokenlost); | |
dc928fbf | 220 | |
221 | printf("\n\n"); | |
222 | exit(-1); | |
223 | default : | |
224 | printf("%s : bad argument %s (please check %s -h)\n",argv[0],argv[i],argv[0]); | |
225 | argc = 2; exit(-1); // exit if error | |
226 | } // end of switch | |
227 | } // end of for i | |
228 | ||
dc928fbf | 229 | UShort_t manuId; |
230 | UChar_t channelId; | |
231 | UShort_t charge; | |
232 | ||
9c2d4e89 | 233 | const char* prefixDA = "MUONTRKPEDda"; // program prefix |
234 | const char* prefixLDC = getenv("DATE_ROLE_NAME"); // LDC name | |
235 | if(prefixLDC == NULL) prefixLDC ="MCH" ; | |
236 | printf("%s : -------- Begin execution : %s -------- \n",prefixLDC,prefixDA); | |
237 | ||
dc928fbf | 238 | //Pedestal object |
239 | AliMUONPedestal* muonPedestal = new AliMUONPedestal(); | |
240 | muonPedestal->SetprefixDA(prefixDA); | |
9c2d4e89 | 241 | muonPedestal->SetprefixLDC(prefixLDC); |
242 | muonPedestal->SetStatusDA(statusDA); | |
243 | ||
244 | // Output log file initialisations | |
245 | sprintf(flatFile,"%s.log",prefixDA); | |
246 | logOutputFile=flatFile; | |
247 | AliLog::SetStreamOutput(&filcout); // Print details on logfile | |
248 | filcout.open(logOutputFile.Data()); | |
249 | filcout<<"//=================================================" << endl; | |
250 | filcout<<"//" << prefixLDC << " " << prefixDA << endl; | |
251 | filcout<<"//=================================================" << endl; | |
252 | filcout<<"// * Date : " << muonPedestal->GetDate()->AsString("l") << "\n" << endl; | |
253 | ||
254 | muonPedestal->SetAlifilcout(&filcout); | |
255 | cout<<prefixLDC << " : Date: " << muonPedestal->GetDate()->AsString("l") << "\n" << endl; | |
256 | ||
dc928fbf | 257 | |
f3cfa63e | 258 | Char_t dbfile[256]=""; |
259 | // nConfig=1 : Reading configuration (or not) status via "mutrkpedvalues" file located in DetDB | |
260 | if(nConfig) | |
261 | { | |
9c2d4e89 | 262 | Int_t flag_hist, nEvthres,maxEvts; |
263 | char line[80]; | |
1ccd531d | 264 | sprintf(dbfile,"mutrkpedvalues"); |
265 | status=daqDA_DB_getFile(dbfile,dbfile); | |
266 | if(status) {printf(" !!! Failed : input file %s is missing, status = %d\n",dbfile,status); return -1; } | |
267 | ifstream filein(dbfile,ios::in); | |
160f3a71 | 268 | filein >> line >> nConfig ; cout << "mutrkpedvalues: " << line << nConfig << " " ; |
269 | filein >> line >> nEvthres ; if(nEvthres !=0)nEvthreshold=nEvthres; cout << line << nEvthreshold << " " ; | |
270 | filein >> line >> checkTokenlost ; cout << line << checkTokenlost << " " ; | |
271 | filein >> line >> flag_histo ; if(flag_histo !=0) cout << line << flag_histo << " " ; | |
272 | filein >> line >> maxEvts ; if(maxEvts!=0){maxEvents=maxEvts; cout << line << maxEvents;} | |
273 | // filein >> line >> errorDetail ; cout << line << errorDetail << " " ; | |
274 | // filein >> line >> nSorting ; cout << line << nSorting << " " ; | |
9c2d4e89 | 275 | cout << endl; |
f3cfa63e | 276 | } |
9c2d4e89 | 277 | if(!nConfig) printf("%s : *** Config= %d: no configuration ascii file is used \n",prefixLDC,nConfig); |
1b15b395 | 278 | muonPedestal->SetconfigDA(nConfig); |
f9e83f1d | 279 | muonPedestal->SetnEvthreshold(nEvthreshold); |
ff496840 | 280 | muonPedestal->SetnSorting(nSorting); |
1b15b395 | 281 | |
b9c33bca | 282 | // nConfig=1: configuration ascii file config_$DATE_ROLE_NAME read from DetDB |
1b15b395 | 283 | if(nConfig) |
284 | { | |
1ccd531d | 285 | sprintf(dbfile,"config_%s",getenv("DATE_ROLE_NAME")); |
286 | status=daqDA_DB_getFile(dbfile,dbfile); | |
287 | if(status) {printf(" !!! Failed : Configuration file %s is missing, status = %d\n",dbfile,status); return -1; } | |
1ccd531d | 288 | muonPedestal->LoadConfig(dbfile); |
1b15b395 | 289 | } |
290 | ||
dc928fbf | 291 | // Rawdeader, RawStreamHP |
292 | AliRawReader* rawReader = AliRawReader::Create(inputFile); | |
293 | AliMUONRawStreamTrackerHP* rawStream = new AliMUONRawStreamTrackerHP(rawReader); | |
18ec51a0 | 294 | // rawStream->DisableWarnings(); |
dc928fbf | 295 | rawStream->EnabbleErrorLogger(); |
9c2d4e89 | 296 | |
297 | switch (errorDetail) | |
298 | { | |
299 | case 0: rawStream->SetLoggingDetailLevel(AliMUONRawStreamTrackerHP::kLowErrorDetail); break;/// Logs minimal information in the error messages. | |
300 | case 1: rawStream->SetLoggingDetailLevel(AliMUONRawStreamTrackerHP::kMediumErrorDetail); break;/// Logs a medium level of detail in the error messages. | |
301 | case 2: rawStream->SetLoggingDetailLevel(AliMUONRawStreamTrackerHP::kHighErrorDetail); break;/// Logs a medium level of detail in the error messages. | |
302 | default: rawStream->SetLoggingDetailLevel(AliMUONRawStreamTrackerHP::kMediumErrorDetail); break; | |
303 | } | |
dc928fbf | 304 | |
9c2d4e89 | 305 | printf("\n%s : Reading data from file %s\n",prefixLDC,inputFile.Data()); |
dc928fbf | 306 | |
f9e83f1d | 307 | Int_t tabTokenError[20][14]; |
308 | for ( Int_t i=0 ; i<20 ; i++) { for ( Int_t j=0 ; j<14 ; j++) { tabTokenError[i][j]=0;} } | |
309 | ||
dc928fbf | 310 | while (rawReader->NextEvent()) |
311 | { | |
9c2d4e89 | 312 | Int_t eventType = rawReader->GetType(); |
313 | runNumber = rawReader->GetRunNumber(); | |
314 | if(nDateEvents==0) { filcout<<"// ----> RUN = " << runNumber << "\n" << endl;} | |
dc928fbf | 315 | if (nDateEvents >= maxDateEvents) break; |
316 | if (nEvents >= maxEvents) break; | |
317 | if (nDateEvents>0 && nDateEvents % 100 == 0) | |
9c2d4e89 | 318 | cout<< prefixLDC << " : DATE events = " << nDateEvents << " Used events = " << nEvents << endl; |
dc928fbf | 319 | |
320 | // check shutdown condition | |
9c2d4e89 | 321 | if (daqDA_checkShutdown()) break; |
dc928fbf | 322 | //Skip events |
323 | while (skipEvents) | |
324 | { | |
325 | rawReader->NextEvent(); | |
326 | skipEvents--; | |
327 | } | |
dc928fbf | 328 | nDateEvents++; |
329 | if (eventType != PHYSICS_EVENT) | |
330 | continue; // for the moment | |
331 | ||
9c2d4e89 | 332 | // const char* detail = ""; |
dc928fbf | 333 | // First lopp over DDL's to find good events |
334 | // Error counters per event (counters in the decoding lib are for each DDL) | |
335 | Bool_t eventIsErrorMessage = kFALSE; | |
336 | int eventGlitchErrors = 0; | |
337 | int eventParityErrors = 0; | |
338 | int eventPaddingErrors = 0; | |
18ec51a0 | 339 | int eventTokenlostErrors = 0; |
dc928fbf | 340 | rawStream->First(); |
341 | do | |
342 | { | |
343 | if (rawStream->IsErrorMessage()) eventIsErrorMessage = kTRUE; | |
344 | eventGlitchErrors += rawStream->GetGlitchErrors(); | |
345 | eventParityErrors += rawStream->GetParityErrors(); | |
346 | eventPaddingErrors += rawStream->GetPaddingErrors(); | |
18ec51a0 | 347 | eventTokenlostErrors += rawStream->GetTokenLostErrors(); |
9c2d4e89 | 348 | // cout << nDateEvents << " " << rawStream->GetDDL() << " " << eventTokenlostErrors << endl; |
f9e83f1d | 349 | if (rawStream->GetTokenLostErrors()) |
350 | { | |
351 | nTokenlostErrors++; | |
352 | const AliMUONRawStreamTrackerHP::AliBlockHeader* blkHeader = 0x0; | |
353 | const AliMUONRawStreamTrackerHP::AliDspHeader* dspHeader = 0x0; | |
354 | Int_t nBlock = rawStream->GetBlockCount(); | |
355 | for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++) | |
356 | { | |
357 | blkHeader = rawStream->GetBlockHeader(iBlock); | |
358 | // printf("Block %d Total length %d\n",iBlock,blkHeader->GetTotalLength()); | |
359 | Int_t nDsp = rawStream->GetDspCount(iBlock); | |
360 | // printf("Block %d DSP %d\n",iBlock,nDsp); | |
361 | for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++) | |
362 | { | |
363 | dspHeader = blkHeader->GetDspHeader(iDsp); | |
364 | // printf("Dsp %d Add %X\n",iDsp,dspHeader); | |
365 | if (dspHeader->GetErrorWord()) | |
366 | { | |
367 | Int_t ddl = rawStream->GetDDL() ; | |
368 | // Int_t ddl = AliDAQ::DdlID("MUONTRK", rawStream->GetDDL()) - 2560 ; // format 2560 + ddl | |
369 | Int_t frt = (dspHeader->GetErrorWord() & 0xFFFF0000) >> 16 ; // 4*4bits right shift | |
370 | tabTokenError[ddl][frt]++; | |
371 | // printf(" DDL %d error word %X %d %d\n",ddl,dspHeader->GetErrorWord(),frt,tabTokenError[8][4]); | |
372 | } | |
373 | ||
374 | } | |
375 | } | |
376 | } | |
dc928fbf | 377 | } while(rawStream->NextDDL()); |
378 | ||
379 | AliMUONRawStreamTrackerHP::AliBusPatch* busPatch; | |
380 | if (!eventIsErrorMessage) | |
381 | { | |
382 | // Good events (no error) -> compute pedestal for all channels | |
383 | rawStream->First(); | |
f9e83f1d | 384 | nEvents++; |
385 | muonPedestal->SetAliNCurrentEvents(nEvents); | |
dc928fbf | 386 | while( (busPatch = (AliMUONRawStreamTrackerHP::AliBusPatch*) rawStream->Next())) |
387 | { | |
388 | for(int i = 0; i < busPatch->GetLength(); ++i) | |
389 | { | |
dc928fbf | 390 | busPatch->GetData(i, manuId, channelId, charge); |
391 | muonPedestal->MakePed(busPatch->GetBusPatchId(), (Int_t)manuId, (Int_t)channelId, (Int_t)charge); | |
392 | } | |
393 | } | |
dc928fbf | 394 | } |
395 | else | |
396 | { | |
397 | // Events with errors | |
9c2d4e89 | 398 | if (recoverParityErrors && eventParityErrors && !eventGlitchErrors && !eventPaddingErrors && !(eventTokenlostErrors && checkTokenlost)) |
dc928fbf | 399 | { |
18ec51a0 | 400 | filcout << " ----------- Date Event recovered = " << nDateEvents << " ----------------" << endl; |
dc928fbf | 401 | // Recover parity errors -> compute pedestal for all good buspatches |
402 | if ( TEST_SYSTEM_ATTRIBUTE( rawReader->GetAttributes(), | |
403 | ATTR_ORBIT_BC )) | |
404 | { | |
405 | filcout <<"Event recovered -> Period:"<<EVENT_ID_GET_PERIOD( rawReader->GetEventId() ) | |
406 | <<" Orbit:"<<EVENT_ID_GET_ORBIT( rawReader->GetEventId() ) | |
407 | <<" BunchCrossing:"<<EVENT_ID_GET_BUNCH_CROSSING( rawReader->GetEventId() )<<endl; | |
408 | } | |
409 | else | |
410 | { | |
411 | filcout <<"Event recovered -> nbInRun:"<<EVENT_ID_GET_NB_IN_RUN( rawReader->GetEventId() ) | |
412 | <<" burstNb:"<<EVENT_ID_GET_BURST_NB( rawReader->GetEventId() ) | |
413 | <<" nbInBurst:"<<EVENT_ID_GET_NB_IN_BURST( rawReader->GetEventId() )<<endl; | |
414 | } | |
415 | rawStream->First(); | |
f9e83f1d | 416 | nEvents++; |
417 | muonPedestal->SetAliNCurrentEvents(nEvents); | |
dc928fbf | 418 | while( (busPatch = (AliMUONRawStreamTrackerHP::AliBusPatch*) rawStream->Next())) |
419 | { | |
420 | // Check the buspatch -> if error not use it in the pedestal calculation | |
421 | int errorCount = 0; | |
422 | for(int i = 0; i < busPatch->GetLength(); ++i) | |
423 | { | |
424 | if (!busPatch->IsParityOk(i)) errorCount++; | |
425 | } | |
426 | if (!errorCount) | |
427 | { | |
428 | // Good buspatch | |
429 | for(int i = 0; i < busPatch->GetLength(); ++i) | |
430 | { | |
dc928fbf | 431 | busPatch->GetData(i, manuId, channelId, charge); |
dc928fbf | 432 | muonPedestal->MakePed(busPatch->GetBusPatchId(), (Int_t)manuId, (Int_t)channelId, (Int_t)charge); |
433 | } | |
434 | } | |
435 | else | |
436 | { | |
dc928fbf | 437 | AliMUONErrorCounter* errorCounter; |
438 | // Bad buspatch -> not used (just print) | |
439 | filcout<<"bpId "<<busPatch->GetBusPatchId()<<" words "<<busPatch->GetLength() | |
440 | <<" parity errors "<<errorCount<<endl; | |
441 | // Number of events where this buspatch is missing | |
a54854fc | 442 | if (!(errorCounter = (AliMUONErrorCounter*) (muonPedestal->GetErrorBuspatchTable()->FindObject(busPatch->GetBusPatchId())))) |
dc928fbf | 443 | { |
444 | // New buspatch | |
445 | errorCounter = new AliMUONErrorCounter(busPatch->GetBusPatchId()); | |
dc928fbf | 446 | muonPedestal->GetErrorBuspatchTable()->Add(errorCounter); |
447 | } | |
448 | else | |
449 | { | |
450 | // Existing buspatch | |
451 | errorCounter->Increment(); | |
452 | } | |
453 | // errorCounter->Print(); | |
454 | } // end of if (!errorCount) | |
455 | } // end of while( (busPatch = (AliMUONRawStreamTrackerHP ... | |
f9e83f1d | 456 | // nEvents++; |
dc928fbf | 457 | nEventsRecovered++; |
458 | } //end of if (recoverParityErrors && eventParityErrors && !eventGlitchErrors&& !eventPaddingErrors) | |
459 | else | |
460 | { | |
461 | // Fatal errors reject the event | |
f9e83f1d | 462 | detail = Form(" ----------- Date Event rejected = %d ----------------",nDateEvents); |
9c2d4e89 | 463 | nDateRejEvents++; |
f9e83f1d | 464 | filcout << detail << endl; |
dc928fbf | 465 | if ( TEST_SYSTEM_ATTRIBUTE( rawReader->GetAttributes(), |
466 | ATTR_ORBIT_BC )) | |
467 | { | |
468 | filcout <<"Event rejected -> Period:"<<EVENT_ID_GET_PERIOD( rawReader->GetEventId() ) | |
469 | <<" Orbit:"<<EVENT_ID_GET_ORBIT( rawReader->GetEventId() ) | |
470 | <<" BunchCrossing:"<<EVENT_ID_GET_BUNCH_CROSSING( rawReader->GetEventId() )<<endl; | |
471 | } | |
472 | else | |
473 | { | |
474 | filcout <<"Event rejected -> nbInRun:"<<EVENT_ID_GET_NB_IN_RUN( rawReader->GetEventId() ) | |
475 | <<" burstNb:"<<EVENT_ID_GET_BURST_NB( rawReader->GetEventId() ) | |
476 | <<" nbInBurst:"<<EVENT_ID_GET_NB_IN_BURST( rawReader->GetEventId() )<<endl; | |
477 | ||
478 | } | |
479 | } // end of if (!rawStream->GetGlitchErrors() && !rawStream->GetPaddingErrors() ... | |
480 | filcout<<"Number of errors : Glitch "<<eventGlitchErrors | |
481 | <<" Parity "<<eventParityErrors | |
18ec51a0 | 482 | <<" Padding "<<eventPaddingErrors |
483 | <<" Token lost "<<eventTokenlostErrors<<endl; | |
dc928fbf | 484 | filcout<<endl; |
485 | } // end of if (!rawStream->IsErrorMessage()) | |
486 | ||
487 | if (eventGlitchErrors) nGlitchErrors++; | |
488 | if (eventParityErrors) nParityErrors++; | |
489 | if (eventPaddingErrors) nPaddingErrors++; | |
490 | ||
491 | } // while (rawReader->NextEvent()) | |
492 | delete rawReader; | |
493 | delete rawStream; | |
494 | ||
5431405e | 495 | sprintf(flatFile,"%s.ped",prefixDA); |
dc928fbf | 496 | if(shuttleFile.IsNull())shuttleFile=flatFile; |
497 | muonPedestal->SetAliNEvents(nEvents); | |
498 | muonPedestal->SetAliRunNumber(runNumber); | |
dbbb2c64 | 499 | |
9c2d4e89 | 500 | muonPedestal->Finalize(); |
501 | status = muonPedestal->GetStatusDA() ; | |
502 | ||
dc928fbf | 503 | // writing some counters |
9c2d4e89 | 504 | detail=Form("\n%s : Nb of DATE events = %d",prefixLDC,nDateEvents) ; cout << detail; filcout << detail ; |
505 | detail=Form("\n%s : Nb of Glitch errors = %d",prefixLDC,nGlitchErrors) ; cout << detail; filcout << detail ; | |
506 | detail=Form("\n%s : Nb of Parity errors = %d",prefixLDC,nParityErrors) ; cout << detail; filcout << detail ; | |
507 | detail=Form("\n%s : Nb of Token lost errors = %d",prefixLDC,nTokenlostErrors) ; cout << detail; filcout << detail ; | |
508 | detail=Form("\n%s : Nb of Rejected DATE events = %d",prefixLDC,nDateRejEvents) ; cout << detail; filcout << detail ; | |
509 | detail=Form("\n%s : Nb of recovered events = %d",prefixLDC,nEventsRecovered) ; cout << detail; filcout << detail ; | |
510 | detail=Form("\n%s : Nb of events without errors = %d",prefixLDC,nEvents-nEventsRecovered) ; cout << detail; filcout << detail ; | |
511 | detail=Form("\n%s : Nb of used events = %d (threshold= %d)\n\n",prefixLDC,nEvents,nEvthreshold); cout << detail; filcout << detail ; | |
dc928fbf | 512 | |
f9e83f1d | 513 | // Writing Token Error table |
514 | if(nTokenlostErrors) | |
515 | { | |
9c2d4e89 | 516 | detail=Form("%s : Warning: Token Lost occurence \n",prefixLDC); |
f9e83f1d | 517 | printf("%s",detail); |
518 | filcout << detail ; | |
519 | for ( Int_t i=0 ; i<20 ; i++) | |
520 | { | |
521 | for ( Int_t j=4 ; j<14 ; j++) | |
522 | { | |
523 | if(tabTokenError[i][j]>0) | |
524 | { | |
525 | Int_t tab=tabTokenError[i][j]; | |
526 | Int_t frt=j/2-1; | |
527 | Int_t station = i/4 +1; | |
9c2d4e89 | 528 | if( j % 2 == 0)detail=Form("%s : in DDL= %d (station %d) and FRT%d ( Up ) => %d Token errors (address = 0x%X0000)",prefixLDC,2560+i,station,frt,tab,j); |
529 | else detail=Form("%s : in DDL= %d (station %d) and FRT%d (Down) => %d Token errors (address = 0x%X0000)",prefixLDC,2560+i,station,frt,tab,j); | |
f9e83f1d | 530 | printf("%s\n",detail); |
531 | filcout << detail << endl; | |
532 | } | |
533 | } | |
534 | } | |
535 | } | |
536 | ||
9c2d4e89 | 537 | if (!shuttleFile.IsNull()) |
538 | { | |
539 | ofstream out(shuttleFile.Data()); | |
540 | muonPedestal->MakeASCIIoutput(out); /// Generate pedestal output file | |
541 | out.close(); | |
542 | detail=Form("%s : Pedestal file (to SHUTTLE) : %s\n",prefixLDC,shuttleFile.Data()); | |
543 | cout << detail; filcout << detail ; | |
544 | } | |
545 | if(flag_histo) /// Generate pedestal histo rootfile | |
546 | { | |
547 | muonPedestal->MakeControlHistos(); | |
548 | detail=Form("%s : Pedestal Histo file : %s\n",prefixLDC,muonPedestal->GetHistoFileName()); | |
549 | cout << detail; filcout << detail ; | |
550 | } | |
551 | // .log files | |
552 | detail=Form("%s : Output logfile : %s\n",prefixLDC,logOutputFile.Data()); | |
553 | cout << detail; filcout << detail ; | |
554 | ||
555 | ||
556 | // Transferring pedestal file to FES (be sure that env variable DAQDALIB_PATH is set) | |
557 | cout << endl; | |
558 | status1 = daqDA_FES_storeFile(shuttleFile.Data(),"PEDESTALS"); | |
559 | if (status1) { detail=Form("%s: !!! ERROR: Failed to export pedestal file : %s to FES \n",prefixLDC,shuttleFile.Data()); | |
560 | printf("%s",detail); filcout << detail ; status= -1; } | |
561 | //else { detail=Form("%s : ***** STORE Pedestal FILE in FES : OK ****** \n",prefixLDC); printf("%s",detail); filcout << detail ;} | |
562 | ||
563 | // Transferring configuration file to FES (be sure that env variable DAQDALIB_PATH is set) | |
564 | if(nConfig) | |
565 | { cout << endl; | |
566 | status1 = daqDA_FES_storeFile(dbfile,"CONFIG"); | |
567 | if (status1) { detail=Form("%s: !!! ERROR: Failed to export configuration file : %s to FES \n",prefixLDC,dbfile); | |
568 | printf("%s",detail); filcout << detail ; status=-1; } | |
569 | // else {detail=Form("%s : ***** STORE Configuration FILE in FES : OK ****** \n",prefixLDC); printf("%s",detail); filcout << detail ;} | |
570 | } | |
dc928fbf | 571 | |
5431405e | 572 | // Copying files to local DB folder defined by DAQ_DETDB_LOCAL |
573 | Char_t *dir; | |
1ccd531d | 574 | unsigned int nLastVersions=50; |
9c2d4e89 | 575 | dir= getenv("DAQ_DETDB_LOCAL"); |
576 | if(dir != NULL) { | |
577 | unsigned int nLastVersions=50; | |
160f3a71 | 578 | printf("\n%s : --- Local DataBase: %s (Max= %d) ---\n",prefixLDC,dir,nLastVersions); |
9c2d4e89 | 579 | if(!shuttleFile.IsNull())status1 = daqDA_localDB_storeFile(shuttleFile.Data(),nLastVersions); |
580 | if(flag_histo)status1 = daqDA_localDB_storeFile(muonPedestal->GetHistoFileName(),nLastVersions); | |
581 | status1 = daqDA_localDB_storeFile(logOutputFile.Data(),nLastVersions); | |
582 | } | |
b9c33bca | 583 | |
dc928fbf | 584 | |
9c2d4e89 | 585 | cout << " " << endl; |
586 | ||
587 | #ifdef ALI_AMORE | |
588 | // | |
589 | //Send objects to the AMORE DB | |
590 | // | |
591 | ostringstream stringout; | |
592 | muonPedestal->MakeASCIIoutput(stringout); | |
593 | ||
594 | amore::da::AmoreDA amoreDA(amore::da::AmoreDA::kSender); | |
595 | TObjString peddata(stringout.str().c_str()); | |
596 | Int_t amoreStatus = amoreDA.Send("Pedestals",&peddata); | |
597 | if ( amoreStatus ) | |
160f3a71 | 598 | {cout << prefixLDC << " : !!! ERROR: Failed to write Pedestals in the AMORE database : " << amoreStatus << endl ; status=-1 ;} |
9c2d4e89 | 599 | else |
600 | cout << prefixLDC << " : amoreDA.Send(Pedestals) ok" << endl; | |
601 | #else | |
602 | cout << prefixLDC << " : Warning: MCH DA not compiled with AMORE support" << endl; | |
603 | #endif | |
604 | ||
605 | filcout.close(); | |
1ccd531d | 606 | |
9c2d4e89 | 607 | if(!status)printf("\n%s : -------- End execution : %s -------- (status= %d) \n",prefixLDC,prefixDA,status); |
608 | else { printf("\n%s : -------- %s ending in ERROR !!!! -------- (status= %d) \n",prefixLDC,prefixDA,status);} | |
dc928fbf | 609 | timers.Stop(); |
9c2d4e89 | 610 | printf("\n Execution time : R:%7.2fs C:%7.2fs\n",timers.RealTime(), timers.CpuTime()); |
dc928fbf | 611 | return status; |
5431405e | 612 | } |