113 {
114 if (orChannel || hpbin.isValid() == false) {
115 return nullptr;
116 }
117
118 std::unique_ptr<TGCModuleId> hpb{
119 hpbin.getModule()};
120
121
122 if (!hpb) {
123 return nullptr;
124 }
125
126
128 if (!mapId.size()) {
129 return nullptr;
130 }
131
132
134 if (numOfBlock == 0) {
135 return nullptr;
136 }
137
139 int slbInBlock = 0;
140
141
142 std::unique_ptr<TGCModuleId> slb{};
143 int blockInHPB = 0;
144 int nSlb = 0;
145 int port = 0;
146
147
148 int blockInSlb = 0;
149 int posInHpb = 0;
151 switch (moduleType) {
154 slbInBlock = 3;
155 blockInHPB = hpbin.getBlock();
156 nSlb = hpbin.getChannel() / (numOfBlock * 2);
157 port = blockInHPB * slbInBlock + nSlb;
158 slb = mapId.popModule(port);
159 blockInSlb = (hpbin.getChannel() - nSlb * (numOfBlock * 2)) / 2;
160 posInHpb = (hpbin.getChannel() - (numOfBlock * 2) * nSlb) % 2;
161 channel = (chInBlock / 2) * posInHpb;
162 break;
163
165 slbInBlock = 2;
166 blockInHPB = hpbin.getBlock();
167 nSlb = hpbin.getChannel() / (numOfBlock * 2);
168 port = blockInHPB * slbInBlock + nSlb;
169 slb = mapId.popModule(-port);
170
171 blockInSlb = (hpbin.getChannel() - nSlb * (numOfBlock * 2)) / 2;
172 posInHpb = (hpbin.getChannel() - (numOfBlock * 2) * nSlb) % 2;
173 channel = (chInBlock / 2) * posInHpb;
174 break;
175
177 blockInHPB = hpbin.getBlock();
178 if (blockInHPB == 0 && hpbin.getChannel() < numOfBlock) {
179 port = 1;
180 } else {
181 port = 2;
182 }
183 slb = mapId.popModule(-port);
184
185 blockInSlb = (hpbin.getChannel()) % numOfBlock;
186 if (blockInHPB == 1 && hpbin.getChannel() >= numOfBlock) {
187 blockInSlb = blockInSlb + numOfBlock / 2;
188 }
190 break;
191
192 default:
193 break;
194 }
195
196 if (!slb) {
197 return nullptr;
198 }
199
202
203 int SLBID = slb->getId();
204 if ((chInBlock * blockInSlb + channel) > chInBlock * numOfBlock) {
205 SLBID++;
207 blockInSlb = 0;
208 } else if (channel > chInBlock) {
210 blockInSlb++;
211 }
212
213 return std::make_unique<TGCChannelSLBOut>(
214 slb->getSideType(), moduleType, slb->getRegionType(), slb->getSector(),
215 SLBID, blockInSlb, channel);
216}
TGCModuleMap getModuleInforHPB(const TGCModuleId &hpb, TGCId::ModuleType moduleType) const