4 Contact: Franck Manso <manso@clermont.in2p3.fr>
5 Link: http://aliceinfo.cern.ch/static/Offline/dimuon/muon_html/README_mtrda.html
9 Number of events needed: 1000 events
10 Input files: MtgGlobalCrate.dat MtgRegionalCrate.dat MtgLocalMask.dat MtgLocalLut.dat MtgCurrent.dat DAConfig.dat
11 Output Files: ExportedFiles.dat MtgGlobalCrate.dat
12 Trigger types used: PHYSICS_EVENT CALIBRATION_EVENT
15 //////////////////////////////////////////////////////////////////////////////
16 // Detector Algorithm for the MUON trigger configuration. //
18 // Calculates masks for the global trigger input, by looking at dead //
19 // channels in calibration events and at noisy channels in physics events. //
20 // Transfers trigger configuration files to the File Exchange Server and //
21 // writes them (if modified) into the trigger configuration data base. //
24 // Christian Fink (formerly at Subatech, Nantes) //
25 // Franck Manso (LPC Clermont-Ferrand, manso@clermont.in2p3.fr) //
26 // Bogdan Vulpescu (LPC Clermont-Ferrand, vulpescu@clermont.in2p3.fr) //
28 //////////////////////////////////////////////////////////////////////////////
39 #include <Riostream.h>
44 #include "AliRawReaderDate.h"
46 #include "AliMpConstants.h"
47 #include "AliMUONRawStreamTrigger.h"
48 #include "AliMUONRawStreamTriggerHP.h"
49 #include "AliMUONDarcHeader.h"
50 #include "AliMUONDDLTrigger.h"
51 #include "AliMUONVStore.h"
52 #include "AliMUON1DArray.h"
53 #include "AliMUONTriggerIO.h"
54 #include "AliMUONRegionalTriggerConfig.h"
55 #include "AliMUONGlobalCrateConfig.h"
56 #include "AliMUONTriggerCrateConfig.h"
61 #include "TStopwatch.h"
63 #include "TPluginManager.h"
65 /// class for DA run parameters and DA working space
66 class AliDAConfig : TObject {
71 fDAConfigFileName("DAConfig.dat"),
72 fCurrentFileName("MtgCurrent.dat"),
73 fLastCurrentFileName("MtgLastCurrent.dat"),
79 fRegionalFileName(""),
80 fLocalMaskFileName(""),
81 fLocalLutFileName(""),
82 fSignatureFileName(""),
83 fGlobalFileVersion(0),
84 fRegionalFileVersion(0),
85 fLocalMaskFileVersion(0),
86 fLocalLutFileVersion(0),
87 fSignatureFileVersion(0),
88 fGlobalFileLastVersion(0),
89 fRegionalFileLastVersion(0),
90 fLocalMaskFileLastVersion(0),
91 fLocalLutFileLastVersion(0),
98 fTriggerIO(new AliMUONTriggerIO),
99 fAlgoNoisyInput(false),
100 fAlgoDeadcInput(false),
106 fWithWarnings(false),
107 fUseFastDecoder(false),
108 fNLocalBoard(AliMpConstants::TotalNofLocalBoards()+1)
110 /// default constructor
111 for (Int_t ii = 0; ii < kGlobalInputs; ii++) {
112 for (Int_t il = 0; il < kGlobalInputLength; il++) {
113 fAccGlobalInputN[ii][il] = 0;
114 fAccGlobalInputD[ii][il] = 0;
117 fLocalMasks = new AliMUON1DArray(fNLocalBoard);
118 fRegionalMasks = new AliMUONRegionalTriggerConfig();
119 fGlobalMasks = new AliMUONGlobalCrateConfig();
122 AliDAConfig (const AliDAConfig& cfg); // copy constructor
123 AliDAConfig& operator=(const AliDAConfig& cfg); // assignment operator
124 virtual ~AliDAConfig()
128 delete fRegionalMasks;
134 /// print DA parameters
135 printf("DA config file name: %s \n",GetDAConfigFileName());
136 printf("Current file name: %s \n",GetCurrentFileName());
137 printf("Last current file name: %s \n",GetLastCurrentFileName());
138 printf("Global file name: %s (%d %d)\n",GetGlobalFileName(),GetGlobalFileVersion(),GetGlobalFileLastVersion());
139 printf("Regional file name: %s (%d %d)\n",GetRegionalFileName(),GetRegionalFileVersion(),GetRegionalFileLastVersion());
140 printf("Local mask file name: %s (%d %d)\n",GetLocalMaskFileName(),GetLocalMaskFileVersion(),GetLocalMaskFileLastVersion());
141 printf("Local LUT file name: %s (%d %d)\n",GetLocalLutFileName(),GetLocalLutFileVersion(),GetLocalLutFileLastVersion());
142 printf("Signature file name: %s (%d)\n",GetSignatureFileName(),GetSignatureFileVersion());
145 const Char_t* GetDAConfigFileName() { return fDAConfigFileName.Data(); }
146 const Char_t* GetCurrentFileName() { return fCurrentFileName.Data(); }
147 const Char_t* GetLastCurrentFileName() { return fLastCurrentFileName.Data(); }
149 const Char_t* GetSodName() { return fSodName.Data(); }
150 Int_t GetSodFlag() const { return fSodFlag; }
152 const Char_t* GetDAName() { return fDAName.Data(); }
153 Int_t GetDAFlag() const { return fDAFlag; }
155 const Char_t* GetGlobalFileName() { return fGlobalFileName.Data(); }
156 const Char_t* GetRegionalFileName() { return fRegionalFileName.Data(); }
157 const Char_t* GetLocalMaskFileName() { return fLocalMaskFileName.Data(); }
158 const Char_t* GetLocalLutFileName() { return fLocalLutFileName.Data(); }
159 const Char_t* GetSignatureFileName() { return fSignatureFileName.Data(); }
161 Int_t GetGlobalFileVersion() const { return fGlobalFileVersion; }
162 Int_t GetRegionalFileVersion() const { return fRegionalFileVersion; }
163 Int_t GetLocalMaskFileVersion() const { return fLocalMaskFileVersion; }
164 Int_t GetLocalLutFileVersion() const { return fLocalLutFileVersion; }
165 Int_t GetSignatureFileVersion() const { return fSignatureFileVersion; }
167 Int_t GetGlobalFileLastVersion() const { return fGlobalFileLastVersion; }
168 Int_t GetRegionalFileLastVersion() const { return fRegionalFileLastVersion; }
169 Int_t GetLocalMaskFileLastVersion() const { return fLocalMaskFileLastVersion; }
170 Int_t GetLocalLutFileLastVersion() const { return fLocalLutFileLastVersion; }
172 AliMUONVStore* GetLocalMasks() const { return fLocalMasks; }
173 AliMUONRegionalTriggerConfig* GetRegionalMasks() const { return fRegionalMasks; }
174 AliMUONGlobalCrateConfig* GetGlobalMasks() const { return fGlobalMasks; }
176 AliMUONTriggerIO* GetTriggerIO() const { return fTriggerIO; }
178 Int_t GetEventsN() const { return fEventsN; }
179 Int_t GetEventsD() const { return fEventsD; }
181 Int_t GetPrintLevel() const { return fPrintLevel; }
183 Bool_t GetAlgoNoisyInput() const { return fAlgoNoisyInput; }
184 Bool_t GetAlgoDeadcInput() const { return fAlgoDeadcInput; }
186 Float_t GetThrN() const { return fThrN; }
187 Float_t GetThrD() const { return fThrD; }
189 Int_t GetMinEvents() const { return fMinEvents; }
190 Int_t GetMaxEvents() const { return fMaxEvents; }
191 Int_t GetSkipEvents() const { return fSkipEvents; }
193 Bool_t WithWarnings() const { return fWithWarnings; }
194 Bool_t UseFastDecoder() const { return fUseFastDecoder; }
196 Int_t GetGlobalInputs() const { return kGlobalInputs; }
197 Int_t GetGlobalInputLength() const { return kGlobalInputLength; }
199 Int_t GetAccGlobalInputN(Int_t ii, Int_t ib) const { return fAccGlobalInputN[ii][ib]; }
200 Int_t GetAccGlobalInputD(Int_t ii, Int_t ib) const { return fAccGlobalInputD[ii][ib]; }
202 void SetSodName(Char_t *name) { fSodName = TString(name); }
203 void SetSodFlag(Int_t flag) { fSodFlag = flag; }
205 void SetDAName(Char_t *name) { fDAName = TString(name); }
206 void SetDAFlag(Int_t flag) { fDAFlag = flag; }
208 void SetGlobalFileName(const Char_t *name) { fGlobalFileName = TString(name); }
209 void SetRegionalFileName(const Char_t *name) { fRegionalFileName = TString(name); }
210 void SetLocalMaskFileName(const Char_t *name) { fLocalMaskFileName = TString(name); }
211 void SetLocalLutFileName(const Char_t *name) { fLocalLutFileName = TString(name); }
212 void SetSignatureFileName(const Char_t *name) { fSignatureFileName = TString(name); }
214 void SetGlobalFileVersion(Int_t ver) { fGlobalFileVersion = ver; }
215 void SetRegionalFileVersion(Int_t ver) { fRegionalFileVersion = ver; }
216 void SetLocalMaskFileVersion(Int_t ver) { fLocalMaskFileVersion = ver; }
217 void SetLocalLutFileVersion(Int_t ver) { fLocalLutFileVersion = ver; }
218 void SetSignatureFileVersion(Int_t ver) { fSignatureFileVersion = ver; }
220 void SetGlobalFileLastVersion(Int_t ver) { fGlobalFileLastVersion = ver; }
221 void SetRegionalFileLastVersion(Int_t ver) { fRegionalFileLastVersion = ver; }
222 void SetLocalMaskFileLastVersion(Int_t ver) { fLocalMaskFileLastVersion = ver; }
223 void SetLocalLutFileLastVersion(Int_t ver) { fLocalLutFileLastVersion = ver; }
225 void IncNoiseEvent() { fEventsN++; }
226 void IncDeadcEvent() { fEventsD++; }
228 void AddAccGlobalInputN(Int_t ii, Int_t ib, Int_t val) { fAccGlobalInputN[ii][ib] += val; }
229 void AddAccGlobalInputD(Int_t ii, Int_t ib, Int_t val) { fAccGlobalInputD[ii][ib] += val; }
231 void SetPrintLevel(Int_t level) { fPrintLevel = level; }
233 void SetAlgoNoisyInput(Bool_t val) { fAlgoNoisyInput = val; }
234 void SetAlgoDeadcInput(Bool_t val) { fAlgoDeadcInput = val; }
236 void SetThrN(Float_t val) { fThrN = val; }
237 void SetThrD(Float_t val) { fThrD = val; }
239 void SetMinEvents(Int_t val) { fMinEvents = val; }
240 void SetMaxEvents(Int_t val) { fMaxEvents = val; }
241 void SetSkipEvents(Int_t val) { fSkipEvents = val; }
243 void SetWithWarnings() { fWithWarnings = true; }
244 void SetUseFastDecoder() { fUseFastDecoder = true; }
246 void IncGlobalFileVersion() { fGlobalFileVersion++; }
247 void DecSkipEvents() { fSkipEvents--; }
251 const TString fDAConfigFileName;
252 const TString fCurrentFileName;
253 const TString fLastCurrentFileName;
261 TString fGlobalFileName;
262 TString fRegionalFileName;
263 TString fLocalMaskFileName;
264 TString fLocalLutFileName;
265 TString fSignatureFileName;
267 Int_t fGlobalFileVersion;
268 Int_t fRegionalFileVersion;
269 Int_t fLocalMaskFileVersion;
270 Int_t fLocalLutFileVersion;
271 Int_t fSignatureFileVersion;
273 Int_t fGlobalFileLastVersion;
274 Int_t fRegionalFileLastVersion;
275 Int_t fLocalMaskFileLastVersion;
276 Int_t fLocalLutFileLastVersion;
283 AliMUONVStore* fLocalMasks;
284 AliMUONRegionalTriggerConfig* fRegionalMasks;
285 AliMUONGlobalCrateConfig* fGlobalMasks;
287 AliMUONTriggerIO *fTriggerIO;
289 Bool_t fAlgoNoisyInput;
290 Bool_t fAlgoDeadcInput;
297 Bool_t fWithWarnings;
298 Bool_t fUseFastDecoder;
300 const Int_t fNLocalBoard;
302 enum { kGlobalInputs = 4, kGlobalInputLength = 32 };
304 Int_t fAccGlobalInputN[kGlobalInputs][kGlobalInputLength];
305 Int_t fAccGlobalInputD[kGlobalInputs][kGlobalInputLength];
309 //__________________________________________________________________
310 Bool_t ReadDAConfig(AliDAConfig& cfg)
312 /// read run parameters for the DA
317 file = cfg.GetDAConfigFileName();
318 std::ifstream in(gSystem->ExpandPathName(file.Data()));
320 printf("Cannot open DA configuration file %s ; use default values.\n",file.Data());
329 pos = tmp.First(" ");
331 cfg.SetPrintLevel(tmp.Atoi());
335 pos = tmp.First(" ");
337 cfg.SetThrN(tmp.Atof());
341 pos = tmp.First(" ");
343 cfg.SetThrD(tmp.Atof());
347 pos = tmp.First(" ");
349 cfg.SetMinEvents(tmp.Atoi());
353 pos = tmp.First(" ");
355 cfg.SetSkipEvents(tmp.Atoi());
359 pos = tmp.First(" ");
361 cfg.SetMaxEvents(tmp.Atoi());
365 pos = tmp.First(" ");
367 if (tmp.Atoi() != 0) cfg.SetWithWarnings();
371 pos = tmp.First(" ");
373 if (tmp.Atoi() != 0) cfg.SetUseFastDecoder();
379 //__________________________________________________________________
380 void WriteLastCurrentFile(AliDAConfig& cfg, TString currentFile)
382 /// write last current file
387 out.open(file.Data());
388 out << cfg.GetSodName() << " " << cfg.GetSodFlag() << endl;
389 out << cfg.GetDAName() << " " << cfg.GetDAFlag() << endl;
391 out << cfg.GetGlobalFileName() << " " << cfg.GetGlobalFileVersion() << endl;
392 out << cfg.GetRegionalFileName() << " " << cfg.GetRegionalFileVersion() << endl;
393 out << cfg.GetLocalMaskFileName() << " " << cfg.GetLocalMaskFileVersion() << endl;
394 out << cfg.GetLocalLutFileName() << " " << cfg.GetLocalLutFileVersion() << endl;
395 out << cfg.GetSignatureFileName() << " " << cfg.GetSignatureFileVersion() << endl;
400 //___________________________________________________________________________________________
401 Bool_t ReadCurrentFile(AliDAConfig& cfg, TString currentFile, Bool_t lastCurrentFlag = false)
403 /// read last current file name and version
411 std::ifstream in(gSystem->ExpandPathName(file.Data()));
413 printf("Cannot open last current file %s\n",currentFile.Data());
419 sscanf(line, "%s %d", name, &flag);
420 cfg.SetSodName(name);
421 cfg.SetSodFlag(flag);
422 if (cfg.GetPrintLevel()) printf("Sod Flag %d\n", cfg.GetSodFlag());
426 sscanf(line, "%s %d", name, &flag);
429 if (cfg.GetPrintLevel()) printf("DA Flag: %d\n", cfg.GetDAFlag());
434 Int_t pos = tmp.First(" ");
435 TString tmp1 = tmp(0, pos);
436 cfg.SetGlobalFileName(tmp1.Data());
438 if (!lastCurrentFlag) {
439 cfg.SetGlobalFileVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
440 if (cfg.GetPrintLevel()) printf("Global File Name: %s version: %d\n",
441 cfg.GetGlobalFileName(), cfg.GetGlobalFileVersion());
443 cfg.SetGlobalFileLastVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
444 if (cfg.GetPrintLevel()) printf("Global File Name: %s last version: %d\n",
445 cfg.GetGlobalFileName(), cfg.GetGlobalFileLastVersion());
451 pos = tmp.First(" ");
453 cfg.SetRegionalFileName(tmp1.Data());
455 if (!lastCurrentFlag) {
456 cfg.SetRegionalFileVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
457 if (cfg.GetPrintLevel()) printf("Regional File Name: %s version: %d\n",
458 cfg.GetRegionalFileName(), cfg.GetRegionalFileVersion());
461 cfg.SetRegionalFileLastVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
462 if (cfg.GetPrintLevel()) printf("Regional File Name: %s last version: %d\n",
463 cfg.GetRegionalFileName(), cfg.GetRegionalFileLastVersion());
469 pos = tmp.First(" ");
471 cfg.SetLocalMaskFileName(tmp1.Data());
473 if (!lastCurrentFlag) {
474 cfg.SetLocalMaskFileVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
475 if (cfg.GetPrintLevel()) printf("Mask File Name: %s version: %d\n",
476 cfg.GetLocalMaskFileName(), cfg.GetLocalMaskFileVersion());
478 cfg.SetLocalMaskFileLastVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
479 if (cfg.GetPrintLevel()) printf("Mask File Name: %s last version: %d\n",
480 cfg.GetLocalMaskFileName(), cfg.GetLocalMaskFileLastVersion());
485 pos = tmp.First(" ");
487 cfg.SetLocalLutFileName(tmp1.Data());
489 if (!lastCurrentFlag) {
490 cfg.SetLocalLutFileVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
491 if (cfg.GetPrintLevel()) printf("Lut File Name: %s version: %d\n",
492 cfg.GetLocalLutFileName(), cfg.GetLocalLutFileVersion());
494 cfg.SetLocalLutFileLastVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
495 if (cfg.GetPrintLevel()) printf("Lut File Name: %s last version: %d\n",
496 cfg.GetLocalLutFileName(), cfg.GetLocalLutFileLastVersion());
501 pos = tmp.First(" ");
503 cfg.SetSignatureFileName(tmp1.Data());
504 cfg.SetSignatureFileVersion(atoi(tmp(pos+1, tmp.Length()-pos).Data()));
505 if (cfg.GetPrintLevel()) printf("Lut File Name: %s version: %d\n",
506 cfg.GetSignatureFileName(), cfg.GetSignatureFileVersion());
512 void ReadFileNames(AliDAConfig& cfg)
514 /// if last current file does not exist than read current file
516 if (!ReadCurrentFile(cfg,cfg.GetLastCurrentFileName(), true))
518 ReadCurrentFile(cfg,cfg.GetCurrentFileName(), true);
521 // any case read current file
522 ReadCurrentFile(cfg,cfg.GetCurrentFileName());
527 Bool_t ExportFiles(AliDAConfig& cfg)
529 /// Export files to FES
531 // env variables have to be set (suppose by ECS ?)
532 // setenv DATE_FES_PATH
533 // setenv DATE_RUN_NUMBER
534 // setenv DATE_ROLE_NAME
535 // setenv DATE_DETECTOR_CODE
538 gSystem->Setenv("DAQDALIB_PATH", "$DATE_SITE/infoLogger");
539 gSystem->Setenv("DAQDA_TEST_DIR", "/alisoft/FES");
545 Bool_t modified = false;
548 TString fileExp("ExportedFiles.dat");
551 out.open(fileExp.Data());
553 printf("Failed to create file: %s\n",file.Data());
557 // check if MtgLastCurrent.dat exists
558 // if not, do initial export of all files
559 Bool_t initFES = false;
560 if (gSystem->AccessPathName("MtgLastCurrent.dat"))
562 if (initFES) printf("Copy all configuration files to the FES.\n");
564 file = cfg.GetGlobalFileName();
565 if ((cfg.GetGlobalFileLastVersion() != cfg.GetGlobalFileVersion()) || initFES) {
566 status = daqDA_FES_storeFile(file.Data(), "GLOBAL");
568 printf("Failed to export file: %s\n",cfg.GetGlobalFileName());
571 if(cfg.GetPrintLevel()) printf("Export file: %s\n",cfg.GetGlobalFileName());
572 out << cfg.GetGlobalFileName() << endl;
575 file = cfg.GetLocalMaskFileName();
576 if ((cfg.GetLocalMaskFileLastVersion() != cfg.GetLocalMaskFileVersion()) || initFES) {
578 status = daqDA_FES_storeFile(file.Data(), "LOCAL");
580 printf("Failed to export file: %s\n",cfg.GetLocalMaskFileName());
583 if(cfg.GetPrintLevel()) printf("Export file: %s\n",cfg.GetLocalMaskFileName());
584 out << cfg.GetLocalMaskFileName() << endl;
587 file = cfg.GetLocalLutFileName();
588 if ((cfg.GetLocalLutFileLastVersion() != cfg.GetLocalLutFileVersion()) || initFES) {
590 status = daqDA_FES_storeFile(file.Data(), "LUT");
592 printf("Failed to export file: %s\n",cfg.GetLocalLutFileName());
595 if(cfg.GetPrintLevel()) printf("Export file: %s\n",cfg.GetLocalLutFileName());
596 out << cfg.GetLocalLutFileName() << endl;
600 // exported regional file whenever mask or/and Lut are modified
601 file = cfg.GetRegionalFileName();
602 if ( (cfg.GetRegionalFileLastVersion() != cfg.GetRegionalFileVersion()) || modified || initFES) {
603 status = daqDA_FES_storeFile(file.Data(), "REGIONAL");
605 printf("Failed to export file: %s\n",cfg.GetRegionalFileName());
608 if(cfg.GetPrintLevel()) printf("Export file: %s\n",cfg.GetRegionalFileName());
609 out << cfg.GetRegionalFileName() << endl;
614 // export Exported file to FES anyway
615 status = daqDA_FES_storeFile(fileExp.Data(), "EXPORTED");
617 printf("Failed to export file: %s\n", fileExp.Data());
620 if(cfg.GetPrintLevel()) printf("Export file: %s\n",fileExp.Data());
622 // write last current file
623 WriteLastCurrentFile(cfg,cfg.GetLastCurrentFileName());
629 Bool_t ImportFiles(AliDAConfig& cfg)
631 /// copy locally a file from daq detector config db
632 /// The current detector is identified by detector code in variable
633 /// DATE_DETECTOR_CODE. It must be defined.
634 /// If environment variable DAQDA_TEST_DIR is defined, files are copied from
635 /// DAQDA_TEST_DIR instead of the database.
636 /// The usual environment variables are not needed.
641 gSystem->Setenv("DAQDALIB_PATH", "$DATE_SITE/db");
644 status = daqDA_DB_getFile(cfg.GetDAConfigFileName(), cfg.GetDAConfigFileName());
646 printf("Failed to get DA config file from DB: %s\n",cfg.GetDAConfigFileName());
652 status = daqDA_DB_getFile(cfg.GetCurrentFileName(), cfg.GetCurrentFileName());
654 printf("Failed to get current config file from DB: %s\n",cfg.GetCurrentFileName());
660 status = daqDA_DB_getFile(cfg.GetGlobalFileName(), cfg.GetGlobalFileName());
662 printf("Failed to get current config file from DB: %s\n", cfg.GetGlobalFileName());
666 status = daqDA_DB_getFile(cfg.GetRegionalFileName(), cfg.GetRegionalFileName());
668 printf("Failed to get current config file from DB: %s\n",cfg.GetRegionalFileName());
672 status = daqDA_DB_getFile(cfg.GetLocalMaskFileName(), cfg.GetLocalMaskFileName());
674 printf("Failed to get current config file from DB: %s\n",cfg.GetLocalMaskFileName());
678 status = daqDA_DB_getFile(cfg.GetLocalLutFileName(), cfg.GetLocalLutFileName());
680 printf("Failed to get current config file from DB: %s\n",cfg.GetLocalLutFileName());
688 void ReadMaskFiles(AliDAConfig& cfg)
692 const Char_t* localFile = cfg.GetLocalMaskFileName();
693 const Char_t* regionalFile = cfg.GetRegionalFileName();
694 const Char_t* globalFile = cfg.GetGlobalFileName();
696 cfg.GetTriggerIO()->ReadConfig(localFile, regionalFile, globalFile, cfg.GetLocalMasks(), cfg.GetRegionalMasks(), cfg.GetGlobalMasks());
699 //______________________________________________________________
700 UInt_t GetFetMode(const AliDAConfig & cfg)
702 /// FET mode = 3 to run algorithm for dead global inputs
706 return cfg.GetGlobalMasks()->GetFetRegister(3);
710 //______________________________________________________________
711 void StoreGlobalInput(AliDAConfig& cfg, const UInt_t * const globalInput)
713 /// accumulate and build statistics of global input values
715 for (Int_t ii = 0; ii < cfg.GetGlobalInputs(); ii++) {
716 for (Int_t ib = 0; ib < cfg.GetGlobalInputLength(); ib++) {
718 if (cfg.GetAlgoNoisyInput())
719 cfg.AddAccGlobalInputN(ii,ib,((globalInput[ii] >> ib) & 0x1));
720 if (cfg.GetAlgoDeadcInput())
721 cfg.AddAccGlobalInputD(ii,ib,((globalInput[ii] >> ib) & 0x1));
727 //______________________________________________________________
728 void UpdateGlobalMasks(AliDAConfig& cfg)
730 /// update the global masks
733 gSystem->Setenv("DAQDALIB_PATH", "$DATE_SITE/db");
736 Float_t rateN = 0.0, rateD = 0.0;
737 UInt_t gmask[4], omask;
738 Bool_t noise, deadc, withEvN, withEvD, updated = false;
740 for (Int_t ii = 0; ii < cfg.GetGlobalInputs(); ii++) {
743 for (Int_t ib = 0; ib < cfg.GetGlobalInputLength(); ib++) {
749 if (cfg.GetEventsN() > cfg.GetMinEvents()) {
750 rateN = (Float_t)cfg.GetAccGlobalInputN(ii,ib)/(Float_t)cfg.GetEventsN();
751 noise = (rateN > cfg.GetThrN());
754 if (cfg.GetEventsD() > cfg.GetMinEvents()) {
755 rateD = (Float_t)cfg.GetAccGlobalInputD(ii,ib)/(Float_t)cfg.GetEventsD();
756 deadc = (rateD < cfg.GetThrD());
759 if (!withEvN && !withEvD) {
760 // - copy the bit from the old mask
761 gmask[ii] |= ((cfg.GetGlobalMasks()->GetGlobalMask(ii) >> ib) & 0x1) << ib;
762 if (cfg.GetPrintLevel())
763 printf("Mask not changed (just copy the old values)\n");
765 if (!withEvN && withEvD) {
767 // - create a new mask, set the bit to 1
769 //gmask[ii] |= 0x1 << ib;
770 // - copy the bit from the old mask
771 gmask[ii] |= ((cfg.GetGlobalMasks()->GetGlobalMask(ii) >> ib) & 0x1) << ib;
773 // - create a new mask, set the bit to 0
774 gmask[ii] |= 0x0 << ib;
775 if (cfg.GetPrintLevel())
776 printf("Found dead channel %1d:%02d (%4.2f) \n",ii,ib,rateD);
779 if (withEvN && !withEvD) {
781 // - create a new mask, set the bit to 1
783 //gmask[ii] |= 0x1 << ib;
784 // - copy the bit from the old mask
785 gmask[ii] |= ((cfg.GetGlobalMasks()->GetGlobalMask(ii) >> ib) & 0x1) << ib;
787 // - create a new mask, set the bit to 0
788 gmask[ii] |= 0x0 << ib;
789 if (cfg.GetPrintLevel())
790 printf("Found noisy channel %1d:%02d (%4.2f) \n",ii,ib,rateN);
793 if (withEvN && withEvD) {
794 if (!noise && !deadc) {
795 // - create a new mask, set the bit to 1
797 //gmask[ii] |= 0x1 << ib;
798 // - copy the bit from the old mask
799 gmask[ii] |= ((cfg.GetGlobalMasks()->GetGlobalMask(ii) >> ib) & 0x1) << ib;
801 // - create a new mask, set the bit to 0
802 gmask[ii] |= 0x0 << ib;
803 if (cfg.GetPrintLevel()) {
805 printf("Found noisy channel %1d:%02d (%4.2f) \n",ii,ib,rateN);
807 printf("Found dead channel %1d:%02d (%4.2f) \n",ii,ib,rateD);
814 // check if at least one mask value has been changed from previous version
815 for (Int_t ii = 0; ii < cfg.GetGlobalInputs(); ii++) {
816 printf("Global mask [%1d] %08x \n",ii,gmask[ii]);
817 omask = cfg.GetGlobalMasks()->GetGlobalMask(ii);
818 if (gmask[ii] != omask) {
820 cfg.GetGlobalMasks()->SetGlobalMask(ii,gmask[ii]);
828 cfg.IncGlobalFileVersion();
830 // don't change the file version ("-x.dat")
832 cfg.GetTriggerIO()->WriteGlobalConfig(cfg.GetGlobalFileName(),cfg.GetGlobalMasks());
834 // write last current file
835 WriteLastCurrentFile(cfg,cfg.GetCurrentFileName());
837 status = daqDA_DB_storeFile(cfg.GetGlobalFileName(), cfg.GetGlobalFileName());
839 printf("Failed to export file to DB: %s\n",cfg.GetGlobalFileName());
843 status = daqDA_DB_storeFile(cfg.GetCurrentFileName(), cfg.GetCurrentFileName());
845 printf("Failed to export file to DB: %s\n",cfg.GetCurrentFileName());
853 //*************************************************************//
854 int main(Int_t argc, Char_t **argv)
858 // needed for streamer application
859 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", "*", "TStreamerInfo", "RIO", "TStreamerInfo()");
861 /* check that we got some arguments = list of files */
863 printf("Wrong number of arguments\n");
869 Char_t inputFile[256] = "";
873 strncpy(inputFile, argv[1], 256);
875 printf("MUONTRGda : No input File !\n");
879 // decoding the events
882 Int_t nDateEvents = 0;
888 AliMUONDDLTrigger* ddlTrigger = 0x0;
889 AliMUONDarcHeader* darcHeader = 0x0;
890 // new (fast) decoder
891 const AliMUONRawStreamTriggerHP::AliHeader* darcHeaderHP = 0x0;
897 // comment out, since we do not retrieve files from database
898 if (!ImportFiles(cfg)) {
899 printf("Import from DB failed\n");
900 printf("For local test set DAQDA_TEST_DIR to the local directory where the Mtg files are located \n");
907 // the run number extracted from the file name
908 TString tmp(inputFile);
909 Int_t pos = tmp.First("daq");
911 gSystem->Setenv("DATE_RUN_NUMBER",tmp.Data());
912 gSystem->Exec("echo \"DATE_RUN_NUMBER = \" $DATE_RUN_NUMBER");
915 if(!ExportFiles(cfg)) {
916 printf("ExportFiles failed\n");
920 // FET is triggered by CTP
921 Bool_t modeFET3 = kTRUE;
922 if (GetFetMode(cfg) != 3) {
923 printf("FET is not in mode 3. Only PHYSICS events will be analysed (noisy channels)\n");
927 // All 5 global cards are controlled by the Mts proxy
928 if (cfg.GetGlobalMasks()->GetGlobalCrateEnable() != 0x1F) {
929 printf("The MTS proxy does not control all global cards\n");
933 // The global cards are ON (active on the global inputs)
934 if (!cfg.GetGlobalMasks()->GetMasksOn()) {
935 printf("Global masks are not ON\n");
939 // make sure to catch the "rare" calib events (1 every 50s in physics)
940 const Char_t* tableSOD[] = {"ALL", "yes", "CAL", "all", NULL, NULL};
941 monitorDeclareTable(const_cast<char**>(tableSOD));
943 status = monitorSetDataSource(inputFile);
945 cerr << "ERROR : monitorSetDataSource status (hex) = " << hex << status
946 << " " << monitorDecodeError(status) << endl;
949 status = monitorDeclareMp("MUON Trigger monitoring");
951 cerr << "ERROR : monitorDeclareMp status (hex) = " << hex << status
952 << " " << monitorDecodeError(status) << endl;
956 /* define wait event timeout - 1s max */
958 monitorSetNoWaitNetworkTimeout(1000);
960 cout << "MUONTRGda : Reading data from file " << inputFile <<endl;
962 UInt_t *globalInput = new UInt_t[4];
963 Bool_t doUpdate = false;
969 if (nEvents >= cfg.GetMaxEvents()) break;
970 if (cfg.GetPrintLevel()) {
971 if (nEvents && nEvents % 1000 == 0)
972 cout<<"Cumulated events " << nEvents << endl;
974 // check shutdown condition
975 if (daqDA_checkShutdown())
978 // Skip Events if needed
979 while (cfg.GetSkipEvents()) {
980 status = monitorGetEventDynamic(&event);
985 status = monitorGetEventDynamic(&event);
987 cout << "MUONTRGda : EOF found" << endl;
993 // decoding rawdata headers
994 AliRawReader *rawReader = new AliRawReaderDate(event);
996 Int_t eventType = rawReader->GetType();
997 runNumber = rawReader->GetRunNumber();
1000 // CALIBRATION_EVENT
1001 // SYSTEM_SOFTWARE_TRIGGER_EVENT
1002 // DETECTOR_SOFTWARE_TRIGGER_EVENT
1003 cfg.SetAlgoNoisyInput(false);
1004 cfg.SetAlgoDeadcInput(false);
1005 if (eventType == PHYSICS_EVENT) {
1006 cfg.SetAlgoNoisyInput(true);
1008 cfg.IncNoiseEvent();
1009 } else if (modeFET3 && eventType == CALIBRATION_EVENT) {
1010 cfg.SetAlgoDeadcInput(true);
1012 cfg.IncDeadcEvent();
1018 if (cfg.GetPrintLevel() == 2) printf("\nEvent # %d\n",nEvents);
1020 // decoding MUON payload
1021 AliMUONVRawStreamTrigger *rawStream = 0x0;
1022 if (cfg.UseFastDecoder()) {
1023 rawStream = new AliMUONRawStreamTriggerHP(rawReader);
1025 rawStream = new AliMUONRawStreamTrigger(rawReader);
1028 // ... without warnings from the decoder !!!
1029 if (!cfg.WithWarnings())
1030 rawStream->DisableWarnings();
1033 while((status = rawStream->NextDDL())) {
1035 if (cfg.GetPrintLevel() == 2) printf("iDDL %d\n", rawStream->GetDDL());
1037 if (rawStream->GetDDL() == 0) {
1038 if (cfg.UseFastDecoder()) {
1039 darcHeaderHP = static_cast<AliMUONRawStreamTriggerHP*>(rawStream)->GetHeaders();
1040 if (cfg.GetPrintLevel() == 2) printf("Global output (fast decoder) %x\n", (Int_t)darcHeaderHP->GetGlobalOutput());
1041 for (Int_t ig = 0; ig < cfg.GetGlobalInputs(); ig++)
1042 globalInput[ig] = darcHeaderHP->GetGlobalInput(ig);
1044 ddlTrigger = rawStream->GetDDLTrigger();
1045 darcHeader = ddlTrigger->GetDarcHeader();
1046 if (cfg.GetPrintLevel() == 2) printf("Global output %x\n", (Int_t)darcHeader->GetGlobalOutput());
1047 globalInput = darcHeader->GetGlobalInput();
1049 StoreGlobalInput(cfg,globalInput);
1059 // update configuration files ifrequested event types were found
1060 if (doUpdate && cfg.GetDAFlag())
1061 UpdateGlobalMasks(cfg);
1065 cout << "MUONTRGda: DA enable: " << cfg.GetDAFlag() << endl;
1066 cout << "MUONTRGda: Run number: " << runNumber << endl;
1067 cout << "MUONTRGda: Nb of DATE events: " << nDateEvents << endl;
1068 cout << "MUONTRGda: Nb of events used: " << nEvents << endl;
1069 cout << "MUONTRGda: Nb of events used (noise): " << cfg.GetEventsN() << endl;
1070 cout << "MUONTRGda: Nb of events used (deadc): " << cfg.GetEventsD() << endl;
1071 cout << "MUONTRGda: Minumum nr of events for rate calculation: " << cfg.GetMinEvents() << endl;
1072 cout << "MUONTRGda: Maximum nr of analyzed events: " << cfg.GetMaxEvents() << endl;
1073 cout << "MUONTRGda: Skip events from start: " << cfg.GetSkipEvents() << endl;
1074 cout << "MUONTRGda: Threshold for noisy inputs: " << 100*cfg.GetThrN() << "%" << endl;
1075 cout << "MUONTRGda: Threshold for dead inputs: " << 100*cfg.GetThrD() << "%" << endl;
1076 cout << "MUONTRGda: Print level: " << cfg.GetPrintLevel() << endl;
1077 cout << "MUONTRGda: Show decoder warnings: " << cfg.WithWarnings() << endl;
1078 cout << "MUONTRGda: Use the fast decoder: " << cfg.UseFastDecoder() << endl;
1080 printf("MUONTRGda: Execution time : R:%7.2fs C:%7.2fs\n", timers.RealTime(), timers.CpuTime());