]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/macros/sim-hlt-tpc.C
After playing, Andrew needs to cleanup :-)
[u/mrichter/AliRoot.git] / HLT / TPCLib / macros / sim-hlt-tpc.C
index ecfd711e67352e2df44f90c905e69c74b243bd08..709e1459be548d643f4207ca70fdf29be3180a37 100644 (file)
 // $Id$
 /*
+ * @file sim-hlt-tpc.C
+ * @brief HLT Conformal mapping tracker embedded into AliRoot simulation.
+ *
  * Example macro to run the HLT Conformal mapping tracker embedded into
  * AliRoot simulation. The reconstruction is done from the TPC digits.
  *
- * aliroot -b -q sim-hlt-tpc.C | tee sim-hlt-tpc.log
+ * Usage: aliroot -b -q sim-hlt-tpc.C | tee sim-hlt-tpc.log
+ *
+ * The chain to be run is defined within the macro. The input data is
+ * read from the TPC.Digits.
  *
- * The chain to be run is defined by the macro given to the parameter
- * 'config='
+ * The following options can be specified comma separated in a string:
+ * <pre>
+ *   aliroot -b -q sim-hlt-tpc.C'("options")'
+ *       CA      use the cellular automaton  tracker and track merger
+ *       CM      use the conformal mapping tracker and track merger
+ *       SORTED  use CF pre-sorting and corresponding sequential CF
+ *               algorithm, by default the algorithm capable of reading
+ *               unsorted data is used
+ *       RAW     write raw data for all detectors
+ *       RAWHLT  write raw data only for HLT
+ *       MC      propagate the MC information
+ * </pre>
  *
- * Matthias.Richter@ift.uib.no
+ * The macro asumes the data to be already simulated. If it should run
+ * within the initial simulation, comment the corresponding functions
+ * below (SetRunGeneration etc.)
+ *
+ * @author Matthias.Richter@ift.uib.no
+ * @ingroup alihlt_tpc
  */
