1 /**************************************************************************
2 * Copyright(c) 2007, 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 **************************************************************************/
16 // Class provides a set of static methods to convert absolute number of pad to pair (X,Y)
19 // Author - Mikhail Stolpovskiy, IHEP Protvino (2013)
21 #include "AliPHOSCpvParam.h"
22 // #include "AliPHOSCpvRawStream.h"
24 ClassImp(AliPHOSCpvParam);
28 //====================================================================================
29 AliPHOSCpv3GConnection AliPHOSCpvParam::fConnection;
30 //====================================================================================
31 Bool_t AliPHOSCpvParam::DecodeRawWord(Int_t ddl,Int_t rWord, Int_t & abs, Int_t & q, Int_t & eType) {
33 //std::cout<<"ddl = "<<ddl<<", mod = "<<DDL2Mod(ddl)<<std::endl;
35 if (((rWord >> 27) & 1)) { //check if it's end_of_event word for 3gassiplex card.
40 //std::cout<<"AliPHOSCpvParam::DecodeRawWord(): passed ((rWord >> 27) & 1)"<<std::endl;
42 UInt_t statusControlRow = 0x32a8;
43 UInt_t rowControlWord = rWord & 0xfbff;
44 if(rowControlWord == statusControlRow) {
49 //std::cout<<"AliPHOSCpvParam::DecodeRawWord(): passed rowControlWord == statusControlRow"<<std::endl;
54 abs |= (DDL2Mod(ddl))<<15;
55 if(!IsValidAbs(abs)) {
59 //std::cout<<"AliPHOSCpvParam::DecodeRawWord(): passed IsValidAbs(abs)"<<std::endl;
60 if(A2Pad(abs) >= kNPadAdd) {
61 // eType = AliPHOSCpvRawStream::kWrongPadErr; // Eliminate circular dependence AliPHOSCpvParam <-> AliPHOSCpvRawStream!
66 //Printf("AliPHOSCpvParam::DecodeRawWord: mod, cc, 3g, pad , q = %d, %d, %d, %d, %d",A2Mod(abs),A2CC(abs),A23G(abs),A2Pad(abs), q);
70 //====================================================================================
71 Int_t AliPHOSCpvParam::Abs(Int_t ddl,Int_t columnCtrl,Int_t gassiplex3,Int_t pad) {
72 if(ddl<0 || ddl>=kNDDL ||
73 columnCtrl<0 || columnCtrl>=kNRows ||
74 gassiplex3<0 || gassiplex3>=kN3GAdd ||
75 pad<0 || pad>=kNPadAdd) return -1;
76 Int_t module = DDL2Mod(ddl); // module is number of CPV module (1-5) accordance to the PHOS offline
77 if(module == -1) return -1;
83 //====================================================================================
84 Bool_t AliPHOSCpvParam::IsValidAbs(Int_t abs) {
85 // Printf("AliPHOSCpvParam::IsValidAbs: abs = %d",abs);
86 Int_t mod = A2Mod(abs),
90 // Printf("mod = %d, cc = %d, g3 = %d, pad = %d",mod,cc,g3,pad);
91 if(mod<1 || mod>kNModules ||
92 cc <0 || cc >=kNRows ||
93 g3 <0 || g3 >=kN3GAdd ||
94 pad<0 || pad>=kNPadAdd) return kFALSE;
97 //====================================================================================
98 Int_t AliPHOSCpvParam::A2DDL(Int_t abs) { return Mod2DDL(A2Mod(abs));}
99 //====================================================================================
100 Int_t AliPHOSCpvParam::A2Mod(Int_t abs) { /*cout << "module is" << (abs>>15) << endl;*/ return abs>>15; }
101 //====================================================================================
102 Int_t AliPHOSCpvParam::DDL2Mod(Int_t ddl) {
104 case (0) : return 5; break;
105 case (2) : return 4; break;
106 case (4) : return 3; break;
107 case (6) : return 2; break;
108 case (8) : return 1; break;
109 default : return -1; break;
112 //====================================================================================
113 Int_t AliPHOSCpvParam::Mod2DDL(Int_t mod) {
115 case (1) : return 8; break;
116 case (2) : return 6; break;
117 case (3) : return 4; break;
118 case (4) : return 2; break;
119 case (5) : return 0; break;
120 default : return -1; break;
123 //====================================================================================
124 Int_t AliPHOSCpvParam::A2CC (Int_t abs) { return ((abs >> 10) & 0x1f) - 1; }
125 //====================================================================================
126 Int_t AliPHOSCpvParam::A23G (Int_t abs) { return ((abs >> 6 ) & 0xf) - 1; }
127 //====================================================================================
128 Int_t AliPHOSCpvParam::A2Pad(Int_t abs) { return abs & 0x3f; }
129 //====================================================================================
130 Int_t AliPHOSCpvParam::A2X (Int_t abs) {
131 if(!IsValidAbs(abs)) {
132 // Printf("AliPHOSCpvParam::A2X: abs is not valid!");
135 return (kNRows - 1 - A2CC(abs))*(kPadPcX/kNRows) + ( fConnection.Pad2X(A2Pad(abs)));
137 //====================================================================================
138 Int_t AliPHOSCpvParam::A2Y (Int_t abs) {
139 if(!IsValidAbs(abs)) {
140 // Printf("AliPHOSCpvParam::A2Y: abs is not valid!");
143 //return A23G(abs)*(kPadPcY/kN3GAdd) + connection.Ch2Y(A2Pad(abs));
144 //return (kN3GAdd - 1 - A23G(abs))*(kPadPcY/kN3GAdd) + (kPadPcY/kN3GAdd - 1 - fConnection.pad2Y(A2Pad(abs)));
145 return (A23G(abs))*(kPadPcY/kN3GAdd) + (5-fConnection.Pad2Y(A2Pad(abs)));
146 //return (kN3GAdd - 1 - A23G(abs))*(kPadPcY/kN3GAdd) + connection.Ch2Y(A2Pad(abs));
148 //====================================================================================
149 Int_t AliPHOSCpvParam::XY2A (Int_t ddl, Int_t x, Int_t y) {
150 if(x<kMinPx || x>kMaxPx || y<kMinPy || y>kMaxPy) return -1;
151 return Abs(ddl,X2CC(x),Y23G(y),XY2Pad(x,y));
153 //====================================================================================
154 Int_t AliPHOSCpvParam::X2CC (Int_t x) {
155 if(x<kMinPx|| x>kMaxPx) return -1;
156 return kNRows - 1 - x/(kPadPcX/kNRows);
158 //====================================================================================
159 Int_t AliPHOSCpvParam::Y23G (Int_t y) {
160 if(y<kMinPy || y>kMaxPy) return -1;
161 return y/(kPadPcY/kN3GAdd);
163 //====================================================================================
164 Int_t AliPHOSCpvParam::XY2Pad(Int_t x, Int_t y) {
165 if(x<kMinPx || x>kMaxPx || y<kMinPy || y>kMaxPy) return -1;
166 Int_t xPad = x - (kNRows - 1 - X2CC(x))*(kPadPcX/kNRows);
167 //Int_t yPad = y - (kN3GAdd- 1 - Y23G(y))*(kPadPcY/kN3GAdd);
168 Int_t yPad = y - (Y23G(y))*(kPadPcY/kN3GAdd);
169 //return connection.XY2Ch(xPad,yPad);
170 //return fConnection.XY2pad(xPad,kPadPcY/kN3GAdd - 1 - yPad);
171 return fConnection.XY2Pad(xPad,5-yPad);
173 //====================================================================================
174 Bool_t AliPHOSCpvParam::GetLimOfCConX( Int_t cc, Int_t &xmin, Int_t &xmax) {
176 if(cc < 0 || cc > kNRows) return kFALSE;
177 Int_t a1 = Abs(0,cc,0,fConnection.XY2Pad(0,0)),
178 a2 = Abs(0,cc,0,fConnection.XY2Pad(7,0));
179 if(!(IsValidAbs(a1) && IsValidAbs(a2))) return kFALSE;
182 //cout<<": xmin = "<<xmin<<" xmax = "<<xmax<<endl;
185 //====================================================================================
186 Bool_t AliPHOSCpvParam::GetLimOf3GonY( Int_t g3, Int_t &ymin, Int_t &ymax) {
187 if(g3 < 0 || g3 > kN3GAdd) return kFALSE;
188 Int_t a1 = Abs(0,0,g3,fConnection.XY2Pad(0,0)),
189 a2 = Abs(0,0,g3,fConnection.XY2Pad(0,5));
190 if(!(IsValidAbs(a1) && IsValidAbs(a2))) return kFALSE;
195 //====================================================================================
196 Int_t AliPHOSCpvParam::A2fId(Int_t abs) {
198 fId += kPadPcX*kPadPcY*(A2DDL(abs)-1);
199 fId += (kPadPcX/kNRows )*A2CC(abs);
200 fId += (kPadPcY/kN3GAdd)*A23G(abs);