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.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Time Projection Chamber clusters objects                                //
//
//  Origin: Marian Ivanov , GSI Darmstadt
//                                                                           //
//                                                                           //
//                                                                          //
///////////////////////////////////////////////////////////////////////////////
#include "TError.h"
#include "TClass.h"
#include  <TROOT.h>
#include "AliComplexCluster.h"
#include "AliClusters.h"
#include "TMarker.h"


const Int_t kDefSize = 1;  //defalut size


ClassImp(AliClusters) 

//*****************************************************************************
//
//_____________________________________________________________________________
AliClusters::AliClusters()
            :AliSegmentID(), 
	     fClusters(0),
             fNclusters(0),
             fClass(0)
{  
  //
  //default constructor
  //

}
//________________________________________________________________________
AliClusters::AliClusters(const AliClusters &param)
            :AliSegmentID(), 
	     fClusters(0),
             fNclusters(0),
             fClass(0)
{
  //
  //  copy constructor - dummy
  //
  fNclusters = param.fNclusters;
}

//________________________________________________________________________
AliClusters::AliClusters(const char *classname)
            :AliSegmentID(),
             fClusters(0),
             fNclusters(0),
             fClass(0)
{
//
// Special constructor
//          
  fClass = gROOT->GetClass(classname);
  
  if (!fClass)
        Error("AliClusters", "%s is not a valid class name", classname);
  if (!fClass->InheritsFrom(TObject::Class())) 
	Error("AliClusters", "%s does not inherit from TObject", classname);
                                                 
  fClusters = new TClonesArray(fClass->GetName(),100);
}

//______________________________________________________________________                                                          
AliClusters & AliClusters::operator =(const AliClusters & param)
{
  //
  // assignment operator - dummy
  //
  if (this == &param) return (*this);
  fNclusters=param.fNclusters;
  return (*this);
}
//________________________________________________________________________
AliClusters::~AliClusters()
{
   //
   //default destructor
  //
   if (fClusters !=0) fClusters->Delete();
   delete fClusters;
}

//_________________________________________________________________________

Bool_t AliClusters::SetClass(const Text_t *classname)
{
  //
  //set class of stored object
  if ( fClass !=0 ) {
    //    delete fClass;
    fClass = 0;
  }
 
  if (!gROOT)
      ::Fatal("AliClusters::SetClass", "ROOT system not initialized");
   
   fClass = gROOT->GetClass(classname);
   if (!fClass) {
      Error("AliClusters", "%s is not a valid class name", classname);
      return kFALSE;
   }
   if (!fClass->InheritsFrom(TObject::Class())) {
      Error("AliClusters", "%s does not inherit from TObject", classname);
      return kFALSE; 
   } 
   return kTRUE;
}

//_____________________________________________________________________________
void AliClusters::SetArray(Int_t length)
{
  //
  // construct Clones array of object
  //
  if (fClusters!=0) delete fClusters;
  if (fClass==0){
     Error("AliClusters", "cluster type not initialised \n SetClass before!");
     return;
  }
  fClusters = new TClonesArray(fClass->GetName(),length);
}



//_____________________________________________________________________________
const  TObject* AliClusters::operator[](Int_t i)
{
  //
  // return cluster at internal position i
  //
  if (fClusters==0) return 0;
  return fClusters->UncheckedAt(i);
}
//_____________________________________________________________________________
void  AliClusters::Sort()
{
  // sort cluster 
  if (fClusters!=0) fClusters->Sort();
}

//_____________________________________________________________________________
TObject * AliClusters::InsertCluster( const TObject * c) 
{ 
  //
  // Add a simulated cluster copy to the list
  //
  if (fClass==0) { 
    Error("AliClusters", "class type not specified");
    return 0; 
  }
  if(!fClusters) fClusters=new TClonesArray(fClass->GetName(),100);
  TClonesArray &lclusters = *fClusters;
  return new(lclusters[fNclusters++]) AliComplexCluster(*((AliComplexCluster*)c));
}

