42e437a5dd33b3249fe38d70e45e53e2b99a6495
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpBusPatch.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 // $MpId: AliMpBusPatch.cxx,v 1.4 2006/05/24 13:58:34 ivana Exp $
18
19 //-----------------------------------------------------------------------------
20 // Class AliMpBusPatch
21 // --------------------
22 // The class defines the properties of BusPatch
23 // Author: Ivana Hrivnacova, IPN Orsay
24 //-----------------------------------------------------------------------------
25
26 #include "AliMpBusPatch.h"
27 #include "AliMpConstants.h"
28 #include "AliMpDEManager.h"
29 #include "AliMpSegmentation.h"
30 #include "AliMpSlatSegmentation.h"
31 #include "AliMpSlat.h"
32 #include "AliMpPCB.h"
33 #include "AliMpMotifPosition.h"
34
35 #include "AliLog.h"
36
37 #include <Riostream.h>
38
39 /// \cond CLASSIMP
40 ClassImp(AliMpBusPatch)
41 /// \endcond
42
43 const Int_t  AliMpBusPatch::fgkOffset = 100;
44 //
45 // static methods
46 //
47
48 //____________________________________________________________________
49 Int_t AliMpBusPatch::GetGlobalBusID(Int_t localID, Int_t ddlID)
50 {
51   /// return global bus id from local bus and ddl id
52
53   return ddlID*fgkOffset + localID;
54
55 }
56 //____________________________________________________________________
57 Int_t AliMpBusPatch::GetLocalBusID(Int_t globalID, Int_t ddlID)
58 {
59   /// return local bus id from local bus id
60
61   return globalID - ddlID*fgkOffset;
62
63 }
64
65 //______________________________________________________________________________
66 AliMpBusPatch::AliMpBusPatch(Int_t id, Int_t detElemId, Int_t ddlId)
67   : TObject(),
68     fId(id),
69     fDEId(detElemId),
70     fDdlId(ddlId),
71     fManus(false),
72     fNofManusPerModule(false),
73     fCableLength(-1),
74     fCableLabel(),
75     fTranslatorLabel(),
76     fFrtId(0)
77 {
78 /// Standard constructor
79 }
80
81 //______________________________________________________________________________
82 AliMpBusPatch::AliMpBusPatch(TRootIOCtor* /*ioCtor*/)
83   : TObject(),
84     fId(),
85     fDEId(),
86     fDdlId(),
87     fManus(false),
88     fNofManusPerModule(false),
89     fCableLength(-1),
90     fCableLabel(),
91     fTranslatorLabel(),
92     fFrtId(0)
93 {
94 /// Root IO constructor
95 }
96
97 //______________________________________________________________________________
98 AliMpBusPatch::~AliMpBusPatch()
99 {
100 /// Destructor
101 }
102
103 //
104 // public methods
105 //
106
107 //______________________________________________________________________________
108 Bool_t AliMpBusPatch::AddManu(Int_t manuId)
109 {
110 /// Add detection element with given detElemId.
111 /// Return true if the detection element was added
112
113   if ( HasManu(manuId) ) {
114     AliWarningStream() 
115       << "Manu with manuId=" << manuId << " already present."
116       << endl;
117     return false;
118   }    
119
120   fManus.Add(manuId);
121   return true;
122 }   
123
124 //______________________________________________________________________________
125 Bool_t AliMpBusPatch::SetNofManusPerModule(Int_t manuNumber)
126 {
127 /// Set the number of manus per patch module (PCB):
128 /// - for stations 1 all manus are connected to one PCB,
129 /// - for stations 2 there maximum two PCBs per buspatch,
130 /// - for slat stations there are maximum three PCBs per buspatch
131
132   if ( AliMpDEManager::GetStationType(fDEId) == AliMp::kStation1) {
133
134     // simply fill the number of manus, no bridge for station 1
135        
136     fNofManusPerModule.Add(GetNofManus());
137     return true;
138   }
139
140  if ( AliMpDEManager::GetStationType(fDEId) == AliMp::kStation2) {
141
142     // there is max two patch modules per buspatch
143        
144     fNofManusPerModule.Add(manuNumber);
145     if (manuNumber != GetNofManus())
146         fNofManusPerModule.Add(GetNofManus() - manuNumber);
147
148     return true;
149   }
150
151   if ( AliMpDEManager::GetStationType(fDEId) == AliMp::kStation345 ) {
152   
153     const AliMpSlatSegmentation* seg0 
154         = static_cast<const AliMpSlatSegmentation*>(
155             AliMpSegmentation::Instance()->GetMpSegmentation(fDEId, AliMp::kCath0));
156
157     const AliMpSlatSegmentation* seg1 
158         = static_cast<const AliMpSlatSegmentation*>(
159             AliMpSegmentation::Instance()->GetMpSegmentation(fDEId, AliMp::kCath1));
160
161     const AliMpSlat* slat0 = seg0->Slat();
162     const AliMpSlat* slat1 = seg1->Slat();
163
164        
165     Int_t iPcb = 0;
166     Int_t iPcbPrev = -1;
167     Int_t manuPerPcb = 0;
168
169     Double_t x = 0.;
170     Double_t length = 0.;
171
172     // Loop over manu
173     for (Int_t iManu = 0; iManu < GetNofManus(); ++iManu) {
174       Int_t manuId = GetManuId(iManu);
175       AliMpMotifPosition* motifPos0 = slat0->FindMotifPosition(manuId);
176       AliMpMotifPosition* motifPos1 = slat1->FindMotifPosition(manuId);   
177       
178       if ( !motifPos0 && !motifPos1 ) {
179         // should never happen
180         AliErrorStream() 
181           << "Motif position for manuId = " << manuId << "not found" << endl;
182         return false;
183       }
184
185       // find PCB id
186       if ( motifPos0 ) {
187         x = motifPos0->Position().X();
188         length = slat0->GetPCB(0)->DX()*2.;
189       }
190       if ( motifPos1 ) {
191         x = motifPos1->Position().X();
192         length = slat1->GetPCB(0)->DX()*2.;
193       }
194       
195       iPcb = Int_t(x/length + AliMpConstants::LengthTolerance());
196
197       // check when going to next PCB
198       if ( iPcb == iPcbPrev )
199         manuPerPcb++;
200       else if ( iPcbPrev != -1 ) {
201         //vec.Set(vec.GetSize()+1);
202         //vec[vec.GetSize()-1] = manuPerPcb+1;
203         fNofManusPerModule.Add(manuPerPcb+1);
204         manuPerPcb = 0;
205       }
206       iPcbPrev = iPcb;
207     }
208    
209     // store last PCB
210     //vec.Set(vec.GetSize()+1);
211     //vec[vec.GetSize()-1] = manuPerPcb+1;
212     fNofManusPerModule.Add(manuPerPcb+1);
213     return true;  
214   } 
215   
216   return false; 
217 }     
218
219 //______________________________________________________________________________
220 void  AliMpBusPatch::RevertReadout()
221 {
222 /// Revert order of manus
223
224   fManus.Revert();
225 }
226
227 //______________________________________________________________________________
228 void  AliMpBusPatch::ResetReadout()
229 {
230 /// Revert order of manus
231
232   fManus.Reset();
233 }
234
235 //______________________________________________________________________________
236 Int_t AliMpBusPatch::GetNofManus() const
237 {  
238 /// Return the number of detection elements connected to this DDL
239
240   return fManus.GetSize(); 
241 }
242
243 //______________________________________________________________________________
244 Int_t  AliMpBusPatch::GetManuId(Int_t index) const
245 {  
246 /// Return the detection element by index (in loop)
247
248   return fManus.GetValue(index); 
249 }
250
251 //______________________________________________________________________________
252 Bool_t  AliMpBusPatch::HasManu(Int_t manuId) const
253 {  
254 /// Return true if bus patch has manu with given manuId
255
256   return fManus.HasValue(manuId); 
257 }
258
259 //______________________________________________________________________________
260 Int_t  AliMpBusPatch::GetNofPatchModules() const
261 {
262 /// Return the number of patch modules (PCB) connected to this bus patch.
263
264   return fNofManusPerModule.GetSize();
265 }  
266   
267 //______________________________________________________________________________
268 Int_t  AliMpBusPatch::GetNofManusPerModule(Int_t patchModule) const
269 {
270 /// Return the number of manus per patch module (PCB)
271
272   if ( patchModule < 0 || patchModule >= GetNofPatchModules() ) {
273     AliErrorStream() << "Invalid patch module number = " << patchModule << endl;
274     return 0;
275   }
276   
277   return fNofManusPerModule.GetValue(patchModule);
278 }