//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "TpcLaserCorrectionTask.h" // C/C++ Headers ---------------------- // Collaborating Class Headers -------- #include "FairRootManager.h" #include "TClonesArray.h" #include "TFile.h" #include "TTree.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" #include "TpcDigiPar.h" #include "BiCubSpline.h" #include "TpcCluster.h" #include #include // Class Member definitions ----------- TpcLaserCorrectionTask::TpcLaserCorrectionTask() : FairTask("TPC LaserCorrection"), fpersistence(kFALSE), fSplineBranchName("TpcLaserSplineFits"), fclusterBranchName("TpcCluster") { frecoFileName = "laser.new.reco.root"; } TpcLaserCorrectionTask::~TpcLaserCorrectionTask() { if(frecoFile!=NULL) { frecoFile->Close(); delete frecoFile; } } InitStatus TpcLaserCorrectionTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("TpcLaserCorrectionTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fclusterArray=(TClonesArray*) ioman->GetObject(fclusterBranchName); if(fclusterArray==0) { Error("TpcLaserCorrectionTask::Init","Cluster-array not found!"); return kERROR; } // create and register output array fbackupBranchName = fclusterBranchName.Append("funcorrected"); fbackupArray = new TClonesArray("TpcPrimaryCluster"); ioman->Register(fbackupBranchName,"Tpc",fbackupArray,fpersistence); // fzMin=fpar->getZGem(); // fzMax=fpar->getZMax(); // frMin=fpar->getRMin(); // frMax=fpar->getRMax(); frecoFile = new TFile(frecoFileName); if(frecoFile->IsZombie()) { Error("TpcLaserCorrectionTask::Init","LaserReco-File not valid! Aborting ..."); return kERROR; } TTree* tr = (TTree*) frecoFile->Get("cbmsim"); if(tr==NULL) { Error("TpcLaserCorrectionTask::Init", "Could not read tree from LaserReco-File! Aborting ..."); return kERROR; } TClonesArray* arr = new TClonesArray("BiCubSpline"); tr->SetBranchAddress(fSplineBranchName, &arr); tr->GetEvent(0); if(arr->GetEntriesFast()!=4) { Fatal("TpcLaserCorrectionTask::Init", "Unexpected number of Spline objects in Laser reco file!"); return kERROR; } frecoMapR = (BiCubSpline*) arr->At(2); frecoMapPerp = (BiCubSpline*) arr->At(3); if(frecoMapR == NULL || frecoMapPerp == NULL) { Error("TpcLaserCorrectionTask::Init", "Could not read Spline objects from LaserReco-File! Aborting ..."); } return kSUCCESS; } void TpcLaserCorrectionTask::SetParContainers() { std::cout<<"TpcLaserCorrectionTask::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"); } void TpcLaserCorrectionTask::Exec(Option_t* opt) { // Reset output Array if(fbackupArray==0) Fatal("TpcLaserCorrectionTask::Exec)","No BackupClusterArray"); fbackupArray->Delete(); Int_t ncl=fclusterArray->GetEntriesFast(); TVector3 clpos; //begin looping over clusters for(unsigned int clust=0; clustAt(clust); //make and store copy of uncorrected cluster //TpcCluster* cl_back = new((*fbackupArray)[clust]) TpcCluster(*cl); clpos = cl->pos(); double phi = clpos.Phi(); //rotate cl into X-Z plane in which the deviation map is defined clpos.RotateZ(-phi); double r = clpos.X(); double z = clpos.Z(); //read reco-deviations double reco_dr = frecoMapR->eval(z,r); double reco_dperp = frecoMapPerp->eval(z,r); clpos.SetXYZ(r-reco_dr,-reco_dperp,z); //rotate back clpos.RotateZ(phi); cl->fpos = clpos; } //end loop over clusters return; } ClassImp(TpcLaserCorrectionTask)