ROOT logo
// $Id$
//**************************************************************************
//* This file is property of and copyright by the ALICE HLT Project        *
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no>           *
//*                  for The ALICE HLT Project.                            *
//*                                                                        *
//* 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.                  *
//**************************************************************************

/**
 * @file   transformFCFtoSFC.C
 * @author Kalliopi.Kanaki@ift.uib.no
 * @date
 * @brief  Test macro for the AliHLTTPCHWClusterTransformComponent.cxx
 *
 *
 * This macro tests the component that does the tranformation from the HW
 * cluster format to the software cluster structure.
 * For the macro to work, the user needs to use the FilePublisher component
 * to make the input files available. The data specification has to be given
 * and the input files have to be present.
 *
 * In order for the reconstruction to work properly at the absence of raw/ folders,
 * a directory has to be specified as the input argument of the function
 * and an empty raw0 folder will be created if not present.
 *
 * The macro looks for a folder called FCFFiles by default, where the produced FCF files
 * should be (format TPC_ddlnumber.fcf or .bin). Argument number 2 can be set to look in a different
 * folder if wanted.
 *
 * In addition, since the $ALICE_ROOT/OCDB/GRP/GRP/Data entry has been removed as obsolete,
 * the user needs to produce 1 simulated event, in order to create a proper GRP entry in the
 * local folder, which will be used by the line
 *
 * rec.SetSpecificStorage("GRP/GRP/Data", Form("local://%s",gSystem->pwd()));
 *
 * The component runs without arguments, except for the case when we want to differentiate
 * between the FCF and the SFC output. Then the argument -change-dataId will change the
 * data Id of the FCF output.
 *
 */
void transformFCFtoSCF(const char* input="./",const char* dirName="./"){
  
  gSystem->Exec("rm galice.root");  
  
  if(!gSystem->AccessPathName("galice.root")){
    cerr << "Please delete file galice.root or run at a different place." << endl;
    return;
  }

  if (!input) {
    cerr << "please specify input or run without arguments" << endl;
    return;
  }
  
  TString inputStr;
  inputStr.Form("%s",input);
  //  if(inputStr.)

  if(inputStr.CompareTo("./") == 0){
    if(gSystem->AccessPathName("./raw0")){
      cout<<"No raw folder found, making dummy raw0 directory...."<<endl;
      gSystem->Exec("mkdir raw0");
    }
    inputStr.Form("%s/",gSystem->pwd());
  }

  if(!inputStr.EndsWith("/")){
    inputStr+="/";
  }

  TString dir;
  dir.Form("%s%s/raw0",inputStr.Data(),dirName);

  if(!dir.EndsWith("/")){
    dir+="/";
  }

  if(gSystem->AccessPathName(dir)){
    cerr << "Input directory does not exist: "<<dir.Data() << endl;
    return;
  }
  

  /////////////////////////////////////////////////////////////////////////////////////////////////
  // 
  // init the HLT system in order to define the analysis chain below
  //
  gSystem->Load("libHLTrec.so");
  AliHLTSystem *gHLT = AliHLTReconstructorBase::GetInstance();

  ///////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // define the analysis chain to be run
  //
    
  int iMinSlice =  0; 
  int iMaxSlice = 35;
  int iMinPart  =  0;
  int iMaxPart  =  5;

  TString dumpOutput;
  TString FCFInput;
  TString mergerInput;
  TString allclusters;

  for(int slice=iMinSlice; slice<=iMaxSlice; slice++){ 
      
      TString trackerInput;
      for(int part=iMinPart; part<=iMaxPart; part++){

          int ddlno=768;
          if (part>1) ddlno+=72+4*slice+(part-2);
          else ddlno+=2*slice+part;

          TString file;
          file.Form("raw0/TPC_%d.bin",ddlno);
          
	  if(gSystem->AccessPathName(file)){
      	    cerr << "Input file does not exist: "<< file.Data() << endl;
      	    continue;
          }
	  	  
          TString publisher, fcf, dumpout;
          publisher.Form("DP_%02d_%d", slice, part);
          TString argument;
          argument.Form("-datatype 'HWCLUST1' 'TPC '  -datafile %s -dataspec 0x%02x%02x%02x%02x", file.Data(), slice, slice, part, part);
        	
          AliHLTConfiguration pubconf(publisher.Data(), "FilePublisher", NULL, argument.Data());
          fcf.Form("FCF_%02d_%d", slice, part);
                        
          AliHLTConfiguration hwconf(fcf.Data(), "TPCHWClusterTransform", publisher.Data(), "");
          
	  if(trackerInput.Length()>0) trackerInput+=" ";
          trackerInput+=fcf;
	  if(allclusters.Length()>0) allclusters+=" ";
          allclusters+=fcf;
	  
          dumpout.Form("DUMP_%02d_%d", slice, part);
          
	  TString argDump, dFile;
          dFile.Form("FCF_%d.dump",ddlno);
          argDump.Form("-directory FCFClusterDump -subdir=raw -datafile %s -specfmt= -blcknofmt= -idfmt= -skip-datatype", dFile.Data());
          
	  AliHLTConfiguration clusDumpconf(dumpout.Data(), "TPCClusterDump", fcf.Data(), argDump.Data());               
         
          if(dumpOutput.Length()>0) dumpOutput+=",";
          dumpOutput+=dumpout;
      }
      
      TString tracker;
      tracker.Form("TR_%02d", slice);
      AliHLTConfiguration trackerconf(tracker.Data(), "TPCCATracker", trackerInput.Data(), "");
      
      if(mergerInput.Length()>0) mergerInput+=" ";
      mergerInput+=tracker;
  }
  
  AliHLTConfiguration mergerconf("globalmerger","TPCCAGlobalMerger",mergerInput.Data(),"");
  AliHLTConfiguration esdconf("ESD","GlobalEsdConverter","globalmerger","");
  AliHLTConfiguration sink("esdfile", "EsdCollector", "ESD", "-directory FCF-hlt-tpc-esd"); 

  TString histoInput; 
  if(histoInput.Length()>0) histoInput+=" ";
  histoInput+=allclusters;
  histoInput+=" ";
  histoInput+="globalmerger";
  
  AliHLTConfiguration histconf("histo","TPCTrackHisto",histoInput.Data(),"");
  
  AliHLTConfiguration cfcompconf("comparison","TPCCFComparison",allclusters.Data(),"");
  
  AliHLTConfiguration rfwconf("RFW","ROOTFileWriter","histo","-datafile FCF_trackhisto -overwrite -concatenate-events");

  
  ///////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // Init and run the reconstruction
  // All but HLT reconstruction is switched off

  AliReconstruction rec;
  rec.SetInput(input);
  rec.SetRunVertexFinder(kFALSE);
  rec.SetRunReconstruction("HLT");
  rec.SetRunTracking("");
  rec.SetLoadAlignFromCDB(0);
  rec.SetRunQA(":");
  rec.SetDefaultStorage("local://$ALICE_ROOT/OCDB");  
  rec.SetSpecificStorage("GRP/GRP/Data", Form("local://%s",gSystem->pwd()));
  TString option;
  option.Form("libAliHLTUtil.so libAliHLTRCU.so libAliHLTTPC.so libAliHLTGlobal.so loglevel=0x7c chains=comparison,RFW,esdfile,%s",dumpOutput.Data());
  rec.SetOption("HLT", option);
  rec.Run();


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