ROOT logo
/*
This macro creates for each pattern in the database (generated by BuildClTop.C) two histograms, for MChit-COG difference in x and z direction respectively
This histograms are filled with the data from compClusHits.C. With a gaussian fit we get mean value, sigma, chi2, NDF and update the database of patterns
with this information.
*/

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TObjArray.h"
#include "TFile.h"
#include "TTree.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TArrayI.h"
#include "TArrayF.h"
#include "TCanvas.h"
#include "TBits.h"
#include "TF1.h"
#include "../ITS/UPGRADE/AliITSUClusterPix.h"
#include "../ITS/UPGRADE/AliITSURecoLayer.h"
#include "../ITS/UPGRADE/AliITSURecoDet.h"
#include "../ITS/UPGRADE/AliITSUHit.h"
#include "../ITS/UPGRADE/AliITSUGeomTGeo.h"
#include "AliITSsegmentation.h"
#include "AliGeomManager.h"
#include "TROOT.h"
#include "TStyle.h"
#include "TCanvas.h"
#include "TPaveStats.h"

#endif

TObjArray *pattDB=0; //it is an array with all the patterns in TBits format (forom the most to the least frequent)
TVectorF* pattFR=0; //frequecy of the pattern in the database
TVectorF* xCentrePix=0; //coordinate of the centre of the pixel containing the COG for the down-left corner in fracion of the pitch
TVectorF* zCentrePix=0;
TVectorF* xCentreShift=0; //Difference between x coordinate fo COG and the centre of the pixel containing the COG, in fraction of the pitch
TVectorF* zCentreShift=0;
TVectorF* NPix=0; //Number of fired pixels
TVectorF* NRow=0; //Number of rows of the pattern
TVectorF* NCol=0; //Number of columns of the pattern

TArrayF DeltaZmean; //mean value of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TArrayF DeltaZmeanErr;
TArrayF DeltaXmean; //mean value of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TArrayF DeltaXmeanErr;
TArrayF DeltaZsigma; //sigma of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TArrayF DeltaZsigmaErr;
TArrayF DeltaXsigma; //sigma of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TArrayF DeltaXsigmaErr;
TArrayF Chi2x; //Chi2 of the gaussian fit over x
TArrayF Chi2z; //Chi2 of the aussian fut over z
TArrayI NDFx;
TArrayI NDFz;

TObjArray histoArr;

/*Int_t err1counter=0;
Int_t err2counter=0;
Int_t err3counter=0;*/

enum{kXhisto=0,kZhisto=1};

void LoadDB(const char* fname);
void CreateHistos(TObjArray* harr);
TH1* GetHistoX(Int_t pattID, TObjArray* harr);
TH1* GetHistoZ(Int_t pattID, TObjArray* harr);
void DrawReport(TObjArray* harr);
void DrawNP(int pattID, TObjArray* harr);
void UpDateDB(const char* outDBFile);

typedef struct {
  Int_t evID;
  Int_t volID;
  Int_t lrID;
  Int_t clID;
  Int_t nPix;
  Int_t nX;
  Int_t nZ;
  Int_t q;
  Float_t pt;
  Float_t eta;
  Float_t phi;
  Float_t xyz[3];
  Float_t dX;
  Float_t dY;
  Float_t dZ;  
  Bool_t split;  
  Bool_t prim;
  Int_t  pdg;
  Int_t  ntr;
  Float_t alpha; // alpha is the angle in y-radius plane in local frame
  Float_t beta;  // beta is the angle in xz plane, taken from z axis, growing counterclockwise
  Int_t nRowPatt;
  Int_t nColPatt;
  Int_t pattID;
  Float_t freq;
  Float_t xCen;
  Float_t zCen;
  Float_t zShift;
  Float_t xShift;
} clSumm;

static clSumm Summ;

Int_t nPatterns=0;

