]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONHVNamer.cxx
Added class to read reconstruction parameters from OCDB (Yuri)
[u/mrichter/AliRoot.git] / MUON / AliMUONHVNamer.cxx
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 "AliMUONHVNamer.h"
19
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"
28
29 #include "AliLog.h"
30 #include "Riostream.h"
31 #include "TMap.h"
32 #include "TObjArray.h"
33 #include "TObjString.h"
34 #include "TString.h"
35 #include "TSystem.h"
36
37 /// $Id$
38 ///
39 /// \class AliMUONHVNamer
40 /// 
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.
43 ///
44 /// \author: Laurent Aphecetche, Subatech
45
46 /// \cond CLASSIMP
47 ClassImp(AliMUONHVNamer)
48 /// \endcond
49
50 const char* AliMUONHVNamer::fgHVChannelSt345Pattern[] = 
51 { "MchHvLvLeft/Chamber%02dLeft/Slat%02d.actual.vMon",
52   "MchHvLvRight/Chamber%02dRight/Slat%02d.actual.vMon" 
53 };
54
55 const char* AliMUONHVNamer::fgHVChannelSt12Pattern[] = 
56 {
57   "MchHvLvLeft/Chamber%02dLeft/Quad%dSect%d.actual.vMon",
58   "MchHvLvRight/Chamber%02dRight/Quad%dSect%d.actual.vMon",
59 };
60
61 const char* AliMUONHVNamer::fgHVSwitchSt345Pattern = "MchDE%04dsw%d.inValue";
62
63 //_____________________________________________________________________________
64 AliMUONHVNamer::AliMUONHVNamer()
65 {
66  /// default ctor 
67 }
68
69 //_____________________________________________________________________________
70 AliMUONHVNamer::~AliMUONHVNamer()
71 {
72   /// dtor
73 }
74
75 //_____________________________________________________________________________
76 void 
77 AliMUONHVNamer::AliasesAsLdif(const char* ldiffile) const
78 {
79 /// Export the aliases in LDIF format
80
81   ofstream out(ldiffile);
82   
83   TObjArray* a = CompactAliases();
84   
85   TIter next(a);
86   TObjString* s;
87
88   // Some header. host name and port probably not up to date.
89   out << "#MCH config" << endl
90     << "dn: det=MCH,o=alice,dc=cern,dc=ch" << endl
91     << "objectClass: AliShuttleDetector" << endl
92     << "det: MCH" << endl
93     << "StrictRunOrder: 1" << endl
94     << "responsible: aphecetc@in2p3.fr" << endl
95     << "DCSHost: aldcs053.cern.ch" << endl
96     << "DCSPort: 4242" <<endl;
97   
98   while ( ( s = (TObjString*)(next()) ) )
99   {
100     out << "DCSalias: " << s->String().Data() << endl;
101   }
102   
103   out.close();
104   
105   delete a;
106 }
107
108 //_____________________________________________________________________________
109 TObjArray*
110 AliMUONHVNamer::CompactAliases() const
111 {
112   /// Generate a compact list of aliases, for Shuttle test
113   /// This one is completely hand-made, in contrast with GenerateAliases()
114   /// method
115
116   TObjArray* a = new TObjArray;
117   a->SetOwner(kTRUE);
118   
119   // St 12 (HV Channels)
120   a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad0Sect[0..2].actual.vMon"));
121   a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad1Sect[0..2].actual.vMon"));
122   a->Add(new TObjString("MchHvLvLeft/Chamber[00..03]Left/Quad2Sect[0..2].actual.vMon"));
123   a->Add(new TObjString("MchHvLvRight/Chamber[00..03]Right/Quad3Sect[0..2].actual.vMon"));
124   
125   // St345 (HV Channels)
126   
127   a->Add(new TObjString("MchHvLvRight/Chamber[04..09]Right/Slat[00..08].actual.vMon"));
128   a->Add(new TObjString("MchHvLvLeft/Chamber[04..09]Left/Slat[00..08].actual.vMon"));
129
130   a->Add(new TObjString("MchHvLvRight/Chamber[06..09]Right/Slat[09..12].actual.vMon"));
131   a->Add(new TObjString("MchHvLvLeft/Chamber[06..09]Left/Slat[09..12].actual.vMon"));
132
133   // St345 (HV Switches)
134   AliMpDEIterator it;
135   
136   it.First();
137   
138   while (!it.IsDone())
139   {
140     Int_t detElemId = it.CurrentDEId();
141     if ( AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345 )
142     {
143           a->Add(new TObjString(Form("MchDE%04dsw[0..%d].inValue",detElemId,NumberOfPCBs(detElemId)-1)));
144      }
145     it.Next();
146   }
147   return a;
148 }
149
150 //_____________________________________________________________________________
151 Int_t 
152 AliMUONHVNamer::DCS2DE(Int_t chamberId, Int_t side, Int_t dcsNumber) const
153 {
154   /// Convert DCS "slat number" (old convention) to DE (new) convention.
155   ///
156   /// \param chamberId : chamber number (starting at 0)
157   /// \param side : 0 for Left, 1 for Right
158   /// \param dcsNumber : slat number in DCS HV convention
159   ///
160   /// note that dcsNumber should be >=0 and < number of DEs/2 in chamber
161
162   Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
163   
164   Int_t half = nofDE/2;
165   
166   dcsNumber = half - dcsNumber;
167   
168   Int_t quarter = nofDE/4;
169   Int_t threeQuarter = half + quarter;
170   
171   Int_t de(-1);
172   
173   if ( side == 0 ) // left
174   {
175     de = threeQuarter + 1 - dcsNumber;
176   }
177   else if ( side == 1 ) // right
178   {
179     if ( dcsNumber <= quarter )
180     {
181       de = dcsNumber + threeQuarter;
182     }
183     else
184     {
185       de = dcsNumber - quarter - 1;
186     }
187   }
188   
189   return chamberId*100 + de;
190 }
191
192 //_____________________________________________________________________________
193 Int_t
194 AliMUONHVNamer::DetElemId2DCS(Int_t detElemId, Int_t& side) const
195 {
196   /// Convert DE to DCS "slat number"
197   /// @see DCS2DE
198   
199   Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
200   if ( chamberId < 0 ) 
201   {
202     AliDebug(1,Form("DetElemId %d invalid",detElemId));
203     return -1;
204   }
205   Int_t dcsNumber = (detElemId-(chamberId+1)*100);
206
207   switch ( AliMpDEManager::GetStationType(detElemId) )
208   {
209     case AliMp::kStation1:
210     case AliMp::kStation2:
211     {
212       switch (dcsNumber)
213       {
214         case 0:
215         case 3:
216           side = 1; // right
217           break;
218         case 1:
219         case 2:
220           side = 0; // left
221         default:
222           break;
223       }
224     }
225       break;
226     case AliMp::kStation345:
227     {
228       Int_t nofDE = AliMpDEManager::GetNofDEInChamber(chamberId);
229       
230       Int_t quarter = nofDE/4;
231       
232       Int_t half = nofDE/2;
233       
234       Int_t threeQuarter = half + quarter;  
235       
236       side = -1;
237       
238       if ( dcsNumber <= quarter ) 
239       {
240         dcsNumber += quarter + 1 ;
241         side = 1; // right
242       }
243       else if ( dcsNumber <= threeQuarter )
244       {
245         dcsNumber = ( threeQuarter - dcsNumber + 1 );
246         side = 0; // left
247       }
248       else if ( dcsNumber > threeQuarter ) 
249       {
250         dcsNumber = dcsNumber - threeQuarter;
251         side = 1; // right
252       }
253       else
254       {
255         AliFatal("oups");
256       }  
257       // dcs convention change : numbering from top, not from bottom
258       dcsNumber = half-dcsNumber;
259     }
260       break;
261     default:
262       break;
263   }
264   return dcsNumber;
265 }
266
267 //_____________________________________________________________________________
268 const char* 
269 AliMUONHVNamer::DCSHVChannelName(Int_t detElemId, Int_t sector) const
270 {
271   /// Return the alias name of the HV Channel for a given HV area 
272   /// \param detElemId 
273   /// \param sector = 0,1 or 2 for St12, and is unused for st345
274   
275   Int_t chamberId = AliMpDEManager::GetChamberId(detElemId);
276   if ( chamberId < 0 ) return 0x0;
277
278   Int_t side(-1);
279   Int_t dcsNumber = DetElemId2DCS(detElemId,side);
280                                   
281   switch (AliMpDEManager::GetStationType(detElemId))
282   {
283     case AliMp::kStation1:
284     case AliMp::kStation2:
285       return Form(fgHVChannelSt12Pattern[side],chamberId,dcsNumber,sector);
286       break;
287     case AliMp::kStation345:
288       return Form(fgHVChannelSt345Pattern[side],chamberId,dcsNumber);
289       break;
290     default:
291       return 0x0;
292       break;
293   }
294 }
295
296 //_____________________________________________________________________________
297 const char* 
298 AliMUONHVNamer::DCSHVSwitchName(Int_t detElemId, Int_t pcbNumber) const
299 {
300   /// Return the alias name of the HV Switch for a given PCB 
301   /// within a slat of St345
302   
303   if (AliMpDEManager::GetStationType(detElemId) == AliMp::kStation345)
304   {
305     return Form(fgHVSwitchSt345Pattern,detElemId,pcbNumber);
306   }
307   return 0x0;
308 }
309
310 //_____________________________________________________________________________
311 Int_t 
312 AliMUONHVNamer::DetElemIdFromDCSAlias(const char* dcsAlias) const
313 {
314   /// Converts the dcs alias to a detection element identifier
315   ///
316   /// dcsAlias has one of the following 2 forms :
317   ///
318   /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Slat##.actual.vMon
319   ///
320   /// MchHvLv[Left|Right]/Chamber##[Left|Right]/Chamber##[Left|Right]Quad#Sect#.actual.vMon
321   
322   TString sDcsAlias(dcsAlias);
323   
324   int side(-1);
325   
326   if ( sDcsAlias.Contains("Left") )
327   {
328     side = 0;
329   }
330   else if ( sDcsAlias.Contains("Right") )
331   {
332     side = 1;
333   }
334   else
335   {
336     return -2;
337   }
338   
339   int n1(-1);
340   int n3(-1);
341   int n4(-1);
342   int detElemId(-1);
343   
344   if ( sDcsAlias.Contains("Slat") )
345   {
346     sscanf(sDcsAlias.Data(),fgHVChannelSt345Pattern[side],&n1,&n3);
347     detElemId = DCS2DE(n1,side,n3);
348   }
349   else if ( sDcsAlias.Contains("Quad") )
350   {
351     sscanf(sDcsAlias.Data(),fgHVChannelSt12Pattern[side],&n1,&n3,&n4);    
352     detElemId = n3-1;
353   }
354   else
355   {
356     return -3;
357   }
358   
359   if ( !AliMpDEManager::IsValidDetElemId(detElemId)  )
360   {
361     AliError(Form("Invalid aliasName %s",dcsAlias));
362     return -1;
363   }
364   
365   return detElemId;
366 }
367
368 //_____________________________________________________________________________
369 TObjArray*
370 AliMUONHVNamer::GenerateAliases() const
371 {
372   /// Generate DCS alias names, for MUON Tracker High Voltage system.
373   ///
374   /// We first generate aliases of HV channels :
375   ///
376   /// St 1 ch  1 : 12 channels
377   ///      ch  2 : 12 channels 
378   /// St 2 ch  3 : 12 channels
379   ///      ch  4 : 12 channels
380   /// St 3 ch  5 : 18 channels
381   ///      ch  6 : 18 channels
382   /// St 4 ch  7 : 26 channels
383   ///      ch  8 : 26 channels
384   /// St 5 ch  9 : 26 channels
385   ///      ch 10 : 26 channels
386   ///
387   /// then aliases of HV switches (only for St345) : 1 switch per PCB.
388   ///
389   /// Returns a TObjArray of TObjString(=alias name)
390   
391   TObjArray* aliases = new TObjArray;
392   aliases->SetOwner(kTRUE);
393   
394   AliMpDEIterator it;
395   
396   it.First();
397   
398   while (!it.IsDone())
399   {
400     Int_t detElemId = it.CurrentDEId();
401     switch ( AliMpDEManager::GetStationType(detElemId) )
402     {
403       case AliMp::kStation1:
404       case AliMp::kStation2:
405         for ( int sector = 0; sector < 3; ++sector)
406         {
407           aliases->Add(new TObjString(DCSHVChannelName(detElemId,sector)));
408         }
409         break;
410       case AliMp::kStation345:
411         aliases->Add(new TObjString(DCSHVChannelName(detElemId)));
412         for ( Int_t i = 0; i < NumberOfPCBs(detElemId); ++i )
413         {
414           aliases->Add(new TObjString(DCSHVSwitchName(detElemId,i)));
415         }
416         break;
417       default:
418         break;
419     }
420     it.Next();
421   }
422   
423   return aliases;
424 }
425
426 //_____________________________________________________________________________
427 Int_t 
428 AliMUONHVNamer::ManuId2PCBIndex(Int_t detElemId, Int_t manuId) const
429 {
430   /// Returns the index of PCB (within a St345 slat) for a given manu number.
431   /// Returns -1 if (detElemId,manuId) is incorrect
432   
433   const AliMpSlatSegmentation* seg = static_cast<const AliMpSlatSegmentation*>
434     (AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId));
435   const AliMpSlat* slat = seg->Slat();
436   AliMpVPadIterator* it = seg->CreateIterator();
437   it->First();
438   AliMpPad pad = it->CurrentItem();
439   
440   while ( !it->IsDone() && pad.GetLocation().GetFirst() != manuId ) 
441   {
442     it->Next();
443     pad = it->CurrentItem();
444   }
445   
446   Int_t pcbIndex = slat->FindPCBIndex(pad.Position().X()+slat->Position().X(),
447                                       pad.Position().Y()+slat->Position().Y());
448 //  AliDebug(1,Form("pcbIndex %d",pcbIndex));
449 //  StdoutToAliDebug(1,pad.Print());
450   return pcbIndex;
451 }
452
453 //_____________________________________________________________________________
454 Int_t 
455 AliMUONHVNamer::ManuId2Sector(Int_t /*detElemId*/, Int_t /*manuId*/) const
456 {
457   /// Return the HV-sector number (within a St12 quadrant) for a given manu number.
458   
459   //FIXME: write me !
460   return 0;
461 }
462
463 //_____________________________________________________________________________
464 Int_t 
465 AliMUONHVNamer::NumberOfPCBs(Int_t detElemId) const
466 {
467   /// Returns the number of PCB in a given detection element
468   /// Only works for St345
469   
470   AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
471   if ( stationType != AliMp::kStation345 )
472   {
473     return 0;
474   }
475   else
476   {
477     const AliMpSlatSegmentation* seg = static_cast<const AliMpSlatSegmentation*>
478     (AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0));
479     const AliMpSlat* slat = seg->Slat();
480     return slat->GetSize();
481   }
482 }