// ------------------------------------------------------------------------- // ----- CbmMvdDetector source file ----- // ----- Created 31/01/11 by M. Deveaux ----- // ------------------------------------------------------------------------- #include "CbmMvdDetector.h" #include using std::cout; using std::endl; //_____________________________________________________________________________ CbmMvdDetector* CbmMvdDetector::fInstance= 0; //_____________________________________________________________________________ CbmMvdDetector* CbmMvdDetector::Instance() { return fInstance; } // ----- Default constructor ------------------------------------------- CbmMvdDetector::CbmMvdDetector() { Fatal (GetName(), " - Do not use standard constructor"); fPluginCount = 0; } // ------------------------------------------------------------------------- // ----- Standard constructor ------------------------------------------ CbmMvdDetector::CbmMvdDetector(const char* name) { if(fInstance) {Fatal(GetName(), " - Error, singleton does already exist.");} else {fInstance=this;}; fSensorArray=new TClonesArray("CbmMvdSensor", 10); fSensorArrayFilled=kFALSE; fPluginCount = 0; } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- CbmMvdDetector::~CbmMvdDetector() { } // -------Setters ----------------------------------------------------- void CbmMvdDetector::AddSensor(TString clearName, TString fullName, TString nodeName, CbmMvdSensorDataSheet* sensorData, Int_t stationNr, Int_t volumeId, Double_t sensorStartTime) { /** * * new sensor is registered in sensor array * * **/ if (fSensorArrayFilled) {Fatal (GetName(), " - Error, must add all sensors before adding plugins.");} Int_t nSensors=fSensorArray->GetEntriesFast(); new ((*fSensorArray)[nSensors]) CbmMvdSensor(clearName, sensorData, fullName, nodeName,stationNr,volumeId,sensorStartTime); //CbmMvdSensor(const char* name, CbmMvdSensorDataSheet* dataSheet, TString volName, //TString nodeName, Int_t stationNr, Int_t volumeId, Double_t sensorStartTime); CbmMvdSensor* sensor = (CbmMvdSensor*)fSensorArray->At(nSensors); sensor->SetDataSheet(sensorData); //cout << endl << "new sensor to detector added" << endl; } // ---------------------------------------------------------------------- void CbmMvdDetector::AddPlugin(CbmMvdSensorPlugin* plugin) { /** * if there is a new buffer or task typ you have to insert it here * or you can't use it. */ fPluginCount++; CbmMvdSensor* sensor; Int_t nSensors=fSensorArray->GetEntriesFast(); const TString digitizername = "CbmMvdSensorDigitizerTask"; const TString findername = "CbmMvdSensorFindHitTask"; const TString framename = "CbmMvdSensorFrameBuffer"; const TString trackingname = "CbmMvdSensorTrackingBuffer"; for (Int_t i=0;iGetPluginType() == task) { if (plugin->ClassName() == digitizername) { CbmMvdSensorDigitizerTask* digiTask = new CbmMvdSensorDigitizerTask(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(digiTask); cout << "Adding Task CbmMvdSensorDigitizerTask at Sensor " << sensor->GetName() << endl; } else if (plugin->ClassName() == findername) { CbmMvdSensorFindHitTask* findTask = new CbmMvdSensorFindHitTask(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(findTask); cout << "Adding Task CbmMvdSensorFindHitTask at Sensor " << sensor->GetName() << endl; } else { cout << endl << "task not included yet, adding standart task." << endl; CbmMvdSensorTask* task = new CbmMvdSensorTask(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(task); } //data parallelizm requires that each sensor get its own task object } else if( plugin->GetPluginType() == buffer) { // cout << endl << "Type is Buffer" << endl; // cout << endl << plugin->ClassName() << endl; if ( plugin->ClassName() == framename) { CbmMvdSensorFrameBuffer* frameBuffer = new CbmMvdSensorFrameBuffer(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(frameBuffer); cout << "Adding Buffer CbmMvdSensorFrameBuffer at Sensor " << sensor->GetName() << endl; } else if ( plugin->ClassName() == trackingname) { CbmMvdSensorTrackingBuffer* trackingBuffer = new CbmMvdSensorTrackingBuffer(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(trackingBuffer); cout << "Adding Buffer CbmMvdSensorTrackingBuffer at Sensor " << sensor->GetName() << endl; } else { cout << endl << "buffer not included yet, adding standart buffer." << endl; CbmMvdSensorBuffer* buffer = new CbmMvdSensorBuffer(); sensor=(CbmMvdSensor*)fSensorArray->At(i); sensor->AddPlugin(buffer); } //data parallelizm requires that each sensor get its own buffer object } else {cout << "Invalide" << endl;} }; }; //---------------------------------------------------------------------- void CbmMvdDetector::Init(){ /** * * Initialisation method * * **/ Int_t nSensors=fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; foutput = new TClonesArray("CbmMvdPoint",1000); fcurrentEvent = new TClonesArray("CbmMvdPoint",1000); foutputDigis = new TClonesArray("CbmMvdDigi",1000); foutputHits = new TClonesArray("CbmMvdHit",1000); for(Int_t j = 0; j < nSensors; j++) { sensor=(CbmMvdSensor*)fSensorArray->At(j); cout << "Init Sensor " << sensor->GetName() << endl; sensor->Init(); } } //----------------------------------------------------------------------- void CbmMvdDetector::SendInput(TClonesArray* input){ /** * * Sending event to sensors, * each sensor gets only his own points * * TODO: find faster way to re-sort points to sensors * * **/ CbmMvdPoint* point; Int_t nEntries = input->GetEntriesFast(); Int_t nSensors=fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t k = 0; k < nSensors; k++) { sensor=(CbmMvdSensor*)fSensorArray->At(k); for (Int_t i = 0; i < nEntries ; i++ ) { point= (CbmMvdPoint*) input->At(i); if (point->GetDetectorID() == sensor->GetDetectorID()) { sensor->SendInput(point); } } } } //----------------------------------------------------------------------- void CbmMvdDetector::ExecChain(){ /** * * method to execute plugin chain on sensors * * **/ Int_t nSensors=fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); //cout << "I------ Send Chain to " << sensor->GetName() << endl; sensor->ExecChain(); //cout << "I------ finished Chain at "<< sensor->GetName() <GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); sensor->Exec(nLevel); } } //----------------------------------------------------------------------- void CbmMvdDetector::ExecFrom(UInt_t nLevel) { } TClonesArray* CbmMvdDetector::GetCurrentEvent(){ /** * Method used for debugging, Plugins have to hold there output until next call */ Int_t nSensors = fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); // foutput = sensor->GetOutputArray(0); fcurrentEvent->AbsorbObjects(sensor->GetOutputArray(0)); } return(fcurrentEvent); } //----------------------------------------------------------------------- TClonesArray* CbmMvdDetector::GetOutputHits(){ /** * method used to write hits to hd */ Int_t nSensors = fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); foutputHits->AbsorbObjects(sensor->GetOutputBuffer()); } return(foutputHits); } //----------------------------------------------------------------------- TClonesArray* CbmMvdDetector::GetOutputDigis(){ /** * method used to write digis to hd */ Int_t nSensors = fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); fDigiPlugin = sensor->GetDigiPlugin(); foutputDigis->AbsorbObjects(sensor->GetOutputArray(fDigiPlugin)); } return(foutputDigis); } //----------------------------------------------------------------------- TClonesArray* CbmMvdDetector::GetOutputArray(Int_t nPlugin){ /** * method used to write processed events to hd */ Int_t nSensors = fSensorArray->GetEntriesFast(); CbmMvdSensor* sensor; for(Int_t i=0; iAt(i); foutputDigis->AbsorbObjects(sensor->GetOutputArray(nPlugin)); } return(foutputDigis); } ClassImp(CbmMvdDetector)