void errClus(){

	//importing data

  LoadDB("clusterTopology.root");

  nPatterns = (pattDB->GetEntriesFast());

  printf("\n\n nPatterns %d\n\n",nPatterns);

  DeltaZmean.Set(nPatterns+100);
  DeltaZmeanErr.Set(nPatterns+100);
  DeltaXmean.Set(nPatterns+100);
  DeltaXmeanErr.Set(nPatterns+100);
  DeltaZsigma.Set(nPatterns+100);
  DeltaZsigmaErr.Set(nPatterns+100);
  DeltaXsigma.Set(nPatterns+100);
  DeltaXsigmaErr.Set(nPatterns+100);
  Chi2x.Set(nPatterns+100);
  Chi2z.Set(nPatterns+100);
  NDFx.Set(nPatterns+100);
  NDFz.Set(nPatterns+100);

  TFile *input = new TFile("clInfo.root","read");
	TTree *clitsu = (TTree*) input->Get("clitsu");

	Int_t ntotCl = (Int_t) clitsu->GetEntries();
	TBranch *brdZ = clitsu->GetBranch("dZ");
 	brdZ->SetAddress(&Summ.dZ);
  TBranch *brdX = clitsu->GetBranch("dX");
  brdX->SetAddress(&Summ.dX);
  TBranch *brpattID = clitsu->GetBranch("pattID");
  brpattID->SetAddress(&Summ.pattID);

  CreateHistos(&histoArr);

  for(Int_t iCl=0; iCl<ntotCl; iCl++){
    clitsu->GetEntry(iCl);
    GetHistoX(Summ.pattID, &histoArr)->Fill(Summ.dX);
    GetHistoZ(Summ.pattID, &histoArr)->Fill(Summ.dZ);  
  }
  
  DrawReport(&histoArr);

  //printf("\n\nNDF is 0 : %d times\n\nNDF and fitstati not corresponding: %d times\n\nNDF not corresponding : %d times\n\n", err3counter,err1counter, err2counter);

  UpDateDB("clusterTopology2.root");

}

void LoadDB(const char* fname){ //load the data base built by BuildClTopDB.C

  // load database
  TFile* fl = TFile::Open(fname);
  if(!fl){printf("Could not find %s",fname); exit(1);}
  pattDB = (TObjArray*)fl->Get("TopDB");
  pattFR = (TVectorF*)fl->Get("TopFreq");
  xCentrePix =(TVectorF*)fl->Get("xCOG");
  zCentrePix =(TVectorF*)fl->Get("zCOG");
  xCentreShift =(TVectorF*)fl->Get("xShift");
  zCentreShift =(TVectorF*)fl->Get("zShift");
  NPix =(TVectorF*)fl->Get("NPix");
  NCol =(TVectorF*)fl->Get("NCol");
  NRow =(TVectorF*)fl->Get("NRow");
}

void CreateHistos(TObjArray* harr){ // creates two histograms for each pattern in the DB

  printf("\n\n Creating histograms...   ");

  Int_t histonumber=0;

  if(!harr) harr = &histoArr;

  for(Int_t i=0; i<nPatterns; i++){

    TH1* h = new TH1F(Form("hX%d", i),Form("#DeltaX for pattID %d", i),100,-30,30);
    h->SetDirectory(0);
    harr->AddAtAndExpand(h, i);
    histonumber++;
  }

  for(Int_t i=0; i<nPatterns; i++){

    TH1* h = new TH1F(Form("hZ%d", i),Form("#DeltaZ for pattID %d", i),100,-30,30);
    h->SetDirectory(0);
    harr->AddAtAndExpand(h, i+nPatterns);
    histonumber++;
  }

  printf(" %d histograms created, corresponding to %d patterns\n\n", histonumber, histonumber/2);
}

TH1* GetHistoX(Int_t pattID, TObjArray* harr){

  TH1* h=0;
  if(!harr) harr = &histoArr;

  h=(TH1*)harr->At(pattID);
  if (!h) {printf("Unknown histo id=%d\n",pattID); exit(1);}
  return h;
}

TH1* GetHistoZ(Int_t pattID, TObjArray* harr){

  Int_t zID=nPatterns+pattID;

  TH1* h=0;
  if(!harr) harr = &histoArr;
  
  h=(TH1*)harr->At(zID);
  if (!h) {printf("Unknown histo id=%d\n",zID); exit(1);}
  return h;
}

void DrawReport(TObjArray* harr) 
{
  // plot all the nPatterns cluster
  for (int i=0;i<nPatterns;i++) {
    DrawNP(i,harr);
  }
}

