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