//* $Id: */ // Includes from GEM #include "PndAnandDetectorDigitize.h" // Includes from base #include "FairRootManager.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" #include "FairLink.h" // Includes from ROOT #include "TClonesArray.h" #include "TObjArray.h" #include "TMath.h" #include "TGeoManager.h" #include "TGeoNode.h" #include "PndDetectorList.h" #include "PndAnandDetectorPoint.h" #include "PndAnandDetectorDigi.h" #include "PndAnandDetectorDigiWriteoutBuffer.h" #include #include #include using std::cout; using std::cerr; using std::endl; using std::pair; using std::setw; using std::left; using std::right; using std::fixed; using std::setprecision; using std::map; // ----- Default constructor ------------------------------------------ PndAnandDetectorDigitize::PndAnandDetectorDigitize() : FairTask("ANAND Digitizer", 0), fPoints(NULL), fNPoints(0), fNDigis(0), fTNofEvents(0), fTNofPoints(0), fTNofDigis(0), fRunTimeBased(kFALSE), fDataBuffer(0) { Reset(); } // ------------------------------------------------------------------------- // ----- Constructor with name ----------------------------------------- PndAnandDetectorDigitize::PndAnandDetectorDigitize(const char* name, Int_t iVerbose) : FairTask(name, iVerbose), fPoints(NULL), fNPoints(0), fNDigis(0), fTNofEvents(0), fTNofPoints(0), fTNofDigis(0), fRunTimeBased(kFALSE), fDataBuffer(0) { Reset(); } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- PndAnandDetectorDigitize::~PndAnandDetectorDigitize() { Reset(); } // ------------------------------------------------------------------------- // ----- Public method Exec -------------------------------------------- void PndAnandDetectorDigitize::Exc(Option_t* opt) { Reset(); if ( fVerbose ) cout << "EVENT " << fTNofEvents << endl; fNPoints = fPoints->GetEntriesFast(); Double_t EventTime = FairRootManager::Instance()->GetEventTime(); for ( Int_t iPoint = 0 ; iPoint < fNPoints ; iPoint++ ) { PndAnandDetectorPoint* currentPoint = (PndAnandDetectorPoint*)fPoints->At(iPoint); Int_t pixelNumber = TMath::Floor(500.+currentPoint->GetX())*1000.+ TMath::Floor(500.+currentPoint->GetY())*1.; Int_t stationNumber = TMath::Floor((currentPoint->GetZ()+5.)/10.); PndAnandDetectorDigi* adigi = new PndAnandDetectorDigi(stationNumber,pixelNumber,EventTime+currentPoint->GetTime()); fDataBuffer->FillNewData(adigi, adigi->GetTimeStamp(), adigi->GetTimeStamp()+50.); // 50 ns dead time fNDigis++; } if ( fVerbose ) { cout << "---PndAnandDetectorDigitize---> Event " << fTNofEvents << " at " << EventTime << " ns" << " has " << fNDigis << " digis made from " << fNPoints << " points." << endl; } fTNofEvents++; fTNofPoints+=fNPoints; fTNofDigis +=fNDigis; } // ------------------------------------------------------------------------- // ----- Private method SetParContainers ------------------------------- void PndAnandDetectorDigitize::SetParContainers() { // Get run and runtime database FairRunAna* run = FairRunAna::Instance(); if ( ! run ) Fatal("SetParContainers", "No analysis run"); FairRuntimeDb* db = run->GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); } // ------------------------------------------------------------------------- // ----- Private method Init ------------------------------------------- InitStatus PndAnandDetectorDigitize::Init() { // Get input array FairRootManager* ioman = FairRootManager::Instance(); if ( ! ioman ) Fatal("Init", "No FairRootManager"); fPoints = (TClonesArray*) ioman->GetObject("PndDetectorPoint"); // Register output buffer fDataBuffer = new PndAnandDetectorDigiWriteoutBuffer("AnandDigi", "ANAND", kTRUE); fDataBuffer = (PndAnandDetectorDigiWriteoutBuffer*)ioman->RegisterWriteoutBuffer("AnandDigi", fDataBuffer); fDataBuffer->ActivateBuffering(fRunTimeBased); cout << "-I- " << fName.Data() << "::Init(). Initialization succesfull." << endl; return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Private method ReInit ----------------------------------------- InitStatus PndAnandDetectorDigitize::ReInit() { return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Private method Reset ------------------------------------------ void PndAnandDetectorDigitize::Reset() { fNPoints = 0; fNDigis = 0; } // ------------------------------------------------------------------------- // ----- Public method Finish ------------------------------------------ void PndAnandDetectorDigitize::Finish() { cout << "-------------------- " << fName.Data() << " : Summary ------------------------" << endl; cout << " Events: " << setw(10) << fTNofEvents << endl; cout << " MC Points: " << setw(10) << fTNofPoints << " ( " << (Double_t)fTNofPoints/((Double_t)fTNofEvents) << " per event )" << endl; cout << " Digis: " << setw(10) << fTNofDigis << " ( " << (Double_t)fTNofDigis /((Double_t)fTNofEvents) << " per event " << endl; cout << " --> " << (Double_t)fTNofDigis /((Double_t)fTNofPoints) << " per point )" << endl; cout << "---------------------------------------------------------------------" << endl; } // ------------------------------------------------------------------------- ClassImp(PndAnandDetectorDigitize)