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 "AliMUONHVNamer.h"
20 #include "AliMpArea.h"
21 #include "AliMpDEIterator.h"
22 #include "AliMpDEManager.h"
23 #include "AliMpHelper.h"
24 #include "AliMpSegmentation.h"
25 #include "AliMpSlat.h"
26 #include "AliMpSlatSegmentation.h"
27 #include "AliMpVPadIterator.h"
30 #include "Riostream.h"
32 #include "TObjArray.h"
33 #include "TObjString.h"
39 /// \class AliMUONHVNamer
41 /// A utility class to manage HV DCS aliases names, in particular the
42 /// two conventions used to number the detection elements within a detector.
44 /// \author: Laurent Aphecetche, Subatech
47 ClassImp(AliMUONHVNamer)
50 const char* AliMUONHVNamer::fgHVChannelSt345Pattern[] =
51 { "MchHvLvLeft/Chamber%02dLeft/Slat%02d.actual.vMon",
52 "MchHvLvRight/Chamber%02dRight/Slat%02d.actual.vMon"
55 const char* AliMUONHVNamer::fgHVChannelSt12Pattern[] =
57 "MchHvLvLeft/Chamber%02dLeft/Quad%dSect%d.actual.vMon",
58 "MchHvLvRight/Chamber%02dRight/Quad%dSect%d.actual.vMon",
61 const char* AliMUONHVNamer::fgHVSwitchSt345Pattern = "MchDE%04dsw%d.inValue";
63 //_____________________________________________________________________________
64 AliMUONHVNamer::AliMUONHVNamer()
69 //_____________________________________________________________________________
70 AliMUONHVNamer::~AliMUONHVNamer()
75 //_____________________________________________________________________________
77 AliMUONHVNamer::CompactAliases() const
79 /// Generate a compact list of aliases, for Shuttle test
80 /// This one is completely hand-made, in contrast with GenerateAliases()
83 TObjArray* a = new TObjArray;
86 // St 12 (HV Channels)
87 a->Add(new TObjString("MchHvLvRight/Chamber[01..04]Right/Quad1Sect[1..3].actual.vMon"));
88 a->Add(new TObjString("MchHvLvLeft/Chamber[01..04]Left/Quad2Sect[1..3].actual.vMon"));
89 a->Add(new TObjString("MchHvLvLeft/Chamber[01..04]Left/Quad3Sect[1..3].actual.vMon"));
90 a->Add(new TObjString("MchHvLvRight/Chamber[01..04]Right/Quad4Sect[1..3].actual.vMon"));
92 // St345 (HV Channels)
94 a->Add(new TObjString("MchHvLvRight/Chamber[05..10]Right/Slat[01..09].actual.vMon"));
95 a->Add(new TObjString("MchHvLvLeft/Chamber[05..10]Left/Slat[01..09].actual.vMon"));
97 a->Add(new TObjString("MchHvLvRight/Chamber[07..10]Right/Slat[10..13].actual.vMon"));
98 a->Add(new TObjString("MchHvLvLeft/Chamber[07..10]Left/Slat[10..13].actual.vMon"));
100 // St345 (HV Switches)
107 Int_t detElemId = it.CurrentDEId();
108 if ( AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345 )
110 a->Add(new TObjString(Form("MchDE%04dsw[1..%d].inValue",detElemId,NumberOfPCBs(detElemId))));
117 //_____________________________________________________________________________
119 AliMUONHVNamer::DCS2DE(Int_t chamberId, Int_t side, Int_t dcsNumber) const
121 /// Convert DCS "slat number" (old convention) to DE (new) convention.
123 /// \param chamberId : chamber number (starting at 1)
124 /// \param side : 0 for Left, 1 for Right
125 /// \param dcsNumber : slat number in DCS HV convention
127 /// note that dcsNumber should be >=1 and <= number of DEs/2 in chamber
129 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
131 Int_t half = nofDE/2;
133 dcsNumber = half + 1 - dcsNumber;
135 Int_t quarter = nofDE/4;
136 Int_t threeQuarter = half + quarter;
140 if ( side == 0 ) // left
142 de = threeQuarter + 1 - dcsNumber;
144 else if ( side == 1 ) // right
146 if ( dcsNumber <= quarter )
148 de = dcsNumber + threeQuarter;
152 de = dcsNumber - quarter - 1;
156 return chamberId*100 + de;
159 //_____________________________________________________________________________
161 AliMUONHVNamer::DetElemId2DCS(Int_t detElemId, Int_t& side) const
163 /// Convert DE to DCS "slat number"
166 Int_t chamberId = 1 + AliMpDEManager::GetChamberId(detElemId);
169 AliDebug(1,Form("DetElemId %d invalid",detElemId));
172 Int_t dcsNumber = (detElemId-chamberId*100);
174 switch ( AliMpDEManager::GetStationType(detElemId) )
176 case AliMp::kStation1:
177 case AliMp::kStation2:
195 case AliMp::kStation345:
197 Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId-1);
199 Int_t quarter = nofDE/4;
201 Int_t half = nofDE/2;
203 Int_t threeQuarter = half + quarter;
207 if ( dcsNumber <= quarter )
209 dcsNumber += quarter + 1 ;
212 else if ( dcsNumber <= threeQuarter )
214 dcsNumber = ( threeQuarter - dcsNumber + 1 );
217 else if ( dcsNumber > threeQuarter )
219 dcsNumber = dcsNumber - threeQuarter;
226 // dcs convention change : numbering from top, not from bottom
227 dcsNumber = half+1-dcsNumber;
236 //_____________________________________________________________________________
238 AliMUONHVNamer::DCSHVChannelName(Int_t detElemId, Int_t sector) const
240 /// Return the alias name of the HV Channel for a given HV area
242 /// \param sector = 0,1 or 2 for St12, and is unused for st345
244 Int_t chamberId = 1 + AliMpDEManager::GetChamberId(detElemId);
245 if ( chamberId < 1 ) return 0x0;
248 Int_t dcsNumber = DetElemId2DCS(detElemId,side);
250 switch (AliMpDEManager::GetStationType(detElemId))
252 case AliMp::kStation1:
253 case AliMp::kStation2:
254 return Form(fgHVChannelSt12Pattern[side],chamberId,dcsNumber,sector+1);
256 case AliMp::kStation345:
257 return Form(fgHVChannelSt345Pattern[side],chamberId,dcsNumber);
265 //_____________________________________________________________________________
267 AliMUONHVNamer::DCSHVSwitchName(Int_t detElemId, Int_t pcbNumber) const
269 /// Return the alias name of the HV Switch for a given PCB
270 /// within a slat of St345
272 if (AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345)
274 return Form(fgHVSwitchSt345Pattern,detElemId,pcbNumber+1);
279 //_____________________________________________________________________________
281 AliMUONHVNamer::DetElemIdFromDCSAlias(const char* dcsAlias) const
283 /// Converts the dcs alias to a detection element identifier
285 /// dcsAlias has one of the following 2 forms :
287 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Slat##.actual.vMon
289 /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Quad#Sect#.actual.vMon
291 TString sDcsAlias(dcsAlias);
295 if ( sDcsAlias.Contains("Left") )
299 else if ( sDcsAlias.Contains("Right") )
313 if ( sDcsAlias.Contains("Slat") )
315 sscanf(sDcsAlias.Data(),fgHVChannelSt345Pattern[side],&n1,&n3);
316 detElemId = DCS2DE(n1,side,n3);
318 else if ( sDcsAlias.Contains("Quad") )
320 sscanf(sDcsAlias.Data(),fgHVChannelSt12Pattern[side],&n1,&n3,&n4);
328 if ( !AliMpDEManager::IsValidDetElemId(detElemId) )
330 AliError(Form("Invalid aliasName %s",dcsAlias));
337 //_____________________________________________________________________________
339 AliMUONHVNamer::GenerateAliases() const
341 /// Generate DCS alias names, for MUON Tracker High Voltage system.
343 /// We first generate aliases of HV channels :
345 /// St 1 ch 1 : 12 channels
346 /// ch 2 : 12 channels
347 /// St 2 ch 3 : 12 channels
348 /// ch 4 : 12 channels
349 /// St 3 ch 5 : 18 channels
350 /// ch 6 : 18 channels
351 /// St 4 ch 7 : 26 channels
352 /// ch 8 : 26 channels
353 /// St 5 ch 9 : 26 channels
354 /// ch 10 : 26 channels
356 /// then aliases of HV switches (only for St345) : 1 switch per PCB.
358 /// Returns a TObjArray of TObjString(=alias name)
360 TObjArray* aliases = new TObjArray;
361 aliases->SetOwner(kTRUE);
369 Int_t detElemId = it.CurrentDEId();
370 switch ( AliMpDEManager::GetStationType(detElemId) )
372 case AliMp::kStation1:
373 case AliMp::kStation2:
374 for ( int sector = 0; sector < 3; ++sector)
376 aliases->Add(new TObjString(DCSHVChannelName(detElemId,sector)));
379 case AliMp::kStation345:
380 aliases->Add(new TObjString(DCSHVChannelName(detElemId)));
381 for ( Int_t i = 0; i < NumberOfPCBs(detElemId); ++i )
383 aliases->Add(new TObjString(DCSHVSwitchName(detElemId,i)));
395 //_____________________________________________________________________________
397 AliMUONHVNamer::ManuId2PCBIndex(Int_t detElemId, Int_t manuId) const
399 /// Returns the index of PCB (within a St345 slat) for a given manu number.
400 /// Returns -1 if (detElemId,manuId) is incorrect
402 const AliMpSlatSegmentation* seg = static_cast<const AliMpSlatSegmentation*>
403 (AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId));
404 const AliMpSlat* slat = seg->Slat();
405 AliMpVPadIterator* it = seg->CreateIterator();
407 AliMpPad pad = it->CurrentItem();
409 while ( !it->IsDone() && pad.GetLocation().GetFirst() != manuId )
412 pad = it->CurrentItem();
415 Int_t pcbIndex = slat->FindPCBIndex(pad.Position().X()+slat->Position().X(),
416 pad.Position().Y()+slat->Position().Y());
417 // AliDebug(1,Form("pcbIndex %d",pcbIndex));
418 // StdoutToAliDebug(1,pad.Print());
422 //_____________________________________________________________________________
424 AliMUONHVNamer::ManuId2Sector(Int_t /*detElemId*/, Int_t /*manuId*/) const
426 /// Return the HV-sector number (within a St12 quadrant) for a given manu number.
432 //_____________________________________________________________________________
434 AliMUONHVNamer::NumberOfPCBs(Int_t detElemId) const
436 /// Returns the number of PCB in a given detection element
437 /// Only works for St345
439 AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
440 if ( stationType != AliMp::kStation345 )
446 const AliMpSlatSegmentation* seg = static_cast<const AliMpSlatSegmentation*>
447 (AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0));
448 const AliMpSlat* slat = seg->Slat();
449 return slat->GetSize();