//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Reclustering. Redo clustering with the help od track information // // // Environment: // Software developed for the FOPI-TPC Detector at GSI. // // Author List: // Martin Berger TUM (original author) // //----------------------------------------------------------- // This Class' Header --------------------------------------- #include "TpcReClusterizerTask.h" //C/C++ Headers --------------------------------------------- #include #include #include #include //Collaborating Headers ------------------------------------- #include "FairRootManager.h" #include "FairRuntimeDb.h" #include "FairRunAna.h" #include "TClonesArray.h" #include "TpcPrelimCluster.h" #include "TpcCluster.h" #include "TpcSPHit.h" #include "TpcRiemannTrack.h" #include "TpcRiemannHit.h" #include "GFTrack.h" #include "GFAbsTrackRep.h" #include "GFException.h" #include "RKTrackRep.h" #include "TpcDigiMapper.h" #include "TpcAlignmentManager.h" #include "TpcDigiPar.h" #include "TpcGas.h" #include "TpcPadPlane.h" #include "TH2D.h" #include "TRandom.h" #include "TStopwatch.h" #include "McIdCollection.h" #include "McId.h" TpcReClusterizerTask::TpcReClusterizerTask() : fDigiBranchName("TpcDigi"), fSPHitBranchName("TpcSPHit"), fClusterBranchName("TpcCluster"), fReClusterBranchName("TpcReCluster"), fTrackBranchName("RiemannTrack"), fRecoHitBranchName("TpcSPHit"), fOutTrackBranchName("TpcTrackPreFit"), fDigiArray(0), fSPHitArray(0), fClusterArray(0), fReClusterArray(0), fRecoHitArray(0), fTrackArray(0), fOutTrackArray(0), fHitBranchID(-1), fhTrack(), fTimeinfo(kFALSE), fPersistence(kFALSE), fArhpersistence(kFALSE), fstepsize(1), fCounter(0), fOnDigi(kTRUE), fIgnoreEdgeDigis(kFALSE), fGlobCounter(0), fUseFirstDigiPos(kFALSE), fUseChamberEdge(kFALSE), fUseCosmics(kFALSE), fRDigiCutoff(1), fMinClusterSize(5), fVarStep(kFALSE), fVarStepSqrt(kFALSE), fStepOff(15), fStepSlope(0.13535), fStepOff_sqrt(1), fStepSlope_sqrt(0.5), fStepOff_0_sqrt(0), fFac(4), fZoff(0), fAlign(kTRUE), fTrAlign(kTRUE), fUseAllDigis(kFALSE), fVarMinClusterSize(kFALSE), fTrackInit(kFALSE), fDevMapName(""), fClusterCorr(kFALSE), fSmallClusterCorr(kFALSE), fSkipUnFitted(kFALSE), fuseFullCov(kFALSE), fweightedPlaneConstruction(kFALSE), fcutCov(kFALSE), frecalcDigiPos(kFALSE), fDigiSharing(kTRUE), fOnlyStep(kFALSE), fUsePRF(kTRUE), fUseSPHitParam(kFALSE), fDoPRF(kTRUE), fC(14.), fG(600), fzJitter(0.1), first(true), fPlane(), fZMax(-1), fZMin(-1), fuseOnPlaneCov(false), fPar(NULL), fcorrFactor(1.), fMCS1(0), fMCS2(0), fMCS3(0), fPrelimClusterCounter(0) { fcorrector=new TpcClusterCorrector(); } TpcReClusterizerTask::~TpcReClusterizerTask() {;} InitStatus TpcReClusterizerTask::Init() { //Get ROOT Manager --------------------- FairRootManager * ioman = FairRootManager::Instance(); if (ioman==0) { Error("TpcReClsuterizerTask::Init","Root Manager not instantiated!"); return kERROR; } fDigiArray=(TClonesArray*) ioman->GetObject(fDigiBranchName); if(fDigiArray==0) { Fatal("TpcReClusterizerTask::Init","Digi Array not found"); return kERROR; } fSPHitArray=(TClonesArray*) ioman->GetObject(fSPHitBranchName); if(fSPHitArray==0) { Fatal("TpcReClusterizerTask::Init","SPHit Array not found"); return kERROR; } // Get Input Arrays -------------------- fClusterArray=(TClonesArray*) ioman->GetObject(fClusterBranchName); if (fClusterArray==0) { Fatal("TpcReClusterizerTask::Init","Cluster Array not found"); return kERROR; } fTrackArray=(TClonesArray*) ioman->GetObject(fTrackBranchName); if (fTrackArray==0) { Fatal("TpcReClusterizerTask::Init","Track Array not found"); } // Create and register output arrays fReClusterArray=new TClonesArray("TpcCluster"); if (fReClusterArray->GetEntries() !=0) Fatal("TpcReClusterizerTask::Init","Cluster Array was not empty"); ioman->Register(fReClusterBranchName,"Tpc",fReClusterArray,fPersistence); fRecoHitArray = new TClonesArray("TpcSPHit"); if (fRecoHitArray->GetEntries() !=0) Fatal("TpcReClusterizerTask::Init","SPHit Array was not empty"); ioman->Register(fRecoHitBranchName,"tpc",fRecoHitArray,fPersistence); fOutTrackArray = new TClonesArray("GFTrack"); if (fOutTrackArray->GetEntries() !=0) Fatal("TpcReClusterizerTask::Init","Output track Array was not empty"); ioman->Register(fOutTrackBranchName,"GenFit",fOutTrackArray,fPersistence); fHitBranchID = FairRootManager::Instance()->GetBranchId(fSPHitBranchName); fSPHitID = FairRootManager::Instance()->GetBranchId(fRecoHitBranchName); fClBrID = FairRootManager::Instance()->GetBranchId(fReClusterBranchName); fPlane = fPar->getPadPlane(); fGas = fPar->getGas(); fDriftVel=fPar->getManDriftVel(); if(fDriftVel<=0){ fDriftVel = fGas->VDrift(); } fRMin = fPar->getRMin(); fRMax = fPar->getRMax(); fZMax = fPar->getZMax(); // fZMin = fPar->getZMin(); if (fClusterCorr) { if(fDevMapName=="") { Error("Init","Reading DevMap from parbase\n"); fDevMapName = fPar->getClustCorrFile(); } std::cout<<"TpcReClusterizerTask::Init() using devmap: "<loaded()) { Fatal("Init","Deviation Map not found!"); return kERROR; } fDevMap->printc(); } if(fSmallClusterCorr) { fcorrector->SetDigiArray(fDigiArray); fcorrector->SetPadPlane(fPlane); } if(fIgnoreEdgeDigis) { fRMin = fRCutoff1; fRMax = fRCutoff2; } return kSUCCESS; } void TpcReClusterizerTask::SetParContainers() { if (fVerbose) std::cout<<"TpcReClusterizerTask::SetParContainers"<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Tpc digitisation parameter container fPar = (TpcDigiPar*) db->getContainer("TpcDigiPar"); if (! fPar ) Fatal("SetParContainers", "TpcDigiPar not found"); } void TpcReClusterizerTask::Exec(Option_t* opt) { if(first) { //this block is to define the z jitter McId dummyID(1,1,0); McIdCollection dummyColl; dummyColl.AddID(dummyID); TVector3 zDiff1,zDiff2; TpcDigi zDiffDigi1(1,1,1,dummyColl),zDiffDigi2(1,2,1,dummyColl); try { TpcDigiMapper::getInstance()->map(&zDiffDigi1,zDiff1); TpcDigiMapper::getInstance()->map(&zDiffDigi2,zDiff2); } catch(const std::exception& ex) { std::cout<Delete(); if (fTrackInit) { if (fOutTrackArray==0) Fatal("TpcReClusterizerTask::Exec","No Track out array"); fOutTrackArray->Delete(); if (fRecoHitArray==0) Fatal("TpcReClusterizerTask::Exec","No RecoHit out array"); fRecoHitArray->Delete(); } Int_t ntracks=fTrackArray->GetEntriesFast(); if (ntracks>20000) { std::cout<<"ntracks="<getGain(); fGlobCounter=0; fPrelimClusterCounter=0; for (Int_t itr=0;itr(fTrackArray->At(itr))!=NULL) { TpcRiemannTrack * trk=(TpcRiemannTrack*)fTrackArray->At(itr); RiemannReCluster(trk); } else { if(fVerbose) std::cout<<"Using genfit tracks for reclustering"<At(itr); if(fOnlyStep) GenfitStepThrough(trk); else GenfitReCluster(trk); } } // done loop over tracks } Bool_t TpcReClusterizerTask::RiemannReCluster(TpcRiemannTrack* ftrack) { std::cout<<"Warning RiemanTrack based Reclustering is not implemented!"<getNumHits(); //check if track is prefitted if ( ! ftrack->isFitted()) { if ( fVerbose) std::cout<<" TpcReClusterizerTask::Exec -skipping, track not prefitted"<getHit(ihit); }//done loop over hits return kTRUE; } Bool_t TpcReClusterizerTask::GenfitReCluster(GFTrack* trk) { TStopwatch timer; timer.Start(); if(fTimeinfo) PrintTime(timer,"START"); FairRootManager * ioman = FairRootManager::Instance(); if(fVerbose) std::cout<<"****************************GENFIT RECLUSTER******************"<getCardinalRep(); if (theRep->getStatusFlag() != 0 && fSkipUnFitted) { if (fVerbose) std::cout<<"ReCl: track not fitted!\n"; return kFALSE; } // //check for GEANE trackrep // if(dynamic_cast(theRep) != NULL) // { // ((GeaneTrackRep*)theRep)->setPropDir(0); // not needed for RKTrackRep // } GFTrackCand cand = trk->getCand(); bool useSPHits = true; std::vector hitIDs = cand.getHitIDs(fHitBranchID); // get pos and momentum for start position and direction TVector3 pos,mom; if (fVerbose) std::cerr<<"get pos and mom"<getPos(); mom = theRep->getMom(); } catch(GFException& e) { e.what(); return kFALSE; } if (fVerbose) { std::cout<<"pos: ("< digis; // unsigned int count = 0; TClonesArray* actClArr; int foundDigi = -1; double maxDist = 0.; //(cm) if (fVerbose) std::cout<<"Cluster in this track: "<At(hitIDs[i]); int clBrID = theHit->getClusterBranchID(); int clID = theHit->getClusterID(); if (count==0) { TString clBrName = ioman->GetBranchName(clBrID); actClArr = (TClonesArray*) ioman->GetObject(clBrName); } cl = (TpcCluster*)(actClArr->At(clID)); count++; const std::map* digiMap = cl->getDigiMap(); for(std::map::const_iterator it=digiMap->begin();it!=digiMap->end();it++) { // avoid double counting if(!digis.count(it->first)) { digis[it->first] = (TpcDigi*) fDigiArray->At(it->first); } else { // std::cout<<"double counted digi:"<first<<" "<second<<"\n"; continue; } TpcDigi* aDigi = digis[it->first]; //only for first hit (cluster): find first Digi if( fUseFirstDigiPos) { //get Digi coordinates: TVector3 dPos; try { TpcDigiMapper::getInstance()->map(aDigi,dPos); } catch (...) { std::cerr<<"TpcReclusterizer::Could not get Position of digi! Skipping ..."<localToMaster("tpc",dPos); TVector3 pc, dpc; try { theRep->extrapolateToPoint(dPos,pc,dpc); } catch(GFException& e) { e.what(); continue; } TVector3 dDist = pl.getO() - pc; if (fVerbose) { std::cout<<"poca: "<= maxDist && (dDist*pl.getNormal()) >= 0.) //we want negative extrap! { if(fIgnoreEdgeDigis) if(dPos.Perp() < fRCutoff1 || dPos.Perp() > fRCutoff2) continue; foundDigi = (*it).first; altFirstPos = dPos; altFirstDir = dpc; maxDist = dDist.Mag(); if(fVerbose) std::cout<<"Moving start position\n"; } } } } if (fTimeinfo) PrintTime(timer,"Collected digis"); // collect all unused digis std::map udigis; // if(fUseAllDigis) { for (Int_t idigi=0;idigiGetEntries();idigi++) { TpcDigi* auDigi = (TpcDigi*) fDigiArray->At(idigi); // avoid double counting if(!digis.count(auDigi->index()) && !udigis.count(auDigi->index()) ) { //std::cout<<"here is another array"<index()] = (TpcDigi*) auDigi; } else continue; } if(fTimeinfo) PrintTime(timer,"Collected unused digis"); } if (fVerbose) { std::cout<At(hitIDs[0])))->pos()); std::cout<<"pos - pos0 mag"<< (pos-pos0).Mag() << std::endl; } GFDetPlane here,next; mom.SetMag(1); here.setO(pos); here.setNormal(mom); if(fVerbose) { std::cout<<"First Plane:"<= 0 && fUseFirstDigiPos) { if(fVerbose) { std::cout<<"Moved plane from cluster position (r="< 2*fRMin) // pull = 1.01; // here.setO(altFirstPos*pull); //pull it inward a little //move first plane to fully include first padhit altFirstDir.SetMag(1); here.setO(altFirstPos-altFirstDir*0.2); here.setNormal(altFirstDir); // if (fVerbose) // { // std::cout<<"\nto first Digi position (r="< usedDigis; //bookkeeping for speedup std::map usedDigis; //bookkeeping for speedup double dir = 1.; //walk through the track and collect the clusters bool founddigis=false; bool shiftPlane=false; double shiftMult=1; std::vector prelimClusters; if (fTimeinfo) PrintTime(timer,"Got Start position"); if (fVerbose) std::cout< digisToCluster; // if (fVerbose) std::cerr<<"at counter "<0 && shiftPlane) here=next;//not the first time TVector3 normdir=next.getNormal(); normdir.SetMag(1); if(fVarStep) { fstepsize=fStepOff + fStepSlope * (next.getO().Z()+fZoff); if (fVerbose) std::cout<<"The Z position to calculate the stepsize: "<Dl(); double fDiff_t = fGas->Dt(); TVector3 diffVec=TVector3(normdir); diffVec[0]*=fDiff_l; diffVec[1]*=fDiff_l; diffVec[2]*=fDiff_t; //fstepsize = fStepOff_sqrt + fFac* ( TMath::Cos(normdir.Theta())* fDiff_t * sqrt( (next.getO().Z() + here.getO().Z() )*0.5 - fStepOff_0_sqrt); //std::cout<<"offset: "<Uniform(0.9,1.1); if (fVerbose) std::cout<<"The Z position to calculate the stepsize: "<extrapolateToPoint(destination,poca,dirInPoca); next.setO(poca); next.setNormal(dirInPoca); //dist=theRep->extrapolate(next); } catch(GFException& e) { e.what(); exc=true; break; } if (fVerbose) { std::cout<<"Poca: "; poca.Print(); } //check if next lies out of the TPC volume // std::cout<3*fRMax) forceabort=true; if (fVerbose) std::cout<<"distance to last point is: "< stopO.Perp() && td.Mag() 1.5*fRMax) { move_plane=kTRUE; } } else if(next.getO().Perp() > 1.5*fRMax || next.getO().Perp() < 0.5*fRMin) move_plane=kTRUE; if (move_plane) { if(fVerbose) std::cout<<"OUT OF CHAMBER next.Perp(): "<setRecalcDigiPos(frecalcDigiPos); pcl->setCorrFactor(fcorrFactor); pcl->setDoPRF(fDoPRF); std::map::const_iterator cit; founddigis=false; Int_t rounds; if(fUseAllDigis) rounds=2; else rounds=1; double meanz; for(Int_t round=0;rounddmap; if(round==0) dmap=digis; else dmap=udigis; for(cit=dmap.begin(); cit!=dmap.end();cit++) { //try to find the digi in the map std::map::iterator it_used=usedDigis.find(cit->first); //if found, check if already fully shared if(it_used!=usedDigis.end()) { //std::cout<<"digi "<first<<" is already used:"<second<<"\n"; //check if digi is fully shared if(it_used->second >0.99999999) { //std::cout<<"digi "<first<<" is fully shared\n"; continue; } } //since digi is not fully/at all used, get position TVector3 hpos(0.,0.,0.); try { TpcDigiMapper::getInstance()->map(cit->second,hpos); } catch(const std::exception& ex) { std::cout< fRCutoff2) continue; //if (fAlign) //hpos=TpcAlignmentManager::getInstance()->localToMaster("tpc",hpos); //check if digi lies in between planes (deprecated) behindHere = here.getNormal() * (here.dist(hpos))*dir; behindNext = next.getNormal() * (next.dist(hpos))*dir; behindHere *= 1./fabs(behindHere); behindNext *= 1./fabs(behindNext); double ok = behindHere + behindNext; // 0 if digi between planes //get weight of digi TpcPad* pad=fPlane->GetPad(((TpcDigi*)fDigiArray->At(cit->first))->padId()); double weight1= pad->GetAreaFractionBelowPlane(here.getO()-TVector3(0,0,hpos.Z()),here.getNormal()); double weight2= pad->GetAreaFractionBelowPlane(next.getO()-TVector3(0,0,hpos.Z()),next.getNormal()); //ok=weight. 0 if outside both planes,1 if fully inside 0=0.5 and ok>0) // std::cout<<"digi "<first<<" :ok from planepos:"<0) { if(fVerbose) { // std::cout<<"INSIDE!"<first<<":"<fRDigiCutoff) continue; else if (fVerbose) std::cout<<"Unclustered digi is inside radius ("<fRMax)) continue; meanz+=hpos.Z(); if((fabs(here.getO().Y()-hpos.Y())<0.15 or fabs(next.getO().Y()-hpos.Y())<0.15) and fVerbose) { //std::cout<<"behind here:"<y()<<"\n"; std::cout<<"weight1:"<second+=ok; //add up if already partially used } else { usedDigis[cit->first]=ok; //new entry in usedDigis with current share } pcl->addHit((TpcDigi*) fDigiArray->At(cit->first),here,ok); founddigis=true; } else { if(fVerbose) { std::cout<<"NOT INSIDE! "<first<<":"<getNDigis(); if(fVarMinClusterSize) { fMinClusterSize=fMCS1+fMCS2*(meanz+fMCS3); } if(pcl->getNDigis()getNDigis()<<":"< fRMax or next.getO().Z()>fZMax) { if( prelimClusters.size()>0 ) { shiftPlane=true; founddigis=false; if (fVerbose) std::cout<<"Merging Cluster backwards\n"; for (int ud=0;udgetNDigis();ud++) { prelimClusters.back()->addHit((TpcDigi*)pcl->getDigi(ud),here,pcl->getDigiShare(ud)); } } } else { founddigis=false; shiftPlane=false; if (fVerbose) std::cout<<"Just move next plane one step further\n"; shiftMult=0.1; for(int ud=0;udgetNDigis();ud++) { usedDigis.erase(((TpcDigi*)pcl->getDigi(ud))->index()); } } } //if last cluster in track is to small: if( pcl->getNDigis()0 ) { founddigis=false; shiftPlane=true; if (fVerbose) std::cout<<"Merging Cluster backwards\n"; for (int ud=0;udgetNDigis();ud++) { prelimClusters.back()->addHit((TpcDigi*)pcl->getDigi(ud),here); } } } if (fVerbose) std::cout<<"2there are "<setPhi(phi); pcl->setDir(next.getO()-here.getO()); //try to get the detplane exactly between next and here TVector3 Midpoca,dirInMidPoca,Midpoint; Midpoint=next.getO()+here.getO(); Midpoint*=0.5; bool extrapGood=false; try //get the plane at MidPoca { theRep->extrapolateToPoint(Midpoint,Midpoca,dirInMidPoca); extrapGood=true; } catch(GFException& e) { e.what(); //if extrap didnt work set into middle between planes (ignore bending) } GFDetPlane MidPlane; if (extrapGood) { pcl->setMidPos(Midpoca); MidPlane.setO(Midpoca); MidPlane.setNormal(dirInMidPoca); pcl->setMidPlane(MidPlane); } else { pcl->setMidPos(Midpoint); MidPlane.setO(Midpoint); MidPlane.setNormal(next.getO()-here.getO()); pcl->setMidPlane(MidPlane); } prelimClusters.push_back(pcl); shiftPlane=true; shiftMult=1.; } else { delete pcl; } if (fabort || forceabort) break; }//done walk through the track if (fTimeinfo) PrintTime(timer,"Done stepping along the Track"); if(fVerbose) std::cout<<"now creating real cluster"<GetEntries()+ncl; fReClusterArray->Expand(size); if(fVerbose) std::cout<<"There are "<getStatusFlag()<<"\n"; } if (fTrackInit and prelimClusters.size()!=0) InitTracks(prelimClusters,trk); for(unsigned int icl=0;iclconvTpcCluster(0,fzJitter,true,fuseOnPlaneCov); //be aware, sector set to 0 regardless of real sector position regardless of real value AND saveraw set to true !!!! new((*fReClusterArray)[fGlobCounter]) TpcCluster(*tcl); fGlobCounter++; delete tcl; } delete prelimClusters[icl]; } prelimClusters.clear(); //std::cout<<"done"<getCardinalRep(); if (theRep->getStatusFlag() != 0 && fSkipUnFitted) { if (fVerbose) std::cout<<"ReCl: track not fitted!\n"; return kFALSE; } GFTrackCand cand = trk->getCand(); bool useSPHits = true; std::vector hitIDs = cand.getHitIDs(fHitBranchID); // get pos and momentum for start position and direction TVector3 pos,mom; if (fVerbose) std::cerr<<"get pos and mom"<getPos(); mom = theRep->getMom(); } catch(GFException& e) { e.what(); return kFALSE; } TVector3 startDir = mom; startDir.SetMag(1.); TVector3 altFirstPos; //set reference plane: GFDetPlane pl; pl.setO(pos); pl.setNormal(startDir); Int_t cosmics=1; unsigned int count = 0; TClonesArray* actClArr; std::vector prelimClusters; for(int i=0; iAt(hitIDs[i]); TpcSPHit* lastHit; TpcSPHit* nextHit; lastHit=nextHit=theHit; if (iAt(hitIDs[i+1]); if(i>0) lastHit=(TpcSPHit*) fSPHitArray->At(hitIDs[i-1]); int clBrID = theHit->getClusterBranchID(); int clID = theHit->getClusterID(); if (count==0) { TString clBrName = ioman->GetBranchName(clBrID); actClArr = (TClonesArray*) ioman->GetObject(clBrName); } cl = (TpcCluster*)(actClArr->At(clID)); lastCl=(TpcCluster*)(actClArr->At(lastHit->getClusterID())); //std::cout<<"i:"<At(nextHit->getClusterID())); TVector3 theDir= (nextCl->pos()-lastCl->pos())*0.5; count++; TVector3 poca, dirpoca; try { theRep->extrapolateToPoint(cl->pos(),poca,dirpoca); } catch(GFException& e) { //if extrapolation is not working, invent poca and dirpoca by useage of clusters e.what(); std::cerr<<"TpcReclusterizer:could not step to cluster\n"; poca=cl->pos(); dirpoca=nextCl->pos()-cl->pos(); if (dirpoca.Mag()==0) dirpoca=cl->pos()-lastCl->pos(); //return kFALSE; } GFDetPlane clusterPlane; clusterPlane.setO(poca); clusterPlane.setNormal(dirpoca); TpcPrelimCluster* pcl = new TpcPrelimCluster(fPlane,fPrelimClusterCounter,fG,fC); pcl->setRecalcDigiPos(frecalcDigiPos); pcl->setCorrFactor(fcorrFactor); pcl->setMidPos(poca); pcl->setMidPlane(clusterPlane); pcl->setDir(theDir); pcl->setPhi(theDir.Phi()); const std::map* digiMap = cl->getDigiMap(); for(std::map::const_iterator it=digiMap->begin();it!=digiMap->end();it++) { pcl->addHit((TpcDigi*) fDigiArray->At(it->first),clusterPlane,it->second); //std::cout<<"digi weight:"<second<<"\n"; } fPrelimClusterCounter++; prelimClusters.push_back(pcl); } if (fTrackInit) InitTracks(prelimClusters,trk); for(unsigned int icl=0;icl ftomerge) { TpcCluster* merged; for (int i=0; i0) { double t; if (!neg) t = (-b + TMath::Sqrt(disc)) / (2*a); else t = (-b - TMath::Sqrt(disc)) / (2*a); return t; } return 0; } void TpcReClusterizerTask::PrintTime(TStopwatch watch, TString text) { watch.Stop(); Double_t rtime = watch.RealTime()*1000; Double_t ctime = watch.CpuTime()*1000; watch.Start(kFALSE); std::cout<<"RealTime (ms): "< _prelimClusters,GFTrack* _trk) { fRecoHitMap.clear(); fToWrite.clear(); // build GFTrackCands std::vector candlist; // create GFTrackCands GFTrackCand* cand=new GFTrackCand(); // fill hits into GFTrackCands and get seed values TpcCluster* cluster1;//=new TpcCluster(); for (int ih = 0; ih<_prelimClusters.size();ih++) { //std::cout<<"converting cluster number: "<convTpcCluster(0,fzJitter,true,fuseOnPlaneCov); //be aware, sector set to 0 regardless of real sector position, regardless of real value AND saveRaw set to true !!!! //std::cout<<"converted cluster\n"; if(fSmallClusterCorr) cl->SetPos(fcorrector->ExecCorrection(cl,true,true)); if (fClusterCorr) ClusterCorr(cl); if (ih==0) { cluster1=new TpcCluster(*cl); } new((*fReClusterArray)[fGlobCounter]) TpcCluster(*cl); TpcSPHit* theHit = new TpcSPHit(cl,fweightedPlaneConstruction,fcutCov); theHit->setUseParam(fUseSPHitParam); theHit->setClusterBranchID(fClBrID); unsigned int nOut = fRecoHitArray->GetEntriesFast(); new ((*fRecoHitArray)[nOut]) TpcSPHit(*theHit); fToWrite.insert(theHit); cand->addHit(fSPHitID, nOut); fGlobCounter++; delete cl; } // if (fTrAlign) // { // TpcAlignmentManager* alMan=TpcAlignmentManager::getInstance(); // pos1=alMan->localToMaster("tpc",pos1); // mom=alMan->localToMasterVect("tpc",mom); // poserr=alMan->localToMasterVect("tpc",poserr); // momerr=alMan->localToMasterVect("tpc",momerr); // } cand->setMcTrackId((_trk->getCand()).getMcTrackId()); candlist.push_back(cand); //RK TRACKREP // store GFTracks in output array TVector3 mom,pos; TVector3 momerr; //cluster1->sig(0).Print(); //std::cout<<"err X:"<sig(0).X()<<" err Y:"<sig(0).Y()<<" err Z:"<sig(0).Z()<<"\n"; //std::cout<<"getting err\n"; TVector3 poserr=TVector3(cluster1->sig(0)); TMatrixDSym cov; _trk->getPosMomCov(pos,mom,cov); //mom=cand->getMomSeed(); //cov.ResizeTo((_trk->getCand()).getCovSeed()); //cov=(_trk->getCand()).getCovSeed(); if(0) { std::cout<<"TpcReclusterizerTask::InitTracks momentum:\n"; mom.Print(); std::cout<<"TpcReclusterizerTask::InitTracks cov:\n"; cov.Print(); } //poserr=TVector3(TMath::Sqrt(cov(0,0)),TMath::Sqrt(cov(1,1)),TMath::Sqrt(cov(2,2))); momerr=TVector3(TMath::Sqrt(cov(3,3)),TMath::Sqrt(cov(4,4)),TMath::Sqrt(cov(5,5))); poserr*=0.00001; momerr*=0.00001; RKTrackRep* rkrep = new RKTrackRep(cluster1->pos(), mom, poserr, momerr,((RKTrackRep*)_trk->getCardinalRep())->getPDG()); //TMatrixDSym trackcov=rkrep->getCov(); //trackcov*=25; //rkrep->setCov(trackcov); //GFTrack* gftrk=new((*fOutTrackArray)[fOutTrackArray->GetEntriesFast()]) GFTrack(*_trk); GFTrack* gftrk=new((*fOutTrackArray)[fOutTrackArray->GetEntriesFast()]) GFTrack(rkrep); gftrk->setSmoothing(true); gftrk->setCandidate(*cand); // here the candidate is copied! //((RKTrackRep*)gftrk->getCardinalRep())->setStatusFlag(1); //gftrk->blowUpCovs(10000); //write out all other recoHits if required, clean up: std::map::const_iterator it; for(it=fRecoHitMap.begin(); it!=fRecoHitMap.end(); it++) { TpcSPHit* iHit = it->second; if(!fToWrite.count(iHit)) { if(fArhpersistence && fPersistence) new ((*fRecoHitArray)[fRecoHitArray->GetEntriesFast()]) TpcSPHit(*iHit); } delete iHit; //all of them have been copied during TCA write ... } delete cluster1; } void TpcReClusterizerTask::ClusterCorr(TpcCluster* cl) { TVector3 pos=cl->pos(); TVector3 corrval=fDevMap->value(pos); //corrval.SetZ(0); //dont correct in z position since drift velocity is not properly set in distortion map creation cl->SetPos(pos-corrval); cl->SetFieldCorr(corrval); //std::cout<<"zpos: "<