ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Witold Przygoda (przygoda@psja1.if.uj.edu.pl)
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichPadLabel
//
//  Functions for labelling pad plane.
//
//////////////////////////////////////////////////////////////////////////////


#include "hrichanalysispar.h"
#include "hrichpadgraph.h"
#include "hrichpadlabel.h"

#include <iomanip>
#include <iostream>

using namespace std;

ClassImp(HRichPadLabel)


//----------------------------------------------------------------------------
HRichPadLabel::HRichPadLabel()
{
   iGraphArray = 128;
   iLabelGraphConnection.Set(iGraphArray * iGraphArray);
}
//============================================================================

//----------------------------------------------------------------------------
HRichPadLabel::HRichPadLabel(Int_t padsx, Int_t padsy)
{
   if (padsx > padsy) iGraphArray = padsx;
   else iGraphArray = padsy;
   iLabelGraphConnection.Set(iGraphArray * iGraphArray);
}
//============================================================================

//----------------------------------------------------------------------------
HRichPadLabel::~HRichPadLabel() {}
//============================================================================
/*
//----------------------------------------------------------------------------
HRichPadLabel::HRichPadLabel(const HRichPadLabel& source) {}
//============================================================================
*/
//----------------------------------------------------------------------------
HRichPadLabel& HRichPadLabel::operator=(const HRichPadLabel& source)
{
   if (this != &source) {}

   return *this;
}
//============================================================================

//----------------------------------------------------------------------------
void HRichPadLabel::Reset()
{
   iLabelGraphConnection.Reset();
}
//============================================================================

