23 #include "FairRunAna.h"
29 #include "TClonesArray.h"
53 fEnergyValid( false ),
56 fWhere( TVector3(0,0,0) ),
85 std::cout<<
"Energy of cluster is not defined"<<std::endl;
94 return where().Theta();
100 return where().Phi();
106 return this->
where();
117 std::cout<<
"Position of cluster is not defined"<<std::endl;
164 fTimeStamp = (digi->GetTimeStamp() > this->GetTimeStamp()) ? digi->GetTimeStamp() : this->GetTimeStamp();
168 SetInsertHistory(kFALSE);
169 if(FairRunAna::Instance()->IsTimeStamp()) {
170 AddLink((static_cast<PndEmcDigi*>(digiArray->At(iDigi))->GetEntryNr()));
172 AddLink(FairLink(-1, FairRootManager::Instance()->GetEntryNr(),
"EmcDigi", iDigi));
174 SetInsertHistory(kTRUE);
190 std::vector<Int_t>::iterator
208 const vector<Int_t> tmpList = cluster->
DigiList();
209 vector<Int_t>::const_iterator digi_iter;
210 for (digi_iter=tmpList.begin();digi_iter!=tmpList.end();++digi_iter)
212 addDigi(digiArray, *digi_iter);
215 AddLinks(cluster->GetLinks());
222 fLocalMaxMap.insert(std::pair<Int_t,Int_t>(detectorId, iDigi));
229 fLocalMaxMap.insert(std::pair<Int_t,Int_t>(detectorId, iDigi));
236 vector<Int_t>::iterator digi_iter;
252 std::vector<Int_t>::const_iterator digipos;
255 if ( max < digi->GetEnergy() ) {
270 std::vector<Int_t>::iterator digipos;
273 if ( max < digi->GetEnergy() ) {
292 std::map<Int_t,Int_t>::const_iterator iter=
fLocalMaxMap.begin();
293 detectorId=iter->first;
297 std::map<Int_t,Int_t>::const_iterator iter=
fMemberDigiMap.begin();
298 detectorId=iter->first;
301 module=detectorId/100000000;
306 typedef std::pair<Int_t,Int_t>
map_ele;
311 return a.second > b.second;
315 std::vector< map_ele > sortedVec;
316 std::vector<FairLink> mcLinks;
317 FairMultiLinkedData mcFairLinks = GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack"));
319 for (
int i = 0;
i < mcFairLinks.GetNLinks();
i++){
320 mcLinks.push_back(mcFairLinks.GetLink(
i));
323 std::sort(mcLinks.begin(), mcLinks.end(), [](
const FairLink&
a,
const FairLink&
b) ->
bool {
324 return a.GetIndex() <
b.GetIndex();
328 for (
auto link : mcLinks)
329 fMcList.push_back(link.GetIndex());
359 std::cout<<
"*********************************"<< endl;
360 std::cout<<
"total energy of cluster: "<<
energy() << endl;
369 return (
where() - aPoint ).Mag();
382 TVector3 clusterPosition= this->
where();
383 Double_t theta_cluster=clusterPosition.Theta();
388 if ( (clusterPosition.Z() < 180.0)&&(theta_cluster<140.*
TMath::Pi()/180.))
390 if (e<0.03) e1 = 0.03;
391 if (e>8.0) e1 = 8.0 ;
394 if ( (clusterPosition.Z() < 180.0)&&(theta_cluster>140.*
TMath::Pi()/180.))
396 if (e<0.03) e1 = 0.03;
397 if (e>2.0) e1 = 2.0 ;
400 if (clusterPosition.Z() > 180.0)
402 if (e<0.01) e1 = 0.01;
403 if (e>16.0) e1 = 16.0 ;
407 double b1 = 2.79086e-02;
408 double b2 = 3.91932e-04;
409 double b3 =-1.23117e-03;
410 double b4 = 2.72270e-01;
413 double b7 =-4.05724e-01;
415 double b9 = 4.80507e-02;
457 double t1 =-1.71202e-02;
458 double t2 = 3.59161e-03;
459 double t3 =-3.46712e-04;
460 double t4 =-3.73691e-01;
463 double t7 =-4.10972e-01;
465 double t9 = 4.60908e-03;
473 +p5*
cos(theta1)*
cos(theta1)
484 +t5*
cos(theta1)*
cos(theta1)
496 +b5*
cos(theta1)*
cos(theta1)
503 double eout1=e*
exp(factor1);
504 double eout2=e*
exp(factor2);
505 double eout3=e*
exp(factor3);
507 double eout4=(3.31694-0.0183379/
sqrt(e1)+0.0327113/e1+0.00040156/(e1*e1)-0.00641305/(e1*
sqrt(e1)))*e/3.0144;
511 if ( clusterPosition.Z() > 500.0)
513 else if ( (clusterPosition.Z() < 180.0)&&(theta_cluster>140.*
TMath::Pi()/180.))
515 else if ( (clusterPosition.Z() < 180.0)&&(theta_cluster<140.*
TMath::Pi()/180.))
537 std::map<FairLink, LinkScoreBoard> scoreBoard;
538 std::set<FairLink> entering, exiting;
550 for (std::map<FairLink, LinkScoreBoard>::iterator iter = scoreBoard.begin(); iter != scoreBoard.end(); iter++){
552 switch (iter->second.score){
553 case 15: entering.insert(iter->first); exiting.insert(iter->first);
break;
554 case 14: entering.insert(iter->first);
break;
555 case 13: exiting.insert(iter->first);
break;
556 case 12: entering.insert(iter->first); exiting.insert(iter->first);
break;
557 case 11: entering.insert(iter->first);
break;
558 case 10: std::cout <<
"-E- PndEmcCluster::AddTracksEnteringExiting Same particle entering twice!" << std::endl;
break;
560 case 8: entering.insert(iter->first);
break;
561 case 7: exiting.insert(iter->first);
break;
563 case 5: std::cout <<
"-E- PndEmcCluster::AddTracksEnteringExiting Same particle exiting twice!" << std::endl;
break;
564 case 4: exiting.insert(iter->first);
break;
565 case 3: entering.insert(iter->first); exiting.insert(iter->first);
break;
566 case 2: entering.insert(iter->first);
break;
567 case 1: exiting.insert(iter->first);
break;
569 default: std::cout <<
"-E- PndEmcCluster::AddTracksEnteringExiting wrong score " << iter->second.score << std::endl;
break;
582 std::set<FairLink> links = tracks.GetLinks();
583 for (std::set<FairLink>::iterator linkIter = links.begin(); linkIter != links.end(); linkIter++){
584 scoreBoard[*linkIter].SetValShift(kTRUE, shift);
virtual void Print(const Option_t *opt="") const
friend F32vec4 cos(const F32vec4 &a)
std::pair< Int_t, Int_t > map_ele
bool isInCluster(PndEmcDigi *theDigi, const TClonesArray *digiArray)
virtual Double_t GetEnergy() const
represents the reconstructed hit of one emc crystal
friend F32vec4 exp(const F32vec4 &a)
Short_t GetModule() const
friend F32vec4 sqrt(const F32vec4 &a)
Int_t GetDetectorId() const
std::map< Int_t, Int_t > fMcMap
bool operator()(const map_ele &a, const map_ele &b)
friend F32vec4 log(const F32vec4 &a)
virtual void SetNBumps(unsigned nbumps)
const std::vector< Int_t > & DigiList() const
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
void AddTracksEnteringExiting(const FairMultiLinkedData &tracksEntering, const FairMultiLinkedData &tracksExiting)
Updates the links to entering and exiting tracks.
const std::vector< Int_t > & GetMcList() const
void addCluster(PndEmcCluster *cluster, const TClonesArray *digiArray)
TVector3 position() const
FairMultiLinkedData GetTrackExiting() const
FairMultiLinkedData fTrackExiting
virtual const PndEmcDigi * Maxima(const TClonesArray *digiArray) const
std::vector< Int_t > fMcList
FairMultiLinkedData fTrackEntering
virtual Double_t DistanceToCentre(const TVector3 &aPoint) const
virtual void removeDigi(const TClonesArray *digiArray, Int_t iDigi)
a cluster (group of neighboring crystals) of hit emc crystals
std::map< Int_t, Int_t > fMemberDigiMap
Int_t NumberOfDigis() const
void invalidateCache(bool)
Double_t GetEnergyCorrected() const
virtual Double_t energy() const
const TVector3 & where() const
std::vector< Int_t > fDigiList
virtual void addLocalMax(const TClonesArray *digiArray, Int_t iDigi)
bool isNeighbour(const PndEmcDigi *theDigi) const
std::map< Int_t, Int_t > fLocalMaxMap
FairMultiLinkedData GetTrackEntering() const
static Double_t FindPhiDiff(Double_t, Double_t)
virtual void addDigi(const TClonesArray *digiArray, Int_t iDigi)
void FillScoreBoard(FairMultiLinkedData tracks, std::map< FairLink, LinkScoreBoard > &scoreBoard, Int_t shift)