1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
6 * Indranil Das <indra.das@saha.ac.in> *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
19 ///////////////////////////////////////////////
20 //Author : Indranil Das, SINP, INDIA
21 // Sukalyan Chattopadhyay, SINP, INDIA
23 //Email : indra.das@saha.ac.in
24 // sukalyan.chattopadhyay@saha.ac.in
26 // This class implements a hit reconstruction algorithm for the dimuon
27 // high level trigger.
28 // The algorithm finds 3 pad clusters by looking for unique pads with a charge
29 // above a certain threshold. A centre of gravity type calculation is applied
30 // to the three pads forming the cluster to find the hit's X or Y coordinate
31 // along the non-bending and bending planes individually.
32 // The sepperate X and Y coordinates are then merged to give the full coordinate
34 /////////////////////////////////////////////////
37 #include "AliHLTMUONHitReconstructor.h"
38 #include "AliHLTMUONRecHitsBlockStruct.h"
41 const int AliHLTMUONHitReconstructor::fgkDetectorId = 0xA00;
42 const int AliHLTMUONHitReconstructor::fgkDDLOffSet = 12 ;
43 const int AliHLTMUONHitReconstructor::fgkNofDDL = 8 ;
45 const int AliHLTMUONHitReconstructor::fgkDDLHeaderSize = 8;
47 const int AliHLTMUONHitReconstructor::fgkEvenLutSize = 1645632 + 1;
48 const int AliHLTMUONHitReconstructor::fgkOddLutSize = 3363840 + 1;
50 const int AliHLTMUONHitReconstructor::fgkLutLine[2] = {54208, 59648};
52 const int AliHLTMUONHitReconstructor::fgkMinIdManuChannel[2] = {917696, 64};
53 const int AliHLTMUONHitReconstructor::fgkMaxIdManuChannel[2] = {2563327, 3363903};
55 const float AliHLTMUONHitReconstructor::fgkHalfPadSize[3] = {1.25, 2.50, 5.00};
58 AliHLTMUONHitReconstructor::AliHLTMUONHitReconstructor():
61 fkBuspatchHeaderSize(4),
64 fLookUpTableData(NULL),
66 fRecPointsCount(NULL),
67 fMaxRecPointsCount(0),
73 fDetManuChannelIdList(NULL),
74 fCentralChargeB(NULL),
75 fCentralChargeNB(NULL),
87 if(AliHLTMUONHitReconstructor::fgkEvenLutSize > AliHLTMUONHitReconstructor::fgkOddLutSize){
88 fPadData = new DHLTPad[AliHLTMUONHitReconstructor::fgkEvenLutSize];
91 fPadData = new DHLTPad[AliHLTMUONHitReconstructor::fgkOddLutSize];
94 fkBlockHeaderSize = 8;
96 fkBuspatchHeaderSize = 4;
98 bzero(fGetIdTotalData,336*80*2*sizeof(int));
102 AliHLTMUONHitReconstructor::~AliHLTMUONHitReconstructor()
107 delete []fLookUpTableData;
111 int AliHLTMUONHitReconstructor::GetLutLine(int iDDL) const
113 return ( iDDL<16 ) ? fgkLutLine[0] : fgkLutLine[1] ;
117 bool AliHLTMUONHitReconstructor::LoadLookUpTable(DHLTLut* lookUpTableData, int lookUpTableId)
119 // function that loads LookUpTable (= position of each pad with electronic channel associated with it)
121 if(lookUpTableId<fgkDDLOffSet || lookUpTableId>= fgkDDLOffSet + fgkNofDDL){
122 HLTError("DDL number is out of range (must be %d<=iDDL<%d)\n",fgkDDLOffSet,fgkDDLOffSet+fgkNofDDL);
126 fDDLId = lookUpTableId;
128 int lutSize = ((lookUpTableId%2)==0) ? fgkEvenLutSize : fgkOddLutSize ;
129 int nofLutLine = GetLutLine(lookUpTableId);
130 int idOffSet = fgkMinIdManuChannel[lookUpTableId%2];
132 int detManuChannelId;
134 fLookUpTableData = new DHLTLut[lutSize];
136 fLookUpTableData[0].fIdManuChannel = 0;
137 fLookUpTableData[0].fIX = 0 ;
138 fLookUpTableData[0].fIY = 0 ;
139 fLookUpTableData[0].fRealX = 0.0 ;
140 fLookUpTableData[0].fRealY = 0.0 ;
141 fLookUpTableData[0].fRealZ = 0.0 ;
142 fLookUpTableData[0].fPlane = -1 ;
143 fLookUpTableData[0].fPcbZone = -1 ;
145 for(int i=0; i<nofLutLine; i++){
147 detManuChannelId = lookUpTableData[i].fIdManuChannel - idOffSet + 1;
148 fLookUpTableData[detManuChannelId].fIdManuChannel = lookUpTableData[i].fIdManuChannel - idOffSet;
149 fLookUpTableData[detManuChannelId].fIX = lookUpTableData[i].fIX ;
150 fLookUpTableData[detManuChannelId].fIY = lookUpTableData[i].fIY ;
151 fLookUpTableData[detManuChannelId].fRealX = lookUpTableData[i].fRealX ;
152 fLookUpTableData[detManuChannelId].fRealY = lookUpTableData[i].fRealY ;
153 fLookUpTableData[detManuChannelId].fRealZ = lookUpTableData[i].fRealZ ;
154 fLookUpTableData[detManuChannelId].fPcbZone = lookUpTableData[i].fPcbZone ;
155 fLookUpTableData[detManuChannelId].fPlane = lookUpTableData[i].fPlane ;
161 bool AliHLTMUONHitReconstructor::SetBusToDetMap(BusToDetElem busToDetElem)
164 // function that loads BusPatch To Detection Element (SlatId) map
166 if(busToDetElem.size()==0)
169 fBusToDetElem = busToDetElem;
175 bool AliHLTMUONHitReconstructor::SetBusToDDLMap(BusToDDL busToDDL)
178 // function that loads BusPatch To DDL Element (DDL) map
180 if(busToDDL.size()==0)
183 fBusToDDL = busToDDL;
189 bool AliHLTMUONHitReconstructor::Run(int* rawData, int *rawDataSize, AliHLTMUONRecHitStruct recHit[], int *nofHit)
191 // main function called by HLTReconstructor to perform DHLT Hitreconstruction
193 fRecPoints = &recHit[0];
194 fMaxRecPointsCount = *nofHit;
195 fRecPointsCount = nofHit;
196 *fRecPointsCount = 0;
198 fPadData[0].fDetElemId = 0;
199 fPadData[0].fBuspatchId = 0;
200 fPadData[0].fIdManuChannel = 0;
201 fPadData[0].fIX = 0 ;
202 fPadData[0].fIY = 0 ;
203 fPadData[0].fRealX = 0.0 ;
204 fPadData[0].fRealY = 0.0 ;
205 fPadData[0].fRealZ = 0.0 ;
206 fPadData[0].fPlane = -1 ;
207 fPadData[0].fPcbZone = -1 ;
208 fPadData[0].fCharge = 0 ;
211 if(!ReadDDL(rawData,rawDataSize)){
212 HLTError("Failed to read the complete DDL file");
217 HLTError("Failed to generate RecHits");
225 bool AliHLTMUONHitReconstructor::ReadDDL(int *rawData, int *rawDataSize)
227 //function to read Raw Data files
230 ddlRawDataSize = *rawDataSize;
232 int *buffer = rawData ;
233 //new int[ddlRawDataSize];
234 //buffer = (int *)rawData;
236 fIdOffSet= fgkMinIdManuChannel[(fDDLId%2)];
237 fDetManuChannelIdList = new int[ddlRawDataSize];
241 fNofFiredDetElem = 0;
244 int prevDetElemId = 0 ;
245 int totalBlockSize,blockRawDataSize;
246 int totalDspSize,dspRawDataSize;
247 int totalBuspatchSize,buspatchRawDataSize;
248 int indexDsp,indexBuspatch,indexRawData;
249 unsigned int dataWord;
253 for(int iBlock = 0; iBlock < 2 ;iBlock++){ // loop over 2 blocks
254 totalBlockSize = buffer[index + 1];
255 blockRawDataSize = buffer[index + 2];
256 indexDsp = index + fkBlockHeaderSize;
257 while(blockRawDataSize > 0){
258 totalDspSize = buffer[indexDsp + 1];
259 dspRawDataSize = buffer[indexDsp + 2];
260 //if(buffer[indexDsp+1] == 1)
261 dspRawDataSize --; // temporary solution to read buspatches
262 indexBuspatch = indexDsp + fkDspHeaderSize + 2; // this extra 2 word comes from the faulty defination of Dsp header size
263 while(dspRawDataSize > 0){
264 totalBuspatchSize = buffer[indexBuspatch + 1];
265 buspatchRawDataSize = buffer[indexBuspatch + 2];
266 buspatchId = buffer[indexBuspatch + 3];
267 if((detElemId = fBusToDetElem[buspatchId])==0){
268 HLTError("No Detection element found for buspatch : %d",buspatchId);
271 indexRawData = indexBuspatch + fkBuspatchHeaderSize;
272 while(buspatchRawDataSize > 0){
273 dataWord = buffer[indexRawData];
274 charge = (unsigned short)(dataWord & 0xFFF);
277 idManuChannel = (idManuChannel|(detElemId%100))<<17;
278 idManuChannel |= (dataWord >> 12) & 0x1FFFF;
279 idManuChannel -= fIdOffSet ;
281 if(charge > fDCCut && charge > 5){ // (charge > 4) is due cut out the noise level
282 fPadData[idManuChannel].fBuspatchId = buspatchId;
283 fPadData[idManuChannel].fDetElemId = detElemId;
284 fPadData[idManuChannel].fIdManuChannel = idManuChannel;
285 fPadData[idManuChannel].fIX = fLookUpTableData[idManuChannel+1].fIX;
286 fPadData[idManuChannel].fIY = fLookUpTableData[idManuChannel+1].fIY;
287 fPadData[idManuChannel].fRealX = fLookUpTableData[idManuChannel+1].fRealX;
288 fPadData[idManuChannel].fRealY = fLookUpTableData[idManuChannel+1].fRealY;
289 fPadData[idManuChannel].fRealZ = fLookUpTableData[idManuChannel+1].fRealZ;
290 fPadData[idManuChannel].fPcbZone = fLookUpTableData[idManuChannel+1].fPcbZone;
291 fPadData[idManuChannel].fPlane = fLookUpTableData[idManuChannel+1].fPlane;
292 fPadData[idManuChannel].fCharge = charge;
294 fDetManuChannelIdList[dataCount] = idManuChannel;
295 if(detElemId != prevDetElemId){
296 if(fNofFiredDetElem>0){
297 fMaxFiredPerDetElem[fNofFiredDetElem-1] = dataCount;
300 prevDetElemId = detElemId ;
303 HLTDebug("buspatch : %d, detele : %d, id : %d, manu : %d, channel : %d, X : %f, Y: %f",
304 fPadData[idManuChannel].fBuspatchId,fPadData[idManuChannel].fDetElemId,
305 idManuChannel,((dataWord >> 12) & 0x7FF),((dataWord >> 23) & 0x3F),
306 fPadData[idManuChannel].fRealX,fPadData[idManuChannel].fRealY);
313 buspatchRawDataSize --;
315 indexBuspatch += totalBuspatchSize;
316 dspRawDataSize -= totalBuspatchSize;
318 indexDsp += totalDspSize;
319 blockRawDataSize -= totalDspSize;
321 index = totalBlockSize;
326 fDigitPerDDL = dataCount;
327 fMaxFiredPerDetElem[fNofFiredDetElem-1] = dataCount;
333 bool AliHLTMUONHitReconstructor::FindRecHits()
335 // fuction that calls hit reconstruction detector element-wise
337 for(int iDet=0; iDet<fNofFiredDetElem ; iDet++){
340 fCentralCountNB = 0 ;
341 fCentralChargeB = new int[fMaxFiredPerDetElem[iDet]];
342 fCentralChargeNB = new int[fMaxFiredPerDetElem[iDet]];
345 FindCentralHits(fMaxFiredPerDetElem[iDet-1],fMaxFiredPerDetElem[iDet]);
347 FindCentralHits(0,fMaxFiredPerDetElem[iDet]);
351 HLTError("Failed to merge hits\n");
356 for(int i=0;i<fMaxFiredPerDetElem[iDet];i++)
357 fGetIdTotalData[fPadData[fDetManuChannelIdList[i]].fIX][fPadData[fDetManuChannelIdList[i]].fIY][fPadData[fDetManuChannelIdList[i]].fPlane] = 0;
359 for(int i=fMaxFiredPerDetElem[iDet-1];i<fMaxFiredPerDetElem[iDet];i++)
360 fGetIdTotalData[fPadData[fDetManuChannelIdList[i]].fIX][fPadData[fDetManuChannelIdList[i]].fIY][fPadData[fDetManuChannelIdList[i]].fPlane] = 0;
364 delete []fCentralChargeB;
365 delete []fCentralChargeNB;
369 //for(int iPad=fDataPerDetElem[i];iPad<fDataPerDetElem[i+1];iPad++){
370 for(int iPad=0;iPad<fDigitPerDDL;iPad++){
371 fGetIdTotalData[fPadData[fDetManuChannelIdList[iPad]].fIX][fPadData[fDetManuChannelIdList[iPad]].fIY][fPadData[fDetManuChannelIdList[iPad]].fPlane] = 0;
372 fPadData[fDetManuChannelIdList[iPad]].fDetElemId = 0;
373 fPadData[fDetManuChannelIdList[iPad]].fBuspatchId = 0;
374 fPadData[fDetManuChannelIdList[iPad]].fIdManuChannel = 0;
375 fPadData[fDetManuChannelIdList[iPad]].fIX = 0 ;
376 fPadData[fDetManuChannelIdList[iPad]].fIY = 0 ;
377 fPadData[fDetManuChannelIdList[iPad]].fRealX = 0.0 ;
378 fPadData[fDetManuChannelIdList[iPad]].fRealY = 0.0 ;
379 fPadData[fDetManuChannelIdList[iPad]].fRealZ = 0.0 ;
380 fPadData[fDetManuChannelIdList[iPad]].fPlane = -1 ;
381 fPadData[fDetManuChannelIdList[iPad]].fPcbZone = -1 ;
382 fPadData[fDetManuChannelIdList[iPad]].fCharge = 0 ;
385 for(int i=0;i<13;i++)
386 fMaxFiredPerDetElem[i] = 0;
387 delete []fDetManuChannelIdList;
393 void AliHLTMUONHitReconstructor::FindCentralHits(int minPadId, int maxPadId)
395 // to find central hit associated with each cluster
398 int idManuChannelCentral;
402 for(int iPad=minPadId;iPad<maxPadId;iPad++){
403 idManuChannel = fDetManuChannelIdList[iPad];
406 fGetIdTotalData[fPadData[idManuChannel].fIX]
407 [fPadData[idManuChannel].fIY]
408 [fPadData[idManuChannel].fPlane] = idManuChannel;
410 if(fPadData[idManuChannel].fPlane == 0 ){//&& fPadData[idManuChannel].fIY > (0+1) && fPadData[idManuChannel].fIY < (79 - 1)){
411 //if(fPadData[idManuChannel].fIY > 0){
412 if(fCentralCountB>0){
414 for(b = 0;b<fCentralCountB;b++){
415 idManuChannelCentral = fCentralChargeB[b];
416 if(fPadData[idManuChannel].fIX == fPadData[idManuChannelCentral].fIX
418 (fPadData[idManuChannel].fIY
419 == fPadData[idManuChannelCentral].fIY + 1
421 fPadData[idManuChannel].fIY
422 == fPadData[idManuChannelCentral].fIY + 2
424 fPadData[idManuChannel].fIY
425 == fPadData[idManuChannelCentral].fIY - 2
427 fPadData[idManuChannel].fIY
428 == fPadData[idManuChannelCentral].fIY - 1)){
431 if(fPadData[idManuChannel].fCharge > fPadData[idManuChannelCentral].fCharge){
432 fCentralChargeB[b] = idManuChannel;
433 }// if condn on pad charge
434 }// if condon on pad position
437 fCentralChargeB[fCentralCountB] = idManuChannel;
442 fCentralChargeB[fCentralCountB] = idManuChannel;
444 }// check the size of centralHitB
445 for(b = 0;b<fCentralCountB;b++){
446 idManuChannelCentral = fCentralChargeB[b];
448 //}// if cond on iY > 2 (to avoid edge value pb)
451 if(fCentralCountNB>0){
453 for(nb = 0;nb<fCentralCountNB;nb++){
454 idManuChannelCentral = fCentralChargeNB[nb];
455 if(fPadData[idManuChannel].fIY == fPadData[idManuChannelCentral].fIY
457 (fPadData[idManuChannel].fIX
458 == fPadData[idManuChannelCentral].fIX + 1
460 fPadData[idManuChannel].fIX
461 == fPadData[idManuChannelCentral].fIX + 2
463 fPadData[idManuChannel].fIX
464 == fPadData[idManuChannelCentral].fIX - 2
466 fPadData[idManuChannel].fIX
467 == fPadData[idManuChannelCentral].fIX - 1)){
470 if(fPadData[idManuChannel].fCharge > fPadData[idManuChannelCentral].fCharge){
471 fCentralChargeNB[nb] = idManuChannel;
472 }// if condn over to find higher charge
473 }// if condn over to find position
474 }// for loop over presently all nb values
476 fCentralChargeNB[fCentralCountNB] = idManuChannel;
479 }// centralHitNB size test
481 fCentralChargeNB[fCentralCountNB] = idManuChannel;
483 }// centralHitNB size test
485 }// fill for bending and nonbending hit
490 void AliHLTMUONHitReconstructor::RecXRecY()
492 // find reconstructed X and Y for each plane separately
499 fRecY = new float[fCentralCountB];
500 fRecX = new float[fCentralCountNB];
502 fAvgChargeY = new float[fCentralCountB];
503 fAvgChargeX = new float[fCentralCountNB];
505 for(b=0;b<fCentralCountB;b++){
506 idCentral = fCentralChargeB[b];
508 if(fPadData[idCentral].fIY==0)
511 idLower = fGetIdTotalData[fPadData[idCentral].fIX][fPadData[idCentral].fIY-1][0];
513 if(fPadData[idCentral].fIY==79)
516 idUpper = fGetIdTotalData[fPadData[idCentral].fIX][fPadData[idCentral].fIY+1][0];
518 fRecY[b] = (fPadData[idCentral].fRealY*fPadData[idCentral].fCharge
520 fPadData[idUpper].fRealY*fPadData[idUpper].fCharge
522 fPadData[idLower].fRealY*fPadData[idLower].fCharge
523 )/(fPadData[idCentral].fCharge + fPadData[idUpper].fCharge + fPadData[idLower].fCharge) ;
525 fAvgChargeY[b] = fPadData[idCentral].fCharge;
528 fRecY[b] += 0.025*sin(12.56637*(0.25-(fRecY[b] - fPadData[idCentral].fRealY))) ;
531 for(nb=0;nb<fCentralCountNB;nb++){
532 idCentral = fCentralChargeNB[nb];
534 if(fPadData[idCentral].fIX==0)
537 idLeft = fGetIdTotalData[fPadData[idCentral].fIX-1][fPadData[idCentral].fIY][1];
539 if(fPadData[idCentral].fIX==335)
542 idRight = fGetIdTotalData[fPadData[idCentral].fIX+1][fPadData[idCentral].fIY][1];
544 fRecX[nb] = (fPadData[idCentral].fRealX*fPadData[idCentral].fCharge
546 fPadData[idRight].fRealX*fPadData[idRight].fCharge
548 fPadData[idLeft].fRealX*fPadData[idLeft].fCharge
549 )/(fPadData[idCentral].fCharge + fPadData[idRight].fCharge + fPadData[idLeft].fCharge);
552 fAvgChargeX[nb] = fPadData[idCentral].fCharge;
558 bool AliHLTMUONHitReconstructor::MergeRecHits()
560 // Merge reconstructed hits first over same plane then bending plane with non-bending plane
562 int idCentralB,idCentralNB ;
566 float halfPadLengthX,halfPadLengthY;
568 // MERGE Bending Plane hits, which are placed side by side
569 for(int i=0;i<fCentralCountB-1;i++){
571 for(int j=i+1;j<fCentralCountB;j++){
573 if(fCentralChargeB[i]==fCentralChargeB[j]){
579 fPadData[fCentralChargeB[i]].fIY == fPadData[fCentralChargeB[j]].fIY
583 fPadData[fCentralChargeB[i]].fIX == fPadData[fCentralChargeB[j]].fIX + 1
585 fPadData[fCentralChargeB[i]].fIX == fPadData[fCentralChargeB[j]].fIX - 1
593 if(fAvgChargeY[i] > fAvgChargeY[j]){
594 fRecY[i] = (fRecY[i]*fAvgChargeY[i] + fRecY[j]*fAvgChargeY[j]
595 )/(fAvgChargeY[i] + fAvgChargeY[j]);
599 fRecY[j] = (fRecY[i]*fAvgChargeY[i] + fRecY[j]*fAvgChargeY[j]
600 )/(fAvgChargeY[i] + fAvgChargeY[j]);
603 }// search for higher charge
606 }//if fRecY[i] != 0.0
609 // MERGE Non Bending Plane hits, which are place side by side
610 for(int i=0;i<fCentralCountNB-1;i++){
612 for(int j=i+1;j<fCentralCountNB;j++){
614 if(fCentralChargeNB[i]==fCentralChargeNB[j]){
620 fPadData[fCentralChargeNB[i]].fIX == fPadData[fCentralChargeNB[j]].fIX
624 fPadData[fCentralChargeNB[i]].fIY == fPadData[fCentralChargeNB[j]].fIY + 1
626 fPadData[fCentralChargeNB[i]].fIY == fPadData[fCentralChargeNB[j]].fIY - 1
634 if(fAvgChargeX[i] > fAvgChargeX[j]){
635 fRecX[i] = (fRecX[i]*fAvgChargeX[i] + fRecX[j]*fAvgChargeX[j]
636 )/(fAvgChargeX[i] + fAvgChargeX[j]);
640 fRecX[j] = (fRecX[i]*fAvgChargeX[i] + fRecX[j]*fAvgChargeX[j]
641 )/(fAvgChargeX[i] + fAvgChargeX[j]);
643 }// search for higher charge
646 }//if fRecX[i] != 0.0
649 // Merge bending Plane hits with Non Bending
650 for(int b=0;b<fCentralCountB;b++){
652 idCentralB = fCentralChargeB[b];
653 padCenterXB = fPadData[idCentralB].fRealX;
655 halfPadLengthX = fgkHalfPadSize[fPadData[idCentralB].fPcbZone] ;
657 for(int nb=0;nb<fCentralCountNB;nb++){
659 idCentralNB = fCentralChargeNB[nb];
661 padCenterYNB = fPadData[idCentralNB].fRealY;
663 halfPadLengthY = fgkHalfPadSize[fPadData[idCentralNB].fPcbZone] ;
665 if(fabsf(fRecX[nb]) > fabsf(padCenterXB))
666 diffX = fabsf(fRecX[nb]) - fabsf(padCenterXB);
668 diffX = fabsf(padCenterXB) - fabsf(fRecX[nb]);
670 if(fabsf(padCenterYNB)>fabsf(fRecY[b]))
671 diffY = fabsf(padCenterYNB) - fabsf(fRecY[b]);
673 diffY = fabsf(fRecY[b]) - fabsf(padCenterYNB);
675 if(diffX < halfPadLengthX && diffY < halfPadLengthY ){//&& fPadData[idCentralB].fIY != 0){
677 //fRecPoints[(*fRecPointsCount)].fId = idCentralB;
678 fRecPoints[(*fRecPointsCount)].fX = fRecX[nb];
679 fRecPoints[(*fRecPointsCount)].fY = fRecY[b];
680 fRecPoints[(*fRecPointsCount)].fZ = fPadData[idCentralB].fRealZ;
681 //fRecPoints[(*fRecPointsCount)].fDetElemId = (AliHLTUInt32_t)fPadData[idCentralB].fDetElemId;
682 (*fRecPointsCount)++;
683 if((*fRecPointsCount) == fMaxRecPointsCount){
684 HLTError("Nof RecHit (i.e. %d) exceeds the max nof RecHit limit %d\n",(*fRecPointsCount),fMaxRecPointsCount);
687 }//if lies wihtin 5.0 mm
688 }// condn over fRecX ! = 0.0
689 }// loop over NB side
690 }// condn on fRecY[b] != 0.0
691 }// loop over B side;
696 delete []fAvgChargeX;
697 delete []fAvgChargeY;