// ------------------------------------------------------------------------- // ----- PndLmdPixelClusterTasksource file ----- // ------------------------------------------------------------------------- #include "PndLmdPixelClusterTask.h" #include "PndSdsPixelDigiPar.h" #include "PndLmdContFact.h" #include "PndLmdAlignPar.h" #include "PndLmdDim.h" #include "TLorentzVector.h" //FAIR #include "FairRun.h" #include "FairRuntimeDb.h" #include "FairBaseParSet.h" #include "FairRunAna.h" // ----- Default constructor ------------------------------------------- PndLmdPixelClusterTask::PndLmdPixelClusterTask() : PndSdsPixelClusterTask("LMD Clustertisation Task") { fPersistance = kTRUE; fAlignParamList = new TList(); readAlign = true; flagMS = true; } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- PndLmdPixelClusterTask::~PndLmdPixelClusterTask() { } // ------------------------------------------------------------------------- InitStatus PndLmdPixelClusterTask::Init() { FairBaseParSet* par=(FairBaseParSet*)(rtdb->findContainer("FairBaseParSet")); fPbeam = par->GetBeamMom(); SetBranchNames(); SetBackMapping(); SetClusterFinder(); FairRootManager* ioman = FairRootManager::Instance(); if ( ! ioman ) { std::cout << "-E- PndSdsPixelClusterTask::Init: " << "RootManager not instantiated!" << std::endl; return kFATAL; } // Get input array fDigiArray = (TClonesArray*) ioman->GetObject(fInBranchName); // if ( ! fDigiArray ) { std::cout << "-E- PndSdsPixelClusterTask::Init: " << "No SDSDigi array!" << std::endl; return kERROR; } fClusterArray = ioman->Register(fClustBranchName, "PndSdsClusterPixel", fFolderName, fPersistance); fHitArray = ioman->Register(fOutBranchName, "PndSdsHit", fFolderName, fPersistance); SetInBranchId(); fFunctor = new TimeGap(); fStartFunctor = new StopTime(); if(fVerbose>1) fDigiPar->Print(); std::cout << "-I- PndSdsPixelClusterTask: Initialisation successfull" << std::endl; return kSUCCESS; } // ------------------------------------------------------------------------- // ----- Initialization of Parameter Containers ------------------------- void PndLmdPixelClusterTask::SetParContainers() { // Get Base Container ana = FairRun::Instance(); rtdb=ana->GetRuntimeDb(); fDigiPar = (PndSdsPixelDigiPar*)(rtdb->getContainer("SDSPixelDigiPar")); rtdb->getContainer("SDSPixelTotDigiPar"); //Read lmd geo description. still not sure where and how to do it as soon as Init stays in PndSdsPixelClusterTask lmddim = PndLmdDim::Instance(); // lmddim -> Read_transformation_matrices("matrices.txt", true); lmddim -> Read_transformation_matrices("matrices_perfect.txt", false); PndLmdContFact* themvdcontfact = (PndLmdContFact*)rtdb->getContFactory("PndLmdContFact"); //read params for lumi alignment TList* theAlignLMDContNames = themvdcontfact->GetAlignParNames(); Info("SetParContainers()","AlignLMD The container names list contains %i entries",theAlignLMDContNames->GetEntries()); TIter cfAlIter(theAlignLMDContNames); while (TObjString* contname = (TObjString*)cfAlIter()) { TString parsetname = contname->String(); Info("SetParContainers()",parsetname.Data()); PndLmdAlignPar *lmdalignpar = (PndLmdAlignPar*)(rtdb->getContainer(parsetname.Data())); if(!lmdalignpar) Fatal("SetParContainers","No ALIGN parameter found: %s",parsetname.Data()); fAlignParamList->Add(lmdalignpar); } // PndSdsPixelClusterTask::SetParContainers(); } void PndLmdPixelClusterTask::SetAlignConst(){ TIter alignparams(fAlignParamList); PndLmdAlignPar* lmdalignpar=(PndLmdAlignPar*)alignparams(); if(0==lmdalignpar) { Error("PndLmdStripClusterTask::SetCalculators()","A ALIGN Parameter Set does not exist properly."); } else{ // lmdalignpar->Print(); Int_t nsens = lmdalignpar->GetNsensors(); Int_t nsides = lmdalignpar->GetNsides(); Int_t nplanes = lmdalignpar->GetNplanes(); for(int ik=0;ikGetShiftX(ik)); fShiftY.push_back(lmdalignpar->GetShiftY(ik)); fShiftZ.push_back(lmdalignpar->GetShiftZ(ik)); fRotateX.push_back(lmdalignpar->GetRotateX(ik)); fRotateY.push_back(lmdalignpar->GetRotateY(ik)); fRotateZ.push_back(lmdalignpar->GetRotateZ(ik)); if (fVerbose > 2) cout<<"fShiftX["<1140 && zhit<1150) num=1; if(zhit>1150 && zhit<1160) num=2; if(zhit>1160 && zhit<1170) num=3; // cout<<"Plane #"<SetVerbose(fVerbose); Double_t EventTime = FairRootManager::Instance()->GetEventTime(); if(fVerbose>0) std::cout << "-I- PndSdsPixelClusterTask::Exec EventTime: " << EventTime << std::endl; if (FairRunAna::Instance()->IsTimeStamp()){ fDigiArray = FairRootManager::Instance()->GetData(fInBranchName, fStartFunctor, EventTime + 10); } if ( ! fHitArray ) Fatal("Exec", "No HitArray"); Int_t nPoints = fDigiArray->GetEntriesFast(); //std::cout << "Points in DigiArray: " << nPoints << std::endl; // convert from TClonesArray to a std::vector for (Int_t iPoint = 0; iPoint < nPoints; iPoint++){ PndSdsDigiPixel myDigi = *(PndSdsDigiPixel*)(fDigiArray->At(iPoint)); DigiPixelArray.push_back(myDigi); } // Retrieve the calculated clusters with the chosen clusterfinder std::vector< std::vector< Int_t> > clusters = fClusterFinder->GetClusters(DigiPixelArray); if(fVerbose>1) std::cout << " -I- PndSdsPixelClusterTask::Exec(): We have "<IsTimeStamp()){ // std::cout << "TempCluster: " << *tempCluster << std::endl; tempCluster->ResetLinks(); for (UInt_t j = 0; j < clusters[i].size(); j++){ PndSdsDigiPixel* tempDigi = (PndSdsDigiPixel*)fDigiArray->At(clusters[i][j]); // std::cout << "TempDigi: " << *tempDigi << std::endl; // std::cout << "EntryNr: "; // tempDigi->GetEntryNr().Print(); // std::cout << std::endl; tempCluster->AddLink(FairLink(tempDigi->GetEntryNr())); // std::cout << "Links: " << (FairMultiLinkedData)(*tempCluster) << std::endl; } } } // do the backmapping with charge-weight for (UInt_t i = 0; i < clusters.size(); i++) { // if(fVerbose>2) std::cout << clusters[i].size() << " " << std::endl; std::vector clusterArray; for (UInt_t j=0;j < clusters[i].size();j++) { // convert clusterArray.push_back(DigiPixelArray[clusters[i][j]]); } // mapping with the choosen back mapping PndSdsHit myHit = fBackMapping->GetCluster(clusterArray); myHit.SetClusterIndex(fClusterType,i, 0, fEventNr); TMatrixD hitCov = myHit.GetCov(); // hitCov.Print(); hitCov(0,0) = 5.56960000000000085e-06; //assuming hit resolution for x-y 23.6 mkm hitCov(1,1) = 5.56960000000000085e-06; //assuming hit resolution for x-y 23.6 mkm hitCov(2,2) = 4.28489999999999954e-08; //assuming hit resolution for z 2.07 mkm //Add multiple scattering error --------------- if(flagMS){ TVector3 hitPos = myHit.GetPosition(); TVector3 hitErr(sqrt(hitCov[0][0]),sqrt(hitCov[1][1]),sqrt(hitCov[2][2])); TVector3 hitErrMSadd = AddMSErr(hitPos, hitErr); hitCov[0][0] = TMath::Power(hitErrMSadd.X(),2); hitCov[1][1] = TMath::Power(hitErrMSadd.Y(),2); hitCov[2][2] = TMath::Power(hitErrMSadd.Z(),2); } myHit.SetCov(hitCov);//save value //translate to LUMI frame -------------------- // if(fVerbose>0){ // cout<<"Before transl to LUMI frame:"<Transform_global_to_lmd_local(hitPos, false, false); // hitCov = lmddim->Transform_global_to_lmd_local(hitCov, false); // if(fVerbose>0){ // cout<<"After Transform_global_to_lmd_local:"<0){ std::cout << " -I- PndSdsPixelClusterTask::Exec(): Calculated Hit(LUMI frame): " << std::endl; myHit.Print(); ((FairMultiLinkedData)(myHit)).Print(); } new ((*fHitArray)[i]) PndSdsHit(myHit); } if(fVerbose>1)std::cout << std::endl; if(fVerbose>1){ std::cout << "-I- PndSdsPixelClusterTask: " << fClusterArray->GetEntriesFast() << " Sds Clusters and " << fHitArray->GetEntriesFast()<<" Hits calculated." << std::endl; } fEventNr++; fHitArray->Sort(); return; } ClassImp(PndLmdPixelClusterTask);