//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Use Abstract class to obtain residuals to a (outside) // reference track // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer (original author) // Physics Department E18, TUM // // //----------------------------------------------------------- #include "TpcMcTrackResidualTask.h" #include "AbsRefTrackResCalc.h" #include "TClonesArray.h" #include "MCTrackResCalc.h" #include "TpcGFTrackMCTrackResidual.h" #include "GFFieldManager.h" #include "TpcDigiPar.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairField.h" #include "FairRunAna.h" #include "PndFieldAdaptor.h" #include #include ClassImp(TpcMcTrackResidualTask) TpcMcTrackResidualTask::TpcMcTrackResidualTask() : fPersistence(kFALSE), fOutArray(NULL), fOutBranch("TpcTrackResidual"), fCalc(NULL), DEBUG(false) { ; } TpcMcTrackResidualTask::~TpcMcTrackResidualTask() { delete fCalc; } InitStatus TpcMcTrackResidualTask::Init() { //check that the residual calculater has been set: if(fCalc==NULL) { Fatal("TpcMcTrackResidualTask::Init()", "No residual calculator has been set! Use SetResCalculator()"); return kFATAL; } //connect to the framework: FairRootManager* ioman = FairRootManager::Instance(); if(ioman==0) { Fatal("TpcMcTrackResidualTask::Init()","RootManager not instantiated!"); return kFATAL; } FairField* field=FairRunAna::Instance()->GetField(); GFFieldManager::getInstance()->init(new PndFieldAdaptor(field)); //get input branches: THESE HAVE TO BE ADDED TO YOUR RES-CALCULATOR //ON MACRO LEVEL BEFORE! std::map* branches = fCalc->getBranchMap(); std::map::iterator it; for(it=branches->begin(); it!=branches->end(); it++) { std::cout<<"TpcMcTrackResidualTask::Init: searching for branch: "<first<GetObject(it->first); if(br==NULL) { std::string s("Branch "); s.append(it->first.Data()); s.append(" requested by residual calculator, but not found in tree!"); Fatal("TpcMcTrackResidualTask::Init()",s.c_str()); } //set this pointer in the calculator's internal map //this way it will point to the TClonesArray handled by the framework it->second = br; } bool err = fCalc->init(); if(err) Fatal("TpcMcTrackResidualTask::Init()", "Calculator init() failed"); //register output array fOutArray = new TClonesArray("TpcGFTrackMCTrackResidual"); ioman->Register(fOutBranch, "Tpc", fOutArray, fPersistence); } void TpcMcTrackResidualTask::Exec(Option_t* opt) { //clear output array: fOutArray->Delete(); //this is basically all that has to happen... //take care of the proper data access and consistency checks inside //fCalc implementation! int err = fCalc->calc(); if(err) { Warning("TpcMcTrackResidualTask::Exec()","ResCalc object returned ERROR!"); return; } std::vector resColl; if(err==0) resColl = fCalc->getResiduals(); if(resColl.size()!=0) { //filling of output array for(unsigned int irc=0; ircGetEntriesFast(); TpcGFTrackMCTrackResidual* res= new((*fOutArray)[size]) TpcGFTrackMCTrackResidual(*(resColl[irc])); } } } void TpcMcTrackResidualTask::SetParContainers() { std::cout<<"TpcAlignmentTask::SetParContainers"<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Tpc digitisation parameter container fPar= (TpcDigiPar*) db->getContainer("TpcDigiPar"); if (! fPar ) Fatal("SetParContainers", "TpcDigiPar not found"); }