void DrawNP(int pattID, TObjArray* harr)
{
  static TF1* gs = new TF1("gs","gaus",-500,500);
  if (!harr) harr = &histoArr;

  printf("\n\nProcessing #DeltaX of pattern %d...",pattID);

  Int_t fitStatusX=0;

  TH1* hdx = (TH1*)harr->At(pattID);
  hdx->GetXaxis()->SetTitle("#DeltaX, #mum");
  hdx->SetTitle(Form("#DeltaX for pattID %d",pattID));
  gs->SetParameters(hdx->GetMaximum(),hdx->GetMean(),hdx->GetRMS());
  if((hdx->GetEntries())<100) fitStatusX = hdx->Fit("gs","Ql0");
  else fitStatusX = hdx->Fit("gs","Q0");

  if(fitStatusX==0){
    Double_t px1 = gs->GetParameter(1);
    DeltaXmean[pattID]=px1;
    Double_t ex1 = gs->GetParError(1);
    DeltaXmeanErr[pattID]=ex1;
    Double_t px2 = gs->GetParameter(2);
    DeltaXsigma[pattID]=px2;
    Double_t ex2 = gs->GetParError(2);
    DeltaXsigmaErr[pattID]=ex2;
    Double_t ChiSqx = gs->GetChisquare();
    Chi2x[pattID] = ChiSqx;
    Int_t varNDFx = gs->GetNDF();
    if(varNDFx>=0)
    NDFx[pattID] = varNDFx;
    else{
      /*if(varNDFx==0){
        printf("\n\nNDF = 0, Chi2 = %e for pattern %d\n\n",ChiSqx,pattID);
        err3counter++;
      }*/
    NDFx[pattID]=-1;
    }
  }
  else{
    DeltaXmean[pattID]=0;
    DeltaXmeanErr[pattID]=0;
    DeltaXsigma[pattID]=0;
    DeltaXsigmaErr[pattID]=0;
    Chi2x[pattID] = -1;   
  }

  printf("done!!\n\n");

  printf("Processing #DeltaZ of pattern %d... ",pattID);

  Int_t fitStatusZ=0;

  TH1* hdz = (TH1*)harr->At(pattID+nPatterns);
  hdz->SetTitle(Form("#DeltaZ for pattID %d",pattID));
  hdz->GetXaxis()->SetTitle("#DeltaZ, #mum");
  gs->SetParameters(hdz->GetMaximum(),hdz->GetMean(),hdz->GetRMS());
  if((hdz->GetEntries())<100) fitStatusZ = hdz->Fit("gs","Ql0");
  else fitStatusZ = hdz->Fit("gs","Q0");

  if(fitStatusZ==0){
    Double_t pz1=gs->GetParameter(1);
    DeltaZmean[pattID]=pz1;
    Double_t ez1 = gs->GetParError(1);
    DeltaZmeanErr[pattID]=ez1;
    Double_t pz2 = gs->GetParameter(2);
    DeltaZsigma[pattID]=pz2;
    Double_t ez2 = gs->GetParError(2);
    DeltaZsigmaErr[pattID]=ez2;
    Double_t ChiSqz = gs->GetChisquare();
    Chi2z[pattID]=ChiSqz;
    Int_t varNDFz = gs->GetNDF();
    if(varNDFz>=0)
    NDFz[pattID] = varNDFz;
    else
    NDFz[pattID] = -1;
  }
  else{
    DeltaZmean[pattID]=0;
    DeltaZmeanErr[pattID]=0;
    DeltaZsigma[pattID]=0;
    DeltaZsigmaErr[pattID]=0;
    Chi2z[pattID] = -1;
  }

  /*if((NDFz[pattID]!=NDFx[pattID])&&fitStatusZ!=fitStatusX){
    printf("\n\nERR: neither NDF nor FitStatus correspond!\n\n");
    err1counter++;
  }
  else if(NDFz[pattID]!=NDFx[pattID]){
    printf("\n\nERR: NDFx and NDFz donnot correspond!\n\n");
    err2counter++;
  }*/

  printf("done!!\n\n");

}

