// ------------------------------------------------------------------------- // ----- PndMvdRates source file ----- // ------------------------------------------------------------------------- #include "TClonesArray.h" #include "FairRootManager.h" #include "PndMvdRates.h" #include "PndSdsHit.h" #include "PndSdsDigiStrip.h" #include "PndSdsMCPoint.h" #include "PndSdsCalcStrip.h" #include "PndSdsStripDigiPar.h" #include "PndSdsTotDigiPar.h" #include "PndSdsGeoPar.h" #include "PndMvdContFact.h" #include "PndSdsStripClusterTask.h" #include "FairMCEventHeader.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairParamList.h" #include "TList.h" #include "FairParAsciiFileIo.h" #include // ----- Default constructor ------------------------------------------- PndMvdRates::PndMvdRates() : PndSdsTask("Rates Estimates"), fPersistance(kTRUE) { fFE = 0; fSens = 95; fDigiParameterList = new TList(); fOutName = "output.txt"; } // ------------------------------------------------------------------------- // ----- Named constructor ------------------------------------------- PndMvdRates::PndMvdRates(const char* name) : PndSdsTask(name), fPersistance(kTRUE) { fFE = 0; fSens = 95; fDigiParameterList = new TList(); fOutName = "output.txt"; } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- PndMvdRates::~PndMvdRates() { std::cout << "bye" << std::endl; } // ----- Public method Init -------------------------------------------- InitStatus PndMvdRates::Init() { SetParContainers(); // Get RootManager FairRootManager* ioman = FairRootManager::Instance(); SetBranchNames(); if ( ! ioman ) { std::cout << "-E- PndMvdRates::Init: " << "RootManager not instantiated!" << std::endl; return kFATAL; } // Get input array fPointArray = (TClonesArray*) ioman->GetObject("MVDPoint"); if ( ! fPointArray ) { std::cout << "-W- PndMvdRates::Init: " << "No SDSPoint array!" << std::endl; return kERROR; } // Get digi array fDigiArray = (TClonesArray*) ioman->GetObject("MVDStripDigis"); if ( ! fDigiArray ) { std::cout << "-W- PndMvdRates::Init: " << "No SDSDigi array!" << std::endl; return kERROR; } // Get MC event header mch = (FairMCEventHeader*) ioman->GetObject("MCEventHeader."); if ( ! mch ) { std::cout << "-W- PndMvdRates::Init: " << "No MC event Header found!" << std::endl; return kERROR; } // open text output file out.open(fOutName.Data()); out.precision(10); std::cout << "-I- PndMvdRates: Intialisation successfull" << std::endl; return kSUCCESS; } // ------------------------------------------------------------------------- void PndMvdRates::SetParContainers() { if ( fGeoH == NULL ) { fGeoH = PndGeoHandling::Instance(); } fGeoH->SetParContainers(); FairRun* ana = FairRun::Instance(); FairRuntimeDb* rtdb = ana->GetRuntimeDb(); PndMvdContFact* themvdcontfact = (PndMvdContFact*)rtdb->getContFactory("PndMvdContFact"); digipar = (PndSdsStripDigiPar*)(rtdb->getContainer("MVDStripDigiParRect")); } // ------------------------------------------------------------------------- void PndMvdRates::SetBranchNames() { std::cout << "bla" << std::endl; // Get Base Container FairRun* ana = FairRun::Instance(); FairRuntimeDb* rtdb=ana->GetRuntimeDb(); fGeoPar = (PndSdsGeoPar*)(rtdb->getContainer("PndSdsGeoPar")); } void PndMvdRates::FinishTask() { std:cout << "Finishing task: adding lastTime to the output file" << std::endl; out << "**** " << LastTime << endl; } // ----- Public method Exec -------------------------------------------- void PndMvdRates::Exec(Option_t* opt) { // Declare some variables PndSdsMCPoint *point = 0; PndSdsDigiStrip *digi = 0; PndSdsStripDigiPar *parpar = new PndSdsStripDigiPar("MVDStripDigiParRect"); TVector3 inG,outG,inL,outL,meanG,meanL; TVector3 Anchor(-3.3345,1.6705,0); Int_t nDigi = fDigiArray->GetEntriesFast(); Double_t strTop,strBottom; Double_t strInTop,strOutTop; Double_t strInBottom,strOutBottom; Double_t time = mch->GetT(); // getting MC event start time Double_t totTime; // event start time + TOF for (Int_t iDigi = 0; iDigi < nDigi; iDigi++) { digi = (PndSdsDigiStrip*) fDigiArray->At(iDigi); if ( (digi->GetSensorID() == fSens) && (digi->GetFE() == fFE) ) { std::cout << " SensorID: " << digi->GetSensorID() << std::endl; std::cout << " Path: " << fGeoH->GetPath(digi->GetSensorID()) << std::endl; if (digi->GetLink(0).GetIndex() == -1) continue; point = (PndSdsMCPoint*) fPointArray->At(digi->GetLink(0).GetIndex()); totTime = time + point->GetTime(); inG = point->GetPosition(); outG = point->GetPositionOut(); inL = fGeoH->MasterToLocalShortId(inG,digi->GetSensorID()); outL = fGeoH->MasterToLocalShortId(outG,digi->GetSensorID()); meanL = (inL+outL)*0.5; //inG.Print(); //inL.Print(); //outG.Print(); //outL.Print(); PndSdsCalcStrip calcTop(digipar,kTOP); PndSdsCalcStrip calcBottom(digipar,kBOTTOM); strTop = calcTop.CalcStripFromPoint(meanL.X(),meanL.Y()); strBottom = calcBottom.CalcStripFromPoint(meanL.X(),meanL.Y()); strInTop = calcTop.CalcStripFromPoint(inL.X(),inL.Y()); strInBottom = calcBottom.CalcStripFromPoint(inL.X(),inL.Y()); strOutTop = calcTop.CalcStripFromPoint(outL.X(),outL.Y()); strOutBottom = calcBottom.CalcStripFromPoint(outL.X(),outL.Y()); std::cout << "Fired channel: " << digi->GetChannel() << std::endl; std::cout << "TopMean: " << strTop << std::endl; std::cout << "TopIn: " << strInTop << ", TopOut: " << strOutTop << std::endl; out << totTime << " " << digi->GetChannel() << " " << digi->GetCharge() << " " << strTop << " " << strInTop << " " << strOutTop << endl; } } // Loop over MCPoints LastTime=time; } // ------------------------------------------------------------------------- ClassImp(PndMvdRates)