ROOT logo
/****************************************************************************
 *           Very important, delicate and rather obscure macro.             *
 *                                                                          *
 *               Creates list of "trackable" tracks,                        *
 *             calculates efficiency, resolutions etc.                      *
 *     There is a possibility to run this macro over several events.         *
 *                                                                          *
 *           Origin: I.Belikov, CERN, Jouri.Belikov@cern.ch                 *
 * with several nice improvements by: M.Ivanov, GSI, m.ivanov@gsi.de        *
 ****************************************************************************/

#if defined(__CINT__) && !defined(__MAKECINT__)
{
  
  gSystem->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/TPC -I$ALICE/geant3/TGeant3 -I$ALICE_ROOT/HLT/TPCLib/HWCFemulator -I$ALICE_ROOT/HLT/TPCLib -I$ALICE_ROOT/HLT/BASE ");    
  AliHLTPluginBase::GetInstance()->LoadComponentLibraries("libAliHLTTPC.so");    
  gROOT->LoadMacro("ClusterMergerQA.C++");

  runTest("NoMerge/TPC.RecPoints.root");

}
#else

  #include <TMath.h>
  #include <TError.h>
  #include <Riostream.h>
  #include <TH1F.h>
  #include <TH2F.h>
  #include <TTree.h>
  #include <TParticle.h>
  #include <TCanvas.h>
  #include <TLine.h>
  #include <TText.h>
  #include <TStyle.h>
  #include <TFile.h>
  #include <TROOT.h>
  #include "TString.h"
  #include "AliTPCclusterMI.h"

  #include "AliStack.h"
  #include "AliHeader.h"
  #include "AliTrackReference.h"
  #include "AliRunLoader.h"
  #include "AliRun.h"
  #include "AliTPCtrack.h"
  #include "AliTracker.h"
  
  #include "AliTPC.h"
  #include "AliTPCClustersArray.h"
  #include "AliTPCClustersRow.h"
  #include "AliTPCcluster.h"
  #include "AliTPCLoader.h"
  #include "TParticlePDG.h"
  #include "TDatabasePDG.h"
  #include "AliGeomManager.h"
  #include <iostream>
  #include <string>
  #include "AliCDBManager.h"
  #include "AliHLTTPCHWClusterMerger.h"
  #include "AliHLTTPCTransform.h"

extern AliRun *gAlice;
extern TROOT *gROOT;


void myDraw(TH1F *h)
{
  Int_t minc=33; 
  if (h->GetEntries()<minc) h->Draw(); else h->Fit("gaus","Q");
}