//----------------------------------------------------------------------------
Int_t HRichPadLabel::LabelPads(HRichAnalysis *showMe, Int_t padDistance)
{

   Int_t m, n, rowOffset, xNow, yNow, xPad, yPad, xMax, yMax, nMin, nMax, mMin, mMax;
   Int_t maxCols = showMe->GetPadsXNr();
   Int_t maxRows = showMe->GetPadsYNr();
   HRichPadSignal * currentPad;

   iLabelGraphConnection.Reset();

   for (yNow = 0; yNow < maxRows; ++yNow) {
      Int_t offsetNow = yNow * maxCols;
      Int_t rightBorder = showMe->pRightBorder[yNow];
      for (xNow = showMe->pLeftBorder[yNow]; xNow <= rightBorder; ++xNow) {
         currentPad = showMe->GetPad(xNow + offsetNow);
         if (currentPad->getAmplitude() > 0) {
            currentPad->setLock(1);
            currentPad->setLabel(-1); // fired pad plus area around it makes a label
            yMax = yNow + padDistance;
            xMax = xNow + padDistance;
            for (yPad = yNow - padDistance; yPad <= yMax; ++yPad) {
               Int_t offset = maxCols * yPad;

               for (xPad = xNow - padDistance; xPad <= xMax; ++xPad) {

                  if (!(xPad == xNow && yPad == yNow))
                     if (!showMe->IsOut(xPad, yPad)) {
                        showMe->GetPad(xPad + offset)->setLabel(-1); // fired pad plus area around it makes a label
                        if (showMe->GetPad(xPad + offset)->getAmplitude() > 0 &&
                            showMe->GetPad(xPad + offset)->getLock() == 0) {
                           if (yPad >= yNow) {
                              nMin = yNow;
                              nMax = yPad;
                           } else {
                              nMin = yPad;
                              nMax = yNow;
                           }
                           if (xPad >= xNow) {
                              mMin = xNow;
                              mMax = xPad;
                           } else {
                              mMin = xPad;
                              mMax = xNow;
                           }
                           for (n = nMin; n <= nMax; n++) {
                              rowOffset = maxCols * n;
                              for (m = mMin; m <= mMax; m++)
                                 showMe->GetPad(m + rowOffset)->setLabel(-1);
                           }
                        }
                     }
               }
            }
         }
      }
   }

//   cout << endl << "-----------LABEL------------" << endl;;
//   for (Int_t kk = 0; kk < 4096; kk++) {
//    if ((kk % 64) == 0) cout << endl;
//    if (showMe->GetPad(kk)->getLabel() < 0) cout << "o";
//     else cout << ".";
//   }
//   cout << endl;


   Int_t padL, padD, marker = 0;
   Int_t maxPads = showMe->GetPadNr();
   Int_t i, k;
   for (i = 0; i < maxPads; i++)
      if (showMe->GetPad(i)->getLabel() < 0) {
         xNow = i % maxCols;
         yNow = i / maxCols;
         padL = padD = 0;
         if (xNow > 0 && showMe->GetPad(i - 1)->getLabel() > 0)
            padL = showMe->GetPad(i - 1)->getLabel();
         if (yNow > 0 && showMe->GetPad(i - maxCols)->getLabel() > 0)
            padD = showMe->GetPad(i - maxCols)->getLabel();

         currentPad = showMe->GetPad(i);
         if (!padL && !padD) currentPad->setLabel(++marker);
         else {

            if (padL && padD) {

               if (padL != padD && !iLabelGraphConnection[padL-1 + iGraphArray*(padD-1)]) {
                  iLabelGraphConnection[padL-1 + iGraphArray*(padD-1)] = 1;
                  iLabelGraphConnection[padD-1 + iGraphArray*(padL-1)] = 1;
               }
               if (padL < padD) {
                  if (padL < marker) currentPad->setLabel(padL);
                  else currentPad->setLabel(marker);
               } else {
                  if (padD < marker) currentPad->setLabel(padD);
                  else currentPad->setLabel(marker);
               }
            }

            if (padL && !padD) {
               if (padL < marker) currentPad->setLabel(padL);
               else currentPad->setLabel(marker);
            }

            if (!padL && padD) {
               if (padD < marker) currentPad->setLabel(padD);
               else currentPad->setLabel(marker);
            }

         }
      }
// end of 'for' loop


//   cout << endl << "-----------LABEL------------" << endl;;
//   for (Int_t kk = 0; kk < 4096; kk++) {
//    if ((kk % 64) == 0) cout << endl;
//    if (showMe->GetPad(kk)->getLabel() < 0) cout << "o";
//     else if (showMe->GetPad(kk)->getLabel() > 0) cout << showMe->GetPad(kk)->getLabel();
//     else cout << ".";
//   }
//   cout << endl;



   HRichPadGraph *pClusterList = NULL;
   if (marker) pClusterList = new HRichPadGraph[marker]; //new in event loop
   for (i = 0; i < marker; i++) pClusterList[i].InitGraph(i + 1, marker);

   for (k = 0; k < marker; k++)
      for (m = 0; m < marker; m++)
         if (m < k && iLabelGraphConnection[m + iGraphArray*k]) {
            pClusterList[m].AddNode(pClusterList + k);
            pClusterList[k].AddNode(pClusterList + m);
         }



   k = 0;
   for (i = 0; i < marker; i++)
      if (pClusterList[i].MarkNodes(k)) k++;


   HRichLabel *pAreaData = NULL;
   if (k) pAreaData = new HRichLabel[k]; //new in event loop
   HRichLabel::iLabelNr = k;

   if (pAreaData != NULL && pClusterList != NULL) {
      Int_t label;
      for (i = 0; i < maxPads; i++) {
         label = showMe->GetPad(i)->getLabel();
         if (label > 0) {
            --label;
            m = i % maxCols;
            n = i / maxCols;
            HRichLabel & area = pAreaData[pClusterList[label].iLabel - 1];

            if (area.iLeftX >= m) area.iLeftX = m;
            if (area.iRightX <= m) area.iRightX = m;
            if (area.iLowerY >= n) area.iLowerY = n;
            if (area.iUpperY <= n) area.iUpperY = n;
            if (showMe->GetPad(i)->getAmplitude() > 0) area.iFiredPadsNr++;
            area.iLabeledPadsNr++;
            area.iSignature = pClusterList[label].iLabel;
            showMe->GetPad(i)->setLabel(pClusterList[label].iLabel);
         }
      }
   }

   if (pClusterList) {
      delete [] pClusterList;
      pClusterList = NULL;

#ifdef HRICH_DEBUGMODE0
      cout << "RICH DEBUG MODE: pointer \'pClusterList\' (type \'class "
           "HRichPadGraph\') deleted.\n";
#endif
   }

//  now grouping section - deciding if a given label may be accepted

   for (i = 0; i < k; i++)
      if (pAreaData[i].iRightX - pAreaData[i].iLeftX < padDistance ||
          pAreaData[i].iUpperY - pAreaData[i].iLowerY < padDistance)
         pAreaData[i].Reset();

   if (showMe->pLabelArea) {
      delete [] showMe->pLabelArea;
      showMe->pLabelArea = NULL;
   }
   showMe->iLabelNr = 0;
   if (HRichLabel::iLabelNr) {
      showMe->iLabelNr = HRichLabel::iLabelNr;
      showMe->pLabelArea = new HRichLabel[HRichLabel::iLabelNr];
   }


//cout << "Temporary debug: Accepted labels: " << HRichLabel::iLabelNr << endl;

   m = 0;
   for (i = 0; i < k; i++)
      if (pAreaData[i].iSignature) showMe->pLabelArea[m++] = pAreaData[i];

#ifdef HRICH_DEBUGMODE
   cout << "RICH DEBUG MODE: LabelPads divides pads into following areas:\n";
   for (i = 0; i < HRichLabel::iLabelNr; i++) {
      HRichLabel & label = showMe->pLabelArea[i];
      cout << "Label nr " << i + 1 << " (" << label.iSignature
           << ") | left = " << label.iLeftX << " | right = "
           << label.iRightX << " (dx = "
           << label.iRightX - label.iLeftX + 1 << ") | bottom = "
           << label.iLowerY << " | top = " << label.iUpperY
           << " (dy = "
           << label.iUpperY - label.iLowerY + 1 << ") | fired = "
           << label.iFiredPadsNr << "\n";
   }
#endif

   if (pAreaData) {
      delete [] pAreaData;
      pAreaData = NULL;

#ifdef HRICH_DEBUGMODE0
      cout << "RICH DEBUG MODE: pointer \'pAreaData\' (type \'class "
           "HRichLabel\') deleted.\n";
#endif
   }

   return (HRichLabel::iLabelNr);

} // eof LabelPads
//============================================================================