+sim_hlt_tpc(const char* options="CA")
 {
   // this is just a tool to switch the logging systems
   AliHLTLogging log;
   //log.SwitchAliLog(0);
 
-  AliSimulation sim;
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // scanning the options
+  //
+  bool bUseCA=true;   // use the CA tracker and merger
+  bool bCFSort=false; // CF pre-sorting and sequential CF algorithm
+  bool bRawData=false;// raw data for all detectors
+  bool bRawHLTData=false; // raw data only for HLT
+  bool bPropagateMC=false;
+  TString tsOptions=options;
+  TObjArray* pTokens=tsOptions.Tokenize(",");
+  if (pTokens) {
+    for (int n=0; n<pTokens->GetEntries(); n++) {
+      TString arg=((TObjString*)pTokens->At(n))->GetString();
+      if (arg.CompareTo("ca", TString::kIgnoreCase)==0) {
+       bUseCA=true;
+      } else if (arg.CompareTo("cm", TString::kIgnoreCase)==0) {
+       bUseCA=false;
+      } else if (arg.CompareTo("sorted", TString::kIgnoreCase)==0) {
+       bCFSort=true;
+      } else if (arg.CompareTo("unsorted", TString::kIgnoreCase)==0) {
+       bCFSort=false;
+      } else if (arg.CompareTo("raw", TString::kIgnoreCase)==0) {
+       bRawData=true;
+      } else if (arg.CompareTo("rawhlt", TString::kIgnoreCase)==0) {
+       bRawHLTData=true;
+      } else if (arg.CompareTo("mc", TString::kIgnoreCase)==0) {
+       bPropagateMC=true;
+      } else {
+       cout << "unknown argument: " << arg << endl;
+       return 0;
+      }
+    }
+    delete pTokens;
+  }
+  // summary
+  cout << "using " << bUseCA?"CA":"CM" << " tracker" << endl;
+  
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // init the HLT system in order to define the analysis chain below
+  //
+  AliHLTSystem* gHLT=AliHLTPluginBase::GetInstance();
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // define the analysis chain
+  //
+
+  // load TPCParam from OCDB
+  const char* cdbEntry="TPC/Calib/Parameters";
+  AliCDBManager* pMan=AliCDBManager::Instance();
+  AliTPCParam* pTPCParam=NULL;
+  if (pMan) {
+    if (!pMan->IsDefaultStorageSet()) {
+      pMan->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+      pMan->SetRun(0);
+    }
+    AliCDBEntry *pEntry = pMan->Get(cdbEntry);
+    if (pEntry && 
+       pEntry->GetObject() &&
+       (pTPCParam=dynamic_cast<AliTPCParam*>(pEntry->GetObject()))) {
+    } else {
+      HLTWarning("can not load AliTPCParam from CDB entry %s", cdbEntry);
+    }
+  }
+
+  int iMinSlice=0; 
+  int iMaxSlice=35;
+  int iMinPart=0;
+  int iMaxPart=5;
+  TString mergerInput;
+  TString writerInput;
+  TString sinkClusterInput;
+  for (int slice=iMinSlice; slice<=iMaxSlice; slice++) {
+    TString trackerInput;
+    for (int part=iMinPart; part<=iMaxPart; part++) {
+      TString arg, publisher, cf;
+
+      // digit publisher components
+      arg.Form("-slice %d -partition %d", slice, part);
+      publisher.Form("DP_%02d_%d", slice, part);
+      AliHLTConfiguration pubconf(publisher.Data(), "TPCDigitPublisher", NULL , arg.Data());
+
+      // cluster finder components
+      arg="-timebins ";
+      if (pTPCParam) arg+=pTPCParam->GetMaxTBin()+1;
+      else arg+=446; // old simulated data
+      if (bCFSort) arg+=" -sorted ";
+      if (bPropagateMC) arg+=" -do-mc ";
+      cf.Form("CF_%02d_%d", slice, part);
+      AliHLTConfiguration cfconf(cf.Data(), "TPCClusterFinderUnpacked", publisher.Data(), "");
+      if (trackerInput.Length()>0) trackerInput+=" ";
+      trackerInput+=cf;
+      if (sinkClusterInput.Length()>0) sinkClusterInput+=" ";
+      sinkClusterInput+=cf;
+    }
+
+    TString tracker;
+    // tracker finder components
+    tracker.Form("TR_%02d", slice);
+    if (bUseCA) {
+      AliHLTConfiguration trackerconf(tracker.Data(), "TPCCATracker", trackerInput.Data(), "");
+    } else {
+      AliHLTConfiguration trackerconf(tracker.Data(), "TPCSliceTracker", trackerInput.Data(), "-pp-run");
+    }
+
+    //add all trackers to writer input. Include if you would like all slice tracks written.
+    //if (writerInput.Length()>0) writerInput+=" ";
+    //writerInput+=tracker;
+
+    // add all clusterfinders to the writer input
+    if (writerInput.Length()>0) writerInput+=" ";
+    writerInput+=trackerInput;
+
+    if (mergerInput.Length()>0) mergerInput+=" ";
+    mergerInput+=tracker;
+
+  }
+
+  // GlobalMerger component
+  if (bUseCA) {
+    AliHLTConfiguration mergerconf("globalmerger","TPCCAGlobalMerger",mergerInput.Data(),"");
+  } else {
+    AliHLTConfiguration mergerconf("globalmerger","TPCGlobalMerger",mergerInput.Data(),"");
+  }
 
+  TString converterInput="globalmerger";
+
+  // collector for the MC information to be propagated from CFs to ESDConverter
+  if (bPropagateMC){
+    AliHLTConfiguration mcinfo("mcinfo", "BlockFilter"   , sinkClusterInput.Data(), "-datatype 'CLMCINFO' 'TPC '");  
+    AliHLTConfiguration mcTrackMarker("mcTrackMarker","TPCTrackMCMarker","globalmerger mcinfo","" );
+    converterInput+=" mcTrackMarker";
+  }
+
+  if (writerInput.Length()>0) writerInput+=" ";
+  writerInput+="globalmerger";
+
+
+  //////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // output section
+  //
+
+  //////////////////////////////////////////////////////////////////////////////////////////
+  // sink1: id=sink-writeall write all blocks
+  AliHLTConfiguration sink1("sink-writeall", "FileWriter"   , writerInput.Data(), "-specfmt -subdir=event_%d -blcknofmt=_0x%x -idfmt=_0x%08x");
+
+
+  //////////////////////////////////////////////////////////////////////////////////////////
+  // sink2: id=sink-esd-file write ESD using the TPCEsdWriter
+  AliHLTConfiguration sink2("sink-esd-file", "TPCEsdWriter"   , converterInput.Data(), "-datafile AliHLTESDs.root");
+
+
+  //////////////////////////////////////////////////////////////////////////////////////////
+  // sink3: id=sink-esd add ESD to HLTOUT using the TPCEsdConverter
+
+  // the esd converter configuration
+  AliHLTConfiguration sink3("sink-esd", "TPCEsdConverter"   , converterInput.Data(), "");
+
+  //////////////////////////////////////////////////////////////////////////////////////////
+  // sink4: id=sink-clusters add cluster data blocks to HLTOUT
+  AliHLTConfiguration sink4("sink-clusters", "BlockFilter"   , sinkClusterInput.Data(), "-datatype 'CLUSTERS' 'TPC '");
+
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Init and run the HLT simulation
+  // All but HLT simulation is switched off
+  //
+  AliSimulation sim;
   // switch of simulation and data generation
   // comment all that stuff to also simulate the events and data
   sim.SetRunGeneration(kFALSE);
   sim.SetMakeDigits("");
   sim.SetMakeSDigits("");
   sim.SetMakeDigitsFromHits("");
-  sim.SetMakeTrigger("");
+  //sim.SetMakeTrigger("");
+  sim.SetRunQA(":");
+
+  // the normal simulation sets the specific storage for the GRP entry
+  if (gSystem->AccessPathName("GRP/GRP/Data")) {
+    cerr << "*********************************************************" << endl;
+    cerr << "error: no GRP entry found in the currect directory, simulation might be incomplete. Skip setting specific storage for GRP entry" << endl;
+    cerr << "*********************************************************" << endl << endl;
+  } else {
+    sim.SetSpecificStorage("GRP/GRP/Data",
+                          Form("local://%s",gSystem->pwd()));
+  }
+
+  TString rawDataSelection="HLT";
+  if (bRawData) rawDataSelection="ALL";
+  if (bRawHLTData || bRawData) sim.SetWriteRawData(rawDataSelection, "raw.root", kTRUE);
 
   // set the options for the HLT simulation
-  //sim.SetRunHLT("libAliHLTTPC.so loglevel=0x3c config=conf-tpc-writer.C chains=sink1");
-  sim.SetRunHLT("libAliHLTTPC.so loglevel=0x3c config=conf-tpc-esd.C chains=sink1");
+  sim.SetRunHLT("libAliHLTUtil.so libAliHLTTPC.so loglevel=0x7c "
+               "chains=sink-esd,sink-clusters");
   sim.Run();
 }