//_____________________________________________________________________________
Int_t AliClusters::Find(Double_t y) const 
{
  //
  // return index of cluster nearest to given y position
  //
  AliComplexCluster* cl;
  cl=(AliComplexCluster*)fClusters->UncheckedAt(0);
  if (y <= cl->GetY()) return 0;  
  cl=(AliComplexCluster*)fClusters->UncheckedAt(fNclusters-1);
  if (y > cl->GetY()) return fNclusters; 
  Int_t b=0, e=fNclusters-1, m=(b+e)/2;
  for (; b<e; m=(b+e)/2) {
    cl = (AliComplexCluster*)fClusters->UncheckedAt(m);
    if (y > cl->GetY()) b=m+1;
    else e=m; 
  }
  return m;
}


//_____________________________________________________________________________

void AliClusters::DrawClusters(Float_t shiftx, Float_t shifty, 
				  Int_t color, Int_t size, Int_t style)
{

  if (fClusters==0) return;  
  //draw marker for each of cluster
  Int_t ncl=fClusters->GetEntriesFast();
  for (Int_t i=0;i<ncl;i++){
    AliComplexCluster *cl = (AliComplexCluster*)fClusters->UncheckedAt(i);
    TMarker * marker = new TMarker;
    marker->SetX(cl->GetX()+shiftx);
    marker->SetY(cl->GetY()+shifty);
    marker->SetMarkerSize(size);
    marker->SetMarkerStyle(style);
    marker->SetMarkerColor(color);
    marker->Draw();    
  }
}

 AliClusters.cxx:1
 AliClusters.cxx:2
 AliClusters.cxx:3
 AliClusters.cxx:4
 AliClusters.cxx:5
 AliClusters.cxx:6
 AliClusters.cxx:7
 AliClusters.cxx:8
 AliClusters.cxx:9
 AliClusters.cxx:10
 AliClusters.cxx:11
 AliClusters.cxx:12
 AliClusters.cxx:13
 AliClusters.cxx:14
 AliClusters.cxx:15
 AliClusters.cxx:16
 AliClusters.cxx:17
 AliClusters.cxx:18
 AliClusters.cxx:19
 AliClusters.cxx:20
 AliClusters.cxx:21
 AliClusters.cxx:22
 AliClusters.cxx:23
 AliClusters.cxx:24
 AliClusters.cxx:25
 AliClusters.cxx:26
 AliClusters.cxx:27
 AliClusters.cxx:28
 AliClusters.cxx:29
 AliClusters.cxx:30
 AliClusters.cxx:31
 AliClusters.cxx:32
 AliClusters.cxx:33
 AliClusters.cxx:34
 AliClusters.cxx:35
 AliClusters.cxx:36
 AliClusters.cxx:37
 AliClusters.cxx:38
 AliClusters.cxx:39
 AliClusters.cxx:40
 AliClusters.cxx:41
 AliClusters.cxx:42
 AliClusters.cxx:43
 AliClusters.cxx:44
 AliClusters.cxx:45
 AliClusters.cxx:46
 AliClusters.cxx:47
 AliClusters.cxx:48
 AliClusters.cxx:49
 AliClusters.cxx:50
 AliClusters.cxx:51
 AliClusters.cxx:52
 AliClusters.cxx:53
 AliClusters.cxx:54
 AliClusters.cxx:55
 AliClusters.cxx:56
 AliClusters.cxx:57
 AliClusters.cxx:58
 AliClusters.cxx:59
 AliClusters.cxx:60
 AliClusters.cxx:61
 AliClusters.cxx:62
 AliClusters.cxx:63
 AliClusters.cxx:64
 AliClusters.cxx:65
 AliClusters.cxx:66
 AliClusters.cxx:67
 AliClusters.cxx:68
 AliClusters.cxx:69
 AliClusters.cxx:70
 AliClusters.cxx:71
 AliClusters.cxx:72
 AliClusters.cxx:73
 AliClusters.cxx:74
 AliClusters.cxx:75
 AliClusters.cxx:76
 AliClusters.cxx:77
 AliClusters.cxx:78
 AliClusters.cxx:79
 AliClusters.cxx:80
 AliClusters.cxx:81
 AliClusters.cxx:82
 AliClusters.cxx:83
 AliClusters.cxx:84
 AliClusters.cxx:85
 AliClusters.cxx:86
 AliClusters.cxx:87
 AliClusters.cxx:88
 AliClusters.cxx:89
 AliClusters.cxx:90
 AliClusters.cxx:91
 AliClusters.cxx:92
 AliClusters.cxx:93
 AliClusters.cxx:94
 AliClusters.cxx:95
 AliClusters.cxx:96
 AliClusters.cxx:97
 AliClusters.cxx:98
 AliClusters.cxx:99
 AliClusters.cxx:100
 AliClusters.cxx:101
 AliClusters.cxx:102
 AliClusters.cxx:103
 AliClusters.cxx:104
 AliClusters.cxx:105
 AliClusters.cxx:106
 AliClusters.cxx:107
 AliClusters.cxx:108
 AliClusters.cxx:109
 AliClusters.cxx:110
 AliClusters.cxx:111
 AliClusters.cxx:112
 AliClusters.cxx:113
 AliClusters.cxx:114
 AliClusters.cxx:115
 AliClusters.cxx:116
 AliClusters.cxx:117
 AliClusters.cxx:118
 AliClusters.cxx:119
 AliClusters.cxx:120
 AliClusters.cxx:121
 AliClusters.cxx:122
 AliClusters.cxx:123
 AliClusters.cxx:124
 AliClusters.cxx:125
 AliClusters.cxx:126
 AliClusters.cxx:127
 AliClusters.cxx:128
 AliClusters.cxx:129
 AliClusters.cxx:130
 AliClusters.cxx:131
 AliClusters.cxx:132
 AliClusters.cxx:133
 AliClusters.cxx:134
 AliClusters.cxx:135
 AliClusters.cxx:136
 AliClusters.cxx:137
 AliClusters.cxx:138
 AliClusters.cxx:139
 AliClusters.cxx:140
 AliClusters.cxx:141
 AliClusters.cxx:142
 AliClusters.cxx:143
 AliClusters.cxx:144
 AliClusters.cxx:145
 AliClusters.cxx:146
 AliClusters.cxx:147
 AliClusters.cxx:148
 AliClusters.cxx:149
 AliClusters.cxx:150
 AliClusters.cxx:151
 AliClusters.cxx:152
 AliClusters.cxx:153
 AliClusters.cxx:154
 AliClusters.cxx:155
 AliClusters.cxx:156
 AliClusters.cxx:157
 AliClusters.cxx:158
 AliClusters.cxx:159
 AliClusters.cxx:160
 AliClusters.cxx:161
 AliClusters.cxx:162
 AliClusters.cxx:163
 AliClusters.cxx:164
 AliClusters.cxx:165
 AliClusters.cxx:166
 AliClusters.cxx:167
 AliClusters.cxx:168
 AliClusters.cxx:169
 AliClusters.cxx:170
 AliClusters.cxx:171
 AliClusters.cxx:172
 AliClusters.cxx:173
 AliClusters.cxx:174
 AliClusters.cxx:175
 AliClusters.cxx:176
 AliClusters.cxx:177
 AliClusters.cxx:178
 AliClusters.cxx:179
 AliClusters.cxx:180
 AliClusters.cxx:181
 AliClusters.cxx:182
 AliClusters.cxx:183
 AliClusters.cxx:184
 AliClusters.cxx:185
 AliClusters.cxx:186
 AliClusters.cxx:187
 AliClusters.cxx:188
 AliClusters.cxx:189
 AliClusters.cxx:190
 AliClusters.cxx:191
 AliClusters.cxx:192
 AliClusters.cxx:193
 AliClusters.cxx:194
 AliClusters.cxx:195
 AliClusters.cxx:196
 AliClusters.cxx:197
 AliClusters.cxx:198
 AliClusters.cxx:199
 AliClusters.cxx:200
 AliClusters.cxx:201
 AliClusters.cxx:202
 AliClusters.cxx:203
 AliClusters.cxx:204
 AliClusters.cxx:205
 AliClusters.cxx:206
 AliClusters.cxx:207
 AliClusters.cxx:208
 AliClusters.cxx:209
 AliClusters.cxx:210
 AliClusters.cxx:211
 AliClusters.cxx:212
 AliClusters.cxx:213
 AliClusters.cxx:214
 AliClusters.cxx:215
 AliClusters.cxx:216
 AliClusters.cxx:217
 AliClusters.cxx:218
 AliClusters.cxx:219
 AliClusters.cxx:220
 AliClusters.cxx:221