Int_t runTest(const char *recPointsName ) 
{

  // access clusters
  
  //const Char_t* recPointsName = "NoMerge/TPC.RecPoints.root";  

 
  AliRunLoader *rl = AliRunLoader::Open("galice.root","COMPARISON");
  if (!rl) return 1;
 
  rl->LoadgAlice();
  rl->LoadHeader();

  AliCDBManager *man=AliCDBManager::Instance();
  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  //man->SetDefaultStorage("local:///lustre/alice/alien/alice/simulation/2008/v4-15-Release/Residual/");
  man->SetSpecificStorage("GRP/GRP/Data",
			  Form("local://%s",gSystem->pwd()));
  man->SetRun(0);
  //man->SetRun(137366);
  
  if(AliGeomManager::GetGeometry()==NULL){
    AliGeomManager::LoadGeometry();
  }

  AliGeomManager::ApplyAlignObjsFromCDB("TPC");
  
  //TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG, AliMagF::kBeamTypeAA, 1300.));
  TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
 
  // Check field
  if (!TGeoGlobalMagField::Instance()) {
    ::Error("","magnetic field not initialized, please set up TGeoGlobalMagField and AliMagF");
    return 1;
  }
  

  Int_t nev=rl->GetNumberOfEvents();
 
  // ******* Loop over events *********


  AliMagF *field = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();

  if(! field) {
    ::Error("","No mag. field found!!!");
    return 1;
  }

  AliHLTTPCHWClusterMerger merger;
  merger.Init();

  int statNGood=0, statNMerged=0;

  //nev = 1;
  // ********  Loop over generated events 
  for (Int_t nEv=0; nEv<nev; nEv++) {
    cout<<"Event " <<nEv<<endl;
    
    merger.Clear();
    static int nClusters =0;
    static int nAccepted = 0;

    vector<AliTPCclusterMI> vClusters;

    // Read clusters
    { 
      rl->GetEvent(nEv);
    
      TFile* file = new TFile(recPointsName, "READ");
      {
	TString str = "Event";
	str+= nEv; 
	file->cd(str.Data());
      }
      
      TTree* tRecPoints = dynamic_cast<TTree*> (gDirectory->Get("TreeR"));
      
      AliTPCClustersRow *row = new AliTPCClustersRow();
      
      tRecPoints->GetBranch("Segment")->SetAddress(&row);

      for (Int_t iRow = 0; iRow < tRecPoints->GetEntriesFast(); iRow++) {
	tRecPoints->GetEntry(iRow);             
	for (Int_t nCl = 0; nCl < row->GetArray()->GetEntriesFast(); nCl++){
	  	  
	  AliTPCclusterMI * cl = static_cast<AliTPCclusterMI*> (row->GetArray()->UncheckedAt(nCl));
	  
	  int slice=-1, padRow=-1;
	  	  
	  if( !AliHLTTPCTransform::Sector2Slice(slice, padRow, cl->GetDetector(), cl->GetRow() ) ) continue;	  
	  int patch = AliHLTTPCTransform::GetPatch(padRow);
	  padRow -=AliHLTTPCTransform::GetFirstRow(patch);

	  double yW = AliHLTTPCTransform::GetPadPitchWidth(patch);
	  double zW = AliHLTTPCTransform::GetZWidth();

	  AliHLTTPCRawCluster rawCluster;
	  rawCluster.SetPadRow(padRow);
	  rawCluster.SetPad(cl->GetPad());
	  rawCluster.SetTime(cl->GetTimeBin());

	  rawCluster.SetSigmaY2(cl->GetSigmaY2()/yW/yW);
	  rawCluster.SetSigmaZ2(cl->GetSigmaZ2()/zW/zW);
	  rawCluster.SetCharge((UShort_t)cl->GetQ()); 
	  rawCluster.SetQMax((UShort_t)cl->GetMax());
	  
	  AliHLTTPCClusterMCLabel mc;
	  int l0 = ( cl->GetLabel(0)>=0 );
	  int l1 = ( cl->GetLabel(1)>=0 );
	  int l2 = ( cl->GetLabel(2)>=0 );

	  int nmc = l0+l1+l2;
	  float w = (nmc>0) ? cl->GetQ()/nmc :0;

	  mc.fClusterID[0].fMCID = cl->GetLabel(0);  mc.fClusterID[0].fWeight=l0*w;
	  mc.fClusterID[1].fMCID = cl->GetLabel(1);  mc.fClusterID[0].fWeight=l1*w;
	  mc.fClusterID[2].fMCID = cl->GetLabel(2);  mc.fClusterID[0].fWeight=l2*w;

	  nClusters++;

	  if( !merger.CheckCandidate(slice, patch, rawCluster) ) continue;
	  
	  
	  int id = merger.AddCandidate(slice, patch, ~AliHLTUInt32_t(0), rawCluster, &mc);
	  if( id>=0 ){
	    nAccepted++;
	    vClusters.push_back(*cl);
	  }

	  //if( (id>=0) &&(merger.GetRecords()[id].GetBorder()>=0) ) nAccepted++;
	  
	}
      } // loop over clusters                    
  
      delete row;
      file->Close();  
    }


    cout<<"Merge..."<<endl;

    static int nMerged = 0;
    nMerged+=merger.Merge();

    cout<<"Read "<<nClusters<<" clusters, accepted "<<nAccepted<<" clusters "<<endl;
    cout<<"Merged "<<2*nMerged<<" clusters "
	<<" ("<<100.*2*nMerged/nAccepted<<" % of "<<nAccepted<< " accepted border clusters )"<<endl;

    for( int iB=0; iB<merger.GetNSlices()*merger.GetNBorders(); iB+=2 ){
       const AliHLTTPCHWClusterMerger::AliBorderRecord 
	 *b1 = merger.GetBorderClusters() + merger.GetBorderFirstCluster(iB),
	 *b2 = merger.GetBorderClusters() + merger.GetBorderFirstCluster(iB+1);
       int 
	 n1 = merger.GetBorderNClusters(iB),
	 n2 = merger.GetBorderNClusters(iB+1);
       if( n1<=0 || n2<=0 ) continue;

       //cout<<iB<<" "<<n1<<" "<<n2<<endl;
       //cout<<iB<<" "<<merger.GetBorderFirstCluster(iB)<<" "<<n1<<endl;
       //cout<<iB+1<<" "<<merger.GetBorderFirstCluster(iB+1)<<" "<<n2<<endl;
       /*
       cout<<"Border "<<iB<<":"<<endl;
       cout<<"  left: "<<n1<<" : ";
       for( int i=0; i<n1; i++ ){
	 const AliTPCclusterMI &c = vClusters[b1[i].fClusterRecordID];
	 cout<<" ("<<c.GetLabel(0)<<" "<<(int)c.GetTimeBin()<<") ";
       }
       cout<<endl;
       cout<<"  right: "<<n2<<" : ";
       for( int i=0; i<n2; i++ ){
	 const AliTPCclusterMI &c = vClusters[b2[i].fClusterRecordID];
	 cout<<" ("<<c.GetLabel(0)<<" "<<(int)c.GetTimeBin()<<") ";
       }
       cout<<endl;
       */

       for( int i1=0; i1<n1; i1++ ){
	 const AliTPCclusterMI &c1 = vClusters[b1[i1].fClusterRecordID];
	 int lab = c1.GetLabel(0);
	 if( lab<0 ) continue;

	 // check if the label has been already checked
	 bool b=0;
	 for( int i=0; i<i1; i++ ){
	   const AliTPCclusterMI &c = vClusters[b1[i].fClusterRecordID];
	   if( c.GetLabel(0) == lab ){
	     b = 1;
	     break;
	   }
	 }
	 if( b ) continue;

	 // check if there is a partner with the same label
	 bool isPartner = 0;
	 bool isMerged = 0;
	 for( int i2=0; i2<n2; i2++ ){
	   const AliTPCclusterMI &c2 = vClusters[b2[i2].fClusterRecordID];
	   if( c2.GetLabel(0) != lab ) continue;
	   if( fabs(c2.GetTimeBin()-c1.GetTimeBin() ) > 5 ) continue;
 
	   isPartner = 1 ;
	   // check if it has been a merged with a cluster with the same label	     
	   int id = merger.GetRecords()[b2[i2].fClusterRecordID].IsMergedTo();
	   if( id<0 ) continue;
	   const AliTPCclusterMI &c21 = vClusters[id];
	   if( c21.GetLabel(0) == lab ) isMerged = 1;	 
	 }
	 if( isPartner ) statNGood++;
	 if( isMerged ) statNMerged++;
       }
       /*
       cout<<" Merging efficiency: merged "<<statNMerged<<" of "<<statNGood<<" tracks : "
	   <<100.*statNMerged/( statNGood>0 ?statNGood :1)<<" %"<<endl;
       */ 
    }

       cout<<" Merging efficiency: merged "<<statNMerged<<" of "<<statNGood<<" tracks : "
	   <<100.*statNMerged/( statNGood>0 ?statNGood :1)<<" %"<<endl;
 
  }// ***** End of the loop over events
 
  delete rl;
  

  /*
  gStyle->SetOptStat(111110);
  gStyle->SetOptFit(1);   
  //hphidist->Draw();
  Int_t minc=33; 
  {
    TCanvas *c1=new TCanvas("c0","Offline vs HLT clusters",0,0,1500,800);  
    c1->Divide(1,3);
    c1->cd(1);
    hQ->Draw();
    c1->cd(2);
    hQ10->Draw();
    c1->cd(3);
    hQ30->Draw();
    c1->cd(0);
    c1->Update();
  }
  */  
  return 0;
}

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