using namespace std;
#include <iostream>
#include <iomanip>
#include "hmdclistgroupcells.h"
Int_t HMdcList12GroupCells::compare(const HMdcList12GroupCells* lst,
Int_t l1, Int_t l2,HMdcList12GroupCells* lstIdent) const {
if(l1>=12) return 0;
setInBounds(l1,l2);
Int_t nLay=0;
if(lstIdent) lstIdent->clear();
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1=firstCell[lay];
Int_t c2=lst->firstCell[lay];
if( !findOverlap(c1,c2) ) continue;
if(lstIdent) {
if(HMdcTBArray::andArr(cellAddrC(lay,c1),lst->cellAddrC(lay,c1),
(c2-c1)>>2,lstIdent->layAddr(lay))) {
lstIdent->firstCell[lay]=c1;
if(lstIdent->arr[laySh] == 0) lstIdent->shiftLeft(lay);
nLay++;
}
} else if(HMdcTBArray::isIdenBits(cellAddrC(lay,c1),lst->cellAddrC(lay,c1),
(c2-c1)>>2)) nLay++;
}
return nLay;
}
Bool_t HMdcList12GroupCells::findOverlap(Int_t& c1, Int_t& c2) {
if(c1 < c2) {
Int_t ct = c2;
c2 = c1;
c1 = ct;
}
c2 += 48;
if(c1 <= c2) return kTRUE;
return kFALSE;
}
Int_t HMdcList12GroupCells::compareAndUnset(const HMdcList12GroupCells* lst,
HMdcList12GroupCells* lstIdent, Int_t modi) {
Int_t nIdDrTm = 0;
lstIdent->clear();
Int_t lay = (modi != 1) ? 0 : 6;
Int_t layEnd = (modi != 0) ? 12 : 6;
for(;lay<layEnd; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1 = firstCell[lay];
Int_t c2 = lst->firstCell[lay];
if( !findOverlap(c1,c2) ) continue;
Int_t nId = HMdcBArray::andArrAndUnset(cellAddr(lay,c1),
lst->cellAddrC(lay,c1),(c2-c1)>>2,lstIdent->layAddr(lay));
if(nId > 0) {
nIdDrTm += nId;
lstIdent->firstCell[lay] = c1;
if(lstIdent->arr[laySh] == 0) lstIdent->shiftLeft(lay);
if(arr[laySh] == 0) shiftLeft(lay);
}
}
return nIdDrTm;
}
Int_t HMdcList12GroupCells::nIdentDrTimes(const HMdcList12GroupCells* lst,
Int_t l1, Int_t l2) const {
if(l1>=12) return 0;
setInBounds(l1,l2);
Int_t nICells=0;
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1 = firstCell[lay];
Int_t c2 = lst->firstCell[lay];
if(c1 < c2) {
Int_t ct = c2;
c2 = c1;
c1 = ct;
}
c2 += 48;
if(c1 <= c2) nICells += HMdcTBArray::compare(cellAddrC(lay,c1),
lst->cellAddrC(lay,c1),(c2-c1)>>2);
}
return nICells;
}
Int_t HMdcList12GroupCells::getMaxNCellsPerLay(void) const {
Int_t maxNum=0;
for(Int_t lay=0;lay<12;lay++) {
Int_t nl=getNCells(lay);
if(nl>maxNum) maxNum=nl;
}
return maxNum;
}
Int_t HMdcList12GroupCells::add(HMdcList12GroupCells* lst) {
Int_t nLay=0;
for(Int_t lay=0; lay<12; lay++) {
UChar_t *lst2=(lst->arr)+lay*laySz;
if(HMdcTBArray::getNSet(lst2,lst2+11) == 0) continue;
UChar_t *lst1=arr+lay*laySz;
if(HMdcTBArray::getNSet(lst1,lst1+11) == 0) {
for(Int_t n=0; n<laySz; n++) lst1[n] = lst2[n];
firstCell[lay]=lst->firstCell[lay];
continue;
}
Int_t sing=firstCell[lay] - lst->firstCell[lay];
if(sing != 0) {
Int_t shift=((sing<0) ? -sing:sing)>>2;
if(shift>12) shift=12;
if( sing < 0 ) {
nLay=HMdcTBArray::getNSet(lst2+laySz-shift,lst2+11);
for(Int_t n=shift; n<laySz; n++) lst1[n] |= lst2[n-shift];
}
else if( sing > 0 ){
nLay=HMdcTBArray::getNSet(lst1+laySz-shift,lst1+11);
for(Int_t n=shift; n<laySz; n++) lst2[n] |= lst1[n-shift];
for(Int_t n=0; n<laySz; n++) lst1[n] = lst2[n];
firstCell[lay]=lst->firstCell[lay];
}
}
else for(Int_t n=0; n<laySz; n++) lst1[n] |= lst2[n];
}
return nLay;
}
Bool_t HMdcList12GroupCells::isIncluded(const HMdcList12GroupCells& lst, Int_t l1,Int_t l2) const {
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t lsh=lay*laySz;
const UChar_t* arr1=arr+lsh;
if((*arr1)==0) continue;
const UChar_t* arr2=lst.arr+lsh;
if((*arr2)==0) return kFALSE;
Int_t shift=(firstCell[lay]-lst.firstCell[lay])>>2;
if(shift<0 || shift>=laySz) return kFALSE;
const UChar_t* arr1e2=arr1+laySz;
const UChar_t* arr1e=arr1e2-shift;
arr2 += shift;
for(;arr1<arr1e;arr1++) {
if(*arr1 && *arr1 != (*arr1 & *arr2)) return kFALSE;
arr2++;
}
if(shift) for(;arr1<arr1e2;arr1++) if(*arr1) return kFALSE;
}
return kTRUE;
}
Int_t HMdcList12GroupCells::getActiveModule(void) const {
Int_t mod = 0;
for(Int_t lay=0; lay<6; lay++) {
if(arr[lay*laySz] == 0) continue;
mod |= 1;
break;
}
for(Int_t lay=6; lay<12; lay++) {
if(arr[lay*laySz] == 0) continue;
mod |= 2;
break;
}
return mod==3 ? -2 : --mod;
}
void HMdcList12GroupCells::print(void) const {
for(Int_t lay=0; lay<12; lay++) print(lay);
}
void HMdcList12GroupCells::print(Int_t lay) const {
if(getNCells(lay) == 0) return;
printf("L.%2i %2i cells:",lay+1,getNCells(lay));
Int_t cell=-1;
while((cell=next(lay,cell)) >= 0) printf(" %3i(%i)",cell+1,getTime(lay,cell));
printf("\n");
}
void HMdcList12GroupCells::copyData(const UChar_t* a,const Int_t* fc) {
memcpy(arr,a,144);
memcpy(firstCell,fc,48);
}
Int_t HMdcList24GroupCells::compare(HMdcList24GroupCells* lst,
Int_t l1, Int_t l2) const {
if(l1>=24) return 0;
setInBounds(l1,l2);
Int_t nLay=0;
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1=firstCell[lay];
Int_t c2=lst->firstCell[lay];
if( !HMdcList12GroupCells::findOverlap(c1,c2) ) continue;
if(HMdcTBArray::isIdenBits(cellAddrC(lay,c1),lst->cellAddrC(lay,c1),
(c2-c1)>>2)) nLay++;
}
return nLay;
}
Int_t HMdcList24GroupCells::getMaxNCellsPerLay(void) const {
Int_t maxNum=0;
for(Int_t lay=0;lay<24;lay++) {
Int_t nl=getNCells(lay);
if(nl>maxNum) maxNum=nl;
}
return maxNum;
}
Int_t HMdcList24GroupCells::nIdentDrTimes(HMdcList24GroupCells* lst,Int_t l1,Int_t l2) const {
if(l1>=24) return 0;
setInBounds(l1,l2);
Int_t nICells=0;
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1 = firstCell[lay];
Int_t c2 = lst->firstCell[lay];
if( HMdcList12GroupCells::findOverlap(c1,c2) ) nICells +=
HMdcTBArray::compare(cellAddrC(lay,c1),lst->cellAddrC(lay,c1),(c2-c1)>>2);
}
return nICells;
}
Int_t HMdcList24GroupCells::add(HMdcList24GroupCells* lst) {
Int_t nLay=0;
for(Int_t lay=0; lay<24; lay++) {
UChar_t *lst2=(lst->arr)+lay*laySz;
if(HMdcTBArray::getNSet(lst2,lst2+11) == 0) continue;
UChar_t *lst1=arr+lay*laySz;
if(HMdcTBArray::getNSet(lst1,lst1+11) == 0) {
for(Int_t n=0; n<laySz; n++) lst1[n] = lst2[n];
firstCell[lay]=lst->firstCell[lay];
continue;
}
Int_t sing=firstCell[lay] - lst->firstCell[lay];
if(sing != 0) {
Int_t shift=((sing<0) ? -sing:sing)>>2;
if(shift>12) shift=12;
if( sing < 0 ) {
nLay=HMdcTBArray::getNSet(lst2+laySz-shift,lst2+11);
for(Int_t n=shift; n<laySz; n++) lst1[n] |= lst2[n-shift];
} else if( sing > 0 ){
nLay=HMdcTBArray::getNSet(lst1+laySz-shift,lst1+11);
for(Int_t n=shift; n<laySz; n++) lst2[n] |= lst1[n-shift];
for(Int_t n=0; n<laySz; n++) lst1[n] = lst2[n];
firstCell[lay]=lst->firstCell[lay];
}
}
else for(Int_t n=0; n<laySz; n++) lst1[n] |= lst2[n];
}
return nLay;
}
Bool_t HMdcList24GroupCells::isIncluded(HMdcList24GroupCells& lst,
Int_t l1, Int_t l2) const {
for(Int_t lay=l1; lay<=l2; lay++) {
Int_t lsh=lay*laySz;
const UChar_t* arr1=arr+lsh;
if((*arr1)==0) continue;
const UChar_t* arr2=lst.arr+lsh;
if((*arr2)==0) return kFALSE;
Int_t shift=(firstCell[lay]-lst.firstCell[lay])>>2;
if(shift<0 || shift>=laySz) return kFALSE;
const UChar_t* arr1e2=arr1+laySz;
const UChar_t* arr1e=arr1e2-shift;
arr2 += shift;
for(;arr1<arr1e;arr1++) {
if(*arr1 && *arr1 != (*arr1 & *arr2)) return kFALSE;
arr2++;
}
if(shift) for(;arr1<arr1e2;arr1++) if(*arr1) return kFALSE;
}
return kTRUE;
}
void HMdcList24GroupCells::print(void) const {
for(Int_t lay=0; lay<24; lay++) print(lay);
}
void HMdcList24GroupCells::print(Int_t lay) const {
if(getNCells(lay) == 0) return;
printf("L.%i %i cells:",lay+1,getNCells(lay));
Int_t cell=-1;
while((cell=next(lay,cell)) >= 0) printf(" %i(%i)",cell+1,getTime(lay,cell));
printf("\n");
}
Bool_t HMdcList24GroupCells::getSeg(HMdcList12GroupCells& fSeg,Int_t seg) const {
if(&fSeg==0 || seg<0 || seg>1) return kFALSE;
fSeg.copyData(arr + 144*seg,firstCell + 12*seg);
return kTRUE;
}
Int_t HMdcList24GroupCells::compareAndUnset(const HMdcList24GroupCells* lst,
HMdcList24GroupCells* lstIdent) {
Int_t nIdDrTm = 0;
lstIdent->clear();
for(Int_t lay=0;lay<24; lay++) {
Int_t laySh = lay*laySz;
if(arr[laySh]==0 || lst->arr[laySh]==0) continue;
Int_t c1 = firstCell[lay];
Int_t c2 = lst->firstCell[lay];
if( !HMdcList12GroupCells::findOverlap(c1,c2) ) continue;
Int_t nId = HMdcBArray::andArrAndUnset(cellAddr(lay,c1),
lst->cellAddrC(lay,c1),(c2-c1)>>2,lstIdent->layAddr(lay));
if(nId > 0) {
nIdDrTm += nId;
lstIdent->firstCell[lay] = c1;
if(lstIdent->arr[laySh] == 0) lstIdent->shiftLeft(lay);
if(arr[laySh] == 0) shiftLeft(lay);
}
}
return nIdDrTm;
}
ClassImp(HMdcList12GroupCells)
ClassImp(HMdcList24GroupCells)
hmdclistgroupcells.cc:100 hmdclistgroupcells.cc:101 hmdclistgroupcells.cc:102 hmdclistgroupcells.cc:103 hmdclistgroupcells.cc:104 hmdclistgroupcells.cc:105 hmdclistgroupcells.cc:106 hmdclistgroupcells.cc:107 hmdclistgroupcells.cc:108 hmdclistgroupcells.cc:109 hmdclistgroupcells.cc:110 hmdclistgroupcells.cc:111 hmdclistgroupcells.cc:112 hmdclistgroupcells.cc:113 hmdclistgroupcells.cc:114 hmdclistgroupcells.cc:115 hmdclistgroupcells.cc:116 hmdclistgroupcells.cc:117 hmdclistgroupcells.cc:118 hmdclistgroupcells.cc:119 hmdclistgroupcells.cc:120 hmdclistgroupcells.cc:121 hmdclistgroupcells.cc:122 hmdclistgroupcells.cc:123 hmdclistgroupcells.cc:124 hmdclistgroupcells.cc:125 hmdclistgroupcells.cc:126 hmdclistgroupcells.cc:127 hmdclistgroupcells.cc:128 hmdclistgroupcells.cc:129 hmdclistgroupcells.cc:130 hmdclistgroupcells.cc:131 hmdclistgroupcells.cc:132 hmdclistgroupcells.cc:133 hmdclistgroupcells.cc:134 hmdclistgroupcells.cc:135 hmdclistgroupcells.cc:136 hmdclistgroupcells.cc:137 hmdclistgroupcells.cc:138 hmdclistgroupcells.cc:139 hmdclistgroupcells.cc:140 hmdclistgroupcells.cc:141 hmdclistgroupcells.cc:142 hmdclistgroupcells.cc:143 hmdclistgroupcells.cc:144 hmdclistgroupcells.cc:145 hmdclistgroupcells.cc:146 hmdclistgroupcells.cc:147 hmdclistgroupcells.cc:148 hmdclistgroupcells.cc:149 hmdclistgroupcells.cc:150 hmdclistgroupcells.cc:151 hmdclistgroupcells.cc:152 hmdclistgroupcells.cc:153 hmdclistgroupcells.cc:154 hmdclistgroupcells.cc:155 hmdclistgroupcells.cc:156 hmdclistgroupcells.cc:157 hmdclistgroupcells.cc:158 hmdclistgroupcells.cc:159 hmdclistgroupcells.cc:160 hmdclistgroupcells.cc:161 hmdclistgroupcells.cc:162 hmdclistgroupcells.cc:163 hmdclistgroupcells.cc:164 hmdclistgroupcells.cc:165 hmdclistgroupcells.cc:166 hmdclistgroupcells.cc:167 hmdclistgroupcells.cc:168 hmdclistgroupcells.cc:169 hmdclistgroupcells.cc:170 hmdclistgroupcells.cc:171 hmdclistgroupcells.cc:172 hmdclistgroupcells.cc:173 hmdclistgroupcells.cc:174 hmdclistgroupcells.cc:175 hmdclistgroupcells.cc:176 hmdclistgroupcells.cc:177 hmdclistgroupcells.cc:178 hmdclistgroupcells.cc:179 hmdclistgroupcells.cc:180 hmdclistgroupcells.cc:181 hmdclistgroupcells.cc:182 hmdclistgroupcells.cc:183 hmdclistgroupcells.cc:184 hmdclistgroupcells.cc:185 hmdclistgroupcells.cc:186 hmdclistgroupcells.cc:187 hmdclistgroupcells.cc:188 hmdclistgroupcells.cc:189 hmdclistgroupcells.cc:190 hmdclistgroupcells.cc:191 hmdclistgroupcells.cc:192 hmdclistgroupcells.cc:193 hmdclistgroupcells.cc:194 hmdclistgroupcells.cc:195 hmdclistgroupcells.cc:196 hmdclistgroupcells.cc:197 hmdclistgroupcells.cc:198 hmdclistgroupcells.cc:199 hmdclistgroupcells.cc:200 hmdclistgroupcells.cc:201 hmdclistgroupcells.cc:202 hmdclistgroupcells.cc:203 hmdclistgroupcells.cc:204 hmdclistgroupcells.cc:205 hmdclistgroupcells.cc:206 hmdclistgroupcells.cc:207 hmdclistgroupcells.cc:208 hmdclistgroupcells.cc:209 hmdclistgroupcells.cc:210 hmdclistgroupcells.cc:211 hmdclistgroupcells.cc:212 hmdclistgroupcells.cc:213 hmdclistgroupcells.cc:214 hmdclistgroupcells.cc:215 hmdclistgroupcells.cc:216 hmdclistgroupcells.cc:217 hmdclistgroupcells.cc:218 hmdclistgroupcells.cc:219 hmdclistgroupcells.cc:220 hmdclistgroupcells.cc:221 hmdclistgroupcells.cc:222 hmdclistgroupcells.cc:223 hmdclistgroupcells.cc:224 hmdclistgroupcells.cc:225 hmdclistgroupcells.cc:226 hmdclistgroupcells.cc:227 hmdclistgroupcells.cc:228 hmdclistgroupcells.cc:229 hmdclistgroupcells.cc:230 hmdclistgroupcells.cc:231 hmdclistgroupcells.cc:232 hmdclistgroupcells.cc:233 hmdclistgroupcells.cc:234 hmdclistgroupcells.cc:235 hmdclistgroupcells.cc:236 hmdclistgroupcells.cc:237 hmdclistgroupcells.cc:238 hmdclistgroupcells.cc:239 hmdclistgroupcells.cc:240 hmdclistgroupcells.cc:241 hmdclistgroupcells.cc:242 hmdclistgroupcells.cc:243 hmdclistgroupcells.cc:244 hmdclistgroupcells.cc:245 hmdclistgroupcells.cc:246 hmdclistgroupcells.cc:247 hmdclistgroupcells.cc:248 hmdclistgroupcells.cc:249 hmdclistgroupcells.cc:250 hmdclistgroupcells.cc:251 hmdclistgroupcells.cc:252 hmdclistgroupcells.cc:253 hmdclistgroupcells.cc:254 hmdclistgroupcells.cc:255 hmdclistgroupcells.cc:256 hmdclistgroupcells.cc:257 hmdclistgroupcells.cc:258 hmdclistgroupcells.cc:259 hmdclistgroupcells.cc:260 hmdclistgroupcells.cc:261 hmdclistgroupcells.cc:262 hmdclistgroupcells.cc:263 hmdclistgroupcells.cc:264 hmdclistgroupcells.cc:265 hmdclistgroupcells.cc:266 hmdclistgroupcells.cc:267 hmdclistgroupcells.cc:268 hmdclistgroupcells.cc:269 hmdclistgroupcells.cc:270 hmdclistgroupcells.cc:271 hmdclistgroupcells.cc:272 hmdclistgroupcells.cc:273 hmdclistgroupcells.cc:274 hmdclistgroupcells.cc:275 hmdclistgroupcells.cc:276 hmdclistgroupcells.cc:277 hmdclistgroupcells.cc:278 hmdclistgroupcells.cc:279 hmdclistgroupcells.cc:280 hmdclistgroupcells.cc:281 hmdclistgroupcells.cc:282 hmdclistgroupcells.cc:283 hmdclistgroupcells.cc:284 hmdclistgroupcells.cc:285 hmdclistgroupcells.cc:286 hmdclistgroupcells.cc:287 hmdclistgroupcells.cc:288 hmdclistgroupcells.cc:289 hmdclistgroupcells.cc:290 hmdclistgroupcells.cc:291 hmdclistgroupcells.cc:292 hmdclistgroupcells.cc:293 hmdclistgroupcells.cc:294 hmdclistgroupcells.cc:295 hmdclistgroupcells.cc:296 hmdclistgroupcells.cc:297 hmdclistgroupcells.cc:298 hmdclistgroupcells.cc:299 hmdclistgroupcells.cc:300 hmdclistgroupcells.cc:301 hmdclistgroupcells.cc:302 hmdclistgroupcells.cc:303 hmdclistgroupcells.cc:304 hmdclistgroupcells.cc:305 hmdclistgroupcells.cc:306 hmdclistgroupcells.cc:307 hmdclistgroupcells.cc:308 hmdclistgroupcells.cc:309 hmdclistgroupcells.cc:310 hmdclistgroupcells.cc:311 hmdclistgroupcells.cc:312 hmdclistgroupcells.cc:313 hmdclistgroupcells.cc:314 hmdclistgroupcells.cc:315 hmdclistgroupcells.cc:316 hmdclistgroupcells.cc:317 hmdclistgroupcells.cc:318 hmdclistgroupcells.cc:319 hmdclistgroupcells.cc:320 hmdclistgroupcells.cc:321 hmdclistgroupcells.cc:322 hmdclistgroupcells.cc:323 hmdclistgroupcells.cc:324 hmdclistgroupcells.cc:325 hmdclistgroupcells.cc:326 hmdclistgroupcells.cc:327 hmdclistgroupcells.cc:328 hmdclistgroupcells.cc:329 hmdclistgroupcells.cc:330 hmdclistgroupcells.cc:331 hmdclistgroupcells.cc:332 hmdclistgroupcells.cc:333 hmdclistgroupcells.cc:334 hmdclistgroupcells.cc:335 hmdclistgroupcells.cc:336 hmdclistgroupcells.cc:337 hmdclistgroupcells.cc:338 hmdclistgroupcells.cc:339 hmdclistgroupcells.cc:340 hmdclistgroupcells.cc:341 hmdclistgroupcells.cc:342 hmdclistgroupcells.cc:343 hmdclistgroupcells.cc:344 hmdclistgroupcells.cc:345 hmdclistgroupcells.cc:346