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 "AliMpDCSNamer.h"
20 #include "AliCodeTimer.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>
34 #include <TObjArray.h>
35 #include <TObjString.h>
39 //-----------------------------------------------------------------------------
40 /// \class AliMpDCSNamer
42 /// A utility class to manage DCS aliases names, in particular the
43 /// two conventions used to number the detection elements within a detector.
45 /// \author: Laurent Aphecetche and Diego Stocco, Subatech
46 //-----------------------------------------------------------------------------
51 ClassImp(AliMpDCSNamer)
54 const char* AliMpDCSNamer::fgkDCSChannelSt345Pattern[] =
55 { "MchHvLvLeft/Chamber%02dLeft/Slat%02d.actual.vMon",
56 "MchHvLvRight/Chamber%02dRight/Slat%02d.actual.vMon"
59 const char* AliMpDCSNamer::fgkDCSChannelSt12Pattern[] =
61 "MchHvLvLeft/Chamber%02dLeft/Quad%dSect%d.actual.vMon",
62 "MchHvLvRight/Chamber%02dRight/Quad%dSect%d.actual.vMon"
65 const char* AliMpDCSNamer::fgkDCSQuadrantPattern[] =
67 "MchHvLvLeft/Chamber%02dLeft/Quad%d",
68 "MchHvLvRight/Chamber%02dRight/Quad%d"
71 const char* AliMpDCSNamer::fgkDCSChamberPattern[] =
73 "MchHvLvLeft/Chamber%02dLeft",
74 "MchHvLvRight/Chamber%02dRight"
77 const char* AliMpDCSNamer::fgkDCSSideTrackerName[] = { "Left", "Right" };
80 const char* AliMpDCSNamer::fgkDCSSwitchSt345Pattern = "MchDE%04dsw%d.inValue";
82 const char* AliMpDCSNamer::fgkDCSChannelTriggerPatternRead[] = {"MTR_%3sSIDE_MT%2i_RPC%i_HV.%14s", "MTR_%2sSIDE_MT%2i_RPC%i_HV.%14s"};
83 const char* AliMpDCSNamer::fgkDCSChannelTriggerPattern[] = {"MTR_%3sSIDE_MT%2i_RPC%i_HV.%s", "MTR_%2sSIDE_MT%2i_RPC%i_HV.%s"};
84 const char* AliMpDCSNamer::fgkDCSSideTriggerName[] = { "OUT", "IN" };
85 const char* AliMpDCSNamer::fgkDCSMeasureName[] = { "vEff", "actual.iMon" };
87 const char* AliMpDCSNamer::fgkDetectorName[] = { "TRACKER", "TRIGGER" };
89 //_____________________________________________________________________________
90 AliMpDCSNamer::AliMpDCSNamer():
93 SetDetector("TRACKER");
97 //_____________________________________________________________________________
98 AliMpDCSNamer::AliMpDCSNamer(const char* detName):
101 /// ctor taking the detector name as argument (either trigger or tracker)
102 SetDetector(detName);
105 //_____________________________________________________________________________
106 AliMpDCSNamer::~AliMpDCSNamer()
111 //_____________________________________________________________________________
112 Bool_t AliMpDCSNamer::SetDetector(const char* detName)
114 /// Set the detector type
115 /// \param detName = tracker, trigger
117 TString sDetName(detName);
120 if(sDetName.Contains(fgkDetectorName[kTrackerDet]))
121 fDetector = kTrackerDet;
122 else if(sDetName.Contains(fgkDetectorName[kTriggerDet]))
123 fDetector = kTriggerDet;
125 AliWarning("Detector name must be either tracker or trigger. Default tracker selected");
132 //_____________________________________________________________________________
134 AliMpDCSNamer::AliasesAsLdif(const char* ldiffile) const
136 /// Export the aliases in LDIF format
138 ofstream out(ldiffile);
140 TObjArray* a = CompactAliases();
145 // Some header. host name and port probably not up to date.
146 TString detName = (fDetector == kTriggerDet) ? "MTR" : "MCH";
148 out << "#" << detName.Data() << " config" << endl
149 << "dn: det=" << detName.Data() <<",o=alice,dc=cern,dc=ch" << endl
150 << "objectClass: AliShuttleDetector" << endl
151 << "det: " << detName.Data() << endl
152 << "StrictRunOrder: 1" << endl
153 << "responsible: aphecetc@in2p3.fr" << endl
154 << "DCSHost: aldcs053.cern.ch" << endl
155 << "DCSPort: 4242" <<endl;
157 while ( ( s = (TObjString*)(next()) ) )
159 out << "DCSalias: " << s->String().Data() << endl;
167 //_____________________________________________________________________________
169 AliMpDCSNamer::CompactAliases() const
171 /// Generate a compact list of aliases, for Shuttle test
172 /// This one is completely hand-made, in contrast with GenerateAliases()
175 TObjArray* a = new TObjArray;
180 // St 12 (DCS Channels)
181 a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad0Sect[0..2].actual.vMon"));
182 a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad1Sect[0..2].actual.vMon"));
183 a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad2Sect[0..2].actual.vMon"));
184 a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad3Sect[0..2].actual.vMon"));
186 // St345 (DCS Channels)
188 a->Add(new TObjString("MchHvLvRight/Chamber[04..09]Right/Slat[00..08].actual.vMon"));
189 a->Add(new TObjString("MchHvLvLeft/Chamber[04..09]Left/Slat[00..08].actual.vMon"));
191 a->Add(new TObjString("MchHvLvRight/Chamber[06..09]Right/Slat[09..12].actual.vMon"));
192 a->Add(new TObjString("MchHvLvLeft/Chamber[06..09]Left/Slat[09..12].actual.vMon"));
196 a->Add(new TObjString("MTR_OUTSIDE_MT[11..12]Right/RPC[1..9]_HV.imon"));
197 a->Add(new TObjString("MTR_OUTSIDE_MT[21..22]Right/RPC[1..9]_HV.imon"));
198 a->Add(new TObjString("MTR_INSIDE_MT[11..12]Right/RPC[1..9]_HV.imon"));
199 a->Add(new TObjString("MTR_INSIDE_MT[21..22]Right/RPC[1..9]_HV.imon"));
201 a->Add(new TObjString("MTR_OUTSIDE_MT[11..12]Right/RPC[1..9]_HV.vmon"));
202 a->Add(new TObjString("MTR_OUTSIDE_MT[21..22]Right/RPC[1..9]_HV.vmon"));
203 a->Add(new TObjString("MTR_INSIDE_MT[11..12]Right/RPC[1..9]_HV.vmon"));
204 a->Add(new TObjString("MTR_INSIDE_MT[21..22]Right/RPC[1..9]_HV.vmon"));
208 if(fDetector == kTrackerDet){
209 // St345 (DCS Switches)
216 Int_t detElemId = it.CurrentDEId();
217 if ( AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345 )
219 a->Add(new TObjString(Form("MchDE%04dsw[0..%d].inValue",detElemId,NumberOfPCBs(detElemId)-1)));
228 //_____________________________________________________________________________
230 AliMpDCSNamer::DCS2DE(Int_t chId, Int_t side, Int_t dcsNumber) const
232 /// Convert DCS Tracker "slat number" (old convention) to DE (new) convention.
234 /// \param chamberId : chamber number (starting at 0)
235 /// \param side : 0 for Left, 1 for Right
236 /// \param dcsNumber : slat number in DCS convention
238 /// note that dcsNumber should be >=0 and < number of DEs/2 in chamber
241 Int_t chamberId = chId;
243 if(fDetector == kTrackerDet){ // Tracker
245 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
247 Int_t half = nofDE/2;
249 dcsNumber = half - dcsNumber;
251 Int_t quarter = nofDE/4;
252 Int_t threeQuarter = half + quarter;
254 if ( side == 0 ) // left
256 de = threeQuarter + 1 - dcsNumber;
258 else if ( side == 1 ) // right
260 if ( dcsNumber <= quarter )
262 de = dcsNumber + threeQuarter;
266 de = dcsNumber - quarter - 1;
272 if ( chId < 19 ) chamberId = chId - 1;
273 else chamberId = chId - 9;
275 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
277 if ( side == 0 ) // left -> Outside
281 else if ( side == 1 ) // right -> Inside
284 de = (13 + dcsNumber) % nofDE;
288 return (chamberId+1)*100 + de;
292 //_____________________________________________________________________________
294 AliMpDCSNamer::DetElemId2DCS(Int_t detElemId, Int_t& side, Int_t &chId) const
296 /// Convert DE to DCS "slat number"
299 CheckConsistency(detElemId);
301 Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
304 AliDebug(1,Form("DetElemId %d invalid",detElemId));
307 Int_t dcsNumber = (detElemId-(chamberId+1)*100);
309 switch ( AliMpDEManager::GetStationType(detElemId) )
311 case AliMp::kStation12:
327 case AliMp::kStation345:
329 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
331 Int_t quarter = nofDE/4;
333 Int_t half = nofDE/2;
335 Int_t threeQuarter = half + quarter;
339 if ( dcsNumber <= quarter )
341 dcsNumber += quarter + 1 ;
344 else if ( dcsNumber <= threeQuarter )
346 dcsNumber = ( threeQuarter - dcsNumber + 1 );
349 else if ( dcsNumber > threeQuarter )
351 dcsNumber = dcsNumber - threeQuarter;
358 // dcs convention change : numbering from top, not from bottom
359 dcsNumber = half-dcsNumber;
362 case AliMp::kStationTrigger:
364 if (chamberId < AliMpConstants::NofChambers()-2)
365 chId = chamberId + 1;
366 else chId = 23 + chamberId - AliMpConstants::NofChambers();
368 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
370 if ( dcsNumber >=5 && dcsNumber <= 13 ) {
372 dcsNumber = 14 - dcsNumber;
377 dcsNumber = (5 + dcsNumber) % nofDE;
379 AliDebug(10, Form("detElemId %i -> MT%i_side%i_L%i", detElemId, chId, side, dcsNumber));
389 //_____________________________________________________________________________
391 AliMpDCSNamer::DCSNameFromAlias(const char* dcsAlias) const
393 /// Convert a (possibly partial) aliasname to a name (only for MCH)
395 TString salias(dcsAlias);
397 if ( !salias.Contains("MchHvLv") ) return dcsAlias;
399 Int_t quadrantNumber(-1);
400 Int_t chamberNumber(-1);
403 if ( salias.Contains("Left")) side = 0;
404 if ( salias.Contains("Right")) side = 1;
406 if ( side < 0 ) return "";
410 if ( salias.Contains("Slat") )
412 Int_t slatNumber(-1);
413 sscanf(salias.Data(),fgkDCSChannelSt345Pattern[side],&chamberNumber,&slatNumber);
416 channelName = TString::Format(fgkDCSChannelSt345Pattern[side],chamberNumber,slatNumber);
418 else if ( salias.Contains("Sect") )
420 Int_t sectorNumber(-1);
421 sscanf(salias.Data(),fgkDCSChannelSt12Pattern[side],&chamberNumber,&quadrantNumber,§orNumber);
425 channelName = TString::Format(fgkDCSChannelSt12Pattern[side],chamberNumber,quadrantNumber,sectorNumber);
427 else if ( salias.Contains("Quad") )
429 sscanf(salias.Data(),fgkDCSQuadrantPattern[side],&chamberNumber,&quadrantNumber);
432 channelName = TString::Format(fgkDCSQuadrantPattern[side],chamberNumber,quadrantNumber);
434 else if ( salias.Contains("Chamber") )
436 sscanf(salias.Data(),fgkDCSChamberPattern[side],&chamberNumber);
438 channelName = TString::Format(fgkDCSChamberPattern[side],chamberNumber);
441 if ( TString(dcsAlias).Contains("iMon") )
443 channelName.ReplaceAll("vMon","iMon");
449 //_____________________________________________________________________________
451 AliMpDCSNamer::DCSAliasFromName(const char* dcsName) const
453 /// Convert a (possibly partial) dcsname to an alias (only for MCH)
455 TString sname(dcsName);
457 if ( !sname.Contains("MchHvLv") ) return dcsName;
459 Int_t quadrantNumber(-1);
460 Int_t chamberNumber(-1);
463 if ( sname.Contains("Left")) side = 0;
464 if ( sname.Contains("Right")) side = 1;
466 if ( side < 0 ) return "";
470 if ( sname.Contains("Slat") )
472 Int_t slatNumber(-1);
473 sscanf(sname.Data(),fgkDCSChannelSt345Pattern[side],&chamberNumber,&slatNumber);
476 channelName = TString::Format(fgkDCSChannelSt345Pattern[side],chamberNumber,slatNumber);
478 else if ( sname.Contains("Sect") )
480 Int_t sectorNumber(-1);
481 sscanf(sname.Data(),fgkDCSChannelSt12Pattern[side],&chamberNumber,&quadrantNumber,§orNumber);
485 channelName = TString::Format(fgkDCSChannelSt12Pattern[side],chamberNumber,quadrantNumber,sectorNumber);
487 else if ( sname.Contains("Quad") )
489 sscanf(sname.Data(),fgkDCSQuadrantPattern[side],&chamberNumber,&quadrantNumber);
492 channelName = TString::Format(fgkDCSQuadrantPattern[side],chamberNumber,quadrantNumber);
494 else if ( sname.Contains("Chamber") )
496 sscanf(sname.Data(),fgkDCSChamberPattern[side],&chamberNumber);
498 channelName = TString::Format(fgkDCSChamberPattern[side],chamberNumber);
501 if ( TString(dcsName).Contains("iMon") )
503 channelName.ReplaceAll("vMon","iMon");
509 //_____________________________________________________________________________
511 AliMpDCSNamer::DCSAliasName(Int_t detElemId, Int_t sector, Int_t dcsMeasure) const
513 /// Return the alias name of the DCS Channel for a given DCS area
515 /// \param sector = 0,1 or 2 for St12, and is unused for st345 and trigger
516 /// \param dcsMeasure = kDCSHV, kDCSI
518 Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
519 if ( chamberId < 0 ) return "";
521 Int_t side(-1), chId(-1);
522 Int_t dcsNumber = DetElemId2DCS(detElemId,side,chId);
526 switch (AliMpDEManager::GetStationType(detElemId))
528 case AliMp::kStation12:
529 aliasName.Form(fgkDCSChannelSt12Pattern[side],chamberId,dcsNumber,sector);
531 case AliMp::kStation345:
532 aliasName.Form(fgkDCSChannelSt345Pattern[side],chamberId,dcsNumber);
534 case AliMp::kStationTrigger:
535 return TString::Format(fgkDCSChannelTriggerPattern[side],fgkDCSSideTriggerName[side],chId,dcsNumber,fgkDCSMeasureName[dcsMeasure]);
542 if ( dcsMeasure == AliMpDCSNamer::kDCSI )
544 aliasName.ReplaceAll("vMon","iMon");
551 //_____________________________________________________________________________
553 AliMpDCSNamer::DCSSwitchAliasName(Int_t detElemId, Int_t pcbNumber) const
555 /// Return the alias name of the DCS Switch for a given PCB
556 /// within a slat of St345
558 if (AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345)
560 return TString::Format(fgkDCSSwitchSt345Pattern,detElemId,pcbNumber);
565 //_____________________________________________________________________________
567 AliMpDCSNamer::DCSIndexFromDCSAlias(const char* dcsAlias) const
569 /// Converts the dcs alias to a hv index
571 /// dcsAlias has one of the following 3 forms :
573 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Slat##.actual.vMon
575 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Quad#Sect#.actual.vMon
577 /// MchDE####dsw#.inValue
579 TString sDcsAlias(dcsAlias);
585 if ( sDcsAlias.Contains("Left") )
589 else if ( sDcsAlias.Contains("Right") )
596 sscanf(sDcsAlias.Data(),fgkDCSSwitchSt345Pattern,&de,&sw);
604 if ( sDcsAlias.Contains("Quad") )
606 sscanf(sDcsAlias.Data(),fgkDCSChannelSt12Pattern[side],&n1,&n3,&n4);
613 //_____________________________________________________________________________
615 AliMpDCSNamer::DetElemIdFromDCSAlias(const char* dcsAlias) const
617 /// Converts the dcs alias to a detection element identifier
619 /// dcsAlias has one of the following forms :
621 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Slat##.actual.vMon
623 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Quad#Sect#.actual.vMon
625 /// MTR_Side[OUTSIDE|INSIDE]_MTChamber##_RPC#_HV.Type[actual.iMon|vEff]
627 AliDebug(1,Form("dcsAlias=%s",dcsAlias));
629 TString sDcsAlias(dcsAlias);
633 const char** sideName = (fDetector == kTriggerDet) ? fgkDCSSideTriggerName : fgkDCSSideTrackerName;
635 for(Int_t iside=0; iside<2; iside++){
636 if ( sDcsAlias.Contains(sideName[iside]) ) {
641 if(side<0) return -2;
650 if ( sDcsAlias.Contains("Slat") )
652 sscanf(sDcsAlias.Data(),fgkDCSChannelSt345Pattern[side],&n1,&n3);
653 detElemId = DCS2DE(n1,side,n3);
654 AliDebug(1,Form("Slat side=%d n1=%d n3=%d de=%d",side,n1,n3,detElemId));
656 else if ( sDcsAlias.Contains("Quad") )
658 sscanf(sDcsAlias.Data(),fgkDCSChannelSt12Pattern[side],&n1,&n3,&n4);
659 detElemId = 100*(n1+1) + n3;
660 AliDebug(1,Form("Quad side=%d n1=%d n3=%d n4=%d de=%d",side,n1,n3,n4,detElemId));
662 else if ( sDcsAlias.Contains("MT") )
664 sscanf(sDcsAlias.Data(),fgkDCSChannelTriggerPatternRead[side],cside,&n1,&n3,type);
665 detElemId = DCS2DE(n1,side,n3);
666 AliDebug(1,Form("Slat side=%d n1=%d n3=%d de=%d",side,n1,n3,detElemId));
673 if ( !AliMpDEManager::IsValidDetElemId(detElemId) )
675 AliError(Form("Invalid aliasName %s",dcsAlias));
682 //_____________________________________________________________________________
683 Int_t AliMpDCSNamer::DCSvariableFromDCSAlias(const char* dcsAlias) const
685 /// Get DCS variable from an alias (trigger)
687 TString sDcsAlias(dcsAlias);
689 Int_t dcsMeasurement = -1;
691 for(Int_t iMeas=0; iMeas<kNDCSMeas; iMeas++){
692 if ( sDcsAlias.Contains(fgkDCSMeasureName[iMeas]) ) {
693 dcsMeasurement = iMeas;
698 return dcsMeasurement;
702 //_____________________________________________________________________________
704 AliMpDCSNamer::GenerateAliases() const
706 /// Generate DCS alias names, for MUON Tracker High Voltage system.
707 /// or for MUON Trigger HV and current system.
709 /// We first generate aliases of DCS channels :
711 /// St 1 ch 1 : 12 channels
712 /// ch 2 : 12 channels
713 /// St 2 ch 3 : 12 channels
714 /// ch 4 : 12 channels
715 /// St 3 ch 5 : 18 channels
716 /// ch 6 : 18 channels
717 /// St 4 ch 7 : 26 channels
718 /// ch 8 : 26 channels
719 /// St 5 ch 9 : 26 channels
720 /// ch 10 : 26 channels
722 /// then aliases of DCS switches (only for St345) : 1 switch per PCB.
724 /// Returns a TObjArray of TObjString(=alias name)
726 TObjArray* aliases = new TObjArray;
727 aliases->SetOwner(kTRUE);
729 Int_t nMeasures = (fDetector == kTriggerDet) ? kNDCSMeas : 1;
731 for(Int_t iMeas=0; iMeas<nMeasures; iMeas++){
739 Int_t detElemId = it.CurrentDEId();
743 switch ( AliMpDEManager::GetStationType(detElemId) )
745 case AliMp::kStation12:
746 for ( int sector = 0; sector < 3; ++sector)
748 aliases->Add(new TObjString(DCSAliasName(detElemId,sector)));
749 aliases->Add(new TObjString(DCSAliasName(detElemId,sector,AliMpDCSNamer::kDCSI)));
752 case AliMp::kStation345:
753 aliases->Add(new TObjString(DCSAliasName(detElemId)));
754 aliases->Add(new TObjString(DCSAliasName(detElemId,0,AliMpDCSNamer::kDCSI)));
755 for ( Int_t i = 0; i < NumberOfPCBs(detElemId); ++i )
757 aliases->Add(new TObjString(DCSSwitchAliasName(detElemId,i)));
767 switch ( AliMpDEManager::GetStationType(detElemId) )
769 case AliMp::kStationTrigger:
770 AliDebug(10,Form("Current DetElemId %i",detElemId));
771 aliases->Add(new TObjString(DCSAliasName(detElemId,0,iMeas)));
780 } // loop on detElemId
781 } // Loop on measurement type
786 //_____________________________________________________________________________
788 AliMpDCSNamer::ManuId2Index(Int_t detElemId, Int_t manuId) const
790 /// Convert (de,manu) to hv index, depending on the station
792 AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
793 if ( stationType == AliMp::kStation345 )
795 return ManuId2PCBIndex(detElemId,manuId);
797 else if ( stationType == AliMp::kStation12 )
799 return ManuId2Sector(detElemId,manuId);
804 //_____________________________________________________________________________
806 AliMpDCSNamer::ManuId2PCBIndex(Int_t detElemId, Int_t manuId) const
808 /// Returns the index of PCB (within a St345 slat) for a given manu number.
809 /// Returns -1 if (detElemId,manuId) is incorrect
811 AliCodeTimerAuto("",0)
813 const AliMpSlat* slat
814 = AliMpSegmentation::Instance()->GetSlatByElectronics(detElemId, manuId);
815 if ( ! slat ) return -1;
817 return slat->FindPCBIndexByMotifPositionID(manuId);
820 //_____________________________________________________________________________
822 AliMpDCSNamer::ManuId2Sector(Int_t detElemId, Int_t manuId) const
824 /// Return the DCS-sector number (within a St12 quadrant) for a given manu number.
826 AliCodeTimerAuto("",0)
828 const AliMpSector* sector
829 = AliMpSegmentation::Instance()->GetSectorByElectronics(detElemId, manuId);
830 if ( ! sector ) return -1;
832 const AliMpMotifMap* motifMap = sector->GetMotifMap();
833 const AliMpMotifPosition* motifPos = motifMap->FindMotifPosition(manuId);
836 = motifPos->GetPositionX()-motifPos->GetDimensionX();
838 Double_t x = lowerLeftX*10.0; // cm -> mm
841 AliMq::Station12Type stationType = AliMpDEManager::GetStation12Type(detElemId);
843 if ( stationType == AliMq::kStation1 )
845 if ( x < -10 ) AliFatal("");
847 if ( x < 291.65 ) isector = 0;
848 else if ( x < 585.65 ) isector = 1;
849 else if ( x < 879.65 ) isector = 2;
853 if ( x < -140 ) AliFatal("");
855 if ( x < 283.75 ) isector = 0;
856 else if ( x < 606.25 ) isector = 1;
857 else if ( x < 1158.75 ) isector = 2;
863 //_____________________________________________________________________________
865 AliMpDCSNamer::NumberOfPCBs(Int_t detElemId) const
867 /// Returns the number of PCB in a given detection element
868 /// Only works for St345
870 AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
871 if ( stationType != AliMp::kStation345 )
877 const AliMpSlat* slat
878 = AliMpSegmentation::Instance()->GetSlat(detElemId, AliMp::kCath0);
879 return slat->GetSize();
883 //_____________________________________________________________________________
884 Bool_t AliMpDCSNamer::CheckConsistency(Int_t detElemId) const
887 /// Check that the required detElemId either belongs to tracker or trigger
888 /// consistently with the initial definition of the namer
891 Bool_t isConsistent(kFALSE);
893 switch(AliMpDEManager::GetStationType(detElemId))
895 case AliMp::kStation12:
896 case AliMp::kStation345:
897 if (fDetector == kTrackerDet) isConsistent = kTRUE;
898 requestInfo = "TRACKER";
900 case AliMp::kStationTrigger:
901 if (fDetector == kTriggerDet) isConsistent = kTRUE;
902 requestInfo = "TRIGGER";
908 if(!isConsistent) AliWarning(Form("Requesting information for %s station but class initialized for %s",requestInfo.Data(), fgkDetectorName[fDetector]));