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: TestRecPoints.C 23207 2007-12-20 09:59:20Z ivana $ */

/// \ingroup macros
/// \file TestRecPoints.C
/// \brief This macro is to be used to check the trigger and tracking chamber behaviour
/// through the RecPoints analysis
///
/// \author D. Stocco (Torino)

#if !defined(__CINT__) || defined(__MAKECINT__)
// ROOT
#include "TString.h"
#include "TH1.h"
#include "TList.h"
#include "TFile.h"
#include "TDirectory.h"

#include "TTree.h"
#include "TClonesArray.h"

// STEER
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
#include "AliCDBManager.h"

// tracker
#include "AliGeomManager.h"

// MUON
#include "AliMpConstants.h"

// trigger
#include "AliMUONVTriggerStore.h"
#include "AliMUONDigitStoreV1.h"
#include "AliMUONDigitMaker.h"
#include "AliMUONLocalTrigger.h"

// tracker
#include "AliMUONClusterStoreV2.h"
#include "AliMUONClusterFinderMLEM.h"
#include "AliMUONPreClusterFinder.h"
#include "AliMUONSimpleClusterServer.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONVDigitStore.h"
#include "AliMUONDigitStoreV2R.h"
#include "AliMUONVCluster.h"
#include "AliMUONRecoParam.h"
#include "AliMUONCDB.h"

#endif

const Int_t kNtrigChambers = AliMpConstants::NofTriggerChambers();
const Int_t kNcathodes = AliMpConstants::NofCathodes();

const Int_t kNtrackChambers = AliMpConstants::NofTrackingChambers();

enum {kOnlyTracker, kOnlyTrigger, kTrackTrig};

Int_t GetPlane(Int_t ch, Int_t cath){return kNcathodes * ch + cath;}
void ClusterSize(TList&, AliMUONVDigit*, Int_t&, Int_t);

