ROOT logo
#include "hades.h"
#include "hdetector.h"
#include "hspectrometer.h"
#include "hmdctaskset.h"
#include "htask.h"
#include "htaskset.h"
#include "hdebug.h"
#include "haddef.h"
#include "hmdccalibrater1.h"
#include "hmdcdigitizer.h"
#include "hmdctrackdset.h"
#include "hmdcdedx2maker.h"
#include "hmdcvertexfind.h"
#include "hreconstructor.h"
#include "hmdcsetup.h"
#include "hmdctimecut.h"
#include "hruntimedb.h"
#include "hrun.h"
#include "hdatasource.h"
#include "hlocation.h"
#include "hmessagemgr.h"

#include "TBrowser.h"
#include "TROOT.h"
#include "TClass.h"

#include <stdlib.h>

//#include <iostream> 
//#include <iomanip>
using namespace std;

//*-- Author : Dan Magestro
//*--modified : Jochen Markert

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HMdcTaskSet
//
// This HTaskSet contains the tasks for the Mdc detector
//
// HMdcTaskSet::make("selectionstring","optionstring");
//
// SELECTION : if selectionstring="rtdb" HMdcTaskSet is initialized
//             via RuntimeDb. If this flag is set, all input from the
//             optionstring will be ignored.
// ----------------------------------------------------------------
//
//
// OPTIONS :                                                     
// ----------------------------------------------------------------
//     All settings are initialized to default values. The options set in the
//     optionstring will override the defaults for the specified parameters.
//     If selectionstring is set to "rtdb", all values in optionstring will be
//     ignored.
//
//     real  (default),simulation
//     or merge                       -- real data, simulation data or embedding
//     dubna (default) or santiago    -- selects hit finder
//
//     Maximum data level
//         raw                        -- only unpacker
//         cal1                       -- up to calibrater1
//         cal2                       -- up to calibrater2
//         hit              (default) -- up to hit finder
//         fit                        -- up to track fitter
//
//     HMdcCalibrater1:
//         NoStartAndNoCal            -- do not use start,
//                                       do not use calibration
//         NoStartAndCal              -- do not use start,
//                                       use calibration
//         StartAndCal      (default) -- use start,
//                                       use calibration
//         NoTimeCuts                 -- do not use time cuts
//         TimeCuts         (default) -- use time cuts
//
//     DUBNA TRACKER:
//         MagnetOn         (default) -- Magnetic field
//         MagnetOff                  -- Magnetic field off
//         CombinedClusters (default) -- Cluster search in
//                                       combined chambers
//         ChamberClusters            -- Cluster search in
//                                       individual chambers
//         MixedClusters              -- Cluster search in
//                                       combined chambers and after it
//                                       in individual chambers
// ----------------------------------------------------------------
//
//
// IDEAL MDC TRACKING :
// ----------------------------------------------------------------
// In DST macro :
//    Bool_t idealTracking = kTRUE;                                                                                                                  
//    Bool_t fillParallel  = kFALSE;
//                           kTRUE will fill HMdcHitSim,HMdcSegSim and HMdcTrkCand to ideal categories
//    
//    After HMdcTaskSet          *mdcTaskSet          = new HMdcTaskSet(); add:
//    if(idealTracking) mdcTaskSet->useIdealTracking(fillParallel); // must be before mdcTaskSet->make(...)
//   
//    For changing ideal tracking parameters (see HMdcIdealTracking.h/cc files) you can get
//    the pointer of HMdcIdealTracking object by function MdcTrackDSet::getMdcIdealTracking().
//    It must be after 
//    HTask *mdcTasks = mdcTaskSet->make(..)
//    ...
//    if(idealTracking) {
//        HMdcTrackDSet::getMdcIdealTracking()->set...
//    }
// ----------------------------------------------------------------
//    
// Note: Thanks to TString, options can be separated and written any way
//       you want, such as
//
//             HMdcTaskSet::make("","MagnetOFF,NOstartandNOcal")
//             HMdcTaskSet::make("","ChamberClusters & STARTandCAL")
//
// For testing a pointer for the MdcDigitizer can be retrieved to set the options from the macro:
// mdcdigi=(HMdcDigitizer*)mdcTasks->HMdcTaskSet::getDigitizer();
//
// In the same way a pointer to MdcCalibrater1() can be retrieved:
// calibrater1=(HMdcCalibrater1*)mdcTasks->HMdcTaskSet::getCalibrater1();
//
// A pointer to MdcDeDx2Maker() can be retrieved:
// mdcdedxmaker=(HMdcDeDx2Maker*)mdcTasks->HMdcTaskSet::getDeDx2Maker();
//
// Full control over all parameters can be gained by retrieving
// the pointer to the internal setup object(example):
//
// create taskset        HMdcTaskSet *mymdctasks   = new HMdcTaskSet();
//                       Int_t testLayers[6][4]={{5,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6}};
//                       Int_t testLevel[4]={10,50,10,30};
//
// get pointer to setup  HMdcSetup* mysetup=mymdctasks->getMdcSetup();
// set values            mysetup->getMdcTrackFinderSet()->setNLayers(&testLayers[0][0]);
//  ...                   mysetup->getMdcTrackFinderSet()->setNLevel (&testLevel[0]);
//  ...                   mysetup->getMdc12FitSet()      ->setMdc12FitSet(1,1,1,kTRUE,kFALSE);
//  ...
// return pointer to
// Taskset                       HTaskSet *mdcTasks    = mymdctasks->make("","");
// For the setup objects of the other tasks it works in the same way, the description can be
// found in HMdcSetup.
//
// BEGIN_HTML<b><font color="maroon">For more information, see <a target="_top" href="http://webdb.gsi.de:8010/pls/hades_webdbs/hanal.hal_posting_query.show_posting_text?p_id=436">this analysis logbook entry<a>.</font></b> END_HTML
//
///////////////////////////////////////////////////////////////////////////////


// set counters to 0
Int_t  HMdcTaskSet::ilevel           =0;
Int_t  HMdcTaskSet::irealorsimulation=0;
Int_t  HMdcTaskSet::icalibrater      =0;
Int_t  HMdcTaskSet::itimecuts        =0;
Int_t  HMdcTaskSet::itracker         =0;
Int_t  HMdcTaskSet::imagnet          =0;
Int_t  HMdcTaskSet::itrackermode     =0;

// define default values of all arguments
Int_t  HMdcTaskSet::analysisLevel    =3;
Int_t  HMdcTaskSet::cal1ModeFlag     =2;
Int_t  HMdcTaskSet::cal1TimeCutFlag  =1;;

Int_t  HMdcTaskSet::tracker          =1;
Int_t  HMdcTaskSet::typeClustFinder  =0;
Bool_t HMdcTaskSet::isCoilOff        =kFALSE;
Int_t  HMdcTaskSet::nLevel[4]        ={10,50,10,30};
Int_t  HMdcTaskSet::nLayers[6][4]    ={{6,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6},{6,6,6,6}};
Int_t  HMdcTaskSet::mdcForSeg1       =1;
Int_t  HMdcTaskSet::mdcForSeg2       =3;
Bool_t HMdcTaskSet::fitNTuple        =kFALSE;
Bool_t HMdcTaskSet::fitPrint         =kFALSE;
Int_t  HMdcTaskSet::fitAuthor        =1;
Int_t  HMdcTaskSet::fitVersion       =1;
Int_t  HMdcTaskSet::fitIndep         =0;
Int_t HMdcTaskSet::isSimulation      =0;

HMdcDigitizer*         HMdcTaskSet::mdcdigi             =0;
HMdcCalibrater1*       HMdcTaskSet::calibrater1         =0;
HMdcDeDx2Maker*        HMdcTaskSet::dedx2maker          =0;
HMdcVertexFind*        HMdcTaskSet::vertexfinder        =0;
Int_t                  HMdcTaskSet::rtdbinput           =0;
Bool_t                 HMdcTaskSet::isCreated           =kFALSE;

