]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONTriggerIO.cxx
In AliMUONPairLight, AliMUONTrackLight:
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerIO.cxx
CommitLineData
2ab3623b 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16// $Id$
17
18#include "AliMUONTriggerIO.h"
acdc80b6 19#include "AliMUONTriggerLut.h"
20#include "AliMUONCalibParamNI.h"
21#include "AliMUONVStore.h"
2ab3623b 22
890cc210 23#include "AliMpCDB.h"
5dde41b3 24#include "AliMpHelper.h"
5eff9abc 25#include "AliMpConstants.h"
aed0186b 26#include "AliMpDDL.h"
5dde41b3 27#include "AliMpFiles.h"
2ab3623b 28#include "AliMpDDLStore.h"
5eff9abc 29#include "AliMpLocalBoard.h"
2ab3623b 30#include "AliMpTriggerCrate.h"
92c23b09 31#include "AliMUONGlobalCrateConfig.h"
32#include "AliMUONRegionalTriggerConfig.h"
33#include "AliMUONTriggerCrateConfig.h"
5eff9abc 34
acdc80b6 35#include "AliLog.h"
5eff9abc 36
2ab3623b 37#include <Riostream.h>
38#include <TSystem.h>
39
40/// \class AliMUONTriggerIO
41///
42/// Handles read/write of masks and LUT to/from online files,
43/// to be used by Shuttle and Trigger DA.
44///
5eff9abc 45/// \author Laurent Aphecetche, Christian Finck Subatech
890cc210 46/// \author Bogdan Vulpescu, LPC Clermont-Ferrand
2ab3623b 47
48/// \cond CLASSIMP
49ClassImp(AliMUONTriggerIO)
50/// \endcond
51
92c23b09 52
53const UInt_t AliMUONTriggerIO::fgkLocalLutSize = 1 << 14; // 16384
54
2ab3623b 55//_____________________________________________________________________________
5eff9abc 56AliMUONTriggerIO::AliMUONTriggerIO()
57 : TObject(),
33245d2c 58 fRegionalTrigger()
2ab3623b 59{
60 /// ctor
61}
62
890cc210 63//_____________________________________________________________________________
5eff9abc 64AliMUONTriggerIO::AliMUONTriggerIO(const char* regionalFileToRead)
65 :TObject(),
33245d2c 66 fRegionalTrigger()
890cc210 67{
68 /// ctor
92c23b09 69 ReadRegionalConfig(regionalFileToRead,0);
890cc210 70}
71
2ab3623b 72//_____________________________________________________________________________
73AliMUONTriggerIO::~AliMUONTriggerIO()
74{
75 /// dtor
76}
77
890cc210 78//_____________________________________________________________________________
e26b1a52 79Bool_t
890cc210 80AliMUONTriggerIO::DeCompAddress(UChar_t &ypos, UChar_t &ytri, UChar_t &xdev, UChar_t &xpos,
81 UShort_t address) const
82{
83 /// decompose the 15-bits address
84
85 UChar_t bitsYpos = 4;
86 UChar_t bitsYtri = 1;
87 UChar_t bitsXdev = 5;
88 // UChar_t bitsXpos = 5;
89
90 UShort_t maskYpos = 0x000F; // ...0 00001111
91 UShort_t maskYtri = 0x0001; // ...0 00000001
92 UShort_t maskXdev = 0x001F; // ...0 00011111
93 UShort_t maskXpos = 0x001F; // ...0 00011111
94
95 ypos = address & maskYpos;
96 ytri = (address >> bitsYpos) & maskYtri;
97 xdev = (address >> (bitsYpos+bitsYtri)) & maskXdev;
98 xpos = (address >> (bitsYpos+bitsYtri+bitsXdev)) & maskXpos;
e26b1a52 99
100 // convert deviation format
101 // online: sign 1bit , dev 4bit
102 // sign dev trigger
103 // 0 1-15 mu-
104 // 1 1-15 mu+
105 // 0 0 mu+, mu- infinite momentum (unde)
106 // 1 0 no x-trigger
107 // offline: dev 5bit
108 // sign dev trigger
109 // - 0-14 mu-
110 // - 16-31 mu+
111 // - 15 mu+, mu- infinite momentum (unde)
112
113 Int_t iXdevOff, iXdevOn, iXdev, sign;
114 Bool_t trigx;
115
116 iXdev = xdev;
117
118 iXdevOn = sign = 0;
119 iXdevOn += iXdev & 0x0F;
120 sign += (iXdev >> 4) & 0x01;
121 if (iXdevOn == 0) {
122 if (sign == 0) {
123 iXdevOff = 15;
124 trigx = kTRUE;
125 } else {
126 iXdevOff = 15;
127 trigx = kFALSE;
128 }
129 } else {
130 trigx = kTRUE;
131 if (sign == 0) {
132 iXdevOff = - iXdevOn + 15; // gives range 0-14
133 } else {
134 iXdevOff = + iXdevOn + 15; // gives range 16-30 !
135 }
136 }
137
138 xdev = iXdevOff;
139
140 return trigx;
141
890cc210 142}
143
144//_____________________________________________________________________________
145void
146AliMUONTriggerIO::FillLut(AliMUONTriggerLut& lut,
147 Int_t icirc, UChar_t istripX, UChar_t idev,
148 Int_t lutLpt[16][2], Int_t lutHpt[16][2])
149{
150 /// Fill the LUT histograms
151
152 if (icirc == 0 && istripX == 0 && idev == 0)
153 {
154 AliDebug(1,"Copy board, not filled ...");
155 return;
156 }
157
158 Short_t iLptPlus, iLptMinu, iLptUnde;
159 Short_t iHptPlus, iHptMinu, iHptUnde;
160
161 iLptPlus = iLptMinu = iLptUnde = 0;
162 iHptPlus = iHptMinu = iHptUnde = 0;
163
164 for (Int_t istripY=0; istripY<16; istripY++)
165 {
166 if (lutLpt[istripY][1] == 0 && lutLpt[istripY][0] ==1)
167 iLptMinu=iLptMinu+(1 << istripY);
168 if (lutLpt[istripY][1] == 1 && lutLpt[istripY][0] ==0)
169 iLptPlus=iLptPlus+(1 << istripY);
170 if (lutLpt[istripY][1] == 1 && lutLpt[istripY][0] ==1)
171 iLptUnde=iLptUnde+(1 << istripY);
172
173 if (lutHpt[istripY][1] == 0 && lutHpt[istripY][0] ==1)
174 iHptMinu=iHptMinu+(1 << istripY);
175 if (lutHpt[istripY][1] == 1 && lutHpt[istripY][0] ==0)
176 iHptPlus=iHptPlus+(1 << istripY);
177 if (lutHpt[istripY][1] == 1 && lutHpt[istripY][0] ==1)
178 iHptUnde=iHptUnde+(1 << istripY);
179
180 } // loop on istripY
181
182 lut.SetContent("LptMinu",icirc,istripX,idev,iLptMinu);
183 lut.SetContent("LptUnde",icirc,istripX,idev,iLptUnde);
184 lut.SetContent("LptPlus",icirc,istripX,idev,iLptPlus);
185
e26b1a52 186 lut.SetContent("HptMinu",icirc,istripX,idev,iHptMinu);
187 lut.SetContent("HptUnde",icirc,istripX,idev,iHptUnde);
188 lut.SetContent("HptPlus",icirc,istripX,idev,iHptPlus);
890cc210 189}
190
2ab3623b 191//_____________________________________________________________________________
192Int_t
193AliMUONTriggerIO::ReadLocalMasks(const char* localFile, AliMUONVStore& localMasks) const
194{
195 /// Fills the local masks store from file
196
197 if ( !NofLocalBoards() )
198 {
199 AliError("No local board to read");
200 return 0;
201 }
202
203 FILE* fp = fopen(gSystem->ExpandPathName(localFile),"r");
204 if (!fp)
205 {
206 AliError(Form("Could not read file %s",localFile));
207 return 0;
208 }
209
210 UShort_t maskBuffer[8];
211
5cf57a25 212 Int_t localBoardIndex(0);
630711ed 213
2ab3623b 214 while ( fread ( maskBuffer, 2, 8, fp ) )
215 {
5cf57a25 216 Int_t localBoardId = fRegionalTrigger.LocalBoardId(localBoardIndex);
2ab3623b 217 AliDebug(1,Form("LB %03d X1 %4x X2 %4x X3 %4x X4 %4x "
218 "Y1 %4x Y2 %4x Y3 %4x Y4 %4x",
219 localBoardId,
220 maskBuffer[0],
221 maskBuffer[1],
222 maskBuffer[2],
223 maskBuffer[3],
224 maskBuffer[4],
225 maskBuffer[5],
226 maskBuffer[6],
227 maskBuffer[7]));
228
5cf57a25 229 if ( localBoardId > 0 )
2ab3623b 230 {
231 AliMUONVCalibParam* localBoard = new AliMUONCalibParamNI(1,8,localBoardId,0,0);
5eff9abc 232 for ( Int_t index = 0; index < 8; ++index )
2ab3623b 233 {
5cf57a25 234 localBoard->SetValueAsInt(index,0,maskBuffer[index]);
2ab3623b 235 }
236 localMasks.Add(localBoard);
237 }
5cf57a25 238 else
239 {
240 AliError(Form("Oups. Got localBoardId=%d for index=%d",localBoardId,localBoardIndex));
241 }
2ab3623b 242
5cf57a25 243 ++localBoardIndex;
2ab3623b 244 }
245
5cf57a25 246 if ( localBoardIndex != NofLocalBoards() )
2ab3623b 247 {
248 AliError(Form("Read %d out of %d local boards",
5cf57a25 249 localBoardIndex, NofLocalBoards()));
2ab3623b 250 }
251
252 fclose(fp);
253
5cf57a25 254 return localBoardIndex+1;
2ab3623b 255}
256
890cc210 257//_____________________________________________________________________________
258void
259AliMUONTriggerIO::ReadLocalLUT(AliMUONTriggerLut& lut,
260 Int_t localBoardId,
261 FILE* flut)
262{
263 /// Read the LUT for one local board from an online file
264
265 UShort_t address;
266
92c23b09 267 UChar_t buffer[fgkLocalLutSize]; // 32768 hpt/lpt addresses divided by two
890cc210 268 UChar_t mask1 = 0xF0;
269 UChar_t mask2 = 0x0F;
e26b1a52 270 UChar_t maskHpt = 0x0C;
271 UChar_t maskLpt = 0x03;
890cc210 272 UChar_t lh, lpt, hpt;
273
274 UChar_t xpos, xdev, ypos, ytri;
275
276 Int_t lutLpt[16][2], lutHpt[16][2];
277
278 Int_t boardnr = localBoardId;
279
280 AliDebug(1,Form("Reading LUT values for local board %d",boardnr));
281
282 Int_t ny = 0;
e26b1a52 283 Bool_t trigx = kFALSE;
890cc210 284
97c4e962 285 // read two lut addresses at once, 32768/2=16384 times
cbcc4fb0 286 if (fread(buffer,fgkLocalLutSize,1,flut) == 0) {
287 AliWarning("Error reading the LUT file");
288 return;
289 }
97c4e962 290
890cc210 291 // create the 32767 addresses for the 4-bits lpt and hpt half-bytes
92c23b09 292 for (UShort_t ilut = 0; ilut < fgkLocalLutSize*2; ilut += 2)
890cc210 293 {
890cc210 294
295 // 1st 4-bits half-byte
296 address = ilut;
97c4e962 297 lh = (buffer[ilut/2] & mask1) >> 4;
890cc210 298
299 // Lpt and Hpt response
e26b1a52 300 hpt = (lh & maskHpt) >> 2;
301 lpt = lh & maskLpt;
890cc210 302
303 // decompose the 15-bits address
e26b1a52 304 trigx = DeCompAddress(ypos,ytri,xdev,xpos,address);
890cc210 305
306 // calculate group of y-strips
e26b1a52 307 if (trigx && (ny < 16))
890cc210 308 {
309 lutLpt[ny][0] = lpt & 1;
310 lutLpt[ny][1] = (lpt & 2) >> 1;
311 lutHpt[ny][0] = hpt & 1;
312 lutHpt[ny][1] = (hpt & 2) >> 1;
313 ny++;
314 if (ny == 16)
315 {
316 ny = 0;
317 // ytri == 1 means no trigger in y-direction
318 if (ytri == 0)
319 {
320 FillLut(lut,boardnr,xpos,xdev,lutLpt,lutHpt);
321 }
322 }
323 }
324
325 // 2nd 4-bits half-byte
326 address = ilut+1;
97c4e962 327 lh = (buffer[ilut/2] & mask2);
890cc210 328
329 // Lpt and Hpt response
e26b1a52 330 hpt = (lh & maskHpt) >> 2;
331 lpt = lh & maskLpt;
890cc210 332
333 // decompose the 15-bits address
e26b1a52 334 trigx = DeCompAddress(ypos,ytri,xdev,xpos,address);
890cc210 335
336 // calculate group of y-strips
e26b1a52 337 if (trigx && (ny < 16))
890cc210 338 {
339 lutLpt[ny][0] = lpt & 1;
340 lutLpt[ny][1] = (lpt & 2) >> 1;
341 lutHpt[ny][0] = hpt & 1;
342 lutHpt[ny][1] = (hpt & 2) >> 1;
343 ny++;
344 if (ny == 16)
345 {
346 ny = 0;
347 // ytri == 1 means no trigger in y-direction
348 if (ytri == 0)
349 {
350 FillLut(lut,boardnr,xpos,xdev,lutLpt,lutHpt);
351 }
352 }
353 }
354 }
355}
356
357//_____________________________________________________________________________
358Bool_t
359AliMUONTriggerIO::ReadLUT(const char* lutFileToRead, AliMUONTriggerLut& lut)
360{
361 /// Fill the LUT object from online file
362
363 if ( !NofLocalBoards() )
364 {
365 AliError("No local board id defined. Must read a regional file first");
366 return kFALSE;
367 }
368
369 FILE* flut = fopen(gSystem->ExpandPathName(lutFileToRead),"rb");
370 if (!flut)
371 {
ca6cee23 372 AliError(Form("Could not read LUT file %s",lutFileToRead));
890cc210 373 return kFALSE;
374 }
375
376 for ( Int_t i = 0; i < NofLocalBoards(); ++i )
377 {
630711ed 378 ReadLocalLUT(lut,fRegionalTrigger.LocalBoardId(i),flut);
890cc210 379 }
380
381 fclose(flut);
382
383 return kTRUE;
384
385}
386
2ab3623b 387//_____________________________________________________________________________
388Bool_t
92c23b09 389AliMUONTriggerIO::ReadConfig(const char* localFile,
11ee2085 390 const char* regionalFile,
391 const char* globalFile,
392 AliMUONVStore* localMasks,
393 AliMUONRegionalTriggerConfig* regionalConfig,
394 AliMUONGlobalCrateConfig* globalConfig)
2ab3623b 395{
396 /// Fill the various masks store from files
397
5a26af27 398 if ( !regionalConfig || !regionalFile || strlen(regionalFile)==0 )
2ab3623b 399 {
400 AliError("Must have a regional file name to proceeed");
401 return kFALSE;
402 }
403
5cf57a25 404 AliDebug(1,Form("regionalConfig=%p",regionalConfig));
405
92c23b09 406 Int_t nCrates = ReadRegionalConfig(regionalFile, regionalConfig);
113ad708 407
5cf57a25 408 if (!nCrates)
409 {
410 AliError("nCrates=0 !");
411 return kFALSE;
412 }
2ab3623b 413
11ee2085 414 if (localMasks && localFile && strlen(localFile) > 0 )
2ab3623b 415 {
416 Int_t nLocal = ReadLocalMasks(localFile,*localMasks);
417 AliDebug(1,Form("Read masks for %d local boards",nLocal));
418 }
419
92c23b09 420 Int_t nDarc = ReadGlobalConfig(globalFile, globalConfig);
5cf57a25 421 AliDebug(1,Form("Read config for %d DARC boards",nDarc));
5dde41b3 422
423 if (!nDarc) return kFALSE;
424
2ab3623b 425 return kTRUE;
426}
427
92c23b09 428
429
5dde41b3 430//_____________________________________________________________________________
431 Int_t
40a42243 432 AliMUONTriggerIO::ReadGlobalConfig(const char* globalFile, AliMUONGlobalCrateConfig* globalConfig) const
5dde41b3 433{
92c23b09 434 /// read the global crate file
5dde41b3 435 /// the masks are disable bit for each crate, 8 per darc board
436 /// bit value 0 means enable, 1 means disable *
437
438 Int_t nDarc = 0;
92c23b09 439 if ( !(nDarc = globalConfig->ReadData(globalFile)) ) return 0;
5dde41b3 440
441 return nDarc;
442}
443
2ab3623b 444//_____________________________________________________________________________
445Int_t
92c23b09 446AliMUONTriggerIO::ReadRegionalConfig(const char* regionalFile, AliMUONRegionalTriggerConfig* regionalConfig)
2ab3623b 447{
92c23b09 448 /// Read regional file to fill
5cf57a25 449
450 AliDebug(1,Form("regionalConfig=%p",regionalConfig));
451
92c23b09 452 Int_t nCrates = 0;
453 if ( !(nCrates = regionalConfig->ReadData(regionalFile)) ) return 0;
acdc80b6 454
92c23b09 455 // read the mapping file also
456 if ( ! fRegionalTrigger.ReadData(regionalFile) ) return 0;
2ab3623b 457
2ab3623b 458 return nCrates;
459}
890cc210 460
92c23b09 461
890cc210 462//_____________________________________________________________________________
463Bool_t
464AliMUONTriggerIO::WriteLUT(const AliMUONTriggerLut& lut,
465 const char* lutFileToWrite)
466{
467 /// Convert an offline lut into an online (binary) lut file
468
469 if ( !NofLocalBoards() )
470 {
471 AliError("No local board id defined. Must read a regional file first");
472 return kFALSE;
473 }
474
475 FILE* flut = fopen(gSystem->ExpandPathName(lutFileToWrite),"wb");
476 if (!flut)
477 {
478 AliError(Form("Could not create output LUT file %s",lutFileToWrite));
479 return kFALSE;
480 }
481
482 for ( Int_t i = 0; i < NofLocalBoards(); ++i )
483 {
630711ed 484 WriteLocalLUT(lut,fRegionalTrigger.LocalBoardId(i),flut);
890cc210 485 }
486
487 fclose(flut);
488
489 return kTRUE;
490}
491
92c23b09 492
5eff9abc 493//_____________________________________________________________________________
92c23b09 494Bool_t
495AliMUONTriggerIO::WriteConfig(const char* localFile,
5eff9abc 496 const char* regionalFile,
5dde41b3 497 const char* globalFile,
57e2ad1a 498 const AliMUONVStore* localMasks,
92c23b09 499 AliMUONRegionalTriggerConfig* regionalConfig,
500 AliMUONGlobalCrateConfig* globalConfig) const
5eff9abc 501{
92c23b09 502/// write config files
503
5dde41b3 504 Bool_t ok;
79abc6a9 505 ok = WriteLocalMasks(localFile, *localMasks);
92c23b09 506 ok &= WriteRegionalConfig(regionalFile, regionalConfig);
507 ok &= WriteGlobalConfig(globalFile, globalConfig);
5dde41b3 508
509 return ok;
92c23b09 510
511
5dde41b3 512}
5eff9abc 513
92c23b09 514
5dde41b3 515 //_____________________________________________________________________________
516Bool_t
92c23b09 517AliMUONTriggerIO::WriteGlobalConfig(const char* globalFile, AliMUONGlobalCrateConfig* globalConfig) const
5dde41b3 518{
92c23b09 519 /// write global config
5dde41b3 520
521 ofstream out;
522 Int_t disable = 0;
523
524 out.open(globalFile);
525 if (!out.good())
526 {
92c23b09 527 AliError(Form("Could not create output global file %s", globalFile));
5dde41b3 528 return kFALSE;
529 }
530
92c23b09 531 out << globalConfig->GetName() << endl;
41a38dec 532 out << Form("0x%x",globalConfig->GetGlobalCrateEnable()) << endl;
92c23b09 533
5dde41b3 534 // Jtag
92c23b09 535 out << globalConfig->GetJtagName() << endl;
1130977f 536 out << Form("0x%08lx", globalConfig->GetJtagVmeAddr()) << endl;
92c23b09 537 out << Form("%d %d %d", globalConfig->GetJtagClockDiv(),
538 globalConfig->GetJtagRxPhase(), globalConfig->GetJtagRdDelay()) << endl;
5dde41b3 539
92c23b09 540 for (Int_t i = 0; i < globalConfig->GetJtagNofLines(); ++i)
541 out << Form("%d ", globalConfig->GetEnableJtag(i));
5dde41b3 542 out << endl;
543
544
92c23b09 545 for (Int_t i = 0; i < globalConfig->GetJtagNofLines(); ++i)
5dde41b3 546 {
547 out << i << endl;
92c23b09 548 for (Int_t j = 0; j < globalConfig->GetJtagNofLines(); ++j)
549 out << Form(" %s", globalConfig->GetJtagCrateName(i,j).Data()) << endl;
5dde41b3 550 }
551
552 // first darc board
92c23b09 553 out << globalConfig->GetFirstDarcName() << endl;
1130977f 554 out << Form("0x%08lx", globalConfig->GetFirstDarcVmeAddr()) << endl;
92c23b09 555 out << globalConfig->GetFirstDarcType() << endl;
556 disable = globalConfig->GetFirstDarcDisable();
5dde41b3 557 out << Form("0x%02x", disable) << endl;
92c23b09 558 out << Form("0x%x", globalConfig->GetFirstDarcL0Delay()) << endl;
559 out << Form("0x%x", globalConfig->GetFirstDarcL1TimeOut()) << endl;
560 out << Form("0x%x", globalConfig->GetFirstDarcGlobalL0()) << endl;
561 out << Form("0x%x", globalConfig->GetFirstDarcConfig()) << endl;
5dde41b3 562
563 // second darc board
92c23b09 564 out << globalConfig->GetSecondDarcName() << endl;
1130977f 565 out << Form("0x%08lx", globalConfig->GetSecondDarcVmeAddr()) << endl;
92c23b09 566 out << globalConfig->GetSecondDarcType() << endl;
567 disable = globalConfig->GetSecondDarcDisable();
5dde41b3 568 out << Form("0x%02x", disable) << endl;
92c23b09 569 out << Form("0x%x", globalConfig->GetSecondDarcL0Delay()) << endl;
570 out << Form("0x%x", globalConfig->GetSecondDarcL1TimeOut()) << endl;
571 out << Form("0x%x", globalConfig->GetSecondDarcGlobalL0()) << endl;
572 out << Form("0x%x", globalConfig->GetSecondDarcConfig()) << endl;
5dde41b3 573
574 // global board
92c23b09 575 out << globalConfig->GetGlobalName() << endl;
1130977f 576 out << Form("0x%08lx", globalConfig->GetGlobalVmeAddr()) << endl;
92c23b09 577 for (Int_t i = 0; i < globalConfig->GetGlobalNofRegisters(); ++i)
578 out << Form("0x%x", globalConfig->GetGlobalRegister(i)) << endl;
5dde41b3 579
580 // Fet board
92c23b09 581 out << globalConfig->GetFetName() << endl;
1130977f 582 out << Form("0x%08lx", globalConfig->GetFetVmeAddr()) << endl;
92c23b09 583 for (Int_t i = 0; i < globalConfig->GetFetNofRegisters(); ++i)
584 out << Form("0x%x", globalConfig->GetFetRegister(i)) << endl;
5dde41b3 585
586 return kTRUE;
5eff9abc 587}
5dde41b3 588
5eff9abc 589//_____________________________________________________________________________
590Bool_t
92c23b09 591AliMUONTriggerIO::WriteRegionalConfig(const char* regionalFile, AliMUONRegionalTriggerConfig* regionalConfig) const
5eff9abc 592{
593
594 /// write regional mask with the current configuration
5dde41b3 595 /// if regional masks not defined, take the one from current configuration
5eff9abc 596
597 ofstream out;
598 out.open(regionalFile);
5dde41b3 599
5eff9abc 600 if (!out.good())
601 {
602 AliError(Form("Could not create output regional file %s",regionalFile));
603 return kFALSE;
604 }
605
92c23b09 606 Int_t nCrate = fRegionalTrigger.GetNofTriggerCrates();
607 if (!nCrate)
5eff9abc 608 {
92c23b09 609 AliError("Could not write regional no configuration in memory");
610 return kFALSE;
611 }
41a38dec 612
613 Int_t nofDDLs = 0;
614 TString name;
630711ed 615 AliMpTriggerCrate* crate;
41a38dec 616 for (Int_t ddlId = 0; ddlId < 2; ddlId++) // right & left side
92c23b09 617 {
41a38dec 618 for (Int_t crateId = 0; crateId < 8; crateId++) // 8 crates/regional boards for each side.
619 {
620
621 name = AliMpTriggerCrate::GenerateName(crateId, ddlId, nofDDLs);
622
623 crate = fRegionalTrigger.FindTriggerCrate(name, false);
624
625 AliMUONTriggerCrateConfig* crateConfig = regionalConfig->FindTriggerCrate(crate->GetName());
626 if (!crateConfig)
627 {
628 AliError(Form("Cannot find crate %s in CDB", crate->GetName()));
629 return kFALSE;
630 }
631
632 out << crate->GetName() << endl;
633 out << Form("%02x", crate->GetId()) << endl;
634 out << crateConfig->GetMode() << endl;
635 out << crateConfig->GetCoinc() << endl;
636 out << Form("%04x", crateConfig->GetMask()) << endl;
637 out << Form("%02d",crate->GetNofLocalBoards()) << endl;
638
639 for (Int_t iLocal = 0; iLocal < crate->GetNofLocalBoards(); ++iLocal)
640 {
641 Int_t localBoardId = crate->GetLocalBoardId(iLocal);
642
643 AliMpLocalBoard* board = fRegionalTrigger.FindLocalBoard(localBoardId);
644
645 out << Form("%02d ", board->GetSlot())
646 << board->GetName()
647 << Form(" %03d ", localBoardId)
648 << Form("%03x", board->GetSwitch())
649 << endl;
650
651 out << " ";
652
653 if (board->IsNotified()) {
654 for (Int_t i = 0; i < board->GetNofDEs(); ++i)
655 out << Form("%4d ", board->GetDEId(i));
656 } else {
657 out << Form("%4d ", 0);
658 }
659 out << endl;
660
661 // print copy card numbers & TC
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;
665 }
666 }
92c23b09 667 }
668
5eff9abc 669 out.close();
670
671 return kTRUE;
672}
673
92c23b09 674
5eff9abc 675//_____________________________________________________________________________
676Bool_t
57e2ad1a 677AliMUONTriggerIO::WriteLocalMasks(const char* localFile, const AliMUONVStore& localMasks) const
5eff9abc 678{
679 /// write local mask
680 /// removing/adding enable for a local board need a update of the configuration
681 /// before calling this method
682 /// mask are written for all boards including the copy card (Ch.F.)
683
684 FILE* fp = fopen(gSystem->ExpandPathName(localFile),"wb");
685 if (!fp)
686 {
687 AliError(Form("Could not create output local file %s",localFile));
688 return kFALSE;
689 }
690
691 UShort_t maskBuffer[8];
42a52f7b 692 Int_t localBoardIndex(0);
693 while (localBoardIndex < NofLocalBoards()) {
5eff9abc 694
42a52f7b 695 Int_t localBoardId = fRegionalTrigger.LocalBoardId(localBoardIndex);
5eff9abc 696
42a52f7b 697 AliMUONVCalibParam* localMask =
698 static_cast<AliMUONVCalibParam*>(localMasks.FindObject(localBoardId));
5eff9abc 699
42a52f7b 700 for (Int_t index = 0; index < 8; ++index)
5eff9abc 701 {
42a52f7b 702 maskBuffer[index] = localMask->ValueAsInt(index,0);
5eff9abc 703 }
42a52f7b 704
705 fwrite ( maskBuffer, 2, 8, fp);
706
707 ++localBoardIndex;
5eff9abc 708
5eff9abc 709 }
710
711 fclose(fp);
712
713 return kTRUE;
714
715}
716
890cc210 717//_____________________________________________________________________________
718void
719AliMUONTriggerIO::WriteLocalLUT(const AliMUONTriggerLut& lut,
720 Int_t localBoardId,
721 FILE* flut)
722{
723 /// loop over the address for the 4-bits lpt and hpt decisions
724
725 const Int_t kMaskYpos = 0x0F;
726 const Int_t kMaskYtri = 0x01;
727 const Int_t kMaskXdev = 0x1F;
728 const Int_t kMaskXpos = 0x1F;
97c4e962 729
92c23b09 730 UChar_t buffer[fgkLocalLutSize]; // 32768 hpt/lpt addresses divided by two
97c4e962 731 Int_t bc = 0;
890cc210 732
92c23b09 733 for (UInt_t i = 0; i < fgkLocalLutSize*2; ++i)
890cc210 734 {
735 Int_t lutLpt[2] = { 0 };
736 Int_t lutHpt[2] = { 0 };
737
738 // decompose address
739 Int_t iYpos = i & kMaskYpos;
740 Int_t iYtri = ( i >> 4 ) & kMaskYtri;
741 Int_t iXdev = ( i >> ( 4 + 1 ) ) & kMaskXdev;
742 Int_t iXpos = ( i >> ( 4 + 1 + 5 ) ) & kMaskXpos;
743
e26b1a52 744 // convert deviation format
745 // online: sign 1bit , dev 4bit
746 // sign dev trigger
747 // 0 1-15 mu-
748 // 1 1-15 mu+
749 // 0 0 mu+, mu- infinite momentum (unde)
750 // 1 0 no x-trigger
751 // offline: dev 5bit
752 // sign dev trigger
753 // - 0-14 mu-
754 // - 16-31 mu+
755 // - 15 mu+, mu- infinite momentum (unde)
756 Int_t iXdevOn = 0;
757 Int_t iXdevOff = 0;
758 Int_t sign = 0;
759 Bool_t trigx = kFALSE;
760 iXdevOn += iXdev & 0x0F;
761 sign += (iXdev >> 4) & 0x01;
762 if (iXdevOn == 0) {
763 if (sign == 0) {
764 iXdevOff = 15;
765 trigx = kTRUE;
766 } else {
767 iXdevOff = 15;
768 trigx = kFALSE;
769 }
770 } else {
771 trigx = kTRUE;
772 if (sign == 0) {
773 iXdevOff = - iXdevOn + 15; // gives range 0-14
774 } else {
775 iXdevOff = + iXdevOn + 15; // gives range 16-30 !
776 }
777 }
778 iXdev = iXdevOff;
779
890cc210 780 // iYtri == 1 means no trigger in y-direction
e26b1a52 781 if (iYtri == 0 && trigx)
890cc210 782 {
783 lut.GetLutOutput(localBoardId,iXpos,iXdev,iYpos,lutLpt,lutHpt);
784 }
785
890cc210 786 // fill byte
787 if (i%2 == 0)
788 {
789 // upper half-byte
97c4e962 790 buffer[bc] = 0;
791 buffer[bc] += lutHpt[1] << 7;
792 buffer[bc] += lutHpt[0] << 6;
793 buffer[bc] += lutLpt[1] << 5;
794 buffer[bc] += lutLpt[0] << 4;
890cc210 795 } else {
796 // lower half-byte
97c4e962 797 buffer[bc] += lutHpt[1] << 3;
798 buffer[bc] += lutHpt[0] << 2;
799 buffer[bc] += lutLpt[1] << 1;
800 buffer[bc] += lutLpt[0] << 0;
801 bc++;
890cc210 802 }
803 }
97c4e962 804 fwrite(&buffer,bc,1,flut);
890cc210 805}
5eff9abc 806
807//_____________________________________________________________________________
acdc80b6 808Int_t
809AliMUONTriggerIO::LocalBoardId(Int_t index) const
810{
811 /// Return the i-th localBoardId, or -1 if index is out of bounds
aed0186b 812
630711ed 813 return fRegionalTrigger.LocalBoardId(index);
aed0186b 814}
113ad708 815
816
817//______________________________________________________________________________
818
819Int_t AliMUONTriggerIO::LocalBoardId(Int_t ddlId, Int_t crateId, Int_t localId) const
820{
821 /// Return local board id from crate and local indexes.
822
823 Int_t nofDDLs = 0;
824 TString name = AliMpTriggerCrate::GenerateName(crateId, ddlId, nofDDLs);
825
826 AliMpTriggerCrate* crate = fRegionalTrigger.FindTriggerCrate(name, false);
827 return crate->GetLocalBoardId(localId);
828}