ROOT logo
// $Id$
/*
 * Example macro to run the HLT tracker embedded into AliRoot reconstruction.
 * The reconstruction is done from the TPC raw data. The TPCTrackHisto 
 * component fills histograms for the diagnostics of the tracking.
 *
 * Input is taken from TPC-clusters and TPC-globalmerger for the moment.
 *
 * Usage:
 * <pre>
 *
 * aliroot -b -q -l trackhisto.C'("file", "cdbURI", minEvent, maxEvent)' 
 * aliroot -b -q -l trackhisto.C'("raw://run115322", 0, 100)'
 * aliroot -b -q -l trackhisto.C'("raw.root", "local://$ALICE_ROOT/OCDB/", 0, 100)'
 * aliroot -b -q -l trackhisto.C'("raw.root", "local://$ALICE_ROOT/OCDB/", 0, 100, kTRUE)'
 * for when we want to have an output file with tracklet properties.
 * </pre>
 *
 * In the latter case an extra converter component is attached to the output
 * of CATracker and produces the exact output datatype as the global merger.
 * For this reason it cannot be run in parallel to the normal chain
 * with the merged tracks. We need to direct these special tracklet data 
 * blocks differently and run the macro with kTRUE as the last argument.
 *
 * This last argument is implemented only for debugging and QA reasons. 
 * The standard user does not need it.
 *
 * The reconstruction is steered by the AliReconstruction object in the
 * usual way.
 *
 * @ingroup alihlt_tpc
 * @author Kalliopi.Kanaki@ift.uib.no
 */

void trackhisto(const char *filename, const char *cdbURI, int minEvent=-1, int maxEvent=-1, Bool_t bTracklets=kFALSE){

  if(!gSystem->AccessPathName("galice.root")){
    cerr << "Remove galice.root or run in a different folder." << endl;
    return;
  }

  if (!filename) {
    cerr << "please specify input or run without arguments" << endl;
    return;
  }
  

  ////////////////////////////////////////////////////////////////////
  //
  // init the HLT system in order to define the analysis chain below
  //
  ////////////////////////////////////////////////////////////////////
 
  
  AliHLTSystem *gHLT = AliHLTPluginBase::GetInstance();
 
  int iMinSlice =  0;
  int iMaxSlice = 35;
  int iMinPart  =  0;
  int iMaxPart  =  5;
  
  TString tracklets;
  
  for(int slice=iMinSlice; slice<=iMaxSlice; slice++){
      
      TString trackerInput;      
      for(int part=iMinPart; part<=iMaxPart; part++){
          
	  TString arg, publisher, cf;
          
          // raw data publisher components
          int ddlno=768;
          if (part>1) ddlno+=72+4*slice+(part-2);
          else ddlno+=2*slice+part;
      
          arg.Form("-minid %d -datatype 'DDL_RAW ' 'TPC '  -dataspec 0x%02x%02x%02x%02x -verbose", ddlno, slice, slice, part, part);
          publisher.Form("DP_%02d_%d", slice, part);
          AliHLTConfiguration pubconf(publisher.Data(), "AliRawReaderPublisher", NULL , arg.Data());

          // cluster finder components
          cf.Form("CF_%02d_%d", slice, part);
          AliHLTConfiguration cfconf(cf.Data(), "TPCClusterFinder32Bit", publisher.Data(), "");
     
          if (trackerInput.Length()>0) trackerInput+=" ";
          trackerInput+=cf;     
    }
    
    TString tracker, converted_tracklet;
    // tracker components
    tracker.Form("TR_%02d", slice);
    converted_tracklet.Form("CONVTR_%02d", slice);
    AliHLTConfiguration trackerconf(tracker.Data(), "TPCCATracker", trackerInput.Data(), "");
    AliHLTConfiguration convertedconf(converted_tracklet.Data(), "TPCCATrackerOutputConverter", tracker.Data(), "");    
       
    if (tracklets.Length()>0) tracklets+=" ";
    tracklets+=converted_tracklet;
  }
   
  TString histoInput;
   
  if(bTracklets==kTRUE){
     if(histoInput.Length()>0) 
     histoInput+=" ";
     histoInput+=tracklets;
     
     AliHLTConfiguration tracklethiconf("tracklethi", "TPCTrackHisto", histoInput.Data(), "");
     AliHLTConfiguration trackletrwfconf("trackletrfw", "ROOTFileWriter", "tracklethi", "-datafile TrackletHisto -concatenate-events -overwrite");
  }
  else {
     if(histoInput.Length()>0) 
     histoInput+=" ";
     histoInput+="TPC-clusters";
     histoInput+=" ";
     histoInput+="TPC-globalmerger";
  
     AliHLTConfiguration trhiconf("trhi", "TPCTrackHisto", histoInput.Data(), "");
     AliHLTConfiguration rwfconf("rfw", "ROOTFileWriter", "trhi", "-datafile TrackHisto -concatenate-events -overwrite");
  }


  AliReconstruction rec;

  rec.SetRunQA(":");
  rec.SetInput(filename);
  
  // connect to the GRID if we use a file or OCDB from the GRID
  TString struri  = cdbURI;
  TString strfile = filename;
  if(struri.BeginsWith("raw://") ||  strfile.Contains("://") && !strfile.Contains("local://")){
     TGrid::Connect("alien");
  }
  
  AliCDBManager *man = AliCDBManager::Instance();
  man->SetDefaultStorage(cdbURI);

  if(struri.BeginsWith("local://")) {
     // set specific storage for GRP entry
     // search in the working directory and one level above, the latter
     // follows the standard simulation setup like e.g. in test/ppbench
     if(!gSystem->AccessPathName("GRP/GRP/Data")) {
       man->SetSpecificStorage("GRP/GRP/Data", "local://$PWD");
     } 
     else if (!gSystem->AccessPathName("../GRP/GRP/Data")) {
          man->SetSpecificStorage("GRP/GRP/Data", "local://$PWD/..");
     }
  }

  if(minEvent>=0 || maxEvent>minEvent){
     if(minEvent<0) minEvent=0;
     if(maxEvent<minEvent) maxEvent=minEvent;
     rec.SetEventRange(minEvent,maxEvent);
  }
 
  rec.SetRunVertexFinder(kFALSE);
  rec.SetRunReconstruction("HLT"); 
 
  if(bTracklets==kTRUE){
     rec.SetOption("HLT", "loglevel=0x7c chains=trackletrfw");
  }
  else {
     rec.SetOption("HLT", "loglevel=0x7c chains=rfw");
  }

  rec.Run();

}

void trackhisto(const char *filename, int minEvent=-1, int maxEvent=-1, Bool_t bTracklets=kFALSE){

  trackhisto(filename, "raw://", minEvent, maxEvent, bTracklets);
}

void trackhisto(){

  cout << "trackhisto: Run HLT TPC tracking and fill histograms" << endl;
  cout << " Usage: aliroot -b -q -l trackhisto.C'(\"file\", \"cdb\", minEvent, maxEvent)'" << endl;
  cout << "   OR " << endl;
  cout << " Usage: aliroot -b -q -l trackhisto.C'(\"file\", \"cdb\", minEvent, maxEvent, kTRUE)'" << endl;
  cout << " if you want to fill a separate histogram file (\TrackletHisto.root)\ with properties of the CA tracker output, no merger called" << endl;
}

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