void UpDateDB(const char* outDBFile){

  printf("\n\n\nStoring data in the DataBase\n\n\n");

  TString outDBFileName = outDBFile;
  if (outDBFileName.IsNull()) outDBFileName = "clusterTopology2.root";

  TVectorF arrDeltaZmean(nPatterns);
  TVectorF arrDeltaZmeanErr(nPatterns);
  TVectorF arrDeltaXmean(nPatterns);
  TVectorF arrDeltaXmeanErr(nPatterns);
  TVectorF arrDeltaZsigma(nPatterns);
  TVectorF arrDeltaZsigmaErr(nPatterns);
  TVectorF arrDeltaXsigma(nPatterns);
  TVectorF arrDeltaXsigmaErr(nPatterns);
  TVectorF arrChi2x(nPatterns);
  TVectorF arrNDFx(nPatterns);
  TVectorF arrChi2z(nPatterns);
  TVectorF arrNDFz(nPatterns);

  for(Int_t ID=0; ID<nPatterns; ID++){

    printf("Processing pattern %d... ", ID);

    arrDeltaZmean[ID]=DeltaZmean[ID];
    arrDeltaZmeanErr[ID]=DeltaZmeanErr[ID];
    arrDeltaXmean[ID]=DeltaXmean[ID];
    arrDeltaXmeanErr[ID]=DeltaXmeanErr[ID];
    arrDeltaZsigma[ID]=DeltaZsigma[ID];
    arrDeltaZsigmaErr[ID]=DeltaZsigmaErr[ID];
    arrDeltaXsigma[ID]=DeltaXsigma[ID];
    arrDeltaXsigmaErr[ID]=DeltaXsigmaErr[ID];
    arrChi2x[ID]=Chi2x[ID];
    arrNDFx[ID]=NDFx[ID];
    arrChi2z[ID]=Chi2z[ID];
    arrNDFz[ID]=NDFz[ID];

    printf("done!!\n\n");
  }

  TFile* flDB = TFile::Open(outDBFileName.Data(), "recreate");
  flDB->WriteObject(pattDB,"TopDB","kSingleKey");
  flDB->WriteObject(NPix,"NPix","kSingleKey");
  flDB->WriteObject(NRow,"NRow","kSingleKey");
  flDB->WriteObject(NCol,"NCol","kSingleKey");
  flDB->WriteObject(pattFR, "TopFreq","kSingleKey");
  flDB->WriteObject(xCentrePix,"xCOG","kSingleKey");
  flDB->WriteObject(xCentreShift,"xShift","kSingleKey");
  flDB->WriteObject(zCentrePix,"zCOG","kSingleKey");
  flDB->WriteObject(zCentreShift,"zShift","kSingleKey");
  flDB->WriteObject(&arrDeltaZmean,"DeltaZmean","kSingleKey");
  flDB->WriteObject(&arrDeltaZmeanErr,"DeltaZmeanErr","kSingleKey");
  flDB->WriteObject(&arrDeltaXmean,"DeltaXmean","kSingleKey");
  flDB->WriteObject(&arrDeltaXmeanErr,"DeltaXmeanErr","kSingleKey");
  flDB->WriteObject(&arrDeltaZsigma,"DeltaZsigma","kSingleKey");
  flDB->WriteObject(&arrDeltaZsigmaErr,"DeltaZsigmaErr","kSingleKey");
  flDB->WriteObject(&arrDeltaXsigma,"DeltaXsigma","kSingleKey");
  flDB->WriteObject(&arrDeltaXsigmaErr,"DeltaXsigmaErr","kSingleKey");
  flDB->WriteObject(&arrChi2x,"Chi2x","kSingleKey");
  flDB->WriteObject(&arrChi2z,"Chi2z","kSingleKey");
  flDB->WriteObject(&arrNDFx,"NDFx","kSingleKey");
  flDB->WriteObject(&arrNDFz,"NDFz","kSingleKey");
  //
  flDB->Close();
  delete flDB;

  printf("\n\nDB Complete!!\n\n");
}
 errClus.C:1
 errClus.C:2
 errClus.C:3
 errClus.C:4
 errClus.C:5
 errClus.C:6
 errClus.C:7
 errClus.C:8
 errClus.C:9
 errClus.C:10
 errClus.C:11
 errClus.C:12
 errClus.C:13
 errClus.C:14
 errClus.C:15
 errClus.C:16
 errClus.C:17
 errClus.C:18
 errClus.C:19
 errClus.C:20
 errClus.C:21
 errClus.C:22
 errClus.C:23
 errClus.C:24
 errClus.C:25
 errClus.C:26
 errClus.C:27
 errClus.C:28
 errClus.C:29
 errClus.C:30
 errClus.C:31
 errClus.C:32
 errClus.C:33
 errClus.C:34
 errClus.C:35
 errClus.C:36
 errClus.C:37
 errClus.C:38
 errClus.C:39
 errClus.C:40
 errClus.C:41
 errClus.C:42
 errClus.C:43
 errClus.C:44
 errClus.C:45
 errClus.C:46
 errClus.C:47
 errClus.C:48
 errClus.C:49
 errClus.C:50
 errClus.C:51
 errClus.C:52
 errClus.C:53
 errClus.C:54
 errClus.C:55
 errClus.C:56
 errClus.C:57
 errClus.C:58
 errClus.C:59
 errClus.C:60
 errClus.C:61
 errClus.C:62
 errClus.C:63
 errClus.C:64
 errClus.C:65
 errClus.C:66
 errClus.C:67
 errClus.C:68
 errClus.C:69
 errClus.C:70
 errClus.C:71
 errClus.C:72
 errClus.C:73
 errClus.C:74
 errClus.C:75
 errClus.C:76
 errClus.C:77
 errClus.C:78
 errClus.C:79
 errClus.C:80
 errClus.C:81
 errClus.C:82
 errClus.C:83
 errClus.C:84
 errClus.C:85
 errClus.C:86
 errClus.C:87
 errClus.C:88
 errClus.C:89
 errClus.C:90
 errClus.C:91
 errClus.C:92
 errClus.C:93
 errClus.C:94
 errClus.C:95
 errClus.C:96
 errClus.C:97
 errClus.C:98
 errClus.C:99
 errClus.C:100
 errClus.C:101
 errClus.C:102
 errClus.C:103
 errClus.C:104
 errClus.C:105
 errClus.C:106
 errClus.C:107
 errClus.C:108
 errClus.C:109
 errClus.C:110
 errClus.C:111
 errClus.C:112
 errClus.C:113
 errClus.C:114
 errClus.C:115
 errClus.C:116
 errClus.C:117
 errClus.C:118
 errClus.C:119
 errClus.C:120
 errClus.C:121
 errClus.C:122
 errClus.C:123
 errClus.C:124
 errClus.C:125
 errClus.C:126
 errClus.C:127
 errClus.C:128
 errClus.C:129
 errClus.C:130
 errClus.C:131
 errClus.C:132
 errClus.C:133
 errClus.C:134
 errClus.C:135
 errClus.C:136
 errClus.C:137
 errClus.C:138
 errClus.C:139
 errClus.C:140
 errClus.C:141
 errClus.C:142
 errClus.C:143
 errClus.C:144
 errClus.C:145
 errClus.C:146
 errClus.C:147
 errClus.C:148
 errClus.C:149
 errClus.C:150
 errClus.C:151
 errClus.C:152
 errClus.C:153
 errClus.C:154
 errClus.C:155
 errClus.C:156
 errClus.C:157
 errClus.C:158
 errClus.C:159
 errClus.C:160
 errClus.C:161
 errClus.C:162
 errClus.C:163
 errClus.C:164
 errClus.C:165
 errClus.C:166
 errClus.C:167
 errClus.C:168
 errClus.C:169
 errClus.C:170
 errClus.C:171
 errClus.C:172
 errClus.C:173
 errClus.C:174
 errClus.C:175
 errClus.C:176
 errClus.C:177
 errClus.C:178
 errClus.C:179
 errClus.C:180
 errClus.C:181
 errClus.C:182
 errClus.C:183
 errClus.C:184
 errClus.C:185
 errClus.C:186
 errClus.C:187
 errClus.C:188
 errClus.C:189
 errClus.C:190
 errClus.C:191
 errClus.C:192
 errClus.C:193
 errClus.C:194
 errClus.C:195
 errClus.C:196
 errClus.C:197
 errClus.C:198
 errClus.C:199
 errClus.C:200
 errClus.C:201
 errClus.C:202
 errClus.C:203
 errClus.C:204
 errClus.C:205
 errClus.C:206
 errClus.C:207
 errClus.C:208
 errClus.C:209
 errClus.C:210
 errClus.C:211
 errClus.C:212
 errClus.C:213
 errClus.C:214
 errClus.C:215
 errClus.C:216
 errClus.C:217
 errClus.C:218
 errClus.C:219
 errClus.C:220
 errClus.C:221
 errClus.C:222
 errClus.C:223
 errClus.C:224
 errClus.C:225
 errClus.C:226
 errClus.C:227
 errClus.C:228
 errClus.C:229
 errClus.C:230
 errClus.C:231
 errClus.C:232
 errClus.C:233
 errClus.C:234
 errClus.C:235
 errClus.C:236
 errClus.C:237
 errClus.C:238
 errClus.C:239
 errClus.C:240
 errClus.C:241
 errClus.C:242
 errClus.C:243
 errClus.C:244
 errClus.C:245
 errClus.C:246
 errClus.C:247
 errClus.C:248
 errClus.C:249
 errClus.C:250
 errClus.C:251
 errClus.C:252
 errClus.C:253
 errClus.C:254
 errClus.C:255
 errClus.C:256
 errClus.C:257
 errClus.C:258
 errClus.C:259
 errClus.C:260
 errClus.C:261
 errClus.C:262
 errClus.C:263
 errClus.C:264
 errClus.C:265
 errClus.C:266
 errClus.C:267
 errClus.C:268
 errClus.C:269
 errClus.C:270
 errClus.C:271
 errClus.C:272
 errClus.C:273
 errClus.C:274
 errClus.C:275
 errClus.C:276
 errClus.C:277
 errClus.C:278
 errClus.C:279
 errClus.C:280
 errClus.C:281
 errClus.C:282
 errClus.C:283
 errClus.C:284
 errClus.C:285
 errClus.C:286
 errClus.C:287
 errClus.C:288
 errClus.C:289
 errClus.C:290
 errClus.C:291
 errClus.C:292
 errClus.C:293
 errClus.C:294
 errClus.C:295
 errClus.C:296
 errClus.C:297
 errClus.C:298
 errClus.C:299
 errClus.C:300
 errClus.C:301
 errClus.C:302
 errClus.C:303
 errClus.C:304
 errClus.C:305
 errClus.C:306
 errClus.C:307
 errClus.C:308
 errClus.C:309
 errClus.C:310
 errClus.C:311
 errClus.C:312
 errClus.C:313
 errClus.C:314
 errClus.C:315
 errClus.C:316
 errClus.C:317
 errClus.C:318
 errClus.C:319
 errClus.C:320
 errClus.C:321
 errClus.C:322
 errClus.C:323
 errClus.C:324
 errClus.C:325
 errClus.C:326
 errClus.C:327
 errClus.C:328
 errClus.C:329
 errClus.C:330
 errClus.C:331
 errClus.C:332
 errClus.C:333
 errClus.C:334
 errClus.C:335
 errClus.C:336
 errClus.C:337
 errClus.C:338
 errClus.C:339
 errClus.C:340
 errClus.C:341
 errClus.C:342
 errClus.C:343
 errClus.C:344
 errClus.C:345
 errClus.C:346
 errClus.C:347
 errClus.C:348
 errClus.C:349
 errClus.C:350
 errClus.C:351
 errClus.C:352
 errClus.C:353
 errClus.C:354
 errClus.C:355
 errClus.C:356
 errClus.C:357
 errClus.C:358
 errClus.C:359
 errClus.C:360
 errClus.C:361
 errClus.C:362
 errClus.C:363
 errClus.C:364
 errClus.C:365
 errClus.C:366
 errClus.C:367
 errClus.C:368
 errClus.C:369
 errClus.C:370
 errClus.C:371
 errClus.C:372
 errClus.C:373
 errClus.C:374
 errClus.C:375
 errClus.C:376
 errClus.C:377
 errClus.C:378
 errClus.C:379
 errClus.C:380
 errClus.C:381
 errClus.C:382
 errClus.C:383
 errClus.C:384
 errClus.C:385
 errClus.C:386
 errClus.C:387
 errClus.C:388
 errClus.C:389
 errClus.C:390
 errClus.C:391
 errClus.C:392
 errClus.C:393
 errClus.C:394
 errClus.C:395