AliRoot Core  edcc906 (edcc906)
AliMpDCSNamer.cxx
Go to the documentation of this file.
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 "AliMpDCSNamer.h"
19 
20 #include "AliCodeTimer.h"
21 #include "AliLog.h"
22 #include "AliMpArea.h"
23 #include "AliMpDEIterator.h"
24 #include "AliMpDEManager.h"
25 #include "AliMpHelper.h"
26 #include "AliMpMotifMap.h"
27 #include "AliMpMotifPosition.h"
28 #include "AliMpSector.h"
29 #include "AliMpSegmentation.h"
30 #include "AliMpSlat.h"
31 #include "AliMpConstants.h"
32 #include <Riostream.h>
33 #include <TMap.h>
34 #include <TObjArray.h>
35 #include <TObjString.h>
36 #include <TString.h>
37 #include <TSystem.h>
38 #include <cassert>
39 
40 //-----------------------------------------------------------------------------
47 //-----------------------------------------------------------------------------
48 
49 using std::cout;
50 using std::endl;
52 ClassImp(AliMpDCSNamer)
54 
55 const char* AliMpDCSNamer::fgkDCSChannelSt345Pattern[] =
56 { "MchHvLvLeft/Chamber%02dLeft/Slat%02d.actual.vMon",
57  "MchHvLvRight/Chamber%02dRight/Slat%02d.actual.vMon"
58 };
59 
61 {
62  "MchHvLvLeft/Chamber%02dLeft/Quad%dSect%d.actual.vMon",
63  "MchHvLvRight/Chamber%02dRight/Quad%dSect%d.actual.vMon"
64 };
65 
67 {
68  "MchHvLvLeft/Chamber%02dLeft/Quad%d",
69  "MchHvLvRight/Chamber%02dRight/Quad%d"
70 };
71 
73 
74 {
75  "MchHvLvLeft/Chamber%02dLeft",
76  "MchHvLvRight/Chamber%02dRight"
77 };
78 
79 
81 {
82  "MchHvLvLeft/Chamber%02dLeft/Group%d%s.MeasurementSenseVoltage",
83  "MchHvLvRight/Chamber%02dRight/Group%d%s.MeasurementSenseVoltage"
84 };
85 
86 const char* AliMpDCSNamer::fgkDCSSideTrackerName[] = { "Left", "Right" };
87 
88 
89 const char* AliMpDCSNamer::fgkDCSSwitchSt345Pattern = "MchDE%04dsw%d.inValue";
90 
91 const char* AliMpDCSNamer::fgkDCSChannelTriggerPatternRead[] = {"MTR_%3sSIDE_MT%2i_RPC%i_HV.%14s", "MTR_%2sSIDE_MT%2i_RPC%i_HV.%14s"};
92 const char* AliMpDCSNamer::fgkDCSChannelTriggerPattern[] = {"MTR_%3sSIDE_MT%2i_RPC%i_HV.%s", "MTR_%2sSIDE_MT%2i_RPC%i_HV.%s"};
93 const char* AliMpDCSNamer::fgkDCSSideTriggerName[] = { "OUT", "IN" };
94 const char* AliMpDCSNamer::fgkDCSMeasureName[] = { "vEff", "actual.iMon" };
95 
96 const char* AliMpDCSNamer::fgkDetectorName[] = { "TRACKER", "TRIGGER" };
97 
98 
99 //_____________________________________________________________________________
101 fDetector(-1)
102 {
103  SetDetector("TRACKER");
105 }
106 
107 //_____________________________________________________________________________
108 AliMpDCSNamer::AliMpDCSNamer(const char* detName):
109 fDetector(-1)
110 {
112  SetDetector(detName);
113 }
114 
115 //_____________________________________________________________________________
117 {
119 }
120 
121 //_____________________________________________________________________________
122 Bool_t AliMpDCSNamer::SetDetector(const char* detName)
123 {
126 
127  TString sDetName(detName);
128  Bool_t isOk(kTRUE);
129  sDetName.ToUpper();
130  if(sDetName.Contains(fgkDetectorName[kTrackerDet]))
131  fDetector = kTrackerDet;
132  else if(sDetName.Contains(fgkDetectorName[kTriggerDet]))
133  fDetector = kTriggerDet;
134  else {
135  AliWarning("Detector name must be either tracker or trigger. Default tracker selected");
136  isOk = kFALSE;
137  }
138  return isOk;
139 }
140 
141 
142 //_____________________________________________________________________________
143 void
144 AliMpDCSNamer::AliasesAsLdif(const char* ldiffile) const
145 {
147 
148  ofstream out(ldiffile);
149 
150  TObjArray* a = CompactAliases();
151 
152  TIter next(a);
153  TObjString* s;
154 
155  // Some header. host name and port probably not up to date.
156  TString detName = (fDetector == kTriggerDet) ? "MTR" : "MCH";
157 
158  out << "#" << detName.Data() << " config" << endl
159  << "dn: det=" << detName.Data() <<",o=alice,dc=cern,dc=ch" << endl
160  << "objectClass: AliShuttleDetector" << endl
161  << "det: " << detName.Data() << endl
162  << "StrictRunOrder: 1" << endl
163  << "responsible: aphecetc@in2p3.fr" << endl
164  << "DCSHost: aldcs053.cern.ch" << endl
165  << "DCSPort: 4242" <<endl;
166 
167  while ( ( s = (TObjString*)(next()) ) )
168  {
169  out << "DCSalias: " << s->String().Data() << endl;
170  }
171 
172  out.close();
173 
174  delete a;
175 }
176 
177 //_____________________________________________________________________________
178 TObjArray*
180 {
184 
185  TObjArray* a = new TObjArray;
186  a->SetOwner(kTRUE);
187 
188  switch(fDetector){
189  case kTrackerDet:
190  // St 12 (DCS HV Channels)
191  a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad0Sect[0..2].actual.vMon"));
192  a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad1Sect[0..2].actual.vMon"));
193  a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad2Sect[0..2].actual.vMon"));
194  a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad3Sect[0..2].actual.vMon"));
195 
196  // St345 (DCS HV Channels)
197 
198  a->Add(new TObjString("MchHvLvRight/Chamber[04..09]Right/Slat[00..08].actual.vMon"));
199  a->Add(new TObjString("MchHvLvLeft/Chamber[04..09]Left/Slat[00..08].actual.vMon"));
200 
201  a->Add(new TObjString("MchHvLvRight/Chamber[06..09]Right/Slat[09..12].actual.vMon"));
202  a->Add(new TObjString("MchHvLvLeft/Chamber[06..09]Left/Slat[09..12].actual.vMon"));
203 
204  // (LV groups)
205 
206  // St12 have 4 LV groups
207 
208  a->Add(new TObjString("MchHvLvLeft/Chamber[01..10]Left/Group[1..4]dig.MeasurementSenseVoltage"));
209  a->Add(new TObjString("MchHvLvLeft/Chamber[01..10]Left/Group[1..4]ann.MeasurementSenseVoltage"));
210  a->Add(new TObjString("MchHvLvLeft/Chamber[01..10]Left/Group[1..4]anp.MeasurementSenseVoltage"));
211  a->Add(new TObjString("MchHvLvRight/Chamber[01..10]Right/Group[1..4]dig.MeasurementSenseVoltage"));
212  a->Add(new TObjString("MchHvLvRight/Chamber[01..10]Right/Group[1..4]ann.MeasurementSenseVoltage"));
213  a->Add(new TObjString("MchHvLvRight/Chamber[01..10]Right/Group[1..4]anp.MeasurementSenseVoltage"));
214 
215  // St3 has 5 LV groups
216 
217  a->Add(new TObjString("MchHvLvLeft/Chamber[05..06]Left/Group[5..5]dig.MeasurementSenseVoltage"));
218  a->Add(new TObjString("MchHvLvLeft/Chamber[05..06]Left/Group[5..5]ann.MeasurementSenseVoltage"));
219  a->Add(new TObjString("MchHvLvLeft/Chamber[05..06]Left/Group[5..5]anp.MeasurementSenseVoltage"));
220  a->Add(new TObjString("MchHvLvRight/Chamber[05..06]Right/Group[5..5]dig.MeasurementSenseVoltage"));
221  a->Add(new TObjString("MchHvLvRight/Chamber[05..06]Right/Group[5..5]ann.MeasurementSenseVoltage"));
222  a->Add(new TObjString("MchHvLvRight/Chamber[05..06]Right/Group[5..5]anp.MeasurementSenseVoltage"));
223 
224  // St4-5 have 7 LV groups
225  a->Add(new TObjString("MchHvLvLeft/Chamber[07..10]Left/Group[5..7]dig.MeasurementSenseVoltage"));
226  a->Add(new TObjString("MchHvLvLeft/Chamber[07..10]Left/Group[5..7]ann.MeasurementSenseVoltage"));
227  a->Add(new TObjString("MchHvLvLeft/Chamber[07..10]Left/Group[5..7]anp.MeasurementSenseVoltage"));
228  a->Add(new TObjString("MchHvLvRight/Chamber[07..10]Right/Group[5..7]dig.MeasurementSenseVoltage"));
229  a->Add(new TObjString("MchHvLvRight/Chamber[07..10]Right/Group[5..7]ann.MeasurementSenseVoltage"));
230  a->Add(new TObjString("MchHvLvRight/Chamber[07..10]Right/Group[5..7]anp.MeasurementSenseVoltage"));
231 
232  break;
233 
234  case kTriggerDet:
235  a->Add(new TObjString("MTR_OUTSIDE_MT[11..12]Right/RPC[1..9]_HV.imon"));
236  a->Add(new TObjString("MTR_OUTSIDE_MT[21..22]Right/RPC[1..9]_HV.imon"));
237  a->Add(new TObjString("MTR_INSIDE_MT[11..12]Right/RPC[1..9]_HV.imon"));
238  a->Add(new TObjString("MTR_INSIDE_MT[21..22]Right/RPC[1..9]_HV.imon"));
239 
240  a->Add(new TObjString("MTR_OUTSIDE_MT[11..12]Right/RPC[1..9]_HV.vmon"));
241  a->Add(new TObjString("MTR_OUTSIDE_MT[21..22]Right/RPC[1..9]_HV.vmon"));
242  a->Add(new TObjString("MTR_INSIDE_MT[11..12]Right/RPC[1..9]_HV.vmon"));
243  a->Add(new TObjString("MTR_INSIDE_MT[21..22]Right/RPC[1..9]_HV.vmon"));
244  }
245 
246 
247  if(fDetector == kTrackerDet){
248  // St345 (DCS Switches)
249  AliMpDEIterator it;
250 
251  it.First();
252 
253  while (!it.IsDone())
254  {
255  Int_t detElemId = it.CurrentDEId();
257  {
258  a->Add(new TObjString(Form("MchDE%04dsw[0..%d].inValue",detElemId,NumberOfPCBs(detElemId)-1)));
259  }
260  it.Next();
261  }
262  }
263 
264  return a;
265 }
266 
267 //_____________________________________________________________________________
268 Int_t
269 AliMpDCSNamer::DCS2DE(Int_t chId, Int_t side, Int_t dcsNumber) const
270 {
278 
279  Int_t de(-1);
280  Int_t chamberId = chId;
281 
282  if(fDetector == kTrackerDet){ // Tracker
283 
284  Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
285 
286  Int_t half = nofDE/2;
287 
288  dcsNumber = half - dcsNumber;
289 
290  Int_t quarter = nofDE/4;
291  Int_t threeQuarter = half + quarter;
292 
293  if ( side == 0 ) // left
294  {
295  de = threeQuarter + 1 - dcsNumber;
296  }
297  else if ( side == 1 ) // right
298  {
299  if ( dcsNumber <= quarter )
300  {
301  de = dcsNumber + threeQuarter;
302  }
303  else
304  {
305  de = dcsNumber - quarter - 1;
306  }
307  }
308  }
309  else { // Trigger
310 
311  if ( chId < 19 ) chamberId = chId - 1;
312  else chamberId = chId - 9;
313 
314  Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
315 
316  if ( side == 0 ) // left -> Outside
317  {
318  de = 14 - dcsNumber;
319  }
320  else if ( side == 1 ) // right -> Inside
321  {
322  if (nofDE>0)
323  de = (13 + dcsNumber) % nofDE;
324  }
325  }
326 
327  return (chamberId+1)*100 + de;
328 }
329 
330 
331 //_____________________________________________________________________________
332 Int_t
333 AliMpDCSNamer::DetElemId2DCS(Int_t detElemId, Int_t& side, Int_t &chId) const
334 {
337 
338  CheckConsistency(detElemId);
339 
340  Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
341  if ( chamberId < 0 )
342  {
343  AliDebug(1,Form("DetElemId %d invalid",detElemId));
344  return -1;
345  }
346  Int_t dcsNumber = (detElemId-(chamberId+1)*100);
347 
348  switch ( AliMpDEManager::GetStationType(detElemId) )
349  {
350  case AliMp::kStation12:
351  {
352  chId = chamberId;
353 
354  switch (dcsNumber)
355  {
356  case 0:
357  case 3:
358  side = 1; // right
359  break;
360  case 1:
361  case 2:
362  side = 0; // left
363  default:
364  break;
365  }
366  }
367  break;
368  case AliMp::kStation345:
369  {
370  chId = chamberId;
371 
372  Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
373 
374  Int_t quarter = nofDE/4;
375 
376  Int_t half = nofDE/2;
377 
378  Int_t threeQuarter = half + quarter;
379 
380  side = -1;
381 
382  if ( dcsNumber <= quarter )
383  {
384  dcsNumber += quarter + 1 ;
385  side = 1; // right
386  }
387  else if ( dcsNumber <= threeQuarter )
388  {
389  dcsNumber = ( threeQuarter - dcsNumber + 1 );
390  side = 0; // left
391  }
392  else if ( dcsNumber > threeQuarter )
393  {
394  dcsNumber = dcsNumber - threeQuarter;
395  side = 1; // right
396  }
397  else
398  {
399  AliFatal("oups");
400  }
401  // dcs convention change : numbering from top, not from bottom
402  dcsNumber = half-dcsNumber;
403  }
404  break;
406  {
407  if (chamberId < AliMpConstants::NofChambers()-2)
408  chId = chamberId + 1;
409  else chId = 23 + chamberId - AliMpConstants::NofChambers();
410 
411  Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
412 
413  if ( dcsNumber >=5 && dcsNumber <= 13 ) {
414  side = 0;
415  dcsNumber = 14 - dcsNumber;
416  }
417  else {
418  side = 1;
419  if (nofDE>0)
420  dcsNumber = (5 + dcsNumber) % nofDE;
421  }
422  AliDebug(10, Form("detElemId %i -> MT%i_side%i_L%i", detElemId, chId, side, dcsNumber));
423  }
424  break;
425  default:
426  break;
427  }
428 
429  return dcsNumber;
430 }
431 
432 //_____________________________________________________________________________
433 TString
434 AliMpDCSNamer::DCSNameFromAlias(const char* dcsAlias) const
435 {
437 
438  TString salias(dcsAlias);
439 
440  if ( !salias.Contains("MchHvLv") ) return dcsAlias; // not MCH
441  if ( salias.Contains("Group")) return dcsAlias; // not MCH HV (but LV)
442 
443  Int_t quadrantNumber(-1);
444  Int_t chamberNumber(-1);
445  Int_t side(-1);
446 
447  if ( salias.Contains("Left")) side = 0;
448  if ( salias.Contains("Right")) side = 1;
449 
450  if ( side < 0 ) return "";
451 
452  TString channelName;
453 
454  if ( salias.Contains("Slat") )
455  {
456  Int_t slatNumber(-1);
457  sscanf(salias.Data(),fgkDCSChannelSt345Pattern[side],&chamberNumber,&slatNumber);
458  ++chamberNumber;
459  ++slatNumber;
460  channelName = TString::Format(fgkDCSChannelSt345Pattern[side],chamberNumber,slatNumber);
461  }
462  else if ( salias.Contains("Sect") )
463  {
464  Int_t sectorNumber(-1);
465  sscanf(salias.Data(),fgkDCSChannelSt12Pattern[side],&chamberNumber,&quadrantNumber,&sectorNumber);
466  ++chamberNumber;
467  ++quadrantNumber;
468  ++sectorNumber;
469  channelName = TString::Format(fgkDCSChannelSt12Pattern[side],chamberNumber,quadrantNumber,sectorNumber);
470  }
471  else if ( salias.Contains("Quad") )
472  {
473  sscanf(salias.Data(),fgkDCSQuadrantPattern[side],&chamberNumber,&quadrantNumber);
474  ++chamberNumber;
475  ++quadrantNumber;
476  channelName = TString::Format(fgkDCSQuadrantPattern[side],chamberNumber,quadrantNumber);
477  }
478  else if ( salias.Contains("Chamber") )
479  {
480  sscanf(salias.Data(),fgkDCSChamberPattern[side],&chamberNumber);
481  ++chamberNumber;
482  channelName = TString::Format(fgkDCSChamberPattern[side],chamberNumber);
483  }
484 
485  if ( TString(dcsAlias).Contains("iMon") )
486  {
487  channelName.ReplaceAll("vMon","iMon");
488  }
489 
490  return channelName;
491 }
492 
493 //_____________________________________________________________________________
494 TString
495 AliMpDCSNamer::DCSAliasFromName(const char* dcsName) const
496 {
498 
499  TString sname(dcsName);
500 
501  if ( !sname.Contains("MchHvLv") ) return dcsName;
502  if ( sname.Contains("Group")) return dcsName; // not MCH HV (but LV)
503 
504  Int_t quadrantNumber(-1);
505  Int_t chamberNumber(-1);
506  Int_t side(-1);
507 
508  if ( sname.Contains("Left")) side = 0;
509  if ( sname.Contains("Right")) side = 1;
510 
511  if ( side < 0 ) return "";
512 
513  TString channelName;
514 
515  if ( sname.Contains("Slat") )
516  {
517  Int_t slatNumber(-1);
518  sscanf(sname.Data(),fgkDCSChannelSt345Pattern[side],&chamberNumber,&slatNumber);
519  --chamberNumber;
520  --slatNumber;
521  channelName = TString::Format(fgkDCSChannelSt345Pattern[side],chamberNumber,slatNumber);
522  }
523  else if ( sname.Contains("Sect") )
524  {
525  Int_t sectorNumber(-1);
526  sscanf(sname.Data(),fgkDCSChannelSt12Pattern[side],&chamberNumber,&quadrantNumber,&sectorNumber);
527  --chamberNumber;
528  --quadrantNumber;
529  --sectorNumber;
530  channelName = TString::Format(fgkDCSChannelSt12Pattern[side],chamberNumber,quadrantNumber,sectorNumber);
531  }
532  else if ( sname.Contains("Quad") )
533  {
534  sscanf(sname.Data(),fgkDCSQuadrantPattern[side],&chamberNumber,&quadrantNumber);
535  --chamberNumber;
536  --quadrantNumber;
537  channelName = TString::Format(fgkDCSQuadrantPattern[side],chamberNumber,quadrantNumber);
538  }
539  else if ( sname.Contains("Chamber") )
540  {
541  sscanf(sname.Data(),fgkDCSChamberPattern[side],&chamberNumber);
542  --chamberNumber;
543  channelName = TString::Format(fgkDCSChamberPattern[side],chamberNumber);
544  }
545 
546  if ( TString(dcsName).Contains("iMon") )
547  {
548  channelName.ReplaceAll("vMon","iMon");
549  }
550 
551  return channelName;
552 }
553 
554 //_____________________________________________________________________________
556  Int_t &chamberNumber,
557  Int_t &groupNumber,
558  TString &voltageType) const
559 {
563 
564  if (!alias.BeginsWith("MchHvLvLeft") && !alias.BeginsWith("MchHvLvRight")) {
565  AliError(Form("alias %s does not start with the expected MchHvLvLeft or MchHvLvRight string",alias.Data()));
566  return kFALSE;
567  }
568 
569  Int_t slash = alias.Index('/');
570 
571  alias = alias(slash+1,alias.Length()-slash-1);
572 
573  if (!alias.BeginsWith("Chamber")) {
574  AliError(Form("alias part %s does not start with the expected Chamber string",alias.Data()));
575  return kFALSE;
576  }
577 
578  chamberNumber = TString(alias(TString("Chamber").Length(),2)).Atoi();
579 
580  slash = alias.Index('/');
581 
582  alias = alias(slash+1,alias.Length()-slash-1);
583 
584  if (!alias.BeginsWith("Group")) {
585  AliError(Form("alias part %s does not start with the expected Group string",alias.Data()));
586  return kFALSE;
587  }
588 
589  groupNumber = TString(alias(TString("Group").Length(),1)).Atoi();
590 
591  int dot = alias.Index('.');
592 
593  voltageType = alias(TString("Group").Length()+1,dot-TString("Group").Length()-1);
594 
595  if ( voltageType != "anp" && voltageType != "ann" && voltageType != "dig") {
596  AliError(Form("alias part (voltageType) %s does not contain one of anp,ann or dig voltageType",alias.Data()));
597  return kFALSE;
598  }
599 
600  return kTRUE;
601 }
602 
603 //_____________________________________________________________________________
604 Bool_t AliMpDCSNamer::DecodeDCSMCHLVAlias(const char* dcsAlias, Int_t*& detElemId, Int_t& numberOfDetectionElements, AliMp::PlaneType& planeType ) const
605 {
609 
610  TString salias(dcsAlias);
611 
612  detElemId = 0x0;
613  planeType = AliMp::kBendingPlane;
614 
615  if (!salias.Contains("Group"))
616  {
617  // not a MCH LV alias
618  return kFALSE;
619  }
620 
621  Int_t side(-1);
622 
623  if ( salias.Contains("Left"))
624  {
625  side = 0;
626  }
627  else if ( salias.Contains("Right"))
628  {
629  side = 1;
630  }
631  else {
632  AliError(Form("unexpected alias=%s",salias.Data()));
633  return kFALSE;
634  }
635 
636  Bool_t left = ( side == 0 );
637 
638  Int_t chamberNumber, groupNumber;
639  TString voltageType;
640 
641  GetElementsFromDCSMCHLVAlias(salias,chamberNumber,groupNumber,voltageType);
642 
643  if ( chamberNumber >= 1 && chamberNumber <= 4 )
644  {
645  Int_t deOffset = 0;
646  if ( groupNumber == 1 )
647  {
648  if ( left )
649  {
650  deOffset = 1;
651  planeType = AliMp::kBendingPlane;
652  }
653  else
654  {
655  deOffset = 0;
656  planeType = AliMp::kNonBendingPlane;
657  }
658  }
659  else if ( groupNumber == 2 )
660  {
661  if ( left )
662  {
663  deOffset = 2;
664  planeType = AliMp::kNonBendingPlane;
665  }
666  else
667  {
668  deOffset = 3;
669  planeType = AliMp::kBendingPlane;
670  }
671  }
672  else if ( groupNumber == 3 )
673  {
674  if ( left )
675  {
676  deOffset = 1;
677  planeType = AliMp::kNonBendingPlane;
678  }
679  else
680  {
681  deOffset = 0;
682  planeType = AliMp::kBendingPlane;
683  }
684  }
685  else if ( groupNumber == 4 )
686  {
687  if ( left )
688  {
689  deOffset = 2;
690  planeType = AliMp::kBendingPlane;
691  }
692  else
693  {
694  deOffset = 3;
695  planeType = AliMp::kNonBendingPlane;
696  }
697  }
698  else
699  {
700  AliError(Form("Got incorrect group number=%d from alias=%s",groupNumber,salias.Data()));
701  return kFALSE;
702  }
703 
704  numberOfDetectionElements=1;
705  detElemId = new Int_t[numberOfDetectionElements];
706  detElemId[0] = chamberNumber*100 + deOffset;
707  }
708  else if ( chamberNumber >= 5 && chamberNumber <= 10 )
709  {
710  Int_t* dcsSlatNumber(0x0);
711 
712  if ( chamberNumber >= 5 && chamberNumber <= 6 )
713  {
714  if ( groupNumber == 1 )
715  {
716  numberOfDetectionElements=3;
717  dcsSlatNumber=new Int_t[numberOfDetectionElements];
718  dcsSlatNumber[0]=1;
719  dcsSlatNumber[1]=2;
720  dcsSlatNumber[2]=3;
721  }
722  else if ( groupNumber == 5 )
723  {
724  numberOfDetectionElements=3;
725  dcsSlatNumber=new Int_t[numberOfDetectionElements];
726  dcsSlatNumber[0]=7;
727  dcsSlatNumber[1]=8;
728  dcsSlatNumber[2]=9;
729  }
730  else if ( groupNumber > 1 && groupNumber < 5 )
731  {
732  numberOfDetectionElements=1;
733  dcsSlatNumber=new Int_t[numberOfDetectionElements];
734  dcsSlatNumber[0]=groupNumber+2;
735  }
736  else
737  {
738  AliError(Form("Got incorrect group number=%d from alias=%s",groupNumber,salias.Data()));
739  return kFALSE;
740  }
741  }
742  else if ( chamberNumber >= 7 )
743  {
744  if ( groupNumber == 1 )
745  {
746  numberOfDetectionElements=4;
747  dcsSlatNumber=new Int_t[numberOfDetectionElements];
748  dcsSlatNumber[0]=1;
749  dcsSlatNumber[1]=2;
750  dcsSlatNumber[2]=3;
751  dcsSlatNumber[3]=4;
752  }
753  else if ( groupNumber == 7 )
754  {
755  numberOfDetectionElements=4;
756  dcsSlatNumber=new Int_t[numberOfDetectionElements];
757  dcsSlatNumber[0]=10;
758  dcsSlatNumber[1]=11;
759  dcsSlatNumber[2]=12;
760  dcsSlatNumber[3]=13;
761  }
762  else if ( groupNumber > 1 && groupNumber < 7 )
763  {
764  numberOfDetectionElements=1;
765  dcsSlatNumber=new Int_t[numberOfDetectionElements];
766  dcsSlatNumber[0]=groupNumber+3;
767  }
768  else
769  {
770  AliError(Form("Got incorrect group number=%d from alias=%s",groupNumber,salias.Data()));
771  return kFALSE;
772  }
773  }
774 
775  detElemId = new Int_t[numberOfDetectionElements];
776  for ( int i = 0; i < numberOfDetectionElements; ++i )
777  {
778  detElemId[i] = DCS2DE(chamberNumber-1,side,dcsSlatNumber[i]-1);
779  }
780  }
781  else
782  {
783  AliError(Form("Got an invalid chamberNumber=%d from alias=%s",chamberNumber,salias.Data()));
784  return kFALSE;
785  }
786 
787  return kTRUE;
788 }
789 
790 //_____________________________________________________________________________
791 TString
792 AliMpDCSNamer::DCSMCHLVAliasName(Int_t detElemId, Int_t voltageType, AliMp::PlaneType planeType) const
793 {
794  TString voltage;
795 
796  if ( voltageType == -1 ) {
797  voltage = "ann";
798  } else if ( voltageType == 0 ) {
799  voltage = "dig";
800  } else if ( voltageType == 1 ) {
801  voltage = "anp";
802  }
803 
804  if ( !voltage.Length() )
805  {
806  AliError(Form("Incorrect voltageType=%d. Expected -1,0 or 1.",voltageType));
807  return "";
808  }
809 
810  Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
811  if ( chamberId < 0 )
812  {
813  AliError(Form("Got an incorrect chamberId=%d from detElemId=%d",chamberId,detElemId));
814  return "";
815  }
816  Int_t stationId = 1 + chamberId / 2;
817 
818  Int_t side(-1);
819  Int_t cham;
820  Int_t dcsNumber = DetElemId2DCS(detElemId, side, cham);
821 
822  Int_t group(0);
823 
824  switch (AliMpDEManager::GetStationType(detElemId))
825  {
826  case AliMp::kStation12:
827  {
828  // For Chamber 1 to 4 Left the relationship between DCS GUI names and groups is:
829  // Quad2B --> Group3 = DE x01 Non Bending
830  // Quad2F --> Group1 = DE x01 Bending
831  // Quad3B --> Group4 = DE x02 Bending
832  // Quad3F --> Group2 = DE x02 Non Bending
833  // for Chamber 1 to 4 Right the relationship is:
834  // Quad1B --> Group3 = DE x00 Bending
835  // Quad1F --> Group1 = DE x00 Non Bending
836  // Quad4B --> Group4 = DE x03 Non Bending
837  // Quad4F --> Group2 = DE x03 Bending
838  // where x = 1,2,3,4
839  // and Quad#B = Back = towards IP = cath1
840  // while Quad#F = Front = towards muon trigger = cath0
841  //
842 
843  Int_t remnant = detElemId % 100;
844  switch (remnant) {
845  case 0: // DE x00
846  group = ( planeType == AliMp::kBendingPlane ) ? 3 : 1;
847  break;
848  case 1: // DE x01
849  group = ( planeType == AliMp::kBendingPlane ) ? 1 : 3;
850  break;
851  case 2: // DE x02
852  group = ( planeType == AliMp::kBendingPlane ) ? 4 : 2;
853  break;
854  case 3: // DE x03
855  group = ( planeType == AliMp::kBendingPlane ) ? 2 : 4;
856  break;
857  default:
858  AliFatal("");
859  break;
860  }
861  }
862  break;
863  case AliMp::kStation345:
864  {
865  Int_t dcsSlatNumber = 1 + dcsNumber;
866  if ( stationId == 3 ) {
867  switch (dcsSlatNumber) {
868  case 1:
869  case 2:
870  case 3:
871  group = 1;
872  break;
873  case 4:
874  case 5:
875  case 6:
876  group = dcsSlatNumber - 2;
877  break;
878  case 7:
879  case 8:
880  case 9:
881  group = 5;
882  break;
883  default:
884  break;
885  }
886  }
887  else
888  {
889  switch (dcsSlatNumber) {
890  case 1:
891  case 2:
892  case 3:
893  case 4:
894  group = 1;
895  break;
896  case 5:
897  case 6:
898  case 7:
899  case 8:
900  case 9:
901  group = dcsSlatNumber - 3;
902  break;
903  case 10:
904  case 11:
905  case 12:
906  case 13:
907  group = 7;
908  break;
909  default:
910  break;
911  }
912  }
913  }
914  break;
915  default:
916  break;
917  }
918 
919  if ( group == 0 ) {
920  AliError(Form("Could not get LV group id for detection element %d",detElemId));
921  return "";
922  }
923 
924  TString aliasName;
925 
926  aliasName.Form(fgkDCSMCHLVGroupPattern[side],chamberId+1,group,voltage.Data());
927 
928  return aliasName;
929 }
930 
931 //_____________________________________________________________________________
932 TString
933 AliMpDCSNamer::DCSAliasName(Int_t detElemId, Int_t sector, Int_t dcsMeasure) const
934 {
939 
940  Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
941  if ( chamberId < 0 ) return "";
942 
943  Int_t side(-1), chId(-1);
944  Int_t dcsNumber = DetElemId2DCS(detElemId,side,chId);
945 
946  TString aliasName;
947 
948  switch (AliMpDEManager::GetStationType(detElemId))
949  {
950  case AliMp::kStation12:
951  aliasName.Form(fgkDCSChannelSt12Pattern[side],chamberId,dcsNumber,sector);
952  break;
953  case AliMp::kStation345:
954  aliasName.Form(fgkDCSChannelSt345Pattern[side],chamberId,dcsNumber);
955  break;
957  return TString::Format(fgkDCSChannelTriggerPattern[side],fgkDCSSideTriggerName[side],chId,dcsNumber,fgkDCSMeasureName[dcsMeasure]);
958  break;
959  default:
960  return "";
961  break;
962  }
963 
964  if ( dcsMeasure == AliMpDCSNamer::kDCSI )
965  {
966  aliasName.ReplaceAll("vMon","iMon");
967  }
968 
969  return aliasName;
970 
971 }
972 
973 //_____________________________________________________________________________
974 TString
975 AliMpDCSNamer::DCSSwitchAliasName(Int_t detElemId, Int_t pcbNumber) const
976 {
979 
981  {
982  return TString::Format(fgkDCSSwitchSt345Pattern,detElemId,pcbNumber);
983  }
984  return "";
985 }
986 
987 //_____________________________________________________________________________
988 Int_t
989 AliMpDCSNamer::DCSIndexFromDCSAlias(const char* dcsAlias) const
990 {
1000 
1001  TString sDcsAlias(dcsAlias);
1002  Int_t de(-1);
1003  Int_t sw(-1);
1004 
1005  int side(-1);
1006 
1007  if ( sDcsAlias.Contains("Left") )
1008  {
1009  side = 0;
1010  }
1011  else if ( sDcsAlias.Contains("Right") )
1012  {
1013  side = 1;
1014  }
1015  else
1016  {
1018  sscanf(sDcsAlias.Data(),fgkDCSSwitchSt345Pattern,&de,&sw);
1019  return sw;
1020  }
1021 
1022  int n1(-1);
1023  int n3(-1);
1024  int n4(-1);
1025 
1026  if ( sDcsAlias.Contains("Quad") )
1027  {
1028  sscanf(sDcsAlias.Data(),fgkDCSChannelSt12Pattern[side],&n1,&n3,&n4);
1029  return n4;
1030  }
1031 
1032  return -2;
1033 }
1034 
1035 //_____________________________________________________________________________
1036 Int_t
1037 AliMpDCSNamer::DetElemIdFromDCSAlias(const char* dcsAlias) const
1038 {
1048 
1049  AliDebug(1,Form("dcsAlias=%s",dcsAlias));
1050 
1051  TString sDcsAlias(dcsAlias);
1052 
1053  int side(-1);
1054 
1055  const char** sideName = (fDetector == kTriggerDet) ? fgkDCSSideTriggerName : fgkDCSSideTrackerName;
1056 
1057  for(Int_t iside=0; iside<2; iside++){
1058  if ( sDcsAlias.Contains(sideName[iside]) ) {
1059  side = iside;
1060  break;
1061  }
1062  }
1063  if(side<0) return -2;
1064 
1065  int n1(-1);
1066  int n3(-1);
1067  int n4(-1);
1068  char type[15];
1069  char cside[4];
1070  int detElemId(-1);
1071 
1072  if ( sDcsAlias.Contains("Slat") )
1073  {
1074  sscanf(sDcsAlias.Data(),fgkDCSChannelSt345Pattern[side],&n1,&n3);
1075  detElemId = DCS2DE(n1,side,n3);
1076  AliDebug(1,Form("Slat side=%d n1=%d n3=%d de=%d",side,n1,n3,detElemId));
1077  }
1078  else if ( sDcsAlias.Contains("Quad") )
1079  {
1080  sscanf(sDcsAlias.Data(),fgkDCSChannelSt12Pattern[side],&n1,&n3,&n4);
1081  detElemId = 100*(n1+1) + n3;
1082  AliDebug(1,Form("Quad side=%d n1=%d n3=%d n4=%d de=%d",side,n1,n3,n4,detElemId));
1083  }
1084  else if ( sDcsAlias.Contains("MT") )
1085  {
1086  sscanf(sDcsAlias.Data(),fgkDCSChannelTriggerPatternRead[side],cside,&n1,&n3,type);
1087  detElemId = DCS2DE(n1,side,n3);
1088  AliDebug(1,Form("Slat side=%d n1=%d n3=%d de=%d",side,n1,n3,detElemId));
1089  }
1090  else
1091  {
1092  return -3;
1093  }
1094 
1095  if ( !AliMpDEManager::IsValidDetElemId(detElemId) )
1096  {
1097  AliError(Form("Invalid aliasName %s",dcsAlias));
1098  return -1;
1099  }
1100 
1101  return detElemId;
1102 }
1103 
1104 //_____________________________________________________________________________
1105 Int_t AliMpDCSNamer::DCSvariableFromDCSAlias(const char* dcsAlias) const
1106 {
1108 
1109  TString sDcsAlias(dcsAlias);
1110 
1111  Int_t dcsMeasurement = -1;
1112 
1113  for(Int_t iMeas=0; iMeas<kNDCSMeas; iMeas++){
1114  if ( sDcsAlias.Contains(fgkDCSMeasureName[iMeas]) ) {
1115  dcsMeasurement = iMeas;
1116  break;
1117  }
1118  }
1119 
1120  return dcsMeasurement;
1121 }
1122 
1123 
1124 //_____________________________________________________________________________
1125 TObjArray*
1126 AliMpDCSNamer::GenerateAliases(const char* pattern) const
1127 {
1160 
1161  TObjArray* aliases = new TObjArray;
1162  aliases->SetOwner(kTRUE);
1163 
1164  Int_t nMeasures = (fDetector == kTriggerDet) ? kNDCSMeas : 1;
1165 
1166  for(Int_t iMeas=0; iMeas<nMeasures; iMeas++){
1167 
1168  AliMpDEIterator it;
1169 
1170  it.First();
1171 
1172  Int_t voltageType[] = { -1,0,1 };
1173 
1174  while (!it.IsDone())
1175  {
1176  Int_t detElemId = it.CurrentDEId();
1177 
1178  switch (fDetector){
1179  case kTrackerDet:
1180  {
1181  switch ( AliMpDEManager::GetStationType(detElemId) )
1182  {
1183  case AliMp::kStation12:
1184  {
1185  for ( int sector = 0; sector < 3; ++sector)
1186  {
1187  // HV voltage
1188  aliases->Add(new TObjString(DCSAliasName(detElemId,sector)));
1189  // HV current
1190  aliases->Add(new TObjString(DCSAliasName(detElemId,sector,AliMpDCSNamer::kDCSI)));
1191  }
1192 
1194 
1195  // LV groups, one per voltage (analog negative, digital, analog positive)
1196  // per plane (bending / non-bending)
1197  for ( int pt = 0; pt < 2; ++pt )
1198  {
1199  for ( int i = 0; i < 3; ++i )
1200  {
1201  TString name = DCSMCHLVAliasName(detElemId,voltageType[i],planeType[pt]);
1202  aliases->Add(new TObjString(name));
1203  }
1204  }
1205  }
1206  break;
1207  case AliMp::kStation345:
1208  {
1209  // HV voltage
1210  aliases->Add(new TObjString(DCSAliasName(detElemId)));
1211  // HV current
1212  aliases->Add(new TObjString(DCSAliasName(detElemId,0,AliMpDCSNamer::kDCSI)));
1213  // HV switches
1214  for ( Int_t i = 0; i < NumberOfPCBs(detElemId); ++i )
1215  {
1216  aliases->Add(new TObjString(DCSSwitchAliasName(detElemId,i)));
1217  }
1218  // LV groups, one per voltage (analog negative, digital, analog positive)
1219  for ( int i = 0; i < 3; ++i )
1220  {
1221  TString name = DCSMCHLVAliasName(detElemId,voltageType[i]);
1222  // for Station345 some detection elements share the same voltage group,
1223  // so we must insure we're not adding the same one several times
1224  if (!aliases->FindObject(name))
1225  {
1226  aliases->Add(new TObjString(name));
1227  }
1228  }
1229  }
1230  break;
1231  default:
1232  break;
1233  }
1234  }
1235  break;
1236  case kTriggerDet:
1237  {
1238  switch ( AliMpDEManager::GetStationType(detElemId) )
1239  {
1241  AliDebug(10,Form("Current DetElemId %i",detElemId));
1242  aliases->Add(new TObjString(DCSAliasName(detElemId,0,iMeas)));
1243  break;
1244  default:
1245  break;
1246  }
1247  }
1248  break;
1249  }
1250  it.Next();
1251  } // loop on detElemId
1252  } // Loop on measurement type
1253 
1254  if (pattern && strlen(pattern)>0)
1255  {
1256  // remove aliases not containing the input pattern
1257  TObjArray* tmp = new TObjArray;
1258  tmp->SetOwner(kTRUE);
1259  for ( Int_t i = 0; i <= aliases->GetLast(); ++i )
1260  {
1261  TString name = static_cast<TObjString*>(aliases->At(i))->String();
1262  if (name.Contains(pattern))
1263  {
1264  tmp->Add(new TObjString(name.Data()));
1265  }
1266  }
1267  delete aliases;
1268  aliases = tmp;
1269  }
1270  return aliases;
1271 }
1272 
1273 //_____________________________________________________________________________
1274 Int_t
1275 AliMpDCSNamer::ManuId2Index(Int_t detElemId, Int_t manuId) const
1276 {
1278 
1279  AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
1280  if ( stationType == AliMp::kStation345 )
1281  {
1282  return ManuId2PCBIndex(detElemId,manuId);
1283  }
1284  else if ( stationType == AliMp::kStation12 )
1285  {
1286  return ManuId2Sector(detElemId,manuId);
1287  }
1288  return -1;
1289 }
1290 
1291 //_____________________________________________________________________________
1292 Int_t
1293 AliMpDCSNamer::ManuId2PCBIndex(Int_t detElemId, Int_t manuId) const
1294 {
1297 
1298  AliCodeTimerAuto("",0)
1299 
1300  const AliMpSlat* slat
1301  = AliMpSegmentation::Instance()->GetSlatByElectronics(detElemId, manuId);
1302  if ( ! slat ) return -1;
1303 
1304  return slat->FindPCBIndexByMotifPositionID(manuId);
1305 }
1306 
1307 //_____________________________________________________________________________
1308 Int_t
1309 AliMpDCSNamer::ManuId2Sector(Int_t detElemId, Int_t manuId) const
1310 {
1312 
1313  AliCodeTimerAuto("",0)
1314 
1315  const AliMpSector* sector
1316  = AliMpSegmentation::Instance()->GetSectorByElectronics(detElemId, manuId);
1317  if ( ! sector ) return -1;
1318 
1319  const AliMpMotifMap* motifMap = sector->GetMotifMap();
1320  const AliMpMotifPosition* motifPos = motifMap->FindMotifPosition(manuId);
1321 
1322  Double_t lowerLeftX
1323  = motifPos->GetPositionX()-motifPos->GetDimensionX();
1324 
1325  Double_t x = lowerLeftX*10.0; // cm -> mm
1326  Int_t isector(-1);
1327 
1328  AliMq::Station12Type stationType = AliMpDEManager::GetStation12Type(detElemId);
1329 
1330  if ( stationType == AliMq::kStation1 )
1331  {
1332  if ( x < -10 ) AliFatal("");
1333 
1334  if ( x < 291.65 ) isector = 0;
1335  else if ( x < 585.65 ) isector = 1;
1336  else if ( x < 879.65 ) isector = 2;
1337  }
1338  else
1339  {
1340  if ( x < -140 ) AliFatal("");
1341 
1342  if ( x < 283.75 ) isector = 0;
1343  else if ( x < 606.25 ) isector = 1;
1344  else if ( x < 1158.75 ) isector = 2;
1345  }
1346 
1347  return isector;
1348 }
1349 
1350 //_____________________________________________________________________________
1351 Int_t
1352 AliMpDCSNamer::NumberOfPCBs(Int_t detElemId) const
1353 {
1356 
1357  AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
1358  if ( stationType != AliMp::kStation345 )
1359  {
1360  return 0;
1361  }
1362  else
1363  {
1364  const AliMpSlat* slat
1366  return slat->GetSize();
1367  }
1368 }
1369 
1370 //_____________________________________________________________________________
1371 Bool_t AliMpDCSNamer::CheckConsistency(Int_t detElemId) const
1372 {
1373  //
1376  //
1377 
1378  Bool_t isConsistent(kFALSE);
1379  TString requestInfo;
1380  switch(AliMpDEManager::GetStationType(detElemId))
1381  {
1382  case AliMp::kStation12:
1383  case AliMp::kStation345:
1384  if (fDetector == kTrackerDet) isConsistent = kTRUE;
1385  requestInfo = "TRACKER";
1386  break;
1388  if (fDetector == kTriggerDet) isConsistent = kTRUE;
1389  requestInfo = "TRIGGER";
1390  break;
1391  default:
1392  break;
1393  }
1394 
1395  if(!isConsistent) AliWarning(Form("Requesting information for %s station but class initialized for %s",requestInfo.Data(), fgkDetectorName[fDetector]));
1396 
1397  return isConsistent;
1398 }
1399 
1400 //_____________________________________________________________________________
1402 {
1404 
1405  TObjArray* aliases = GenerateAliases("Group");
1406 
1407  const char* voltageTypeName[] = { "ann","dig","anp"};
1408  Int_t voltageType[] = { -1,0,1 };
1409  Int_t n(0);
1410 
1411  for ( Int_t iv = 0; iv < 3; ++iv )
1412  {
1413  for ( Int_t i = 0; i < aliases->GetEntries(); ++i )
1414  {
1415  TString dcsAlias = static_cast<TObjString*>(aliases->At(i))->String();
1416  if ( !dcsAlias.Contains(voltageTypeName[iv])) continue;
1417 
1418  Int_t* detElemId(0x0);
1419  Int_t numberOfDetectionElements(0);
1420  AliMp::PlaneType planeType;
1421 
1422  Bool_t ok = DecodeDCSMCHLVAlias(dcsAlias.Data(), detElemId, numberOfDetectionElements, planeType);
1423 
1424  if (!ok)
1425  {
1426  AliError(Form("Could not decode alias=%s",dcsAlias.Data()));
1427  delete[] detElemId;
1428  return kFALSE;
1429  }
1430 
1431  for ( Int_t id = 0; id < numberOfDetectionElements; ++id )
1432  {
1433  TString check =
1434  DCSMCHLVAliasName(detElemId[id], voltageType[iv], planeType);
1435 
1436  if (check!=dcsAlias)
1437  {
1438  AliError(Form("%s != %s",check.Data(),dcsAlias.Data()));
1439  return kFALSE;
1440  }
1441  else
1442  {
1443  ++n;
1444  }
1445  }
1446 
1447  delete[] detElemId;
1448  }
1449  }
1450 
1451  delete aliases;
1452 
1453  AliInfo(Form("%d aliases successfully tested",n));
1454 
1455  return kTRUE;
1456 }
static AliMq::Station12Type GetStation12Type(Int_t detElemId)
static Int_t NofChambers()
Return number of chambers.
static const char * fgkDCSChannelSt12Pattern[]
DCS Tracker Channel name template.
The iterator over detection elements.
Int_t ManuId2PCBIndex(Int_t detElemId, Int_t manuId) const
Returns the index of PCB (within a St345 slat) for a given manu number.
station 1,2 (quadrants)
void AliasesAsLdif(const char *ldiffile) const
static AliMpSegmentation * Instance(Bool_t warn=true)
TString DCSMCHLVAliasName(Int_t detElemId, Int_t voltageType, AliMp::PlaneType planeType=AliMp::kBendingPlane) const
Namer for tracker.
Definition: AliMpDCSNamer.h:91
#define TObjArray
const AliMpSlat * GetSlatByElectronics(Int_t detElemId, Int_t elCardID, Bool_t warn=true) const
static const char * fgkDCSChamberPattern[]
DCS Tracker chamber name template.
Int_t ManuId2Sector(Int_t detElemId, Int_t manuId) const
Return the HV-sector number (within a St12 quadrant) for a given manu number.
static const char * fgkDCSQuadrantPattern[]
DCS Tracker quadrant name template.
Bool_t IsDone() const
const AliMpSlat * GetSlat(const AliMpVSegmentation *kSegmentation, Bool_t warn=true) const
station 3,4,5 (slats)
Double_t GetDimensionX() const
Return x dimension.
Collection of methods usefull to DCS handling for MUON TRK and TRG.
Definition: AliMpDCSNamer.h:22
Int_t NumberOfPCBs(Int_t detElemId) const
Int_t FindPCBIndexByMotifPositionID(Int_t manuId) const
Find the index of the PCB containing a given manu.
Definition: AliMpSlat.cxx:308
Int_t CurrentDEId() const
static const char * fgkDCSMCHLVGroupPattern[]
DCS Tracker chamber LV group name template.
A slat (building block of stations 3, 4 and 5)
Definition: AliMpSlat.h:51
Bool_t TestMCHLV() const
static const char * fgkDCSSideTrackerName[]
DCS Tracker Name of the side written in DCS.
Int_t DetElemId2DCS(Int_t detElemId, Int_t &side, Int_t &chId) const
static const char * fgkDCSChannelSt345Pattern[]
DCS Tracker Channel name template.
#define AliWarning(message)
Definition: AliLog.h:541
Namer for trigger.
Definition: AliMpDCSNamer.h:92
Bool_t GetElementsFromDCSMCHLVAlias(TString alias, Int_t &chamberNumber, Int_t &groupNumber, TString &voltageType) const
TString DCSNameFromAlias(const char *dcsAlias) const
static Int_t GetChamberId(Int_t detElemId, Bool_t warn=true)
static const char * fgkDCSChannelTriggerPattern[]
DCS Trigger Channel name template for output.
A placed motif.
Bool_t DecodeDCSMCHLVAlias(const char *dcsAlias, Int_t *&detElemId, Int_t &numberOfDetectionElements, AliMp::PlaneType &planeType) const
Bool_t CheckConsistency(Int_t detElemId) const
Int_t ManuId2Index(Int_t detElemId, Int_t manuId) const
static Int_t GetNofDEInChamber(Int_t chamberId, Bool_t warn=true)
#define AliInfo(message)
Definition: AliLog.h:484
TString DCSAliasFromName(const char *dcsName) const
const AliMpSector * GetSectorByElectronics(Int_t detElemId, Int_t elCardID, Bool_t warn=true) const
Motif map containers.
Definition: AliMpMotifMap.h:34
non-bending plane
#define AliCodeTimerAuto(message, counter)
Definition: AliCodeTimer.h:137
static AliMp::StationType GetStationType(Int_t detElemId)
Int_t DCSIndexFromDCSAlias(const char *dcsAlias) const
A sector (quadrant) of the MUON chamber of stations 1 and 2.
Definition: AliMpSector.h:34
static const char * fgkDCSChannelTriggerPatternRead[]
DCS Trigger Channel name template for input.
#define AliFatal(message)
Definition: AliLog.h:640
AliMpMotifMap * GetMotifMap() const
Return the motif map.
Definition: AliMpSector.h:159
bending plane
#define AliDebug(logLevel, message)
Definition: AliLog.h:300
Bool_t SetDetector(const char *detName)
Int_t DCSvariableFromDCSAlias(const char *dcsAlias) const
Int_t DCS2DE(Int_t chamberId, Int_t side, Int_t dcsNumber) const
trigger stations (slats)
Number of measured quantities.
Definition: AliMpDCSNamer.h:86
AliMpMotifPosition * FindMotifPosition(Int_t motifPositionID) const
static const char * fgkDCSSwitchSt345Pattern
DCS Tracker Switch name template.
TObjArray * GenerateAliases(const char *pattern="") const
TObjArray * CompactAliases() const
TString DCSSwitchAliasName(Int_t detElemId, Int_t pcbNumber) const
Double_t GetPositionX() const
Return x position.
static const char * fgkDCSSideTriggerName[]
DCS Trigger Name of the side written in DCS.
#define AliError(message)
Definition: AliLog.h:591
static const char * fgkDetectorName[]
Name of detector (Tracker or Trigger)
static const char * fgkDCSMeasureName[]
DCS Trigger Name of the measure (HV or current) written in DCS.
Int_t DetElemIdFromDCSAlias(const char *dcsAlias) const
TString DCSAliasName(Int_t detElemId, Int_t sector=0, Int_t dcsMeasure=0) const
static Bool_t IsValidDetElemId(Int_t detElemId, Bool_t warn=false)
Int_t GetSize() const
Returns the number of PCBs of this slat.
Definition: AliMpSlat.cxx:446
Int_t fDetector
Detector type (either tracker or trigger)
virtual ~AliMpDCSNamer()