HMdcSetup*             HMdcTaskSet::mdcsetup            =0;
HMdcSetup*             HMdcTaskSet::mdcsetuplocal       =0;
HMdcCalibrater1Setup*  HMdcTaskSet::calibrater1setlocal =0;
HMdcDigitizerSetup*    HMdcTaskSet::digisetlocal        =0;
HMdcTrackFinderSetup*  HMdcTaskSet::trackfindersetlocal =0;
HMdcClusterToHitSetup* HMdcTaskSet::clustertohitsetlocal=0;
HMdc12FitSetup*        HMdcTaskSet::fittersetlocal      =0;
HMdcCommonSetup*       HMdcTaskSet::commonsetlocal      =0;


HMdcTaskSet::HMdcTaskSet(const Text_t name[],const Text_t title[]) : HTaskSet(name,title) {
    // Constructor
    setDefaults();
    isCreated=kTRUE;
}
HMdcTaskSet::HMdcTaskSet(void) : HTaskSet() {
    // Default constructor
    setDefaults();
    isCreated=kTRUE;
}
HMdcTaskSet::~HMdcTaskSet(void) {
    // Destructor.
    if(mdcsetuplocal) delete mdcsetuplocal;
}
void HMdcTaskSet::copySetup()
{
    if(mdcsetuplocal) delete mdcsetuplocal;
    mdcsetuplocal=new HMdcSetup(*mdcsetup);
}
void HMdcTaskSet::getSets()
{
    digisetlocal        =mdcsetuplocal->getMdcDigitizerSet();
    calibrater1setlocal =mdcsetuplocal->getMdcCalibrater1Set();
    trackfindersetlocal =mdcsetuplocal->getMdcTrackFinderSet();
    clustertohitsetlocal=mdcsetuplocal->getMdcClusterToHitSet();
    fittersetlocal      =mdcsetuplocal->getMdc12FitSet();
    commonsetlocal      =mdcsetuplocal->getMdcCommonSet();
}
void HMdcTaskSet::setDefaults()
{
    // define default values of all arguments

    mdcsetuplocal=new HMdcSetup("setuplocal","setuplocal");
    getSets();
    commonsetlocal      ->setMdcCommonSet      (isSimulation,analysisLevel,tracker);
    calibrater1setlocal ->setMdcCalibrater1Set (cal1ModeFlag,cal1TimeCutFlag);
    trackfindersetlocal ->setMdcTrackFinderSet (isCoilOff,typeClustFinder,&nLayers[0][0],&nLevel[0]);
    clustertohitsetlocal->setMdcClusterToHitSet(mdcForSeg1,mdcForSeg2);
    fittersetlocal      ->setMdc12FitSet       (fitAuthor,fitVersion,fitIndep,fitNTuple,fitPrint);

    digisetlocal->setTdcModeDigi      (2);
    digisetlocal->setNtupleDigi       (kFALSE);
    digisetlocal->setUseTofDigi       (kTRUE);
    digisetlocal->setUseErrorDigi     (kTRUE);
    digisetlocal->setUseWireOffsetDigi(kTRUE);
    digisetlocal->setUseWireStatDigi  (kFALSE);
    digisetlocal->setUseTimeCutsDigi  (kFALSE);
    digisetlocal->setEmbeddingModeDigi(1);
    digisetlocal->setNoiseModeDigi    (1);
    digisetlocal->setNoiseOffDigi     (0);
    digisetlocal->setNoiseLevelDigi   (0,0,0,0);
    digisetlocal->setNoiseRangeDigi   (0,0,0,0,0,0,0,0);
    digisetlocal->setOffsetsOffDigi   (0);
    digisetlocal->setOffsetsDigi      (0,0,0,0);
    digisetlocal->setCellEffOffDigi   (1);
    digisetlocal->setCellEffDigi      (88,88,88,88);
    
    idealTracking = kFALSE;
    fillParallel  = kFALSE;

    if(!mdcsetuplocal->check()) exit(1);
    versionDeDx=1;
}
void HMdcTaskSet::getSetupContainer()
{
    // gets the pointer to setup container,
    // init the container with the actual runId (or RefId),
    // copies the setup object to the local setup object and
    // retrieves the pointer to the sub setup objects.

    HRuntimeDb *rtdb=gHades->getRuntimeDb();

    // get runid from data source/compare if a refId has been
    // used
    HDataSource* source=gHades->getDataSource();
    Int_t refId=source->getCurrentRefId();
    Int_t runId=source->getCurrentRunId();
    Int_t myId=-99;

    if(runId==refId || refId<0)
    {
	myId=runId;
    }
    else
    {
	myId=refId;
    }

    // get pointer to HMdcSetup
    mdcsetup=(HMdcSetup*)rtdb->getContainer("MdcSetup");
    if(!mdcsetup)
    {
	Error("HMdcTaskSet:make()","RETRIEVED 0 POINTER FOR HMDCSETUP!");
	exit(1);
    }
    else
    {   // init HMdcSetup for the runId if the pointer is not 0
	// this is needed because the container should be available
	// before the TaskSet is created
	rtdbinput=1;
	rtdb->initContainers(myId);
	mdcsetup->setStatic();
	if(!mdcsetup->check())
	{  // check if init was correct

	    rtdbinput=0;
	    mdcsetup->printParam();
	    Error("HMdcTaskSet:getSetupContainer()","HMDCSETUP NOT INITIALIZED CORRECTLY!");
	    exit(1);
	}

	if(rtdbinput==1)
	{
            copySetup();
            getSets();
	}
    }
}
HTask* HMdcTaskSet::make(const Char_t *select,const Option_t *option) {
    // Returns a pointer to the Mdc task.
    // The task is created according to the specified options in Option_t *option
    // and select. If no option is specified default values will be used. If select
    // specifies rtdb the parameters will be used from runtimedb container HMdcSetup
    // and the parameters in option will be ignored.
    if(!isCreated) {setDefaults();}

  HTaskSet *tasks = new HTaskSet("Mdc","List of Mdc tasks");
  TString sel = select;
  sel.ToLower();
  TString opt=option;
  if((sel.CompareTo("rtdb"))==0)
  {
      getSetupContainer(); // gets setupcontainer, copy, get sets
  }
  else
  {   // if no rtdb input was specified
      parseArguments(opt);
  }

  //create the taskset

  //######################### REAL/ EMBEDDING ###################################

  // check global Hades flag for embedding mode
  if(gHades->getEmbeddingMode()!=0)
  {
      commonsetlocal     ->setIsSimulation(2);
  }

  if(commonsetlocal->getIsSimulation()==0 || commonsetlocal->getIsSimulation()==2)
  {  // real data or merge
      if(commonsetlocal->getIsSimulation()==2)
      {
	  //-----------------------------------------------------------------
	  // configure MDC task
	  // for embedding :
	  // -- create HMdcTimeCut standalone, set IsUsed=kFALSE
	  // -- common mode has to be switched from exp to merge
	  //    This will switch the task list to run calibrater1
	  //    before digitizer and the digitizer into embedding mode
	  // -- switch off time cuts in calibrater1
	  // -- select the wanted embedding mode for digitizer
	  //-----------------------------------------------------------------
	  // Mdc time cuts will not be performed by Calibrater1 but by
	  // trackfinder. Efficiency will be different, because the embedded
	  // drift cells have to struggle against noise! If the container exists
	  // and the flag Isused is set false, the track finder will use
	  // time cuts.

	  calibrater1setlocal->setTimeCutFlagCal1(0);
	  digisetlocal       ->setEmbeddingModeDigi(gHades->getEmbeddingMode());

	  HRuntimeDb *rtdb=gHades->getRuntimeDb();

	  HDataSource* source=gHades->getDataSource();
	  Int_t refId=source->getCurrentRefId();
	  Int_t runId=source->getCurrentRunId();
	  Int_t myId=-99;

	  if(runId==refId || refId<0) {myId=runId;}
	  else                        {myId=refId;}

	  HMdcTimeCut* timecut=(HMdcTimeCut*)rtdb->getContainer("MdcTimeCut");
	  rtdb->initContainers(myId);
	  timecut->setIsUsed(kFALSE);
      }
      if(commonsetlocal->getAnalysisLevel()>0)
      {   // cal1 and higher
	  calibrater1=new HMdcCalibrater1("mdc.cal1","Cal1");
          calibrater1setlocal ->setupMdcCalibrater1(calibrater1);
	  tasks->add(calibrater1);
      }
  }  
  if (commonsetlocal->getIsSimulation()==1 || commonsetlocal->getIsSimulation()==2)
  {
      //######################### SIMULATION / EMBEDDING ###################################

      if(commonsetlocal->getAnalysisLevel()>=1 && commonsetlocal->getAnalysisLevel()>0)
      {   // cal1sim and higher
	  mdcdigi=(HMdcDigitizer*)new HMdcDigitizer("mdc.digi","Mdc digitizer");
	  digisetlocal->setupMdcDigitizer(mdcdigi);
	  tasks->add(mdcdigi);
      }
  }
  //######################### DUBNA TRACKER ###################################

  if(commonsetlocal->getTracker()==1 && commonsetlocal->getAnalysisLevel()>=3 )
  {   // dubna tracker / hit and higher
    if(idealTracking) // ideal tracking
    {   // ideal tracking
	tasks->add( HMdcTrackDSet::hMdcIdealTracking("mdc.idealTr","mdc.idealTr",fillParallel) );
    }
    if(!idealTracking || fillParallel) {
      if(commonsetlocal->getAnalysisLevel()>=3 )
      {   // trackfinder and higher
	  trackfindersetlocal->setupMdcTrackFinder();
	  tasks->add( HMdcTrackDSet::hMdcTrackFinder("mdc.hitf","mdc.hitf") );
      }
      if(commonsetlocal->getAnalysisLevel()==3 )
      {   // trackfinder
          clustertohitsetlocal->setupMdcClusterToHit();
	  tasks->add( HMdcTrackDSet::hMdcClusterToHit("mdc.c2h","mdc.c2h") );
      }
      if(commonsetlocal->getAnalysisLevel()==4 )
      {   // fitter
	  fittersetlocal->setupMdc12Fit();
	  tasks->add( HMdcTrackDSet::hMdc12Fit("mdc.12fit","mdc.12fit") );
      }
      if(commonsetlocal->getAnalysisLevel()>=3 )
      {   // trackfinder and higher
          if(versionDeDx==1){
              dedx2maker=new HMdcDeDx2Maker("mdcdedx","mdcdedx");
              tasks->add(dedx2maker);
          }
      } 
    }
  }
  //################################ VERTEX FINDER #########################################
  if(commonsetlocal->getAnalysisLevel()==4 )
  {   // trackfinder and higher

      vertexfinder = new HMdcVertexFind("vertexfinder","vertexfinder",HMdcVertexFind::kSegments,kTRUE);
      tasks->add(vertexfinder);
  }

  // print the setup status to the screen
  printStatus();

  return tasks;
}
void HMdcTaskSet::parseArguments(TString s1)
{
    // The option string is searched for known arguments and
    // the internal variables of the task are defined according
    // to the arguments. Not set options will be defined by the
    // default values.
    // If the string is empty default values will be used.
    // If unknown arguments are found error messages will be displayed
    // and the program will be exited.
    // If two arguments for the same type of option are found an error
    // message will show up and the program is exited too.

    // switch maximum data level
    TString sraw             ="raw";
    TString scal1            ="cal1";
    TString scal2            ="cal2";
    TString shit             ="hit";
    TString sfit             ="fit";

    // switch between real data or simulation
    TString ssimulation      ="simulation";
    TString sreal            ="real";
    TString smerge           ="merge";

    //  Calibrater1 options
    TString snostartandnocal ="nostartandnocal";
    TString snostartandcal   ="nostartandcal";
    TString sstartandcal     ="startandcal";
    TString stimecuts        ="timecuts";
    TString snotimecuts      ="notimecuts";

    // switch trackers
    TString sdubna           ="dubna";
    TString ssantiago        ="santiago";

    // Dubna tracker options
    TString smagnetoff       ="magnetoff";
    TString smagneton        ="magneton";

    TString scombinedclusters="combinedclusters";
    TString schamberclusters ="chamberclusters";
    TString smixedclusters   ="mixedclusters";
    TString s2=s1;
    s1.ToLower();
    s1.ReplaceAll(" ","");
    Ssiz_t len=s1.Length();
    if(len!=0)
    {
	TObjArray* myarguments =  s1.Tokenize(",");
	TObjString *stemp;
	TString argument;

	ilevel=0;
        irealorsimulation=0;
	icalibrater=0;
	icalibrater=0;
        itimecuts=0;
	itracker=0;
        imagnet=0;
	itrackermode=0;

	TIterator* myiter=myarguments->MakeIterator();

	// iterate over the lis of arguments and compare the
        // to known key words.
	while ((stemp=(TObjString*)myiter->Next())!= 0) {
	    argument=stemp->GetString();
	    if(argument.CompareTo(sraw)==0)
	    {
		ilevel++;
		if(ilevel>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for analysis level:RAW!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: ",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setAnalysisLevel(0);
	    }
	    else if(argument.CompareTo(scal1)==0)
	    {
		ilevel++;
		if(ilevel>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for analysis level:CAL1!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setAnalysisLevel(1);
	    }
	    else if(argument.CompareTo(scal2)==0)
	    {
		ilevel++;
		if(ilevel>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for analysis level:CAL2!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setAnalysisLevel(2);
	    }
	    else if(argument.CompareTo(shit)==0)
	    {
		ilevel++;
		if(ilevel>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for analysis level:HIT!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setAnalysisLevel(3);
	    }
	    else if(argument.CompareTo(sfit)==0)
	    {
		ilevel++;
		if(ilevel>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for analysis level:FIT!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setAnalysisLevel(4);
	    }
	    else if(argument.CompareTo(ssimulation)==0)
	    {
		irealorsimulation++;
		if(irealorsimulation>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for data type!:SIMULATION");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                commonsetlocal->setIsSimulation(1);
	    }
	    else if(argument.CompareTo(sreal)==0)
	    {
		irealorsimulation++;
		if(irealorsimulation>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for data type:REAL!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: ",s2.Data());
		    printOptions();
		    exit(1);
		}
		commonsetlocal->setIsSimulation(0);
	    }
	    else if(argument.CompareTo(smerge)==0)
	    {
		irealorsimulation++;
		if(irealorsimulation>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for data type:REAL!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: ",s2.Data());
		    printOptions();
		    exit(1);
		}
		commonsetlocal->setIsSimulation(2);
	    }
	    else if(argument.CompareTo(snostartandnocal)==0)
	    {
		icalibrater++;
		if(icalibrater>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for calibrater option:NoStartAndNoCal!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
                calibrater1setlocal->setModeFlagCal1(3);
	    }
	    else if(argument.CompareTo(snostartandcal)==0)
	    {
		icalibrater++;
		if(icalibrater>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for calibrater option:NoStartAndCal!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		calibrater1setlocal->setModeFlagCal1(1);
	    }
	    else if(argument.CompareTo(sstartandcal)==0)
	    {
		icalibrater++;
		if(icalibrater>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for calibrater option:StartAndCal!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		calibrater1setlocal->setModeFlagCal1(2);
	    }
	    else if(argument.CompareTo(snotimecuts)==0)
	    {
		itimecuts++;
		if(itimecuts>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for time cuts:NoTimeCuts!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		calibrater1setlocal->setTimeCutFlagCal1(0);
	    }
	    else if(argument.CompareTo(stimecuts)==0)
	    {
		itimecuts++;
		if(itimecuts>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for time cuts:TimeCuts!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		calibrater1setlocal->setTimeCutFlagCal1(1);
	    }
	    else if(argument.CompareTo(sdubna)==0)
	    {
		itracker++;
		if(itracker>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for tracker type:DUBNA!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		commonsetlocal->setTracker(1);
	    }
	    else if(argument.CompareTo(ssantiago)==0)
	    {
		itracker++;
		if(itracker>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for tracker type:SANTIAGO!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		commonsetlocal->setTracker(2);
	    }
	    else if(argument.CompareTo(smagnetoff)==0)
	    {
		imagnet++;
		if(imagnet>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for magnet status:MagnetOff!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		trackfindersetlocal->setIsCoilOff(kTRUE);
	    }
	    else if(argument.CompareTo(smagneton)==0)
	    {
		imagnet++;
		if(imagnet>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for magnet status:MagnetOn!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		trackfindersetlocal->setIsCoilOff(kFALSE);
	    }
	    else if(argument.CompareTo(scombinedclusters)==0)
	    {
		itrackermode++;
		if(itrackermode>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for tracker mode:CombinedChamberClusters!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		trackfindersetlocal->setTypeClustFinder(0);
	    }
	    else if(argument.CompareTo(schamberclusters)==0)
	    {
		itrackermode++;
		if(itrackermode>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for tracker mode:ChamberClusters!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		trackfindersetlocal->setTypeClustFinder(1);
	    }
            else if(argument.CompareTo(smixedclusters)==0)
	    {
		itrackermode++;
		if(itrackermode>1)
		{
		    ERROR_msg(HMessageMgr::DET_MDC,"overlap with other argument for tracker mode:MixedClusters!");
		    gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		    printOptions();
		    exit(1);
		}
		trackfindersetlocal->setTypeClustFinder(2);
	    }
	    else
	    {
		gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"unknown argument %s !",argument.Data());
		gHades->getMsg()->error(10,HMessageMgr::DET_MDC,GetName(),"INPUT OPTIONSTRING: %s",s2.Data());
		printOptions();
		exit(1);
	    }
	
	}
	delete myiter;
	myarguments ->Delete();
        delete myarguments;
    }
}
void HMdcTaskSet::printOptions()
{
    // Prints the options of HMdcTaskSet
  SEPERATOR_msg("#",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"SELECTION : rtdb               -- init from HMdcSetup");
  INFO_msg(10,HMessageMgr::DET_MDC,"            no selection       -- init from OptionString");
  SEPERATOR_msg("-",60);
  INFO_msg(10,HMessageMgr::DET_MDC," OPTIONS   :");
  SEPERATOR_msg("-",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"real  (default) or simulation  -- real data or simulation data");
  INFO_msg(10,HMessageMgr::DET_MDC,"dubna (default) or santiago    -- selects hit finder");
  SEPERATOR_msg("-",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"Maximum data level");
  INFO_msg(10,HMessageMgr::DET_MDC,"     raw                        -- only unpacker");
  INFO_msg(10,HMessageMgr::DET_MDC,"     cal1                       -- up to calibrater1");
  INFO_msg(10,HMessageMgr::DET_MDC,"     cal2                       -- up to calibrater2");
  INFO_msg(10,HMessageMgr::DET_MDC,"     hit              (default) -- up to hit finder");
  INFO_msg(10,HMessageMgr::DET_MDC,"     fit                        -- up to track fitter");
  INFO_msg(10,HMessageMgr::DET_MDC,"HMdcCalibrater1:");
  INFO_msg(10,HMessageMgr::DET_MDC,"     NoStartAndNoCal            -- do not use start,");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   do not use calibration");
  INFO_msg(10,HMessageMgr::DET_MDC,"     NoStartAndCal              -- do not use start,");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   use calibration");
  INFO_msg(10,HMessageMgr::DET_MDC,"     StartAndCal      (default) -- use start,");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   use calibration");
  INFO_msg(10,HMessageMgr::DET_MDC,"     NoTimeCuts                 -- do not use time cuts");
  INFO_msg(10,HMessageMgr::DET_MDC,"     TimeCuts         (default) -- use time cuts");
  INFO_msg(10,HMessageMgr::DET_MDC," DUBNA TRACKER:");
  INFO_msg(10,HMessageMgr::DET_MDC,"      MagnetOn         (default) -- Magnetic field");
  INFO_msg(10,HMessageMgr::DET_MDC,"      MagnetOff                  -- Magnetic field off");
  INFO_msg(10,HMessageMgr::DET_MDC,"     CombinedClusters (default) -- Cluster search in");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   combined chambers");
  INFO_msg(10,HMessageMgr::DET_MDC,"     ChamberClusters            -- Cluster search in");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   individual chambers");
  INFO_msg(10,HMessageMgr::DET_MDC,"     MixedClusters              -- Cluster search in");
  INFO_msg(10,HMessageMgr::DET_MDC,"                                   comb.+indiv. chambers");
  SEPERATOR_msg("#",60);
}
HMdcDigitizer* HMdcTaskSet::getDigitizer()
{
    // Returns a pointer to the HMdcDigitizer.
    // If the pointer is 0 an error message will be displayed
    // and the program will be exited.

    if(mdcdigi!=0)
    {
	return mdcdigi;
    }
    else
    {
     	Error("HMdcTaskSet:getDigitzer():"
	      ,"\n POINTER TO MDCDIGITIZER IS ZERO! \n DON'T CALL THIS FUNCTION WHEN RUNNING WITH REAL DATA!");
        exit(1);
    }
}
HMdcCalibrater1* HMdcTaskSet::getCalibrater1()
{
    // Returns a pointer to the HMdcCalibrater1.
    // If the pointer is 0 an error message will be displayed
    // and the program will be exited.

    if(calibrater1!=0)
    {
	return calibrater1;
    }
    else
    {
     	Error("HMdcTaskSet:getCalibrater1():"
	      ,"\n POINTER TO MDCCALIBRATER1 IS ZERO! \n DON'T CALL THIS FUNCTION WHEN RUNNING WITH SIM DATA!");
        exit(1);
    }
}
HMdcDeDx2Maker* HMdcTaskSet::getDeDx2Maker()
{
    // Returns a pointer to the HMdcDeDx2Maker.
    // If the pointer is 0 an error message will be displayed
    // and the program will be exited.

    if(dedx2maker!=0)
    {
	return dedx2maker;
    }
    else
    {
     	Error("HMdcTaskSet:getDeDx2Maker():"
	      ,"\n POINTER TO MDCDEDX2MAKER IS ZERO! \n YOU NEED TO RUN IN FIT MODE!");
        exit(1);
    }
}
HMdcSetup* HMdcTaskSet::getMdcSetup()
{
    if(mdcsetuplocal!=0)
    {
	return mdcsetuplocal;
    }
    else
    {
	Error("HMdcTaskSet:getMdcSetup():"
	      ,"\n POINTER TO MDCSETUP IS ZERO!");
	exit(1);
    }
}
HMdcVertexFind* HMdcTaskSet::getMdcVertexFinder()
{
    if(vertexfinder!=0)
    {
	return vertexfinder;
    }
    else
    {
	Error("HMdcTaskSet:getMdcVertexFinder():"
	      ,"\n POINTER TO MDCVERTEXFIND IS ZERO!");
	exit(1);
    }
}
void HMdcTaskSet::printStatus()
{
    // Prints the status of the configuration of
    // HMdcTaskSet.

    printOptions();
    SEPERATOR_msg("#",60);
    INFO_msg(10,HMessageMgr::DET_MDC,"ACTUAL CONFIGURATION :");
    commonsetlocal->printParam();
    if(calibrater1)calibrater1->printStatus();
    if(mdcdigi)    mdcdigi    ->printStatus();
    HMdcTrackDSet::printStatus();//pointer checked inside function
    if(dedx2maker)  dedx2maker->printStatus();
    SEPERATOR_msg("#",60);
}


ClassImp(HMdcTaskSet)
 hmdctaskset.cc:1
 hmdctaskset.cc:2
 hmdctaskset.cc:3
 hmdctaskset.cc:4
 hmdctaskset.cc:5
 hmdctaskset.cc:6
 hmdctaskset.cc:7
 hmdctaskset.cc:8
 hmdctaskset.cc:9
 hmdctaskset.cc:10
 hmdctaskset.cc:11
 hmdctaskset.cc:12
 hmdctaskset.cc:13
 hmdctaskset.cc:14
 hmdctaskset.cc:15
 hmdctaskset.cc:16
 hmdctaskset.cc:17
 hmdctaskset.cc:18
 hmdctaskset.cc:19
 hmdctaskset.cc:20
 hmdctaskset.cc:21
 hmdctaskset.cc:22
 hmdctaskset.cc:23
 hmdctaskset.cc:24
 hmdctaskset.cc:25
 hmdctaskset.cc:26
 hmdctaskset.cc:27
 hmdctaskset.cc:28
 hmdctaskset.cc:29
 hmdctaskset.cc:30
 hmdctaskset.cc:31
 hmdctaskset.cc:32
 hmdctaskset.cc:33
 hmdctaskset.cc:34
 hmdctaskset.cc:35
 hmdctaskset.cc:36
 hmdctaskset.cc:37
 hmdctaskset.cc:38
 hmdctaskset.cc:39
 hmdctaskset.cc:40
 hmdctaskset.cc:41
 hmdctaskset.cc:42
 hmdctaskset.cc:43
 hmdctaskset.cc:44
 hmdctaskset.cc:45
 hmdctaskset.cc:46
 hmdctaskset.cc:47
 hmdctaskset.cc:48
 hmdctaskset.cc:49
 hmdctaskset.cc:50
 hmdctaskset.cc:51
 hmdctaskset.cc:52
 hmdctaskset.cc:53
 hmdctaskset.cc:54
 hmdctaskset.cc:55
 hmdctaskset.cc:56
 hmdctaskset.cc:57
 hmdctaskset.cc:58
 hmdctaskset.cc:59
 hmdctaskset.cc:60
 hmdctaskset.cc:61
 hmdctaskset.cc:62
 hmdctaskset.cc:63
 hmdctaskset.cc:64
 hmdctaskset.cc:65
 hmdctaskset.cc:66
 hmdctaskset.cc:67
 hmdctaskset.cc:68
 hmdctaskset.cc:69
 hmdctaskset.cc:70
 hmdctaskset.cc:71
 hmdctaskset.cc:72
 hmdctaskset.cc:73
 hmdctaskset.cc:74
 hmdctaskset.cc:75
 hmdctaskset.cc:76
 hmdctaskset.cc:77
 hmdctaskset.cc:78
 hmdctaskset.cc:79
 hmdctaskset.cc:80
 hmdctaskset.cc:81
 hmdctaskset.cc:82
 hmdctaskset.cc:83
 hmdctaskset.cc:84
 hmdctaskset.cc:85
 hmdctaskset.cc:86
 hmdctaskset.cc:87
 hmdctaskset.cc:88
 hmdctaskset.cc:89
 hmdctaskset.cc:90
 hmdctaskset.cc:91
 hmdctaskset.cc:92
 hmdctaskset.cc:93
 hmdctaskset.cc:94
 hmdctaskset.cc:95
 hmdctaskset.cc:96
 hmdctaskset.cc:97
 hmdctaskset.cc:98
 hmdctaskset.cc:99
 hmdctaskset.cc:100
 hmdctaskset.cc:101
 hmdctaskset.cc:102
 hmdctaskset.cc:103
 hmdctaskset.cc:104
 hmdctaskset.cc:105
 hmdctaskset.cc:106
 hmdctaskset.cc:107
 hmdctaskset.cc:108
 hmdctaskset.cc:109
 hmdctaskset.cc:110
 hmdctaskset.cc:111
 hmdctaskset.cc:112
 hmdctaskset.cc:113
 hmdctaskset.cc:114
 hmdctaskset.cc:115
 hmdctaskset.cc:116
 hmdctaskset.cc:117
 hmdctaskset.cc:118
 hmdctaskset.cc:119
 hmdctaskset.cc:120
 hmdctaskset.cc:121
 hmdctaskset.cc:122
 hmdctaskset.cc:123
 hmdctaskset.cc:124
 hmdctaskset.cc:125
 hmdctaskset.cc:126
 hmdctaskset.cc:127
 hmdctaskset.cc:128
 hmdctaskset.cc:129
 hmdctaskset.cc:130
 hmdctaskset.cc:131
 hmdctaskset.cc:132
 hmdctaskset.cc:133
 hmdctaskset.cc:134
 hmdctaskset.cc:135
 hmdctaskset.cc:136
 hmdctaskset.cc:137
 hmdctaskset.cc:138
 hmdctaskset.cc:139
 hmdctaskset.cc:140
 hmdctaskset.cc:141
 hmdctaskset.cc:142
 hmdctaskset.cc:143
 hmdctaskset.cc:144
 hmdctaskset.cc:145
 hmdctaskset.cc:146
 hmdctaskset.cc:147
 hmdctaskset.cc:148
 hmdctaskset.cc:149
 hmdctaskset.cc:150
 hmdctaskset.cc:151
 hmdctaskset.cc:152
 hmdctaskset.cc:153
 hmdctaskset.cc:154
 hmdctaskset.cc:155
 hmdctaskset.cc:156
 hmdctaskset.cc:157
 hmdctaskset.cc:158
 hmdctaskset.cc:159
 hmdctaskset.cc:160
 hmdctaskset.cc:161
 hmdctaskset.cc:162
 hmdctaskset.cc:163
 hmdctaskset.cc:164
 hmdctaskset.cc:165
 hmdctaskset.cc:166
 hmdctaskset.cc:167
 hmdctaskset.cc:168
 hmdctaskset.cc:169
 hmdctaskset.cc:170
 hmdctaskset.cc:171
 hmdctaskset.cc:172
 hmdctaskset.cc:173
 hmdctaskset.cc:174
 hmdctaskset.cc:175
 hmdctaskset.cc:176
 hmdctaskset.cc:177
 hmdctaskset.cc:178
 hmdctaskset.cc:179
 hmdctaskset.cc:180
 hmdctaskset.cc:181
 hmdctaskset.cc:182
 hmdctaskset.cc:183
 hmdctaskset.cc:184
 hmdctaskset.cc:185
 hmdctaskset.cc:186
 hmdctaskset.cc:187
 hmdctaskset.cc:188
 hmdctaskset.cc:189
 hmdctaskset.cc:190
 hmdctaskset.cc:191
 hmdctaskset.cc:192
 hmdctaskset.cc:193
 hmdctaskset.cc:194
 hmdctaskset.cc:195
 hmdctaskset.cc:196
 hmdctaskset.cc:197
 hmdctaskset.cc:198
 hmdctaskset.cc:199
 hmdctaskset.cc:200
 hmdctaskset.cc:201
 hmdctaskset.cc:202
 hmdctaskset.cc:203
 hmdctaskset.cc:204
 hmdctaskset.cc:205
 hmdctaskset.cc:206
 hmdctaskset.cc:207
 hmdctaskset.cc:208
 hmdctaskset.cc:209
 hmdctaskset.cc:210
 hmdctaskset.cc:211
 hmdctaskset.cc:212
 hmdctaskset.cc:213
 hmdctaskset.cc:214
 hmdctaskset.cc:215
 hmdctaskset.cc:216
 hmdctaskset.cc:217
 hmdctaskset.cc:218
 hmdctaskset.cc:219
 hmdctaskset.cc:220
 hmdctaskset.cc:221
 hmdctaskset.cc:222
 hmdctaskset.cc:223
 hmdctaskset.cc:224
 hmdctaskset.cc:225
 hmdctaskset.cc:226
 hmdctaskset.cc:227
 hmdctaskset.cc:228
 hmdctaskset.cc:229
 hmdctaskset.cc:230
 hmdctaskset.cc:231
 hmdctaskset.cc:232
 hmdctaskset.cc:233
 hmdctaskset.cc:234
 hmdctaskset.cc:235
 hmdctaskset.cc:236
 hmdctaskset.cc:237
 hmdctaskset.cc:238
 hmdctaskset.cc:239
 hmdctaskset.cc:240
 hmdctaskset.cc:241
 hmdctaskset.cc:242
 hmdctaskset.cc:243
 hmdctaskset.cc:244
 hmdctaskset.cc:245
 hmdctaskset.cc:246
 hmdctaskset.cc:247
 hmdctaskset.cc:248
 hmdctaskset.cc:249
 hmdctaskset.cc:250
 hmdctaskset.cc:251
 hmdctaskset.cc:252
 hmdctaskset.cc:253
 hmdctaskset.cc:254
 hmdctaskset.cc:255
 hmdctaskset.cc:256
 hmdctaskset.cc:257
 hmdctaskset.cc:258
 hmdctaskset.cc:259
 hmdctaskset.cc:260
 hmdctaskset.cc:261
 hmdctaskset.cc:262
 hmdctaskset.cc:263
 hmdctaskset.cc:264
 hmdctaskset.cc:265
 hmdctaskset.cc:266
 hmdctaskset.cc:267
 hmdctaskset.cc:268
 hmdctaskset.cc:269
 hmdctaskset.cc:270
 hmdctaskset.cc:271
 hmdctaskset.cc:272
 hmdctaskset.cc:273
 hmdctaskset.cc:274
 hmdctaskset.cc:275
 hmdctaskset.cc:276
 hmdctaskset.cc:277
 hmdctaskset.cc:278
 hmdctaskset.cc:279
 hmdctaskset.cc:280
 hmdctaskset.cc:281
 hmdctaskset.cc:282
 hmdctaskset.cc:283
 hmdctaskset.cc:284
 hmdctaskset.cc:285
 hmdctaskset.cc:286
 hmdctaskset.cc:287
 hmdctaskset.cc:288
 hmdctaskset.cc:289
 hmdctaskset.cc:290
 hmdctaskset.cc:291
 hmdctaskset.cc:292
 hmdctaskset.cc:293
 hmdctaskset.cc:294
 hmdctaskset.cc:295
 hmdctaskset.cc:296
 hmdctaskset.cc:297
 hmdctaskset.cc:298
 hmdctaskset.cc:299
 hmdctaskset.cc:300
 hmdctaskset.cc:301
 hmdctaskset.cc:302
 hmdctaskset.cc:303
 hmdctaskset.cc:304
 hmdctaskset.cc:305
 hmdctaskset.cc:306
 hmdctaskset.cc:307
 hmdctaskset.cc:308
 hmdctaskset.cc:309
 hmdctaskset.cc:310
 hmdctaskset.cc:311
 hmdctaskset.cc:312
 hmdctaskset.cc:313
 hmdctaskset.cc:314
 hmdctaskset.cc:315
 hmdctaskset.cc:316
 hmdctaskset.cc:317
 hmdctaskset.cc:318
 hmdctaskset.cc:319
 hmdctaskset.cc:320
 hmdctaskset.cc:321
 hmdctaskset.cc:322
 hmdctaskset.cc:323
 hmdctaskset.cc:324
 hmdctaskset.cc:325
 hmdctaskset.cc:326
 hmdctaskset.cc:327
 hmdctaskset.cc:328
 hmdctaskset.cc:329
 hmdctaskset.cc:330
 hmdctaskset.cc:331
 hmdctaskset.cc:332
 hmdctaskset.cc:333
 hmdctaskset.cc:334
 hmdctaskset.cc:335
 hmdctaskset.cc:336
 hmdctaskset.cc:337
 hmdctaskset.cc:338
 hmdctaskset.cc:339
 hmdctaskset.cc:340
 hmdctaskset.cc:341
 hmdctaskset.cc:342
 hmdctaskset.cc:343
 hmdctaskset.cc:344
 hmdctaskset.cc:345
 hmdctaskset.cc:346
 hmdctaskset.cc:347
 hmdctaskset.cc:348
 hmdctaskset.cc:349
 hmdctaskset.cc:350
 hmdctaskset.cc:351
 hmdctaskset.cc:352
 hmdctaskset.cc:353
 hmdctaskset.cc:354
 hmdctaskset.cc:355
 hmdctaskset.cc:356
 hmdctaskset.cc:357
 hmdctaskset.cc:358
 hmdctaskset.cc:359
 hmdctaskset.cc:360
 hmdctaskset.cc:361
 hmdctaskset.cc:362
 hmdctaskset.cc:363
 hmdctaskset.cc:364
 hmdctaskset.cc:365
 hmdctaskset.cc:366
 hmdctaskset.cc:367
 hmdctaskset.cc:368
 hmdctaskset.cc:369
 hmdctaskset.cc:370
 hmdctaskset.cc:371
 hmdctaskset.cc:372
 hmdctaskset.cc:373
 hmdctaskset.cc:374
 hmdctaskset.cc:375
 hmdctaskset.cc:376
 hmdctaskset.cc:377
 hmdctaskset.cc:378
 hmdctaskset.cc:379
 hmdctaskset.cc:380
 hmdctaskset.cc:381
 hmdctaskset.cc:382
 hmdctaskset.cc:383
 hmdctaskset.cc:384
 hmdctaskset.cc:385
 hmdctaskset.cc:386
 hmdctaskset.cc:387
 hmdctaskset.cc:388
 hmdctaskset.cc:389
 hmdctaskset.cc:390
 hmdctaskset.cc:391
 hmdctaskset.cc:392
 hmdctaskset.cc:393
 hmdctaskset.cc:394
 hmdctaskset.cc:395
 hmdctaskset.cc:396
 hmdctaskset.cc:397
 hmdctaskset.cc:398
 hmdctaskset.cc:399
 hmdctaskset.cc:400
 hmdctaskset.cc:401
 hmdctaskset.cc:402
 hmdctaskset.cc:403
 hmdctaskset.cc:404
 hmdctaskset.cc:405
 hmdctaskset.cc:406
 hmdctaskset.cc:407
 hmdctaskset.cc:408
 hmdctaskset.cc:409
 hmdctaskset.cc:410
 hmdctaskset.cc:411
 hmdctaskset.cc:412
 hmdctaskset.cc:413
 hmdctaskset.cc:414
 hmdctaskset.cc:415
 hmdctaskset.cc:416
 hmdctaskset.cc:417
 hmdctaskset.cc:418
 hmdctaskset.cc:419
 hmdctaskset.cc:420
 hmdctaskset.cc:421
 hmdctaskset.cc:422
 hmdctaskset.cc:423
 hmdctaskset.cc:424
 hmdctaskset.cc:425
 hmdctaskset.cc:426
 hmdctaskset.cc:427
 hmdctaskset.cc:428
 hmdctaskset.cc:429
 hmdctaskset.cc:430
 hmdctaskset.cc:431
 hmdctaskset.cc:432
 hmdctaskset.cc:433
 hmdctaskset.cc:434
 hmdctaskset.cc:435
 hmdctaskset.cc:436
 hmdctaskset.cc:437
 hmdctaskset.cc:438
 hmdctaskset.cc:439
 hmdctaskset.cc:440
 hmdctaskset.cc:441
 hmdctaskset.cc:442
 hmdctaskset.cc:443
 hmdctaskset.cc:444
 hmdctaskset.cc:445
 hmdctaskset.cc:446
 hmdctaskset.cc:447
 hmdctaskset.cc:448
 hmdctaskset.cc:449
 hmdctaskset.cc:450
 hmdctaskset.cc:451
 hmdctaskset.cc:452
 hmdctaskset.cc:453
 hmdctaskset.cc:454
 hmdctaskset.cc:455
 hmdctaskset.cc:456
 hmdctaskset.cc:457
 hmdctaskset.cc:458
 hmdctaskset.cc:459
 hmdctaskset.cc:460
 hmdctaskset.cc:461
 hmdctaskset.cc:462
 hmdctaskset.cc:463
 hmdctaskset.cc:464
 hmdctaskset.cc:465
 hmdctaskset.cc:466
 hmdctaskset.cc:467
 hmdctaskset.cc:468
 hmdctaskset.cc:469
 hmdctaskset.cc:470
 hmdctaskset.cc:471
 hmdctaskset.cc:472
 hmdctaskset.cc:473
 hmdctaskset.cc:474
 hmdctaskset.cc:475
 hmdctaskset.cc:476
 hmdctaskset.cc:477
 hmdctaskset.cc:478
 hmdctaskset.cc:479
 hmdctaskset.cc:480
 hmdctaskset.cc:481
 hmdctaskset.cc:482
 hmdctaskset.cc:483
 hmdctaskset.cc:484
 hmdctaskset.cc:485
 hmdctaskset.cc:486
 hmdctaskset.cc:487
 hmdctaskset.cc:488
 hmdctaskset.cc:489
 hmdctaskset.cc:490
 hmdctaskset.cc:491
 hmdctaskset.cc:492
 hmdctaskset.cc:493
 hmdctaskset.cc:494
 hmdctaskset.cc:495
 hmdctaskset.cc:496
 hmdctaskset.cc:497
 hmdctaskset.cc:498
 hmdctaskset.cc:499
 hmdctaskset.cc:500
 hmdctaskset.cc:501
 hmdctaskset.cc:502
 hmdctaskset.cc:503
 hmdctaskset.cc:504
 hmdctaskset.cc:505
 hmdctaskset.cc:506
 hmdctaskset.cc:507
 hmdctaskset.cc:508
 hmdctaskset.cc:509
 hmdctaskset.cc:510
 hmdctaskset.cc:511
 hmdctaskset.cc:512
 hmdctaskset.cc:513
 hmdctaskset.cc:514
 hmdctaskset.cc:515
 hmdctaskset.cc:516
 hmdctaskset.cc:517
 hmdctaskset.cc:518
 hmdctaskset.cc:519
 hmdctaskset.cc:520
 hmdctaskset.cc:521
 hmdctaskset.cc:522
 hmdctaskset.cc:523
 hmdctaskset.cc:524
 hmdctaskset.cc:525
 hmdctaskset.cc:526
 hmdctaskset.cc:527
 hmdctaskset.cc:528
 hmdctaskset.cc:529
 hmdctaskset.cc:530
 hmdctaskset.cc:531
 hmdctaskset.cc:532
 hmdctaskset.cc:533
 hmdctaskset.cc:534
 hmdctaskset.cc:535
 hmdctaskset.cc:536
 hmdctaskset.cc:537
 hmdctaskset.cc:538
 hmdctaskset.cc:539
 hmdctaskset.cc:540
 hmdctaskset.cc:541
 hmdctaskset.cc:542
 hmdctaskset.cc:543
 hmdctaskset.cc:544
 hmdctaskset.cc:545
 hmdctaskset.cc:546
 hmdctaskset.cc:547
 hmdctaskset.cc:548
 hmdctaskset.cc:549
 hmdctaskset.cc:550
 hmdctaskset.cc:551
 hmdctaskset.cc:552
 hmdctaskset.cc:553
 hmdctaskset.cc:554
 hmdctaskset.cc:555
 hmdctaskset.cc:556
 hmdctaskset.cc:557
 hmdctaskset.cc:558
 hmdctaskset.cc:559
 hmdctaskset.cc:560
 hmdctaskset.cc:561
 hmdctaskset.cc:562
 hmdctaskset.cc:563
 hmdctaskset.cc:564
 hmdctaskset.cc:565
 hmdctaskset.cc:566
 hmdctaskset.cc:567
 hmdctaskset.cc:568
 hmdctaskset.cc:569
 hmdctaskset.cc:570
 hmdctaskset.cc:571
 hmdctaskset.cc:572
 hmdctaskset.cc:573
 hmdctaskset.cc:574
 hmdctaskset.cc:575
 hmdctaskset.cc:576
 hmdctaskset.cc:577
 hmdctaskset.cc:578
 hmdctaskset.cc:579
 hmdctaskset.cc:580
 hmdctaskset.cc:581
 hmdctaskset.cc:582
 hmdctaskset.cc:583
 hmdctaskset.cc:584
 hmdctaskset.cc:585
 hmdctaskset.cc:586
 hmdctaskset.cc:587
 hmdctaskset.cc:588
 hmdctaskset.cc:589
 hmdctaskset.cc:590
 hmdctaskset.cc:591
 hmdctaskset.cc:592
 hmdctaskset.cc:593
 hmdctaskset.cc:594
 hmdctaskset.cc:595
 hmdctaskset.cc:596
 hmdctaskset.cc:597
 hmdctaskset.cc:598
 hmdctaskset.cc:599
 hmdctaskset.cc:600
 hmdctaskset.cc:601
 hmdctaskset.cc:602
 hmdctaskset.cc:603
 hmdctaskset.cc:604
 hmdctaskset.cc:605
 hmdctaskset.cc:606
 hmdctaskset.cc:607
 hmdctaskset.cc:608
 hmdctaskset.cc:609
 hmdctaskset.cc:610
 hmdctaskset.cc:611
 hmdctaskset.cc:612
 hmdctaskset.cc:613
 hmdctaskset.cc:614
 hmdctaskset.cc:615
 hmdctaskset.cc:616
 hmdctaskset.cc:617
 hmdctaskset.cc:618
 hmdctaskset.cc:619
 hmdctaskset.cc:620
 hmdctaskset.cc:621
 hmdctaskset.cc:622
 hmdctaskset.cc:623
 hmdctaskset.cc:624
 hmdctaskset.cc:625
 hmdctaskset.cc:626
 hmdctaskset.cc:627
 hmdctaskset.cc:628
 hmdctaskset.cc:629
 hmdctaskset.cc:630
 hmdctaskset.cc:631
 hmdctaskset.cc:632
 hmdctaskset.cc:633
 hmdctaskset.cc:634
 hmdctaskset.cc:635
 hmdctaskset.cc:636
 hmdctaskset.cc:637
 hmdctaskset.cc:638
 hmdctaskset.cc:639
 hmdctaskset.cc:640
 hmdctaskset.cc:641
 hmdctaskset.cc:642
 hmdctaskset.cc:643
 hmdctaskset.cc:644
 hmdctaskset.cc:645
 hmdctaskset.cc:646
 hmdctaskset.cc:647
 hmdctaskset.cc:648
 hmdctaskset.cc:649
 hmdctaskset.cc:650
 hmdctaskset.cc:651
 hmdctaskset.cc:652
 hmdctaskset.cc:653
 hmdctaskset.cc:654
 hmdctaskset.cc:655
 hmdctaskset.cc:656
 hmdctaskset.cc:657
 hmdctaskset.cc:658
 hmdctaskset.cc:659
 hmdctaskset.cc:660
 hmdctaskset.cc:661
 hmdctaskset.cc:662
 hmdctaskset.cc:663
 hmdctaskset.cc:664
 hmdctaskset.cc:665
 hmdctaskset.cc:666
 hmdctaskset.cc:667
 hmdctaskset.cc:668
 hmdctaskset.cc:669
 hmdctaskset.cc:670
 hmdctaskset.cc:671
 hmdctaskset.cc:672
 hmdctaskset.cc:673
 hmdctaskset.cc:674
 hmdctaskset.cc:675
 hmdctaskset.cc:676
 hmdctaskset.cc:677
 hmdctaskset.cc:678
 hmdctaskset.cc:679
 hmdctaskset.cc:680
 hmdctaskset.cc:681
 hmdctaskset.cc:682
 hmdctaskset.cc:683
 hmdctaskset.cc:684
 hmdctaskset.cc:685
 hmdctaskset.cc:686
 hmdctaskset.cc:687
 hmdctaskset.cc:688
 hmdctaskset.cc:689
 hmdctaskset.cc:690
 hmdctaskset.cc:691
 hmdctaskset.cc:692
 hmdctaskset.cc:693
 hmdctaskset.cc:694
 hmdctaskset.cc:695
 hmdctaskset.cc:696
 hmdctaskset.cc:697
 hmdctaskset.cc:698
 hmdctaskset.cc:699
 hmdctaskset.cc:700
 hmdctaskset.cc:701
 hmdctaskset.cc:702
 hmdctaskset.cc:703
 hmdctaskset.cc:704
 hmdctaskset.cc:705
 hmdctaskset.cc:706
 hmdctaskset.cc:707
 hmdctaskset.cc:708
 hmdctaskset.cc:709
 hmdctaskset.cc:710
 hmdctaskset.cc:711
 hmdctaskset.cc:712
 hmdctaskset.cc:713
 hmdctaskset.cc:714
 hmdctaskset.cc:715
 hmdctaskset.cc:716
 hmdctaskset.cc:717
 hmdctaskset.cc:718
 hmdctaskset.cc:719
 hmdctaskset.cc:720
 hmdctaskset.cc:721
 hmdctaskset.cc:722
 hmdctaskset.cc:723
 hmdctaskset.cc:724
 hmdctaskset.cc:725
 hmdctaskset.cc:726
 hmdctaskset.cc:727
 hmdctaskset.cc:728
 hmdctaskset.cc:729
 hmdctaskset.cc:730
 hmdctaskset.cc:731
 hmdctaskset.cc:732
 hmdctaskset.cc:733
 hmdctaskset.cc:734
 hmdctaskset.cc:735
 hmdctaskset.cc:736
 hmdctaskset.cc:737
 hmdctaskset.cc:738
 hmdctaskset.cc:739
 hmdctaskset.cc:740
 hmdctaskset.cc:741
 hmdctaskset.cc:742
 hmdctaskset.cc:743
 hmdctaskset.cc:744
 hmdctaskset.cc:745
 hmdctaskset.cc:746
 hmdctaskset.cc:747
 hmdctaskset.cc:748
 hmdctaskset.cc:749
 hmdctaskset.cc:750
 hmdctaskset.cc:751
 hmdctaskset.cc:752
 hmdctaskset.cc:753
 hmdctaskset.cc:754
 hmdctaskset.cc:755
 hmdctaskset.cc:756
 hmdctaskset.cc:757
 hmdctaskset.cc:758
 hmdctaskset.cc:759
 hmdctaskset.cc:760
 hmdctaskset.cc:761
 hmdctaskset.cc:762
 hmdctaskset.cc:763
 hmdctaskset.cc:764
 hmdctaskset.cc:765
 hmdctaskset.cc:766
 hmdctaskset.cc:767
 hmdctaskset.cc:768
 hmdctaskset.cc:769
 hmdctaskset.cc:770
 hmdctaskset.cc:771
 hmdctaskset.cc:772
 hmdctaskset.cc:773
 hmdctaskset.cc:774
 hmdctaskset.cc:775
 hmdctaskset.cc:776
 hmdctaskset.cc:777
 hmdctaskset.cc:778
 hmdctaskset.cc:779
 hmdctaskset.cc:780
 hmdctaskset.cc:781
 hmdctaskset.cc:782
 hmdctaskset.cc:783
 hmdctaskset.cc:784
 hmdctaskset.cc:785
 hmdctaskset.cc:786
 hmdctaskset.cc:787
 hmdctaskset.cc:788
 hmdctaskset.cc:789
 hmdctaskset.cc:790
 hmdctaskset.cc:791
 hmdctaskset.cc:792
 hmdctaskset.cc:793
 hmdctaskset.cc:794
 hmdctaskset.cc:795
 hmdctaskset.cc:796
 hmdctaskset.cc:797
 hmdctaskset.cc:798
 hmdctaskset.cc:799
 hmdctaskset.cc:800
 hmdctaskset.cc:801
 hmdctaskset.cc:802
 hmdctaskset.cc:803
 hmdctaskset.cc:804
 hmdctaskset.cc:805
 hmdctaskset.cc:806
 hmdctaskset.cc:807
 hmdctaskset.cc:808
 hmdctaskset.cc:809
 hmdctaskset.cc:810
 hmdctaskset.cc:811
 hmdctaskset.cc:812
 hmdctaskset.cc:813
 hmdctaskset.cc:814
 hmdctaskset.cc:815
 hmdctaskset.cc:816
 hmdctaskset.cc:817
 hmdctaskset.cc:818
 hmdctaskset.cc:819
 hmdctaskset.cc:820
 hmdctaskset.cc:821
 hmdctaskset.cc:822
 hmdctaskset.cc:823
 hmdctaskset.cc:824
 hmdctaskset.cc:825
 hmdctaskset.cc:826
 hmdctaskset.cc:827
 hmdctaskset.cc:828
 hmdctaskset.cc:829
 hmdctaskset.cc:830
 hmdctaskset.cc:831
 hmdctaskset.cc:832
 hmdctaskset.cc:833
 hmdctaskset.cc:834
 hmdctaskset.cc:835
 hmdctaskset.cc:836
 hmdctaskset.cc:837
 hmdctaskset.cc:838
 hmdctaskset.cc:839
 hmdctaskset.cc:840
 hmdctaskset.cc:841
 hmdctaskset.cc:842
 hmdctaskset.cc:843
 hmdctaskset.cc:844
 hmdctaskset.cc:845
 hmdctaskset.cc:846
 hmdctaskset.cc:847
 hmdctaskset.cc:848
 hmdctaskset.cc:849
 hmdctaskset.cc:850
 hmdctaskset.cc:851
 hmdctaskset.cc:852
 hmdctaskset.cc:853
 hmdctaskset.cc:854
 hmdctaskset.cc:855
 hmdctaskset.cc:856
 hmdctaskset.cc:857
 hmdctaskset.cc:858
 hmdctaskset.cc:859
 hmdctaskset.cc:860
 hmdctaskset.cc:861
 hmdctaskset.cc:862
 hmdctaskset.cc:863
 hmdctaskset.cc:864
 hmdctaskset.cc:865
 hmdctaskset.cc:866
 hmdctaskset.cc:867
 hmdctaskset.cc:868
 hmdctaskset.cc:869
 hmdctaskset.cc:870
 hmdctaskset.cc:871
 hmdctaskset.cc:872
 hmdctaskset.cc:873
 hmdctaskset.cc:874
 hmdctaskset.cc:875
 hmdctaskset.cc:876
 hmdctaskset.cc:877
 hmdctaskset.cc:878
 hmdctaskset.cc:879
 hmdctaskset.cc:880
 hmdctaskset.cc:881
 hmdctaskset.cc:882
 hmdctaskset.cc:883
 hmdctaskset.cc:884
 hmdctaskset.cc:885
 hmdctaskset.cc:886
 hmdctaskset.cc:887
 hmdctaskset.cc:888
 hmdctaskset.cc:889
 hmdctaskset.cc:890
 hmdctaskset.cc:891
 hmdctaskset.cc:892
 hmdctaskset.cc:893
 hmdctaskset.cc:894
 hmdctaskset.cc:895
 hmdctaskset.cc:896