110{
111 if(orChannel) return nullptr;
112 if(hpbin->isValid()==false) return nullptr;
113
114 TGCChannelSLBOut* slbout = nullptr;
115
116
117 TGCModuleId* hpb = hpbin->getModule();
118
119
120 if(!hpb) return nullptr;
121
122
124 delete hpb;
125 if(!mapId) return nullptr;
126
127
129 if(numOfBlock==0) {
130 delete mapId;
131 mapId = nullptr;
132 return nullptr;
133 }
134
136 int slbInBlock = 0;
137
138
139 TGCModuleId* slb = nullptr;
140 int blockInHPB = 0;
141 int nSlb = 0;
142 int port = 0;
143
144
145 int blockInSlb = 0;
146 int posInHpb = 0;
148 int size = 0;
149 switch(moduleType){
150
153 slbInBlock = 3;
154 blockInHPB = hpbin->getBlock();
155 nSlb = hpbin->getChannel()/(numOfBlock*2);
156 port = blockInHPB*slbInBlock+nSlb;
157 size = mapId->size();
158 for(
int i=0;
i<size;
i++){
159 if(mapId->connector(i)==port){
160 slb = mapId->popModuleId(i);
161 break;
162 }
163 }
164 blockInSlb = (hpbin->getChannel() - nSlb*(numOfBlock*2))/2;
165 posInHpb = (hpbin->getChannel() - (numOfBlock*2)*nSlb)%2;
166 channel = (chInBlock/2)*posInHpb;
167 break;
168
170 slbInBlock = 2;
171 blockInHPB = hpbin->getBlock();
172 nSlb = hpbin->getChannel()/(numOfBlock*2);
173 port = blockInHPB*slbInBlock+nSlb;
174 size = mapId->size();
175 for(
int i=0;
i<size;
i++){
176 if(mapId->connector(i)== -1*port){
177 slb = mapId->popModuleId(i);
178 break;
179 }
180 }
181 blockInSlb = (hpbin->getChannel() - nSlb*(numOfBlock*2))/2;
182 posInHpb = (hpbin->getChannel() - (numOfBlock*2)*nSlb)%2;
183 channel = (chInBlock/2)*posInHpb;
184 break;
185
187 blockInHPB = hpbin->getBlock();
188 if(blockInHPB==0 && hpbin->getChannel()<numOfBlock) port=1;
189 else port=2;
190 size = mapId->size();
191 for(
int i=0;
i<size;
i++){
192 if(mapId->connector(i)== -1*port){
193 slb = mapId->popModuleId(i);
194 break;
195 }
196 }
197 blockInSlb = (hpbin->getChannel())%numOfBlock;
198 if(blockInHPB == 1 && hpbin->getChannel() >= numOfBlock) blockInSlb = blockInSlb + numOfBlock/2;
200 break;
201
202 default:
203 break;
204
205 }
206
207 delete mapId; mapId = nullptr;
208 if(!slb) return nullptr;
209
212
213 int SLBID = slb->getId();
214 if((chInBlock*blockInSlb+channel)>chInBlock*numOfBlock){
215 SLBID++;
217 blockInSlb = 0;
218 } else if( channel > chInBlock){
220 blockInSlb++;
221 }
222
223 slbout = new TGCChannelSLBOut(slb->getSideType(),
224 moduleType,
225 slb->getRegionType(),
226 slb->getSector(),
227 SLBID,
228 blockInSlb,
229 channel );
230
231 delete slb;
232 return slbout;
233}
virtual TGCModuleMap * getModuleInforHPB(const TGCModuleId *hpb, TGCId::ModuleType moduleType) const