//----------------------------------------------------------------------------
Int_t HRichPadLabel::Execute(HRichAnalysis *giveMe)
{

   Int_t iLabelNr = 0;

   if (giveMe->iPadFiredNr - giveMe->iPadCleanedNr > 2) { //no ring otherwise
      HRichAnalysisPar *analParams = giveMe->getAnalysisPar();

      if (analParams->isActiveLabelPads)
         iLabelNr = LabelPads(giveMe, analParams->iLabeledPadsDistance);
   }
   return iLabelNr;
}
//============================================================================







 hrichpadlabel.cc:1
 hrichpadlabel.cc:2
 hrichpadlabel.cc:3
 hrichpadlabel.cc:4
 hrichpadlabel.cc:5
 hrichpadlabel.cc:6
 hrichpadlabel.cc:7
 hrichpadlabel.cc:8
 hrichpadlabel.cc:9
 hrichpadlabel.cc:10
 hrichpadlabel.cc:11
 hrichpadlabel.cc:12
 hrichpadlabel.cc:13
 hrichpadlabel.cc:14
 hrichpadlabel.cc:15
 hrichpadlabel.cc:16
 hrichpadlabel.cc:17
 hrichpadlabel.cc:18
 hrichpadlabel.cc:19
 hrichpadlabel.cc:20
 hrichpadlabel.cc:21
 hrichpadlabel.cc:22
 hrichpadlabel.cc:23
 hrichpadlabel.cc:24
 hrichpadlabel.cc:25
 hrichpadlabel.cc:26
 hrichpadlabel.cc:27
 hrichpadlabel.cc:28
 hrichpadlabel.cc:29
 hrichpadlabel.cc:30
 hrichpadlabel.cc:31
 hrichpadlabel.cc:32
 hrichpadlabel.cc:33
 hrichpadlabel.cc:34
 hrichpadlabel.cc:35
 hrichpadlabel.cc:36
 hrichpadlabel.cc:37
 hrichpadlabel.cc:38
 hrichpadlabel.cc:39
 hrichpadlabel.cc:40
 hrichpadlabel.cc:41
 hrichpadlabel.cc:42
 hrichpadlabel.cc:43
 hrichpadlabel.cc:44
 hrichpadlabel.cc:45
 hrichpadlabel.cc:46
 hrichpadlabel.cc:47
 hrichpadlabel.cc:48
 hrichpadlabel.cc:49
 hrichpadlabel.cc:50
 hrichpadlabel.cc:51
 hrichpadlabel.cc:52
 hrichpadlabel.cc:53
 hrichpadlabel.cc:54
 hrichpadlabel.cc:55
 hrichpadlabel.cc:56
 hrichpadlabel.cc:57
 hrichpadlabel.cc:58
 hrichpadlabel.cc:59
 hrichpadlabel.cc:60
 hrichpadlabel.cc:61
 hrichpadlabel.cc:62
 hrichpadlabel.cc:63
 hrichpadlabel.cc:64
 hrichpadlabel.cc:65
 hrichpadlabel.cc:66
 hrichpadlabel.cc:67
 hrichpadlabel.cc:68
 hrichpadlabel.cc:69
 hrichpadlabel.cc:70
 hrichpadlabel.cc:71
 hrichpadlabel.cc:72
 hrichpadlabel.cc:73
 hrichpadlabel.cc:74
 hrichpadlabel.cc:75
 hrichpadlabel.cc:76
 hrichpadlabel.cc:77
 hrichpadlabel.cc:78
 hrichpadlabel.cc:79
 hrichpadlabel.cc:80
 hrichpadlabel.cc:81
 hrichpadlabel.cc:82
 hrichpadlabel.cc:83
 hrichpadlabel.cc:84
 hrichpadlabel.cc:85
 hrichpadlabel.cc:86
 hrichpadlabel.cc:87
 hrichpadlabel.cc:88
 hrichpadlabel.cc:89
 hrichpadlabel.cc:90
 hrichpadlabel.cc:91
 hrichpadlabel.cc:92
 hrichpadlabel.cc:93
 hrichpadlabel.cc:94
 hrichpadlabel.cc:95
 hrichpadlabel.cc:96
 hrichpadlabel.cc:97
 hrichpadlabel.cc:98
 hrichpadlabel.cc:99
 hrichpadlabel.cc:100
 hrichpadlabel.cc:101
 hrichpadlabel.cc:102
 hrichpadlabel.cc:103
 hrichpadlabel.cc:104
 hrichpadlabel.cc:105
 hrichpadlabel.cc:106
 hrichpadlabel.cc:107
 hrichpadlabel.cc:108
 hrichpadlabel.cc:109
 hrichpadlabel.cc:110
 hrichpadlabel.cc:111
 hrichpadlabel.cc:112
 hrichpadlabel.cc:113
 hrichpadlabel.cc:114
 hrichpadlabel.cc:115
 hrichpadlabel.cc:116
 hrichpadlabel.cc:117
 hrichpadlabel.cc:118
 hrichpadlabel.cc:119
 hrichpadlabel.cc:120
 hrichpadlabel.cc:121
 hrichpadlabel.cc:122
 hrichpadlabel.cc:123
 hrichpadlabel.cc:124
 hrichpadlabel.cc:125
 hrichpadlabel.cc:126
 hrichpadlabel.cc:127
 hrichpadlabel.cc:128
 hrichpadlabel.cc:129
 hrichpadlabel.cc:130
 hrichpadlabel.cc:131
 hrichpadlabel.cc:132
 hrichpadlabel.cc:133
 hrichpadlabel.cc:134
 hrichpadlabel.cc:135
 hrichpadlabel.cc:136
 hrichpadlabel.cc:137
 hrichpadlabel.cc:138
 hrichpadlabel.cc:139
 hrichpadlabel.cc:140
 hrichpadlabel.cc:141
 hrichpadlabel.cc:142
 hrichpadlabel.cc:143
 hrichpadlabel.cc:144
 hrichpadlabel.cc:145
 hrichpadlabel.cc:146
 hrichpadlabel.cc:147
 hrichpadlabel.cc:148
 hrichpadlabel.cc:149
 hrichpadlabel.cc:150
 hrichpadlabel.cc:151
 hrichpadlabel.cc:152
 hrichpadlabel.cc:153
 hrichpadlabel.cc:154
 hrichpadlabel.cc:155
 hrichpadlabel.cc:156
 hrichpadlabel.cc:157
 hrichpadlabel.cc:158
 hrichpadlabel.cc:159
 hrichpadlabel.cc:160
 hrichpadlabel.cc:161
 hrichpadlabel.cc:162
 hrichpadlabel.cc:163
 hrichpadlabel.cc:164
 hrichpadlabel.cc:165
 hrichpadlabel.cc:166
 hrichpadlabel.cc:167
 hrichpadlabel.cc:168
 hrichpadlabel.cc:169
 hrichpadlabel.cc:170
 hrichpadlabel.cc:171
 hrichpadlabel.cc:172
 hrichpadlabel.cc:173
 hrichpadlabel.cc:174
 hrichpadlabel.cc:175
 hrichpadlabel.cc:176
 hrichpadlabel.cc:177
 hrichpadlabel.cc:178
 hrichpadlabel.cc:179
 hrichpadlabel.cc:180
 hrichpadlabel.cc:181
 hrichpadlabel.cc:182
 hrichpadlabel.cc:183
 hrichpadlabel.cc:184
 hrichpadlabel.cc:185
 hrichpadlabel.cc:186
 hrichpadlabel.cc:187
 hrichpadlabel.cc:188
 hrichpadlabel.cc:189
 hrichpadlabel.cc:190
 hrichpadlabel.cc:191
 hrichpadlabel.cc:192
 hrichpadlabel.cc:193
 hrichpadlabel.cc:194
 hrichpadlabel.cc:195
 hrichpadlabel.cc:196
 hrichpadlabel.cc:197
 hrichpadlabel.cc:198
 hrichpadlabel.cc:199
 hrichpadlabel.cc:200
 hrichpadlabel.cc:201
 hrichpadlabel.cc:202
 hrichpadlabel.cc:203
 hrichpadlabel.cc:204
 hrichpadlabel.cc:205
 hrichpadlabel.cc:206
 hrichpadlabel.cc:207
 hrichpadlabel.cc:208
 hrichpadlabel.cc:209
 hrichpadlabel.cc:210
 hrichpadlabel.cc:211
 hrichpadlabel.cc:212
 hrichpadlabel.cc:213
 hrichpadlabel.cc:214
 hrichpadlabel.cc:215
 hrichpadlabel.cc:216
 hrichpadlabel.cc:217
 hrichpadlabel.cc:218
 hrichpadlabel.cc:219
 hrichpadlabel.cc:220
 hrichpadlabel.cc:221
 hrichpadlabel.cc:222
 hrichpadlabel.cc:223
 hrichpadlabel.cc:224
 hrichpadlabel.cc:225
 hrichpadlabel.cc:226
 hrichpadlabel.cc:227
 hrichpadlabel.cc:228
 hrichpadlabel.cc:229
 hrichpadlabel.cc:230
 hrichpadlabel.cc:231
 hrichpadlabel.cc:232
 hrichpadlabel.cc:233
 hrichpadlabel.cc:234
 hrichpadlabel.cc:235
 hrichpadlabel.cc:236
 hrichpadlabel.cc:237
 hrichpadlabel.cc:238
 hrichpadlabel.cc:239
 hrichpadlabel.cc:240
 hrichpadlabel.cc:241
 hrichpadlabel.cc:242
 hrichpadlabel.cc:243
 hrichpadlabel.cc:244
 hrichpadlabel.cc:245
 hrichpadlabel.cc:246
 hrichpadlabel.cc:247
 hrichpadlabel.cc:248
 hrichpadlabel.cc:249
 hrichpadlabel.cc:250
 hrichpadlabel.cc:251
 hrichpadlabel.cc:252
 hrichpadlabel.cc:253
 hrichpadlabel.cc:254
 hrichpadlabel.cc:255
 hrichpadlabel.cc:256
 hrichpadlabel.cc:257
 hrichpadlabel.cc:258
 hrichpadlabel.cc:259
 hrichpadlabel.cc:260
 hrichpadlabel.cc:261
 hrichpadlabel.cc:262
 hrichpadlabel.cc:263
 hrichpadlabel.cc:264
 hrichpadlabel.cc:265
 hrichpadlabel.cc:266
 hrichpadlabel.cc:267
 hrichpadlabel.cc:268
 hrichpadlabel.cc:269
 hrichpadlabel.cc:270
 hrichpadlabel.cc:271
 hrichpadlabel.cc:272
 hrichpadlabel.cc:273
 hrichpadlabel.cc:274
 hrichpadlabel.cc:275
 hrichpadlabel.cc:276
 hrichpadlabel.cc:277
 hrichpadlabel.cc:278
 hrichpadlabel.cc:279
 hrichpadlabel.cc:280
 hrichpadlabel.cc:281
 hrichpadlabel.cc:282
 hrichpadlabel.cc:283
 hrichpadlabel.cc:284
 hrichpadlabel.cc:285
 hrichpadlabel.cc:286
 hrichpadlabel.cc:287
 hrichpadlabel.cc:288
 hrichpadlabel.cc:289
 hrichpadlabel.cc:290
 hrichpadlabel.cc:291
 hrichpadlabel.cc:292
 hrichpadlabel.cc:293
 hrichpadlabel.cc:294
 hrichpadlabel.cc:295
 hrichpadlabel.cc:296
 hrichpadlabel.cc:297
 hrichpadlabel.cc:298
 hrichpadlabel.cc:299
 hrichpadlabel.cc:300
 hrichpadlabel.cc:301
 hrichpadlabel.cc:302
 hrichpadlabel.cc:303
 hrichpadlabel.cc:304
 hrichpadlabel.cc:305
 hrichpadlabel.cc:306
 hrichpadlabel.cc:307
 hrichpadlabel.cc:308
 hrichpadlabel.cc:309
 hrichpadlabel.cc:310
 hrichpadlabel.cc:311
 hrichpadlabel.cc:312
 hrichpadlabel.cc:313
 hrichpadlabel.cc:314
 hrichpadlabel.cc:315
 hrichpadlabel.cc:316
 hrichpadlabel.cc:317
 hrichpadlabel.cc:318
 hrichpadlabel.cc:319
 hrichpadlabel.cc:320
 hrichpadlabel.cc:321
 hrichpadlabel.cc:322
 hrichpadlabel.cc:323
 hrichpadlabel.cc:324
 hrichpadlabel.cc:325