ROOT logo
/***************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//-----------------------------------------------------//
//                                                     //
//           Date   : August 05 2003                   //
//  This reads the file PMD.digits.root(TreeD),        //
//  calls the Clustering algorithm and stores the      //
//  clustering output in PMD.RecPoints.root(TreeR)     // 
//                                                     //
//-----------------------------------------------------//

#include <Riostream.h>
#include <TMath.h>
#include <TTree.h>
#include <TObjArray.h>
#include <TClonesArray.h>
#include <TFile.h>
#include <TNtuple.h>
#include <TParticle.h>

#include "AliLog.h"
#include "AliPMDcluster.h"
#include "AliPMDclupid.h"
#include "AliPMDDiscriminator.h"

ClassImp(AliPMDDiscriminator)

AliPMDDiscriminator::AliPMDDiscriminator() :
  fDiscrim(0)
{
//
// Default Constructor
//

}
// -----------------------------------------------------------------------
AliPMDDiscriminator::~AliPMDDiscriminator()
{
  // Destructor
}

// -----------------------------------------------------------------------

void AliPMDDiscriminator::Discrimination(TObjArray *pmdcontin, TObjArray *pmdcontout)
{
  // Does Photon/Hadron discrimination

  if(fDiscrim == 0)
    {
      EmpDiscrimination(pmdcontin, pmdcontout);
    }
  else if(fDiscrim == 1)
    {
      NNDiscrimination();
    }
}
// -----------------------------------------------------------------------

void AliPMDDiscriminator::EmpDiscrimination(TObjArray *pmdcontin, TObjArray *pmdcontout)
{
  // Does Photon/Hadron discrimination
  // matching the clusters of CPV and PREshower plane
  //
  const  Int_t kumperdet = 24;
  static Int_t neibx[6]={1,0,-1,-1,0,1}, neiby[6]={0,1,1,0,-1,-1}; 
  Int_t   det = 0, smn = 0;
  Int_t   iprecount[24], icpvcount[24];
  Float_t xpos = 0., ypos = 0.;
  Float_t adc = 0., ncell = 0., rad = 0.;
  Float_t clusdata[6] = {0.,0.,0.,0.,0.,0.};

  for(Int_t i = 0; i < kumperdet; i++)
    {
      iprecount[i] = 0;
      icpvcount[i] = 0;
    }
  AliPMDcluster  *pmdcl    = 0;
  AliPMDclupid   *pmdclout = 0;

  Int_t nentries1 = pmdcontin->GetEntries();

  AliDebug(1,Form("Number of total clusters from CPV PRE = %d",nentries1));
  for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
    {
      pmdcl = (AliPMDcluster*)pmdcontin->UncheckedAt(ient1);

      det   = pmdcl->GetDetector();
      smn   = pmdcl->GetSMN();
      if(det == 0) iprecount[smn]++;
      if(det == 1) icpvcount[smn]++;
    } // Entries of TObjArray loop

  Int_t   idet = 0, ismn = 0;
  Float_t edepcpv[48][96];
  Int_t   statuscpv[48][96];

  for(Int_t i = 0; i < kumperdet; i++) // unit module
    {
      // Initialisation of the ADC of CPV (1UM)
      for (Int_t ix = 0; ix < 48;ix++)
	{
	  for (Int_t iy = 0; iy < 96;iy++)
	    {
	      edepcpv[ix][iy]   = 0.;
	      statuscpv[ix][iy] = 0;
	    }
	}
      Int_t precounter   = iprecount[i];
      Int_t cpvcounter   = icpvcount[i];

      Float_t *xpadpre   = new Float_t[precounter];
      Float_t *ypadpre   = new Float_t[precounter];
      Float_t *adcpre    = new Float_t[precounter];
      Float_t *ncellpre  = new Float_t[precounter];
      Float_t *radpre    = new Float_t[precounter];
      Int_t   *sortcoord = new Int_t[precounter];
      Int_t   *clupidpre = new Int_t[precounter];

      Float_t *xpadcpv   = new Float_t[cpvcounter];
      Float_t *ypadcpv   = new Float_t[cpvcounter];
      Float_t *adccpv    = new Float_t[cpvcounter];
      Float_t *ncellcpv  = new Float_t[cpvcounter];
      Float_t *radcpv    = new Float_t[cpvcounter];

      Int_t ii = 0;
      Int_t ij = 0;
      for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
	{
	  pmdcl = (AliPMDcluster*)pmdcontin->UncheckedAt(ient1);
	  
	  det   = pmdcl->GetDetector();
	  smn   = pmdcl->GetSMN();
	  xpos  = pmdcl->GetClusX();
	  ypos  = pmdcl->GetClusY();
	  adc   = pmdcl->GetClusADC();
	  ncell = pmdcl->GetClusCells();
	  rad   = pmdcl->GetClusRadius();
	  
	  if(det == 0 && smn == i)
	    {
	      xpadpre[ii]  = xpos;
	      ypadpre[ii]  = ypos;
	      adcpre[ii]   = adc;
	      ncellpre[ii] = ncell;
	      radpre[ii]   = rad;
	      ii++;
	    }
	  if(det == 1 && smn == i)
	    {
	      Int_t ix = (Int_t) (xpos+0.5);
	      Int_t iy = (Int_t) (ypos+0.5);
	      if(ix > 47) ix = 47;
	      if(iy > 95) iy = 95;
	      edepcpv[ix][iy] = adc;
	      xpadcpv[ij]  = xpos;
	      ypadcpv[ij]  = ypos;
	      adccpv[ij]   = adc;
	      ncellcpv[ij] = ncell;
	      radcpv[ij]   = rad;
	      ij++;
	    }
	} // Entries of TObjArray loop
      // sorts from lowest ADC to highest ADC
      // and returns the coordinates
      Bool_t jsort = false;
      TMath::Sort(precounter,adcpre,sortcoord,jsort);

      Int_t jjsort = 0;
      for(Int_t jj=0; jj<precounter; jj++)
	{
	  // PRE information
	  // PIDs for PRE clusters are 0(photon) and 1(hadron)

	  jjsort = sortcoord[jj];

	  Int_t ix = (Int_t) (xpadpre[jjsort]+0.5);
	  Int_t iy = (Int_t) (ypadpre[jjsort]+0.5);
	  if(ix > 47) ix = 47;
	  if(iy > 95) iy = 95;

	  for(Int_t jk=0; jk<6; jk++)
	    {
	      Int_t jd1 = ix + neibx[jk]; 
	      Int_t jd2 = iy + neiby[jk];
	      if(jd1 <0 ) jd1 = 0;
	      if(jd1 >47) jd1 = 47;
	      if(jd2 <0 ) jd2 = 0;
	      if(jd2 >47) jd2 = 47;
	      if(edepcpv[jd1][jd2] > 0.0 && statuscpv[jd1][jd2] == 0)
		{
		  statuscpv[jd1][jd2] = 1;
		  clupidpre[jjsort]   = 1;
		  break;
		}
	    }

	  idet        = 0;
	  ismn        = i;
	  clusdata[0] = xpadpre[jjsort];
	  clusdata[1] = ypadpre[jjsort];
	  clusdata[2] = adcpre[jjsort];
	  clusdata[3] = ncellpre[jjsort];
	  clusdata[4] = radpre[jjsort];
	  //PH	  clusdata[5] = (Float_t) clupidpre[jjsort];

	  // Temporary the cluster PID is set to 1 if the
	  // adc > 3MIP units which will be changed later on.

	  if (adcpre[jjsort] > 4500.)
	    {
	      clusdata[5] = 1.0;
	    }
	  else
	    {
	      clusdata[5] = 0.0;
	    }
	  pmdclout = new AliPMDclupid(idet,ismn,clusdata);
	  pmdcontout->Add(pmdclout);
	} // jj loop

      for(Int_t jj=0; jj<cpvcounter; jj++)
	{
	  // CPV information
	  // PID for CPV clusters is 1

	  idet        = 1;
	  ismn        = i;
	  clusdata[0] = xpadcpv[jj];
	  clusdata[1] = ypadcpv[jj];
	  clusdata[2] = adccpv[jj];
	  clusdata[3] = ncellcpv[jj];
	  clusdata[4] = radcpv[jj];
	  clusdata[5] = 0.;

	  pmdclout = new AliPMDclupid(idet,ismn,clusdata);
	  pmdcontout->Add(pmdclout);
	}

      // delete all the pointers
      delete [] xpadpre;
      delete [] ypadpre;
      delete [] adcpre;
      delete [] ncellpre;
      delete [] radpre;
      delete [] clupidpre;
      delete [] xpadcpv;
      delete [] ypadcpv;
      delete [] adccpv;
      delete [] ncellcpv;
      delete [] radcpv;
    } // i loop

}
// -----------------------------------------------------------------------
void AliPMDDiscriminator::NNDiscrimination()
{
  // This method does discrimination using Neural Network technique

}
// -----------------------------------------------------------------------
void AliPMDDiscriminator::SetDiscrimination(Int_t idiscrim)
{
  fDiscrim = idiscrim;
}
// -----------------------------------------------------------------------

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