1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 #include "AliMUONTriggerIO.h"
19 #include "AliMUONTriggerLut.h"
20 #include "AliMUONCalibParamNI.h"
21 #include "AliMUONVStore.h"
24 #include "AliMpHelper.h"
25 #include "AliMpConstants.h"
27 #include "AliMpFiles.h"
28 #include "AliMpDDLStore.h"
29 #include "AliMpLocalBoard.h"
30 #include "AliMpTriggerCrate.h"
34 #include <Riostream.h>
37 /// \class AliMUONTriggerIO
39 /// Handles read/write of masks and LUT to/from online files,
40 /// to be used by Shuttle and Trigger DA.
42 /// \author Laurent Aphecetche, Christian Finck Subatech
43 /// \author Bogdan Vulpescu, LPC Clermont-Ferrand
46 ClassImp(AliMUONTriggerIO)
49 //_____________________________________________________________________________
50 AliMUONTriggerIO::AliMUONTriggerIO()
58 //_____________________________________________________________________________
59 AliMUONTriggerIO::AliMUONTriggerIO(const char* regionalFileToRead)
65 ReadRegional(regionalFileToRead,0);
68 //_____________________________________________________________________________
69 AliMUONTriggerIO::~AliMUONTriggerIO()
74 //_____________________________________________________________________________
76 AliMUONTriggerIO::DeCompAddress(UChar_t &ypos, UChar_t &ytri, UChar_t &xdev, UChar_t &xpos,
77 UShort_t address) const
79 /// decompose the 15-bits address
84 // UChar_t bitsXpos = 5;
86 UShort_t maskYpos = 0x000F; // ...0 00001111
87 UShort_t maskYtri = 0x0001; // ...0 00000001
88 UShort_t maskXdev = 0x001F; // ...0 00011111
89 UShort_t maskXpos = 0x001F; // ...0 00011111
91 ypos = address & maskYpos;
92 ytri = (address >> bitsYpos) & maskYtri;
93 xdev = (address >> (bitsYpos+bitsYtri)) & maskXdev;
94 xpos = (address >> (bitsYpos+bitsYtri+bitsXdev)) & maskXpos;
96 // convert deviation format
97 // online: sign 1bit , dev 4bit
101 // 0 0 mu+, mu- infinite momentum (unde)
107 // - 15 mu+, mu- infinite momentum (unde)
109 Int_t iXdevOff, iXdevOn, iXdev, sign;
115 iXdevOn += iXdev & 0x0F;
116 sign += (iXdev >> 4) & 0x01;
128 iXdevOff = - iXdevOn + 15; // gives range 0-14
130 iXdevOff = + iXdevOn + 15; // gives range 16-30 !
140 //_____________________________________________________________________________
142 AliMUONTriggerIO::FillLut(AliMUONTriggerLut& lut,
143 Int_t icirc, UChar_t istripX, UChar_t idev,
144 Int_t lutLpt[16][2], Int_t lutHpt[16][2])
146 /// Fill the LUT histograms
148 if (icirc == 0 && istripX == 0 && idev == 0)
150 AliDebug(1,"Copy board, not filled ...");
154 Short_t iLptPlus, iLptMinu, iLptUnde;
155 Short_t iHptPlus, iHptMinu, iHptUnde;
157 iLptPlus = iLptMinu = iLptUnde = 0;
158 iHptPlus = iHptMinu = iHptUnde = 0;
160 for (Int_t istripY=0; istripY<16; istripY++)
162 if (lutLpt[istripY][1] == 0 && lutLpt[istripY][0] ==1)
163 iLptMinu=iLptMinu+(1 << istripY);
164 if (lutLpt[istripY][1] == 1 && lutLpt[istripY][0] ==0)
165 iLptPlus=iLptPlus+(1 << istripY);
166 if (lutLpt[istripY][1] == 1 && lutLpt[istripY][0] ==1)
167 iLptUnde=iLptUnde+(1 << istripY);
169 if (lutHpt[istripY][1] == 0 && lutHpt[istripY][0] ==1)
170 iHptMinu=iHptMinu+(1 << istripY);
171 if (lutHpt[istripY][1] == 1 && lutHpt[istripY][0] ==0)
172 iHptPlus=iHptPlus+(1 << istripY);
173 if (lutHpt[istripY][1] == 1 && lutHpt[istripY][0] ==1)
174 iHptUnde=iHptUnde+(1 << istripY);
178 lut.SetContent("LptMinu",icirc,istripX,idev,iLptMinu);
179 lut.SetContent("LptUnde",icirc,istripX,idev,iLptUnde);
180 lut.SetContent("LptPlus",icirc,istripX,idev,iLptPlus);
182 lut.SetContent("HptMinu",icirc,istripX,idev,iHptMinu);
183 lut.SetContent("HptUnde",icirc,istripX,idev,iHptUnde);
184 lut.SetContent("HptPlus",icirc,istripX,idev,iHptPlus);
187 //_____________________________________________________________________________
189 AliMUONTriggerIO::ReadLocalMasks(const char* localFile, AliMUONVStore& localMasks) const
191 /// Fills the local masks store from file
193 if ( !NofLocalBoards() )
195 AliError("No local board to read");
199 FILE* fp = fopen(gSystem->ExpandPathName(localFile),"r");
202 AliError(Form("Could not read file %s",localFile));
206 UShort_t maskBuffer[8];
208 Int_t nLocalBoards(0);
210 while ( fread ( maskBuffer, 2, 8, fp ) )
212 Int_t localBoardId = LocalBoardId(nLocalBoards);
213 AliDebug(1,Form("LB %03d X1 %4x X2 %4x X3 %4x X4 %4x "
214 "Y1 %4x Y2 %4x Y3 %4x Y4 %4x",
227 AliMUONVCalibParam* localBoard = new AliMUONCalibParamNI(1,8,localBoardId,0,0);
228 for ( Int_t index = 0; index < 8; ++index )
230 localBoard->SetValueAsInt(index,0,maskBuffer[index]);
232 localMasks.Add(localBoard);
238 if ( nLocalBoards != NofLocalBoards() )
240 AliError(Form("Read %d out of %d local boards",
241 nLocalBoards, NofLocalBoards()));
249 //_____________________________________________________________________________
251 AliMUONTriggerIO::ReadLocalLUT(AliMUONTriggerLut& lut,
255 /// Read the LUT for one local board from an online file
259 UChar_t buffer[16384]; // 32768 hpt/lpt addresses divided by two
260 UChar_t mask1 = 0xF0;
261 UChar_t mask2 = 0x0F;
262 UChar_t maskHpt = 0x0C;
263 UChar_t maskLpt = 0x03;
264 UChar_t lh, lpt, hpt;
266 UChar_t xpos, xdev, ypos, ytri;
268 Int_t lutLpt[16][2], lutHpt[16][2];
270 Int_t boardnr = localBoardId;
272 AliDebug(1,Form("Reading LUT values for local board %d",boardnr));
275 Bool_t trigx = kFALSE;
277 // read two lut addresses at once, 32768/2=16384 times
278 fread(buffer,16384,1,flut);
280 // create the 32767 addresses for the 4-bits lpt and hpt half-bytes
281 for (UShort_t ilut = 0; ilut < 32768; ilut += 2)
284 // 1st 4-bits half-byte
286 lh = (buffer[ilut/2] & mask1) >> 4;
288 // Lpt and Hpt response
289 hpt = (lh & maskHpt) >> 2;
292 // decompose the 15-bits address
293 trigx = DeCompAddress(ypos,ytri,xdev,xpos,address);
295 // calculate group of y-strips
296 if (trigx && (ny < 16))
298 lutLpt[ny][0] = lpt & 1;
299 lutLpt[ny][1] = (lpt & 2) >> 1;
300 lutHpt[ny][0] = hpt & 1;
301 lutHpt[ny][1] = (hpt & 2) >> 1;
306 // ytri == 1 means no trigger in y-direction
309 FillLut(lut,boardnr,xpos,xdev,lutLpt,lutHpt);
314 // 2nd 4-bits half-byte
316 lh = (buffer[ilut/2] & mask2);
318 // Lpt and Hpt response
319 hpt = (lh & maskHpt) >> 2;
322 // decompose the 15-bits address
323 trigx = DeCompAddress(ypos,ytri,xdev,xpos,address);
325 // calculate group of y-strips
326 if (trigx && (ny < 16))
328 lutLpt[ny][0] = lpt & 1;
329 lutLpt[ny][1] = (lpt & 2) >> 1;
330 lutHpt[ny][0] = hpt & 1;
331 lutHpt[ny][1] = (hpt & 2) >> 1;
336 // ytri == 1 means no trigger in y-direction
339 FillLut(lut,boardnr,xpos,xdev,lutLpt,lutHpt);
346 //_____________________________________________________________________________
348 AliMUONTriggerIO::ReadLUT(const char* lutFileToRead, AliMUONTriggerLut& lut)
350 /// Fill the LUT object from online file
352 if ( !NofLocalBoards() )
354 AliError("No local board id defined. Must read a regional file first");
358 FILE* flut = fopen(gSystem->ExpandPathName(lutFileToRead),"rb");
361 AliError(Form("Could not read LUT file %s",lutFileToRead));
365 for ( Int_t i = 0; i < NofLocalBoards(); ++i )
367 ReadLocalLUT(lut,LocalBoardId(i),flut);
376 //_____________________________________________________________________________
378 AliMUONTriggerIO::ReadMasks(const char* localFile,
379 const char* regionalFile,
380 const char* globalFile,
381 AliMUONVStore* localMasks,
382 AliMUONVStore* regionalMasks,
383 AliMUONVCalibParam* globalMasks,
386 /// Fill the various masks store from files
390 AliError("Must have a regional file name to proceeed");
394 Int_t nCrates = ReadRegional(regionalFile,regionalMasks, warn);
396 if (!nCrates) return kFALSE;
398 if (localMasks && localFile)
400 Int_t nLocal = ReadLocalMasks(localFile,*localMasks);
401 AliDebug(1,Form("Read masks for %d local boards",nLocal));
404 Int_t nDarc = ReadGlobal(globalFile, globalMasks);
405 AliDebug(1,Form("Read disable for %d DARC boards",nDarc));
407 if (!nDarc) return kFALSE;
412 //_____________________________________________________________________________
414 AliMUONTriggerIO::ReadGlobal(const char* globalFile, AliMUONVCalibParam* globalMasks)
416 /// read the global crate file and file corresponding mask
417 /// the masks are disable bit for each crate, 8 per darc board
418 /// bit value 0 means enable, 1 means disable *
421 if ( ! fGlobalCrate.ReadData(globalFile) ) return 0;
423 UChar_t mask = fGlobalCrate.GetFirstDarcDisable();
424 ULong_t vmeAddr = fGlobalCrate.GetFirstDarcVmeAddr();
425 if (vmeAddr) nDarc++;
426 globalMasks->SetValueAsInt(0,0,mask);
428 mask = fGlobalCrate.GetSecondDarcDisable();
429 vmeAddr = fGlobalCrate.GetSecondDarcVmeAddr();
430 if (vmeAddr) nDarc++;
431 globalMasks->SetValueAsInt(1,0,mask);
436 //_____________________________________________________________________________
438 AliMUONTriggerIO::ReadRegional(const char* regionalFile, AliMUONVStore* regionalMasks, Bool_t warn)
440 /// Read regional file to fill the regional mask store *AND*
441 /// determine the order in which local boards will appear in local
444 if ( ! fRegionalTrigger.ReadData(regionalFile) ) return 0;
448 for (Int_t iCrate = 0; iCrate < fRegionalTrigger.GetNofTriggerCrates(); ++iCrate)
451 AliMpTriggerCrate* crate = fRegionalTrigger.GetTriggerCrateFast(iCrate);
455 AliMpTriggerCrate* triggerCrate = AliMpDDLStore::Instance()->GetTriggerCrate(crate->GetName());
459 AliError(Form("Mapping error : could not get crate %s", crate->GetName()));
466 if (regionalMasks != 0x0)
468 masks = crate->GetMask();
470 AliMUONVCalibParam* regionalBoard = new AliMUONCalibParamNI(1, 1, crate->GetId(), 0, 0);
471 regionalBoard->SetValueAsInt(0, 0, masks);
472 regionalMasks->Add(regionalBoard);
479 //_____________________________________________________________________________
481 AliMUONTriggerIO::WriteLUT(const AliMUONTriggerLut& lut,
482 const char* lutFileToWrite)
484 /// Convert an offline lut into an online (binary) lut file
486 if ( !NofLocalBoards() )
488 AliError("No local board id defined. Must read a regional file first");
492 FILE* flut = fopen(gSystem->ExpandPathName(lutFileToWrite),"wb");
495 AliError(Form("Could not create output LUT file %s",lutFileToWrite));
499 for ( Int_t i = 0; i < NofLocalBoards(); ++i )
501 WriteLocalLUT(lut,LocalBoardId(i),flut);
509 //_____________________________________________________________________________
511 AliMUONTriggerIO::WriteMasks(const char* localFile,
512 const char* regionalFile,
513 const char* globalFile,
514 AliMUONVStore* localMasks,
515 AliMUONVStore* regionalMasks,
516 AliMUONVCalibParam* globalMasks) const
520 ok = WriteLocalMasks(localFile, *localMasks);
521 ok &= WriteRegional(regionalFile, regionalMasks);
522 ok &= WriteGlobal(globalFile, globalMasks);
527 //_____________________________________________________________________________
529 AliMUONTriggerIO::WriteGlobal(const char* globalFile, AliMUONVCalibParam* globalMasks) const
531 /// write global file
532 /// if no global masks defined take the one of configuration
537 out.open(globalFile);
540 AliError(Form("Could not create output regional file %s", globalFile));
544 out << fGlobalCrate.GetName() << endl;
547 out << fGlobalCrate.GetJtagName() << endl;
548 out << Form("0x%08x", fGlobalCrate.GetJtagVmeAddr()) << endl;
549 out << Form("%d %d %d", fGlobalCrate.GetJtagClockDiv(),
550 fGlobalCrate.GetJtagRxPhase(), fGlobalCrate.GetJtagRdDelay()) << endl;
552 for (Int_t i = 0; i < fGlobalCrate.GetJtagNofLines(); ++i)
553 out << Form("%d ", fGlobalCrate.GetEnableJtag(i));
557 for (Int_t i = 0; i < fGlobalCrate.GetJtagNofLines(); ++i)
560 for (Int_t j = 0; j < fGlobalCrate.GetJtagNofLines(); ++j)
561 out << Form(" %s", fGlobalCrate.GetJtagCrateName(i,j).Data()) << endl;
565 out << fGlobalCrate.GetFirstDarcName() << endl;
566 out << Form("0x%08x", fGlobalCrate.GetFirstDarcVmeAddr()) << endl;
567 out << fGlobalCrate.GetFirstDarcType() << endl;
568 if (globalMasks != 0x0)
569 disable = globalMasks->ValueAsInt(0);
571 disable = fGlobalCrate.GetFirstDarcDisable();
572 out << Form("0x%02x", disable) << endl;
573 out << Form("0x%x", fGlobalCrate.GetFirstDarcL0Delay()) << endl;
574 out << Form("0x%x", fGlobalCrate.GetFirstDarcL1TimeOut()) << endl;
577 out << fGlobalCrate.GetSecondDarcName() << endl;
578 out << Form("0x%08x", fGlobalCrate.GetSecondDarcVmeAddr()) << endl;
579 out << fGlobalCrate.GetSecondDarcType() << endl;
580 if (globalMasks != 0x0)
581 disable = globalMasks->ValueAsInt(1);
583 disable = fGlobalCrate.GetSecondDarcDisable();
584 out << Form("0x%02x", disable) << endl;
585 out << Form("0x%x", fGlobalCrate.GetSecondDarcL0Delay()) << endl;
586 out << Form("0x%x", fGlobalCrate.GetSecondDarcL1TimeOut()) << endl;
589 out << fGlobalCrate.GetGlobalName() << endl;
590 out << Form("0x%08x", fGlobalCrate.GetGlobalVmeAddr()) << endl;
591 for (Int_t i = 0; i < fGlobalCrate.GetGlobalNofRegisters(); ++i)
592 out << Form("0x%x", fGlobalCrate.GetGlobalRegister(i)) << endl;
595 out << fGlobalCrate.GetFetName() << endl;
596 out << Form("0x%08x", fGlobalCrate.GetFetVmeAddr()) << endl;
597 for (Int_t i = 0; i < fGlobalCrate.GetFetNofRegisters(); ++i)
598 out << Form("0x%x", fGlobalCrate.GetFetRegister(i)) << endl;
604 //_____________________________________________________________________________
606 AliMUONTriggerIO::WriteRegional(const char* regionalFile, AliMUONVStore* regionalMasks) const
609 /// write regional mask with the current configuration
610 /// if regional masks not defined, take the one from current configuration
613 out.open(regionalFile);
617 AliError(Form("Could not create output regional file %s",regionalFile));
621 for (Int_t iCrate = 0; iCrate < fRegionalTrigger.GetNofTriggerCrates(); ++iCrate)
623 AliMpTriggerCrate* crate = fRegionalTrigger.GetTriggerCrateFast(iCrate);
625 out << crate->GetName() << endl;
626 out << Form("%02x", crate->GetId()) << endl;
627 out << crate->GetMode() << endl;
628 out << crate->GetCoinc() << endl;
631 if (regionalMasks != 0x0)
633 AliMUONVCalibParam* maskParam =
634 static_cast<AliMUONVCalibParam*>(regionalMasks->FindObject(crate->GetId()));
635 masks = maskParam->ValueAsInt(0,0);
639 masks = crate->GetMask();
642 out << Form("%04x", masks) << endl;
644 for (Int_t iLocal = 0; iLocal < crate->GetNofLocalBoards(); ++iLocal)
646 Int_t localBoardId = crate->GetLocalBoardId(iLocal);
648 AliMpLocalBoard* board = fRegionalTrigger.FindLocalBoard(localBoardId);
650 out << Form("%02d ", board->GetSlot())
652 << Form(" %03d ", localBoardId)
653 << Form("%03x", board->GetSwitch())
657 for (Int_t i = 0; i < board->GetNofDEs(); ++i)
658 out << Form("%4d ", board->GetDEId(i));
661 // print copy card numbers
662 out << Form(" %4d %4d", board->GetInputXfrom(), board->GetInputXto());
663 out << Form(" %4d %4d", board->GetInputYfrom(), board->GetInputYto());
664 out << Form(" %4d", board->GetTC()) << endl;
672 //_____________________________________________________________________________
674 AliMUONTriggerIO::WriteLocalMasks(const char* localFile, AliMUONVStore& localMasks) const
677 /// removing/adding enable for a local board need a update of the configuration
678 /// before calling this method
679 /// mask are written for all boards including the copy card (Ch.F.)
681 FILE* fp = fopen(gSystem->ExpandPathName(localFile),"wb");
684 AliError(Form("Could not create output local file %s",localFile));
688 UShort_t maskBuffer[8];
690 for (Int_t iCrate = 0; iCrate < fRegionalTrigger.GetNofTriggerCrates(); ++iCrate)
692 AliMpTriggerCrate* crate = fRegionalTrigger.GetTriggerCrateFast(iCrate);
694 UShort_t mask = crate->GetMask(); // getting mask from current config
696 for (Int_t iLocal = 0; iLocal < crate->GetNofLocalBoards(); ++iLocal)
698 Int_t localBoardId = crate->GetLocalBoardId(iLocal);
700 if ( (mask >> iLocal ) & 0x1 )
702 AliMUONVCalibParam* localMask =
703 static_cast<AliMUONVCalibParam*>(localMasks.FindObject(localBoardId));
705 for (Int_t index = 0; index < 8; ++index)
707 maskBuffer[index] = localMask->ValueAsInt(index,0);
710 fwrite ( maskBuffer, 2, 8, fp);
722 //_____________________________________________________________________________
724 AliMUONTriggerIO::WriteLocalLUT(const AliMUONTriggerLut& lut,
728 /// loop over the address for the 4-bits lpt and hpt decisions
730 const Int_t kMaskYpos = 0x0F;
731 const Int_t kMaskYtri = 0x01;
732 const Int_t kMaskXdev = 0x1F;
733 const Int_t kMaskXpos = 0x1F;
735 UChar_t buffer[16384]; // 32768 hpt/lpt addresses divided by two
738 for (Int_t i = 0; i < 32768; ++i)
740 Int_t lutLpt[2] = { 0 };
741 Int_t lutHpt[2] = { 0 };
744 Int_t iYpos = i & kMaskYpos;
745 Int_t iYtri = ( i >> 4 ) & kMaskYtri;
746 Int_t iXdev = ( i >> ( 4 + 1 ) ) & kMaskXdev;
747 Int_t iXpos = ( i >> ( 4 + 1 + 5 ) ) & kMaskXpos;
749 // convert deviation format
750 // online: sign 1bit , dev 4bit
754 // 0 0 mu+, mu- infinite momentum (unde)
760 // - 15 mu+, mu- infinite momentum (unde)
764 Bool_t trigx = kFALSE;
765 iXdevOn += iXdev & 0x0F;
766 sign += (iXdev >> 4) & 0x01;
778 iXdevOff = - iXdevOn + 15; // gives range 0-14
780 iXdevOff = + iXdevOn + 15; // gives range 16-30 !
785 // iYtri == 1 means no trigger in y-direction
786 if (iYtri == 0 && trigx)
788 lut.GetLutOutput(localBoardId,iXpos,iXdev,iYpos,lutLpt,lutHpt);
796 buffer[bc] += lutHpt[1] << 7;
797 buffer[bc] += lutHpt[0] << 6;
798 buffer[bc] += lutLpt[1] << 5;
799 buffer[bc] += lutLpt[0] << 4;
802 buffer[bc] += lutHpt[1] << 3;
803 buffer[bc] += lutHpt[0] << 2;
804 buffer[bc] += lutLpt[1] << 1;
805 buffer[bc] += lutLpt[0] << 0;
809 fwrite(&buffer,bc,1,flut);
812 //_____________________________________________________________________________
814 AliMUONTriggerIO::LocalBoardId(Int_t index) const
816 /// Return the i-th localBoardId, or -1 if index is out of bounds
818 AliMpLocalBoard* board = fRegionalTrigger.GetLocalBoard(index);
819 if ( ! board ) return -1;
821 return board->GetId();
824 //_____________________________________________________________________________
826 AliMUONTriggerIO::UpdateMapping(Bool_t writeFile) const
828 /// check if mapping in database different from current Mtg configuration
829 /// Update mapping in databse and read regional crate file in repository (ext .out
830 /// to avoid overwriting). This case has a low probability to happen.
832 // Assuming that crates do not change
834 if (!AliMpDDLStore::Instance(kFALSE))
836 AliMpCDB::LoadDDLStore();
839 Bool_t modified = false;
841 TExMapIter itr = AliMpDDLStore::Instance()->GetLocalBoardItr();
845 while(itr.Next(key, value))
847 AliMpLocalBoard* boardMapping = reinterpret_cast<AliMpLocalBoard*>(value);
849 Int_t localBoardId = boardMapping->GetId();
850 AliMpLocalBoard* board = fRegionalTrigger.FindLocalBoard(localBoardId);
852 AliFatal("Board found in mapping but not in regional trigger");
856 if ( board->GetCrate().CompareTo(boardMapping->GetCrate()) != 0 )
858 AliWarning(Form("Crate Name different for board %d (%s %s)", localBoardId, boardMapping->GetCrate().Data(),
859 board->GetCrate().Data()));
860 boardMapping->SetCrate( board->GetCrate() );
864 if ((board->GetSlot()) != boardMapping->GetSlot())
866 AliWarning(Form("Slot different for board %d (%d %d)", localBoardId, boardMapping->GetSlot(), board->GetSlot()+1));
867 boardMapping->SetSlot(board->GetSlot());
871 if (boardMapping->GetSwitch() != board->GetSwitch()) {
872 AliWarning(Form("Switch different for board %d (0x%x 0x%x)", localBoardId,
873 boardMapping->GetSwitch(), board->GetSwitch()));
874 boardMapping->SetSwitch(board->GetSwitch());
881 AliMpDDLStore::Instance()->SetRegionalTrigger(fRegionalTrigger);
882 AliMpCDB::WriteDDLStore(false);
883 AliWarning("Wrote new version of mapping in databse");
886 TString file = AliMpFiles::LocalTriggerBoardMapping();
888 WriteRegional(file.Data(), 0x0);
889 AliWarning(Form("Wrote regional file %s", file.Data()));