// Main Method
void TestRecPoints(TString baseDir=".", TString outDir=".", Float_t adcCut = 10., Int_t whatToTest=kTrackTrig, Int_t runNumber=0, TString cdbStorage="local://$ALICE_ROOT/OCDB")
{
  const Int_t kNplanes = kNtrigChambers * kNcathodes;
  const Int_t kNslats = 18;
  
  TList histoListTrig;
  
  TH1F* trigStripMult[kNplanes];
  TH1F* trigClusterSize[kNplanes];
  TH1F* trigClusterMult[kNplanes];
  TString histoName, histoTitle;
  
  if(whatToTest!=kOnlyTracker){
    for(Int_t ch=0; ch<kNtrigChambers; ch++){
      for(Int_t cath=0; cath<kNcathodes; cath++){
        Int_t iplane = GetPlane(ch, cath);
        histoName = "stripMult";
        histoName.Append(Form("Ch%iCath%i",ch,cath));
        histoTitle = Form("Strip multiplicity Ch %i Cathode %i", ch, cath);
        trigStripMult[iplane] = new TH1F(histoName.Data(), histoTitle.Data(), kNslats, 0.-0.5, (Float_t)kNslats - 0.5);
        trigStripMult[iplane]->SetXTitle("slat");
        histoListTrig.Add(trigStripMult[iplane]);
        
        histoName = "clusterSize";
        histoName.Append(Form("Ch%iCath%i",ch,cath));
        histoTitle = Form("Cluster size Ch %i Cathode %i", ch, cath);
        trigClusterSize[iplane] = new TH1F(histoName.Data(), histoTitle.Data(), 10, 0.-0.5, (Float_t)10 - 0.5);
        trigClusterSize[iplane]->SetXTitle("cluster size");
        histoListTrig.Add(trigClusterSize[iplane]);
        
        histoName = "clusterMult";
        histoName.Append(Form("Ch%iCath%i",ch,cath));
        histoTitle = Form("Cluster multiplicity Ch %i Cathode %i", ch, cath);
        trigClusterMult[iplane] = new TH1F(histoName.Data(), histoTitle.Data(), kNslats, 0.-0.5, (Float_t)kNslats - 0.5);
        trigClusterMult[iplane]->SetXTitle("slat");
        histoListTrig.Add(trigClusterMult[iplane]);
      }
    }
  }
  
  const Int_t kMaxDetElem = 26;
  TList histoListTrack;
  TH1F* trackClusterSize[kNtrackChambers];
  TH1F* trackClusterMult[kNtrackChambers];
  TH1F* trackClusterYield[kNtrackChambers];
  
  if(whatToTest!=kOnlyTrigger){
    for(Int_t ch=0; ch<kNtrackChambers; ch++){
      histoName = "clusterSize";
      histoName.Append(Form("Ch%i",ch));
      histoTitle = Form("Cluster size Ch %i", ch);
      trackClusterSize[ch] = new TH1F(histoName.Data(), histoTitle.Data(), kMaxDetElem, 0.-0.5, (Float_t)kMaxDetElem - 0.5);
      trackClusterSize[ch]->SetXTitle("cluster size");
      histoListTrack.Add(trackClusterSize[ch]);
      
      histoName = "clusterMult";
      histoName.Append(Form("Ch%i",ch));
      histoTitle = Form("Cluster multiplicity vs. Charge Ch %i", ch);
      trackClusterMult[ch] = new TH1F(histoName.Data(), histoTitle.Data(), 200, 0, 15000.);
      trackClusterMult[ch]->SetXTitle("Charge (ADC)");
      histoListTrack.Add(trackClusterMult[ch]);
      
      histoName = "clusterYield";
      histoName.Append(Form("Ch%i",ch));
      histoTitle = Form("Cluster yield vs. DetElem Ch %i", ch);
      trackClusterYield[ch] = new TH1F(histoName.Data(), histoTitle.Data(), kMaxDetElem, 0.-0.5, (Float_t)kMaxDetElem - 0.5);
      trackClusterYield[ch]->SetXTitle("Detector element #");
      histoListTrack.Add(trackClusterYield[ch]);
    }
  }
  
  
  // Creating Run Loader and opening RecPoints
  TString filename = baseDir.Data();
  filename.Append("/galice.root");
  AliRunLoader * RunLoader = AliRunLoader::Open(filename.Data(),"MUONLoader","UPDATE");
  if (RunLoader ==0x0) {
    printf(">>> Error : Error Opening %s file \n",filename.Data());
    return;
  }
  
  // Loading MUON subsystem
  AliLoader* MUONLoader = RunLoader->GetDetectorLoader("MUON");
  if(whatToTest!=kOnlyTracker)  MUONLoader->LoadRecPoints("READ");
  if(whatToTest!=kOnlyTrigger)  MUONLoader->LoadDigits("READ");
  
  TTree *treeR = 0x0, *treeD = 0x0;
  AliMUONVTriggerStore* trigStore = 0x0;
  AliMUONLocalTrigger* locTrg = 0x0;
  
  AliMUONVDigitStore* digitStoreTrack = 0x0;
  AliMUONDigitStoreV2R digitStoreTrackCut;
  AliMUONVCluster* cluster = 0x0;
  
  // Load mapping
  AliCDBManager::Instance()->SetDefaultStorage(cdbStorage.Data());
  AliCDBManager::Instance()->SetRun(runNumber);
  if (!AliMUONCDB::LoadMapping()) return;
  
  AliMUONGeometryTransformer* transformer = 0x0;
  
  AliMUONRecoParam* recoParam = 0x0;
  
  AliMUONClusterStoreV2 clusterStore;
  AliMUONVClusterFinder* clusterFinder = 0x0;
  
  AliMUONSimpleClusterServer* clusterServer = 0x0;
  
  Int_t firstChamber(0);
  Int_t lastChamber(9);
  
  if(whatToTest!=kOnlyTrigger){
    // Import TGeo geometry
    TString geoFilename = baseDir.Data();
    geoFilename.Append("/geometry.root");
    if ( ! AliGeomManager::GetGeometry() ) {
      AliGeomManager::LoadGeometry(geoFilename);
      if (! AliGeomManager::GetGeometry() ) {
        printf(">>> Error : getting geometry from file %s failed\n", geoFilename.Data());
        return;
      }
    }
    transformer = new AliMUONGeometryTransformer();
    // Load geometry data
    transformer->LoadGeometryData();
    // Load reconstruction parameters
    recoParam = AliMUONCDB::LoadRecoParam();
    if (!recoParam) return;
    recoParam->Print("FULL");
    clusterFinder = new AliMUONClusterFinderMLEM(kFALSE,new AliMUONPreClusterFinder);
    clusterServer = new AliMUONSimpleClusterServer(clusterFinder,*transformer);
  }
  
  AliMUONDigitStoreV1 digitStore;
  AliMUONVDigit* mDigit;
  
  Int_t clusterSize;
  
  AliMUONDigitMaker digitMaker;
  TList digitsList[kNplanes];
  
  Int_t nevents = RunLoader->GetNumberOfEvents();
  Int_t analysisFrac = nevents/10+1;
  
  printf("\nNumber of events = %i\n\n",nevents);
  
  for(Int_t ievent=0; ievent<nevents; ievent++){
    if(ievent%analysisFrac==0) printf("Analysing event = %i\n",ievent);
    RunLoader->GetEvent(ievent);
    if(whatToTest!=kOnlyTracker){
      digitStore.Clear();
      treeR = MUONLoader->TreeR();
      trigStore = AliMUONVTriggerStore::Create(*treeR);
      
      if ( trigStore == 0x0 ) continue;
      trigStore->Clear();
      trigStore->Connect(*treeR);
      treeR->GetEvent(0);
      
      TIter nextLocal(trigStore->CreateLocalIterator());
      while ( (locTrg = static_cast<AliMUONLocalTrigger*>( nextLocal() )) != NULL )
      {
        TArrayS xyPattern[2];
        locTrg->GetXPattern(xyPattern[0]);
        locTrg->GetYPattern(xyPattern[1]);
        
        Int_t nBoard = locTrg->LoCircuit();
        digitMaker.TriggerDigits(nBoard, xyPattern, digitStore);
      }
      
      TIter next(digitStore.CreateIterator());
      
      while ( ( mDigit = static_cast<AliMUONVDigit*>(next()) ) )
      {
        Int_t detElemId = mDigit->DetElemId();
        Int_t ch = detElemId/100 - 11;
        Int_t cathode = mDigit->Cathode();
        Int_t slat = detElemId%100;
        Int_t iplane = GetPlane(ch, cathode);
        trigStripMult[iplane]->Fill(slat);
        digitsList[iplane].Add(mDigit);
      } // loop on digits
      
      for(Int_t iplane=0; iplane<kNplanes; iplane++){
        while(digitsList[iplane].GetEntries()){
          clusterSize=1;
          mDigit = (AliMUONVDigit*)digitsList[iplane].At(0);
          digitsList[iplane].Remove(mDigit);
          ClusterSize(digitsList[iplane],mDigit,clusterSize,1);
          //if(clusterSize>1) printf("Cluster size = %i\n\n",clusterSize);
          trigClusterSize[iplane]->Fill(clusterSize);
          
          Int_t detElemId = mDigit->DetElemId();
          Int_t slat = detElemId%100;
          trigClusterMult[iplane]->Fill(slat);
        } // loop o sorted digits
      } // loop on planes
    } // trigger part
    
    if(whatToTest!=kOnlyTrigger){
      clusterStore.Clear();
      treeD = MUONLoader->TreeD();
      digitStoreTrack = AliMUONVDigitStore::Create(*treeD);
      
      if ( digitStoreTrack == 0x0 ) continue;
      digitStoreTrack->Clear();
      digitStoreTrackCut.Clear();
      digitStoreTrack->Connect(*treeD);
      treeD->GetEvent(0);
      
      // Cut low charge channels (pedestal subtraction)
      TIter nextDigitTrack(digitStoreTrack->CreateIterator());
      while ( ( mDigit = static_cast<AliMUONVDigit*>(nextDigitTrack()) ) )
      {
        //printf("Digit class = %s",mDigit->ClassName());
        Float_t charge = mDigit->Charge();
        if(charge<adcCut) continue;
        digitStoreTrackCut.Add(*mDigit, AliMUONVDigitStore::kDeny);
      } // loop on digits
      
      TIter nextDigitTrackCut(digitStoreTrackCut.CreateIterator());
      clusterServer->UseDigits(nextDigitTrackCut,&digitStoreTrackCut);
      
      for (Int_t ch = firstChamber; ch <= lastChamber; ++ch ){
        clusterServer->Clusterize(ch, clusterStore, AliMpArea(),recoParam);
      }
      
      TIter next(clusterStore.CreateIterator());
      while ( ( cluster = static_cast<AliMUONVCluster*>(next()) ) )
      {
        Float_t charge = cluster->GetCharge();
        if(charge==0.) continue;
        Int_t ch = cluster->GetChamberId();
        Int_t npads = cluster->GetNDigits();
        Int_t detElemId = cluster->GetDetElemId()%100;
        //printf("charge = %f   pads = %i   detElemId = %i\n",charge,npads,detElemId);
        
        trackClusterSize[ch]->Fill(npads);
        trackClusterMult[ch]->Fill(charge);
        trackClusterYield[ch]->Fill(detElemId);      
      } // loop on clusters
    } // tracker part
  } // loop on events
  
  MUONLoader->UnloadRecPoints();
  MUONLoader->UnloadDigits();
  RunLoader->UnloadAll();
  delete RunLoader;
  TString outFileName = outDir.Data();
  outFileName.Append("/outTestRecPoints.root");
  TFile* outFile = new TFile(outFileName.Data(), "RECREATE");
  TDirectory* dir = 0x0;
  if(whatToTest!=kOnlyTracker){
    outFile->cd();
    dir = outFile->mkdir("Trigger");
    dir->cd();
    histoListTrig.Write();
  }
  if(whatToTest!=kOnlyTrigger){
    outFile->cd();
    dir = outFile->mkdir("Tracker");
    dir->cd();
    histoListTrack.Write();
  }
  outFile->Close();
  printf("\nSee results in %s\n",outFileName.Data());
}

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