7 #include "TClonesArray.h"
9 #include "TGeoManager.h"
10 #include "TGeoMatrix.h"
13 #include "TCollection.h"
14 #include "FairRootManager.h"
15 #include "FairRunAna.h"
16 #include "FairRuntimeDb.h"
17 #include "FairGeoNode.h"
18 #include "FairGeoVector.h"
19 #include "FairContFact.h"
50 fSingleStripChargeThreshold(0),
52 fDigiParameterList(new TList()),
55 fChargeDigiParameterList(new TList()),
59 fCurrentStripCalcTop(0),
60 fCurrentStripCalcBot(0),
62 fCurrentChargeConverter(0),
65 fCurrentClusterfinder(0),
89 fSingleStripChargeThreshold(0),
91 fDigiParameterList(new TList()),
94 fChargeDigiParameterList(new TList()),
98 fCurrentStripCalcTop(0),
99 fCurrentStripCalcBot(0),
101 fCurrentChargeConverter(0),
104 fCurrentClusterfinder(0),
105 fClusterFinderList(),
127 if(0 != it->second)
delete it->second;
131 if(0 != it->second)
delete it->second;
136 if(0 != it->second)
delete it->second;
140 if(0 != it->second)
delete it->second;
154 if (
fGeoH == NULL ) {
164 fHitArray =
new TClonesArray(
"PndSdsHit",10000);
166 fClusterArray =
new TClonesArray(
"PndSdsClusterStrip", 10000);
185 fDigiArray = (TClonesArray*) inputList->FindObject(
"PndSdsDigiStrips");
186 fEventHeader = (FairEventHeader*) inputList->FindObject(
"EventHeader.");
187 LOG(INFO) <<
"DigiArray: " <<
fDigiArray << FairLogger::endl;
188 LOG(INFO) <<
"DigiArray: " <<
fDigiArray->GetEntriesFast() << FairLogger::endl;
209 if (
fVerbose>1) Info(
"SetCalculators",
"sds part");
214 Error(
"SetCalculators()",
"A Digi Parameter Set does not exist properly.");
217 const char* senstype = digipar->GetSensType();
219 Info(
"SetCalculators()",
"Create a Parameter Set for %s sensors",senstype);
220 std::cout<<senstype<<
"#"<<std::endl;
239 FairRootManager* ioman = FairRootManager::Instance();
242 std::cout <<
"-E- PndSdsStripClusterTask::Init: "
243 <<
"RootManager not instantiated!" << std::endl;
254 std::cout <<
"-W- PndSdsPixelClusterTask::Init: "
255 <<
"No SDSDigi array!" << std::endl;
273 fPath = getenv(
"VMCWORKDIR");
274 fPath +=
"/macro/params/interstrippos_vs_eta_histos.root";
280 Info(
"Init",
"Initialisation successfull");
289 std::cout<<
" **Starting PndSdsStripClusterTask::Exec()**"<<std::endl;
290 std::vector<PndSdsDigiStrip> digiStripArray;
297 if ( !
fHitArray ) Fatal(
"Exec",
"No HitArray");
302 if (FairRunAna::Instance() != 0 && FairRunAna::Instance()->IsTimeStamp()){
306 std::cout <<
"-I- PndSdsStripClusterTask::Exec Digis: " <<
fDigiArray->GetEntries() << std::endl;
320 std::cout <<
"-W- PndSdsStripClusterTask::Init: "
321 <<
"No SDSDigi array!" << std::endl;
326 if (
fDigiArray->GetEntriesFast() == 0)
return;
332 std::vector< PndSdsClusterStrip* > clusters;
333 std::vector< Int_t > topclusters;
334 std::vector< Int_t > botclusters;
335 std::vector< Int_t > oneclustertop;
336 std::vector< Int_t > oneclusterbot;
337 std::vector< Int_t > leftDigis;
338 Int_t mcindex, clindex, botIndex, topIndex;
341 if (FairRootManager::Instance() != 0)
344 TVector2 meantopPoint, meanbotPoint, onsensorPoint;
345 TVector3 hitPos,hitErr;
347 Int_t clusterOffset = 0;
362 if (0<leftDigis.size()){
363 std::cout <<
"There are "<<leftDigis.size()<<
" Digis not assigned to"
365 for(
unsigned int s=0;
s<leftDigis.size();
s++)
367 std::cout<<leftDigis[
s]<<
"|";
369 std::cout<<std::endl;
370 }
else std::cout<<
"All Digis assigned to clusters"<<std::endl;
375 for(std::vector< PndSdsClusterStrip* >::iterator clit= clusters.begin(); clit!=clusters.end(); ++clit)
380 if (FairRunAna::Instance() != 0 && FairRunAna::Instance()->IsTimeStamp()){
381 myCluster->ResetLinks();
384 myCluster->AddLink(FairLink(tempDigi->GetEntryNr()));
393 std::cout <<
"Check.. Offset: " << clusterOffset << std::endl;
394 std::cout <<
"Top Clusters: ";
395 for (std::vector< Int_t>::iterator itTop = topclusters.begin();
396 itTop!=topclusters.end(); ++itTop)
398 std::cout<<*itTop<<
" | ";
400 std::cout<<std::endl;
401 std::cout<<
"Bot Clusters: ";
402 for (std::vector< Int_t>::iterator itBot = botclusters.begin();
403 itBot!=botclusters.end(); ++itBot)
405 std::cout<<*itBot<<
" | ";
407 std::cout<<std::endl;
422 for (std::vector< Int_t>::iterator itTop = topclusters.begin();
423 itTop!=topclusters.end(); ++itTop)
425 topIndex= *itTop + clusterOffset;
426 Double_t topcharge = 0., meantopstrip=0.,meantoperr=0., timestamp=0., timestampError=0. ;
429 if(oneclustertop.size()<1)
continue;
434 CalcMeanCharge(aTopCluster,meantopstrip,meantoperr,topcharge, timestamp, timestampError);
437 std::cout<<
"-W- PndSdsClusterTask::Exec: Single strip charge ("<<topcharge<<
" e-) falls below the threshold of "<<
fSingleStripChargeThreshold<<
"e- : skipping. "<<endl;
441 Error(
"Exec() - Hit combination",
"Not a sane top charge (%f) calculated, skip cluster %i",topcharge, *itTop);
444 if(meantopstrip < 0) {
445 Error(
"Exec() - Hit combination",
"Not a sane top mean (%f) calculated, skip cluster %i",meantopstrip, *itTop);
450 for (std::vector< Int_t>::iterator itBot = botclusters.begin();
451 itBot!=botclusters.end(); ++itBot)
453 botIndex = *itBot + clusterOffset;
454 Double_t botcharge = 0., meanbotstrip=0., meanboterr=0.;
457 if(oneclusterbot.size()<1)
continue;
462 if(sensorIDbot != sensorIDtop)
continue;
464 CalcMeanCharge(aBotCluster,meanbotstrip,meanboterr,botcharge, timestamp, timestampError);
467 std::cout<<
"-W- PndSdsClusterTask::Exec: Single strip charge ("<<botcharge<<
" e-) falls below the threshold of "<<
fSingleStripChargeThreshold<<
"e- : skipping. "<<endl;
471 Error(
"Exec() - Hit combination",
"Not a sane bot charge (%f) calculated, skip cluster %i",botcharge, *itBot);
474 if(meanbotstrip < 0) {
475 Error(
"Exec() - Hit combination",
"Not a sane bot mean (%f) calculated, skip cluster %i",meanbotstrip, *itBot);
480 std::cout<<
"Charges: Ctop = "<<topcharge<<
" | Cbot = "<<botcharge
481 <<
" | difference bot-top = "<<botcharge-topcharge
487 mycharge = (botcharge + topcharge) / 2.;
490 for(Int_t mcI = 0; mcI<atopDigi->
GetNIndices();mcI++){
492 for(Int_t mcIb = 0; mcIb<abotDigi->
GetNIndices();mcIb++){
500 Bool_t test =
Backmap(meantopPoint, meantoperr, meanbotPoint, meanboterr, hitPos, hitCov,sensorIDtop);
501 if (kFALSE==test)
continue;
505 hitErr.SetXYZ(
sqrt(hitCov[0][0]),
sqrt(hitCov[1][1]),
sqrt(hitCov[2][2]));
506 tmphit =
new((*fHitArray)[
i])
PndSdsHit(clDetID,sensorIDtop,hitPos,hitErr,
507 topIndex,mycharge,oneclusterbot.size()+oneclustertop.size(),mcindex);
509 if (FairRootManager::Instance() != 0){
510 tmphit->SetLink(FairLink(-1, FairRootManager::Instance()->GetEntryNr(),
fClusterType, topIndex));
511 tmphit->AddLink(FairLink(-1, FairRootManager::Instance()->GetEntryNr(),
fClusterType, botIndex));
514 tmphit->SetTimeStamp(timestamp);
515 tmphit->SetTimeStampError(timestampError);
519 if (
fVerbose > 2) std::cout<<
"Strip charge contents too different"<<std::endl;
522 for (
size_t i = 0;
i < clusters.size();
i++){
523 delete (clusters[
i]);
529 std::cout <<
"-I- PndSdsStripClusterTask: " <<
fClusterArray->GetEntriesFast()
530 <<
" Mvd Clusters and " <<
fHitArray->GetEntriesFast()<<
" Hits calculated."
531 <<
" out of " <<
fDigiArray->GetEntriesFast()<<
" Digis"<< std::endl;
539 if( !(detpath.Contains(
"Strip")) )
544 const char* sensortype = digipar->GetSensType();
545 if(detpath.Contains(sensortype)) {
551 if (
fVerbose > 1) std::cout<<
"detector name does not contain a valid parameter name."<<std::endl;
552 if (
fVerbose > 2) std::cout<<
" DetName : "<<detpath<<std::endl;
576 for(std::map<const char*,PndSdsStripClusterer*>::iterator CFiter =
fClusterFinderList.begin();
579 (CFiter->second)->Reinit();
594 if (
fDigiArray->GetEntriesFast() == 0)
return;
595 if(
fVerbose>2) Info(
"FillClusterFinders",
"adding these digis to the finders:");
596 for (Int_t iDigi = 0; iDigi <
fDigiArray->GetEntriesFast(); iDigi++)
602 if (kFALSE==tester)
continue;
615 TVector2 point1, TVector2 dir1,
616 TVector2 point2, TVector2 dir2)
const
619 dx = point2.X() - point1.X();
620 dy = point2.Y() - point1.Y();
622 M = dir1.X()*dir2.Y() - dir1.Y()*dir2.X();
626 s = dir1.Y()*dx/M - dir1.X()*dy/M;
627 x = point2.X() + dir2.X()*
s;
628 y = point2.Y() + dir2.Y()*
s;
632 std::cout<<
"Warning in PndSdsStripClusterTask::CalcLineCross(): M=0 setting (x,y) to 0"<<std::endl;
636 TVector2 result(x,y);
718 std::pair<Double_t,Double_t> result;
751 meanstrip=result.first;
752 meanerr=result.second;
755 for (std::vector<Int_t>::iterator itDigi = oneclusterlist.begin();
756 itDigi != oneclusterlist.end(); ++itDigi)
761 Double_t var = tmpdigi->GetTimeStampError() * tmpdigi->GetTimeStampError();
762 timestamp += tmpdigi->GetTimeStamp()/var;
763 timestampError += 1/var;
767 timestamp /= timestampError;
768 timestampError =
sqrt(timestampError / nDigis);
776 TVector3 &hitPos,
TMatrixD &hitCov, Int_t &sensorID)
787 TVector2 onsensorPoint =
790 localpos.SetXYZ( onsensorPoint.X(), onsensorPoint.Y(), 0.);
803 locCov[0][0]=t*t+b*
b;
806 locCov[1][1]=t*t+b*
b;
807 locCov[2][2]=errZ*errZ;
std::ostream & Print(std::ostream &out=std::cout) const
std::pair< Double_t, Double_t > HeadTail(const PndSdsCluster *Cluster)
std::vector< Int_t > GetClusterList() const
friend F32vec4 cos(const F32vec4 &a)
PndSdsChargeWeightingAlgorithms * fChargeAlgos
Int_t GetClusterSize() const
void ResetClusterFinders()
Int_t GetSensorID() const
virtual void Print(const Option_t *opt=0) const
Int_t GetClusterMean() const
void SetCalcStrip(PndSdsCalcStrip *calc)
Double_t GetSingleChargeCut() const
virtual void SetInBranchId()
const char * GetSensType() const
friend F32vec4 sqrt(const F32vec4 &a)
Bool_t SelectSensorParams(Int_t sensorID)
static T Sqrt(const T &x)
Int_t GetIndex(int i=0) const
PndSdsCalcStrip * fCurrentStripCalcTop
virtual void SetParContainers()
friend F32vec4 sin(const F32vec4 &a)
TClonesArray * fDigiArray
Class for digitised strip hits.
virtual void InitMQ(TList *tempList)
void SetPersistency(Bool_t val=kTRUE)
std::vector< Int_t > GetLeftDigiIDs() const
Bool_t Backmap(TVector2 meantopPoint, Double_t toperr, TVector2 meanbotPoint, Double_t boterr, TVector3 &hitpos, TMatrixD &hitCov, Int_t &sensorID)
Class for calculating strip indices from wafer hits.
const TVector2 GetStripDirection() const
TString GetPath(Int_t shortID)
for a given shortID the path is returned
Double_t GetOrient() const
virtual Double_t DigiValueToCharge(Double_t digi)=0
Converts a given digitized charge into charge in electrons.
TClonesArray * fClusterArray
TVector3 GetSensorDimensionsShortId(Int_t shortId)
std::map< const char *, PndSdsStripClusterer * > fClusterFinderList
void SetChargeConverter(PndSdsChargeConversion *ChargeConverter)
Double_t GetChargeCut() const
std::map< const char *, PndSdsCalcStrip * > fStripCalcBot
TMatrixD LocalToMasterErrorsShortId(const TMatrixD &local, const Int_t &shortId)
Class to access the naming information of the MVD.
Int_t GetDigiIndex(Int_t i) const
std::vector< Int_t > GetBotClusterIDs() const
virtual void SetCalculators()
void AddDigi(Int_t sensorID, SensorSide side, Int_t timestamp, Int_t strip, Int_t iDigi)
virtual void SetBranchNames()=0
virtual void ExecMQ(TList *inputList, TList *outputList)
void SetVerbose(Int_t level=0)
Digitization Parameter Class for MVD-Strip part.
std::pair< Double_t, Double_t > CenterOfGravity(const PndSdsCluster *Cluster)
friend F32vec4 fabs(const F32vec4 &a)
std::vector< Int_t > GetTopClusterIDs() const
virtual void SetParContainersMQ(TList *)
void SetBotIndex(Int_t id)
static PndGeoHandling * Instance()
std::map< const char *, PndSdsCalcStrip * > fStripCalcTop
Calculator objects.
virtual InitStatus Init()
TList * fChargeDigiParameterList
PndSensorNamePar * fSensorNamePar
void SetCurrentCalculators(PndSdsStripDigiPar *digipar)
PndSdsStripDigiPar * fCurrentDigiPar
virtual std::vector< PndSdsClusterStrip * > SearchClusters()=0
void CalcFeChToStrip(Int_t fe, Int_t channel, Int_t &strip, enum SensorSide &side) const
std::pair< Double_t, Double_t > Eta(const PndSdsCluster *Cluster, const TH2F *PosVsEta)
virtual InitStatus ReInit()
std::map< const char *, PndSdsChargeConversion * > fChargeConverter
std::pair< Double_t, Double_t > Binary(const PndSdsCluster *Cluster)
Double_t GetBotPitch() const
void FillClusterFinders()
TVector3 LocalToMasterShortId(const TVector3 &local, const Int_t &shortId)
virtual ~PndSdsStripClusterTask()
Int_t GetNIndices() const
TVector2 GetTopAnchor() const
TList * fDigiParameterList
Digitization Parameters.
void SetCov(TMatrixD cov)
PndSdsCalcStrip * fCurrentStripCalcBot
PndSdsChargeConversion * fCurrentChargeConverter
void CalcMeanCharge(PndSdsClusterStrip *onecluster, Double_t &meanstrip, Double_t &meanerr, Double_t &charge, Double_t ×tamp, Double_t ×tampError)
Double_t GetTopPitch() const
virtual void Exec(Option_t *opt)
void SetDigiArray(TClonesArray *darray)
PndSdsStripClusterer * fCurrentClusterfinder
Geometry name handling.
TMatrixT< double > TMatrixD
Double_t fSingleStripChargeThreshold
virtual void SetParContainers()
Unique match between SensorID and path in TGeoManager.
TVector2 CalcLineCross(TVector2 point1, TVector2 dir1, TVector2 point2, TVector2 dir2) const
void CalcStripPointOnLine(const Double_t strip, TVector2 &point) const
FairEventHeader * fEventHeader