//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcEvtMixTask // see PndTpcEvtMixTask.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcEvtMixTask.h" // C/C++ Headers ---------------------- // Collaborating Class Headers -------- #include "FairRootManager.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "TClonesArray.h" #include "PndTpcSignal.h" #include "PndTpcDigi.h" #include "PndTpcDigiMapper.h" #include "PndTpcEvtTime.h" #include "PndTpcDigiPar.h" #include "PndTpcPad.h" #include "PndTpcPadPlane.h" #include "TRandom.h" #include "TFile.h" #include "TTree.h" #include "TBranch.h" #include #include // Class Member definitions ----------- using std::deque; PndTpcEvtMixTask::PndTpcEvtMixTask() : FairTask("TPC Background Event Addmixer"), finBranchName("PndTpcSignal"), fbkgBranchName("PndTpcSignal"), fbkgFileName(""), fsignalArray(NULL), ftimeArray(NULL), fbkgArray(NULL), fpersistence(kFALSE), fnbkgEvts(0), fmeanEvtSpacing(0), ft0(0), fdoTimeSim(false) {} PndTpcEvtMixTask::~PndTpcEvtMixTask() { if(fbkgBranch!=NULL){ delete fbkgBranch; } if(fbkgTree!=NULL){ delete fbkgTree; } if(finFile!=NULL){ finFile->Close(); delete finFile; } } void PndTpcEvtMixTask::SetParContainers() { std::cout<<"PndTpcEvtMixTask::SetParContainers"<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get PndTpc digitisation parameter container fpar= (PndTpcDigiPar*) db->getContainer("PndTpcDigiPar"); if (! fpar ) Fatal("SetParContainers", "PndTpcDigiPar not found"); } InitStatus PndTpcEvtMixTask::Init() { std::cout<< "PndTpcEvtMixTask::Init()" <GetObject(finBranchName); if(fsignalArray==0) { Error("Init","signal-array not found!"); return kERROR; } // open input file with background events if(fbkgFileName.IsNull()) { Error("Init","background file not found"); return kERROR; } finFile=TFile::Open(fbkgFileName,"READ"); if(!finFile->IsOpen()) { Error("Init","background file could not be opened"); return kERROR; } fbkgTree=(TTree*)finFile->Get("cbmsim"); if(fbkgTree==NULL) { Error("Init","cbmsim tree not found in bkgfile"); return kERROR; } //check if there are enough bkg events in tree Int_t n=fbkgTree->GetEntries(); if(nSetBranchAddress(fbkgBranchName,&fbkgArray); fbkgTree->SetBranchAddress("PndTpcEvtTime",&ftimeArray); fnAvailableBkgEvents=fbkgTree->GetEntries(); fpadPlane= fpar->getPadPlane(); // store timing info in this event ftimeOutArray = new TClonesArray("PndTpcEvtTime"); ioman->Register("PndTpcEvtTime","PndTpc",ftimeOutArray,fpersistence); return kSUCCESS; } void PndTpcEvtMixTask::Exec(Option_t* opt) { std::cout<< "PndTpcEvtMixTask::Exec" << std::endl; // clean up fTimeArray ftimeArray->Delete(); // Look at this event geantHits in the TPC: Int_t iout=fsignalArray->GetEntriesFast(); std::cout< availableEvents; for(unsigned int i=0;iInteger(availableEvents.size()); Int_t selectEvt=availableEvents.at(EventNum); // remove event from list of availables availableEvents.erase(availableEvents.begin()+EventNum); // ------------- fbkgTree->GetEntry(selectEvt); double tevent=((PndTpcEvtTime*)ftimeArray->At(0))->t0(); // if reshuffel if(fdoTimeSim){ teventSim+=gRandom->Exp(fmeanEvtSpacing); new ((*ftimeOutArray)[i]) PndTpcEvtTime(tevent,selectEvt+1); tevent=teventSim; } double teventClock=PndTpcDigiMapper::getInstance()->t_to_ticks(tevent); //std::cout<<"tevent="<GetEntriesFast(); for(Int_t ip=0;ipAt(ip); // check if signal lies in region of interest unsigned int sec=fpadPlane->GetPad(sig->padId())->sectorId(); if(fsectors.size()>0 && fsectors.find(sec)==fsectors.end()){ // std::cout << "Skipping sig. Sector" // << sec << " not in list." << std::endl; continue; } // TODO: modify time of point according to event time sig->sett(sig->t()+tevent); sig->setmcEventId(selectEvt+1); // add because evt 0 = physics event! // Add background to point-array of this event new((*fsignalArray)[iout++]) PndTpcSignal(*sig); } // if doSignals else { PndTpcDigi* digi=(PndTpcDigi*)fbkgArray->At(ip); // check if signal lies in region of interest unsigned int sec=fpadPlane->GetPad(digi->padId())->sectorId(); if(fsectors.size()>0 && fsectors.find(sec)==fsectors.end()){ // std::cout << "Skipping sig. Sector" // << sec << " not in list." << std::endl; continue; } // TODO: modify time of point according to event time digi->t(digi->t()+teventClock); digi->shiftEventIds(selectEvt+1); // Add background to point-array of this event new((*fsignalArray)[iout++]) PndTpcDigi(*digi); } // end digis } } //fbkgArray->Print(); std::cout<GetEntriesFast()<<" total signals in signalArray"<