* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
- * Contributors are mentioned in the code where appropriate. *
+ * Conributors are mentioned in the code where appropriate. *
* *
* Permission to use, copy, modify and distribute this software and its *
* documentation strictly for non-commercial purposes is hereby granted *
* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
- $Id$
-*/
-/*********************************************************************
- * This class defines the "Standard" reconstruction for the ITS
- * detector.
- **********************************************************************/
+
+////////////////////////////////////////////////////////////////////////
+// This class defines the "Standard" reconstruction for the ITS //
+// detector. //
+// //
+////////////////////////////////////////////////////////////////////////
+#include "TObjArray.h"
+#include "TTree.h"
+
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+#include "AliITSClusterFinder.h"
+#include "AliITSClusterFinderV2SPD.h"
+#include "AliITSClusterFinderV2SDD.h"
+#include "AliITSClusterFinderSDDfast.h"
+#include "AliITSClusterFinderV2SSD.h"
#include "AliITSDetTypeRec.h"
+#include "AliITSDDLModuleMapSDD.h"
+#include "AliITSRecPoint.h"
+#include "AliITSRecPointContainer.h"
+#include "AliITSCalibrationSDD.h"
+#include "AliITSMapSDD.h"
+#include "AliITSCalibrationSSD.h"
+#include "AliITSNoiseSSDv2.h"
+#include "AliITSGainSSDv2.h"
+#include "AliITSBadChannelsSSDv2.h"
+#include "AliITSNoiseSSD.h"
+#include "AliITSGainSSD.h"
+#include "AliITSBadChannelsSSD.h"
+#include "AliITSresponseSDD.h"
+#include "AliITSsegmentationSPD.h"
+#include "AliITSsegmentationSDD.h"
+#include "AliITSsegmentationSSD.h"
+#include "AliLog.h"
+#include "AliITSRawStreamSPD.h"
+#include "AliITSTriggerConditions.h"
+#include "AliITSFOSignalsSPD.h"
+#include "AliRunLoader.h"
+#include "AliDataLoader.h"
+#include "AliITSLoader.h"
+
+
+class AliITSDriftSpeedArraySDD;
+class AliITSCorrMapSDD;
+class AliITSRecoParam;
+
+const Int_t AliITSDetTypeRec::fgkNdettypes = 3;
+const Int_t AliITSDetTypeRec::fgkDefaultNModulesSPD = 240;
+const Int_t AliITSDetTypeRec::fgkDefaultNModulesSDD = 260;
+const Int_t AliITSDetTypeRec::fgkDefaultNModulesSSD = 1698;
ClassImp(AliITSDetTypeRec)
-//----------------------------------------------------------------------
+//________________________________________________________________
AliITSDetTypeRec::AliITSDetTypeRec(): TObject(),
-fGeom(), //
-fReconstruction(),// [NDet]
-fSegmentation(), // [NDet]
-fCalibration(), // [NMod]
-fPreProcess(), // [] e.g. Find Calibration values
-fPostProcess(), // [] e.g. find primary vertex
-fClusters(), //! [NMod][NClusters]
-fDigits(), //! [NMod][NDigits]
-fClusterClassName(), // String with Cluster class name
-fDigClassName(), // String with digit class name.
-fRecPointClassName(){// String with RecPoint class name
- // Default Constructor
+fNMod(0),
+fITSgeom(0),
+fReconstruction(0),
+fSegmentation(0),
+fCalibration(0),
+fSSDCalibration(0),
+fSPDDead(0),
+fSPDSparseDead(0),
+fTriggerConditions(0),
+fDigits(0),
+fFOSignals(0),
+fDDLMapSDD(0),
+fRespSDD(0),
+fAveGainSDD(0),
+fRecPoints(0),
+fNRecPoints(0),
+fFirstcall(kTRUE),
+fLoadOnlySPDCalib(0),
+fFastOrFiredMap(1200){
+ // Standard Constructor
// Inputs:
// none.
// Outputs:
// none.
// Return:
- // A properly zero-ed AliITSDetTypeRec class.
+ //
+
+ fReconstruction = new TObjArray(fgkNdettypes);
+ fDigits = new TObjArray(fgkNdettypes);
+ for(Int_t i=0; i<3; i++){
+ fkDigClassName[i]=0;
+ }
+ fSSDCalibration=new AliITSCalibrationSSD();
+ fNMod = new Int_t [fgkNdettypes];
+ fNMod[0] = fgkDefaultNModulesSPD;
+ fNMod[1] = fgkDefaultNModulesSDD;
+ fNMod[2] = fgkDefaultNModulesSSD;
+ fNRecPoints = 0;
+
+
+}
+
+//______________________________________________________________________
+AliITSDetTypeRec::AliITSDetTypeRec(const AliITSDetTypeRec & rec):TObject(rec),
+fNMod(rec.fNMod),
+fITSgeom(rec.fITSgeom),
+fReconstruction(rec.fReconstruction),
+fSegmentation(rec.fSegmentation),
+fCalibration(rec.fCalibration),
+fSSDCalibration(rec.fSSDCalibration),
+fSPDDead(rec.fSPDDead),
+fSPDSparseDead(rec.fSPDSparseDead),
+fTriggerConditions(rec.fTriggerConditions),
+fDigits(rec.fDigits),
+fFOSignals(rec.fFOSignals),
+fDDLMapSDD(rec.fDDLMapSDD),
+fRespSDD(rec.fRespSDD),
+fAveGainSDD(rec.fAveGainSDD),
+fRecPoints(rec.fRecPoints),
+fNRecPoints(rec.fNRecPoints),
+fFirstcall(rec.fFirstcall),
+fLoadOnlySPDCalib(rec.fLoadOnlySPDCalib),
+fFastOrFiredMap(rec.fFastOrFiredMap){
+
+ // Copy constructor.
+ for(Int_t i=0; i<3; i++){
+ fkDigClassName[i]=rec.fkDigClassName[i]; // NB only copies Char_t*, so not so safe, but this code should never be reached anyways
+ }
+}
+//______________________________________________________________________
+AliITSDetTypeRec& AliITSDetTypeRec::operator=(const AliITSDetTypeRec& source){
+ // Assignment operator.
+ this->~AliITSDetTypeRec();
+ new(this) AliITSDetTypeRec(source);
+ return *this;
+
}
-//----------------------------------------------------------------------
+
+//_____________________________________________________________________
AliITSDetTypeRec::~AliITSDetTypeRec(){
- // Destructor
+ //Destructor
+
+ if(fReconstruction){
+ fReconstruction->Delete();
+ delete fReconstruction;
+ }
+ if(fSegmentation){
+ fSegmentation->Delete();
+ delete fSegmentation;
+ }
+ if(fCalibration){
+ if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+ fCalibration->Delete();
+ delete fCalibration;
+ if(fRespSDD) delete fRespSDD;
+ if(fDDLMapSDD) delete fDDLMapSDD;
+ }
+ }
+ if(fSSDCalibration){
+ if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+ delete fSSDCalibration;
+ }
+ }
+ if(fSPDDead){
+ if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+ fSPDDead->Delete();
+ delete fSPDDead;
+ }
+ }
+ if(fSPDSparseDead){
+ if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+ fSPDSparseDead->Delete();
+ delete fSPDSparseDead;
+ }
+ }
+ if(fTriggerConditions){
+ if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+ fTriggerConditions->Delete();
+ delete fTriggerConditions;
+ }
+ }
+ if(fDigits){
+ fDigits->Delete();
+ delete fDigits;
+ }
+ if(fRecPoints){
+ fRecPoints->Delete();
+ delete fRecPoints;
+ }
+ delete [] fNMod;
+
+ if (fITSgeom) delete fITSgeom;
+
+}
+
+//___________________________________________________________________
+void AliITSDetTypeRec::SetReconstructionModel(Int_t dettype,AliITSClusterFinder *clf){
+
+ //Set reconstruction model for detector type
+
+ if(fReconstruction==0) fReconstruction = new TObjArray(fgkNdettypes);
+ if(fReconstruction->At(dettype)!=0) delete fReconstruction->At(dettype);
+ fReconstruction->AddAt(clf,dettype);
+}
+//______________________________________________________________________
+AliITSClusterFinder* AliITSDetTypeRec::GetReconstructionModel(Int_t dettype) const{
+
+ //Get reconstruction model for detector type
+ if(fReconstruction==0) {
+ Warning("GetReconstructionModel","fReconstruction is 0!");
+ return 0;
+ }
+ return (AliITSClusterFinder*)fReconstruction->At(dettype);
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::SetSegmentationModel(Int_t dettype,AliITSsegmentation *seg){
+
+ //Set segmentation model for detector type
+
+ if(fSegmentation==0) fSegmentation = new TObjArray(fgkNdettypes);
+ if(fSegmentation->At(dettype)!=0) delete fSegmentation->At(dettype);
+ fSegmentation->AddAt(seg,dettype);
+
+}
+//______________________________________________________________________
+AliITSsegmentation* AliITSDetTypeRec::GetSegmentationModel(Int_t dettype) const {
+
+ //Get segmentation model for detector type
+
+ if(fSegmentation==0) {
+ Warning("GetSegmentationModel","fSegmentation is 0!");
+ return 0;
+ }
+ return (AliITSsegmentation*)fSegmentation->At(dettype);
+
+}
+//_______________________________________________________________________
+void AliITSDetTypeRec::SetCalibrationModel(Int_t iMod, AliITSCalibration *cal){
+
+ //Set calibration (response) for the module iMod of type dettype
+ if (fCalibration==0) {
+ fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
+ fCalibration->SetOwner(kTRUE);
+ fCalibration->Clear();
+ }
+
+ if (fCalibration->At(iMod) != 0)
+ delete (AliITSCalibration*) fCalibration->At(iMod);
+ fCalibration->AddAt(cal,iMod);
+
+}
+//_______________________________________________________________________
+void AliITSDetTypeRec::SetSPDDeadModel(Int_t iMod, AliITSCalibration *cal){
+
+ //Set dead pixel info for the SPD module iMod
+ if (fSPDDead==0) {
+ fSPDDead = new TObjArray(fgkDefaultNModulesSPD);
+ fSPDDead->SetOwner(kTRUE);
+ fSPDDead->Clear();
+ }
+
+ if (fSPDDead->At(iMod) != 0)
+ delete (AliITSCalibration*) fSPDDead->At(iMod);
+ fSPDDead->AddAt(cal,iMod);
+}
+//_______________________________________________________________________
+void AliITSDetTypeRec::SetSPDSparseDeadModel(Int_t iMod, AliITSCalibration *cal){
+
+ //Set dead pixel info for the SPD ACTIVE module iMod
+ if (fSPDSparseDead==0) {
+ fSPDSparseDead = new TObjArray(fgkDefaultNModulesSPD);
+ fSPDSparseDead->SetOwner(kTRUE);
+ fSPDSparseDead->Clear();
+ }
+
+ if (fSPDSparseDead->At(iMod) != 0)
+ delete (AliITSCalibration*) fSPDSparseDead->At(iMod);
+ fSPDSparseDead->AddAt(cal,iMod);
+}
+//_______________________________________________________________________
+AliITSCalibration* AliITSDetTypeRec::GetCalibrationModel(Int_t iMod) const {
+
+ //Get calibration model for module type
+
+ if(fCalibration==0) {
+ Warning("GetalibrationModel","fCalibration is 0!");
+ return 0;
+ }
+
+ if(iMod<fgkDefaultNModulesSPD+fgkDefaultNModulesSDD){
+ return (AliITSCalibration*)fCalibration->At(iMod);
+ }else{
+ Int_t i=iMod-(fgkDefaultNModulesSPD+fgkDefaultNModulesSDD);
+ fSSDCalibration->SetModule(i);
+ return (AliITSCalibration*)fSSDCalibration;
+ }
+
+}
+//_______________________________________________________________________
+AliITSCalibration* AliITSDetTypeRec::GetSPDDeadModel(Int_t iMod) const {
+
+ //Get SPD dead for module iMod
+
+ if(fSPDDead==0) {
+ AliWarning("fSPDDead is 0!");
+ return 0;
+ }
+ return (AliITSCalibration*)fSPDDead->At(iMod);
+}
+//_______________________________________________________________________
+AliITSCalibration* AliITSDetTypeRec::GetSPDSparseDeadModel(Int_t iMod) const {
+
+ //Get SPD dead for module iMod
+
+ if(fSPDSparseDead==0) {
+ AliWarning("fSPDSparseDead is 0!");
+ return 0;
+ }
+ return (AliITSCalibration*)fSPDSparseDead->At(iMod);
+}
+//_______________________________________________________________________
+AliITSTriggerConditions* AliITSDetTypeRec::GetTriggerConditions() const {
+ //Get Pixel Trigger Conditions
+ if (fTriggerConditions==0) {
+ AliWarning("fTriggerConditions is 0!");
+ }
+ return fTriggerConditions;
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::SetTreeAddressD(TTree* const treeD){
+ // Set branch address for the tree of digits.
+
+ const char *det[4] = {"SPD","SDD","SSD","ITS"};
+ TBranch *branch;
+ const Char_t* digclass;
+ Int_t i;
+ char branchname[30];
+
+ if(!treeD) return;
+ if (fDigits == 0x0) {
+ fDigits = new TObjArray(fgkNdettypes);
+ }
+ else {
+ ResetDigits();
+ }
+ for (i=0; i<fgkNdettypes; i++) {
+ digclass = GetDigitClassName(i);
+ fDigits->AddAt(new TClonesArray(digclass,1000),i);
+ if (fgkNdettypes==3) snprintf(branchname,29,"%sDigits%s",det[3],det[i]);
+ else snprintf(branchname,29,"%sDigits%d",det[3],i+1);
+ branch = treeD->GetBranch(branchname);
+ if (branch) branch->SetAddress(&((*fDigits)[i]));
+ }
+
+}
+
+//_______________________________________________________________________
+TBranch* AliITSDetTypeRec::MakeBranchInTree(TTree* const tree,
+ const char* name, const char *classname,
+ void* address,Int_t size,Int_t splitlevel)
+{
+//
+// Makes branch in given tree and diverts them to a separate file
+//
+//
+//
+
+ if (tree == 0x0) {
+ Error("MakeBranchInTree","Making Branch %s Tree is NULL",name);
+ return 0x0;
+ }
+ TBranch *branch = tree->GetBranch(name);
+ if (branch) {
+ return branch;
+ }
+ if (classname){
+ branch = tree->Branch(name,classname,address,size,splitlevel);
+ }
+ else {
+ branch = tree->Bronch(name, "TClonesArray", address, size, splitlevel);
+ }
+
+ return branch;
+}
+
+//____________________________________________________________________
+void AliITSDetTypeRec::SetDefaults(){
+
+ //Set defaults for segmentation and response
+
+ if(!GetITSgeom()){
+ Warning("SetDefaults","null pointer to AliITSgeomGeom !");
+ return;
+ }
+
+ AliITSsegmentation* seg;
+ if(!GetCalibration()) {AliFatal("Exit");exit(0);}
+
+ for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
+ if(dettype==0){
+ seg = new AliITSsegmentationSPD();
+ SetSegmentationModel(dettype,seg);
+ SetDigitClassName(dettype,"AliITSdigitSPD");
+ }
+ if(dettype==1){
+ seg = new AliITSsegmentationSDD();
+ if(fLoadOnlySPDCalib==kFALSE){
+ AliITSCalibrationSDD* cal=(AliITSCalibrationSDD*)GetCalibrationModel(fgkDefaultNModulesSPD+1);
+ if(cal->IsAMAt20MHz()){
+ seg->SetPadSize(seg->Dpz(0),20.);
+ seg->SetNPads(seg->Npz()/2,128);
+ }
+ }
+ SetSegmentationModel(dettype,seg);
+ SetDigitClassName(dettype,"AliITSdigitSDD");
+ }
+ if(dettype==2){
+ AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD();
+ SetSegmentationModel(dettype,seg2);
+ SetDigitClassName(dettype,"AliITSdigitSSD");
+ }
+ }
+}
+//______________________________________________________________________
+Bool_t AliITSDetTypeRec::GetCalibration() {
+ // Get Default calibration if a storage is not defined.
+
+ if(!fFirstcall){
+ AliITSCalibration* cal = GetCalibrationModel(0);
+ if(cal)return kTRUE;
+ }else {
+ fFirstcall = kFALSE;
+ }
+
+ // SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
+ // Int_t run=GetRunNumber();
+
+ Bool_t cacheStatus = AliCDBManager::Instance()->GetCacheFlag();
+ if (fCalibration==0) {
+ fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
+ fCalibration->SetOwner(!cacheStatus);
+ fCalibration->Clear();
+ }
+
+ Bool_t retCode=GetCalibrationSPD(cacheStatus);
+ if(retCode==kFALSE) return kFALSE;
+
+ if(fLoadOnlySPDCalib==kFALSE){
+ retCode=GetCalibrationSDD(cacheStatus);
+ if(retCode==kFALSE) return kFALSE;
+ retCode=GetCalibrationSSD(cacheStatus);
+ if(retCode==kFALSE) return kFALSE;
+ }
+
+ AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
+ fNMod[0], fNMod[1], fNMod[2]));
+ return kTRUE;
+}
+//______________________________________________________________________
+Bool_t AliITSDetTypeRec::GetCalibrationSPD(Bool_t cacheStatus) {
+ // Get SPD calibration objects from OCDB
+ // dead pixel are not used for local reconstruction
+
+
+ AliCDBEntry *noisySPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDNoisy");
+ AliCDBEntry *deadSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDDead");
+ AliCDBEntry *deadSparseSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDSparseDead");
+ AliCDBEntry *pitCond = AliCDBManager::Instance()->Get("TRIGGER/SPD/PITConditions");
+ if(!noisySPD || !deadSPD || !pitCond ){
+ AliFatal("SPD Calibration object retrieval failed! ");
+ return kFALSE;
+ }
+
+ TObjArray *calNoisySPD = (TObjArray*) noisySPD->GetObject();
+ if (!cacheStatus) noisySPD->SetObject(NULL);
+ noisySPD->SetOwner(kTRUE);
+
+ TObjArray *calDeadSPD = (TObjArray*) deadSPD->GetObject();
+ if (!cacheStatus) deadSPD->SetObject(NULL);
+ deadSPD->SetOwner(kTRUE);
+
+ TObjArray *calSparseDeadSPD = (TObjArray*) deadSparseSPD->GetObject();
+ if (!cacheStatus) deadSparseSPD->SetObject(NULL);
+ deadSparseSPD->SetOwner(kTRUE);
+
+
+ AliITSTriggerConditions *calPitCond = (AliITSTriggerConditions*) pitCond->GetObject();
+ if (!cacheStatus) pitCond->SetObject(NULL);
+ pitCond->SetOwner(kTRUE);
+
+ if(!cacheStatus){
+ delete noisySPD;
+ delete deadSPD;
+ delete deadSparseSPD;
+ delete pitCond;
+ }
+ if ((!calNoisySPD) || (!calDeadSPD) || (!calSparseDeadSPD) || (!calPitCond)){
+ AliWarning("Can not get SPD calibration from calibration database !");
+ return kFALSE;
+ }
+ fNMod[0] = calNoisySPD->GetEntries();
+
+ AliITSCalibration* cal;
+ for (Int_t i=0; i<fNMod[0]; i++) {
+ cal = (AliITSCalibration*) calNoisySPD->At(i);
+ SetCalibrationModel(i, cal);
+ cal = (AliITSCalibration*) calDeadSPD->At(i);
+ SetSPDDeadModel(i, cal);
+ cal = (AliITSCalibration*) calSparseDeadSPD->At(i);
+ SetSPDSparseDeadModel(i, cal);
+ }
+ fTriggerConditions = calPitCond;
+
+ return kTRUE;
+}
+
+//______________________________________________________________________
+Bool_t AliITSDetTypeRec::GetCalibrationSDD(Bool_t cacheStatus) {
+ // Get SDD calibration objects from OCDB
+
+ AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD");
+ AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD");
+ AliCDBEntry *drSpSDD = AliCDBManager::Instance()->Get("ITS/Calib/DriftSpeedSDD");
+ AliCDBEntry *ddlMapSDD = AliCDBManager::Instance()->Get("ITS/Calib/DDLMapSDD");
+ // AliCDBEntry *mapASDD = AliCDBManager::Instance()->Get("ITS/Calib/MapsAnodeSDD");
+ AliCDBEntry *mapTSDD = AliCDBManager::Instance()->Get("ITS/Calib/MapsTimeSDD");
+
+ if(!entrySDD || !entry2SDD || !drSpSDD || !ddlMapSDD || !mapTSDD ){
+ AliFatal("SDD Calibration object retrieval failed! ");
+ return kFALSE;
+ }
+
+
+
+ TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
+ if(!cacheStatus)entrySDD->SetObject(NULL);
+ entrySDD->SetOwner(kTRUE);
+
+ AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
+ if(!cacheStatus)entry2SDD->SetObject(NULL);
+ entry2SDD->SetOwner(kTRUE);
+
+ TObjArray *drSp = (TObjArray *)drSpSDD->GetObject();
+ if(!cacheStatus)drSpSDD->SetObject(NULL);
+ drSpSDD->SetOwner(kTRUE);
+
+ AliITSDDLModuleMapSDD *ddlsdd=(AliITSDDLModuleMapSDD*)ddlMapSDD->GetObject();
+ if(!cacheStatus)ddlMapSDD->SetObject(NULL);
+ ddlMapSDD->SetOwner(kTRUE);
+
+// TObjArray *mapAn = (TObjArray *)mapASDD->GetObject();
+// if(!cacheStatus)mapASDD->SetObject(NULL);
+// mapASDD->SetOwner(kTRUE);
+
+ TObjArray *mapT = (TObjArray *)mapTSDD->GetObject();
+ if(!cacheStatus)mapTSDD->SetObject(NULL);
+ mapTSDD->SetOwner(kTRUE);
+
+
+ // DB entries are deleted. In this way metadeta objects are deleted as well
+ if(!cacheStatus){
+ delete entrySDD;
+ delete entry2SDD;
+ //delete mapASDD;
+ delete mapTSDD;
+ delete drSpSDD;
+ delete ddlMapSDD;
+ }
+
+ if ((!pSDD)||(!calSDD) || (!drSp) || (!ddlsdd) || (!mapT) ){
+ AliWarning("Can not get SDD calibration from calibration database !");
+ return kFALSE;
+ }
+
+ fNMod[1] = calSDD->GetEntries();
+
+ fDDLMapSDD=ddlsdd;
+ fRespSDD=pSDD;
+ AliITSCalibration* cal;
+ Float_t avegain=0.;
+ Float_t nGdAnodes=0;
+ Bool_t oldMapFormat=kFALSE;
+ TObject* objmap=(TObject*)mapT->At(0);
+ TString cname(objmap->ClassName());
+ if(cname.CompareTo("AliITSMapSDD")==0){
+ oldMapFormat=kTRUE;
+ AliInfo("SDD Maps converted to new format");
+ }
+ for(Int_t iddl=0; iddl<AliITSDDLModuleMapSDD::GetNDDLs(); iddl++){
+ for(Int_t icar=0; icar<AliITSDDLModuleMapSDD::GetNModPerDDL();icar++){
+ Int_t iMod=fDDLMapSDD->GetModuleNumber(iddl,icar);
+ if(iMod==-1) continue;
+ Int_t i=iMod - fgkDefaultNModulesSPD;
+ cal = (AliITSCalibration*) calSDD->At(i);
+ Int_t i0=2*i;
+ Int_t i1=1+2*i;
+ for(Int_t iAnode=0;iAnode< ((AliITSCalibrationSDD*)cal)->NOfAnodes(); iAnode++){
+ if(((AliITSCalibrationSDD*)cal)->IsBadChannel(iAnode)) continue;
+ avegain+= ((AliITSCalibrationSDD*)cal)->GetChannelGain(iAnode);
+ nGdAnodes++;
+ }
+ AliITSDriftSpeedArraySDD* arr0 = (AliITSDriftSpeedArraySDD*) drSp->At(i0);
+ AliITSDriftSpeedArraySDD* arr1 = (AliITSDriftSpeedArraySDD*) drSp->At(i1);
+
+ AliITSCorrMapSDD* mt0 = 0;
+ AliITSCorrMapSDD* mt1 = 0;
+ if(oldMapFormat){
+ AliITSMapSDD* oldmap0=(AliITSMapSDD*)mapT->At(i0);
+ AliITSMapSDD* oldmap1=(AliITSMapSDD*)mapT->At(i1);
+ mt0=oldmap0->ConvertToNewFormat();
+ mt1=oldmap1->ConvertToNewFormat();
+ }else{
+ mt0=(AliITSCorrMapSDD*)mapT->At(i0);
+ mt1=(AliITSCorrMapSDD*)mapT->At(i1);
+ }
+ cal->SetDriftSpeed(0,arr0);
+ cal->SetDriftSpeed(1,arr1);
+ cal->SetMapT(0,mt0);
+ cal->SetMapT(1,mt1);
+ SetCalibrationModel(iMod, cal);
+ }
+ }
+ if(nGdAnodes) fAveGainSDD=avegain/nGdAnodes;
+ return kTRUE;
+}
+
+
+//______________________________________________________________________
+Bool_t AliITSDetTypeRec::GetCalibrationSSD(Bool_t cacheStatus) {
+ // Get SSD calibration objects from OCDB
+ // AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD");
+
+ AliCDBEntry *entryNoiseSSD = AliCDBManager::Instance()->Get("ITS/Calib/NoiseSSD");
+ AliCDBEntry *entryGainSSD = AliCDBManager::Instance()->Get("ITS/Calib/GainSSD");
+ AliCDBEntry *entryBadChannelsSSD = AliCDBManager::Instance()->Get("ITS/Calib/BadChannelsSSD");
+
+ if(!entryNoiseSSD || !entryGainSSD || !entryBadChannelsSSD){
+ AliFatal("SSD Calibration object retrieval failed! ");
+ return kFALSE;
+ }
+
+ TObject *emptyssd = 0; TString ssdobjectname;
+ AliITSNoiseSSDv2 *noiseSSD = NULL;
+ emptyssd = (TObject *)entryNoiseSSD->GetObject();
+ ssdobjectname = emptyssd->GetName();
+ if(ssdobjectname=="TObjArray") {
+ TObjArray *noiseSSDOld = (TObjArray *)entryNoiseSSD->GetObject();
+ noiseSSD = new AliITSNoiseSSDv2();
+ ReadOldSSDNoise(noiseSSDOld, noiseSSD);
+ }
+ else if(ssdobjectname=="AliITSNoiseSSDv2")
+ noiseSSD = (AliITSNoiseSSDv2 *)entryNoiseSSD->GetObject();
+ if(!cacheStatus)entryNoiseSSD->SetObject(NULL);
+ entryNoiseSSD->SetOwner(kTRUE);
+
+ AliITSGainSSDv2 *gainSSD = NULL;;
+ emptyssd = (TObject *)entryGainSSD->GetObject();
+ ssdobjectname = emptyssd->GetName();
+ if(ssdobjectname=="Gain") {
+ TObjArray *gainSSDOld = (TObjArray *)entryGainSSD->GetObject();
+ gainSSD = new AliITSGainSSDv2();
+ ReadOldSSDGain(gainSSDOld, gainSSD);
+ }
+ else if(ssdobjectname=="AliITSGainSSDv2")
+ gainSSD = (AliITSGainSSDv2 *)entryGainSSD->GetObject();
+ if(!cacheStatus)entryGainSSD->SetObject(NULL);
+ entryGainSSD->SetOwner(kTRUE);
+
+ AliITSBadChannelsSSDv2 *badChannelsSSD = NULL;
+ emptyssd = (TObject *)entryBadChannelsSSD->GetObject();
+ ssdobjectname = emptyssd->GetName();
+ if(ssdobjectname=="TObjArray") {
+ TObjArray *badChannelsSSDOld = (TObjArray *)entryBadChannelsSSD->GetObject();
+ badChannelsSSD = new AliITSBadChannelsSSDv2();
+ ReadOldSSDBadChannels(badChannelsSSDOld, badChannelsSSD);
+ }
+ else if(ssdobjectname=="AliITSBadChannelsSSDv2")
+ badChannelsSSD = (AliITSBadChannelsSSDv2*)entryBadChannelsSSD->GetObject();
+ if(!cacheStatus)entryBadChannelsSSD->SetObject(NULL);
+ entryBadChannelsSSD->SetOwner(kTRUE);
+
+ // DB entries are deleted. In this way metadeta objects are deleted as well
+ if(!cacheStatus){
+ delete entryNoiseSSD;
+ delete entryGainSSD;
+ delete entryBadChannelsSSD;
+ }
+
+ if ((!noiseSSD)|| (!gainSSD)|| (!badChannelsSSD)) {
+ AliWarning("Can not get SSD calibration from calibration database !");
+ return kFALSE;
+ }
+
+ fSSDCalibration->SetNoise(noiseSSD);
+ fSSDCalibration->SetGain(gainSSD);
+ fSSDCalibration->SetBadChannels(badChannelsSSD);
+ //fSSDCalibration->FillBadChipMap();
+
+ return kTRUE;
+}
+
+//________________________________________________________________
+void AliITSDetTypeRec::SetDefaultClusterFindersV2(Bool_t rawdata, Bool_t fastSDD){
+
+ //Set defaults for cluster finder V2
+
+ if(!GetITSgeom()){
+ Warning("SetDefaults","Null pointer to AliITSgeom !");
+ return;
+ }
+
+ AliITSClusterFinder *clf;
+
+ for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
+ //SPD
+ if(dettype==0){
+ if(!GetReconstructionModel(dettype)){
+ clf = new AliITSClusterFinderV2SPD(this);
+ clf->InitGeometry();
+ if(!rawdata) clf->SetDigits(DigitsAddress(0));
+ SetReconstructionModel(dettype,clf);
+
+ }
+ }
+ //SDD
+ if(dettype==1){
+ if(!GetReconstructionModel(dettype)){
+ if(fastSDD){
+ clf = new AliITSClusterFinderSDDfast(this);
+ }
+ else {
+ clf = new AliITSClusterFinderV2SDD(this);
+ }
+ clf->InitGeometry();
+ if(!rawdata) clf->SetDigits(DigitsAddress(1));
+ SetReconstructionModel(dettype,clf);
+ }
+
+ }
+
+ //SSD
+ if(dettype==2){
+ if(!GetReconstructionModel(dettype)){
+ clf = new AliITSClusterFinderV2SSD(this);
+ clf->InitGeometry();
+ if(!rawdata) clf->SetDigits(DigitsAddress(2));
+ SetReconstructionModel(dettype,clf);
+ }
+ }
+
+ }
+
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::MakeBranch(TTree* tree, Option_t* option){
+
+ //Creates branches for clusters and recpoints
+ Bool_t cR = (strstr(option,"R")!=0);
+ Bool_t cRF = (strstr(option,"RF")!=0);
+
+ if(cRF)cR = kFALSE;
+
+ if(cR) MakeBranchR(tree);
+ if(cRF) MakeBranchRF(tree);
+
+}
+
+//___________________________________________________________________
+void AliITSDetTypeRec::ResetDigits(){
+ // Reset number of digits and the digits array for the ITS detector.
+
+ if(!fDigits) return;
+ for(Int_t i=0;i<fgkNdettypes;i++){
+ ResetDigits(i);
+ }
+}
+//___________________________________________________________________
+void AliITSDetTypeRec::ResetDigits(Int_t branch){
+ // Reset number of digits and the digits array for this branch.
+
+ if(fDigits->At(branch)) ((TClonesArray*)fDigits->At(branch))->Clear();
+
+}
+//__________________________________________________________________
+void AliITSDetTypeRec::MakeBranchR(TTree *treeR, Option_t *opt){
+
+ //Creates tree branches for recpoints
+ // Inputs:
+ // cont char *file File name where RecPoints branch is to be written
+ // to. If blank it write the SDigits to the same
+ // file in which the Hits were found.
+
+ Int_t buffsz = 4000;
+ char branchname[30];
+
+ // only one branch for rec points for all detector types
+ Bool_t oFast= (strstr(opt,"Fast")!=0);
+
+ Char_t detname[10] = "ITS";
+
+
+ if(oFast){
+ snprintf(branchname,29,"%sRecPointsF",detname);
+ } else {
+ snprintf(branchname,29,"%sRecPoints",detname);
+ }
+
+ if(!fRecPoints)fRecPoints = new TClonesArray("AliITSRecPoint",1000);
+ if (treeR)
+ MakeBranchInTree(treeR,branchname,0,&fRecPoints,buffsz,99);
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::SetTreeAddressR(TTree* const treeR){
+ // Set branch address for the Reconstructed points Trees.
// Inputs:
- // none.
+ // TTree *treeR Tree containing the RecPoints.
// Outputs:
- // none.
+ // none.
+ // Return:
+
+ char branchname[30];
+ Char_t namedet[10]="ITS";
+
+ if(!treeR) return;
+ if(fRecPoints==0x0) fRecPoints = new TClonesArray("AliITSRecPoint",1000);
+ TBranch *branch;
+ snprintf(branchname,29,"%sRecPoints",namedet);
+ branch = treeR->GetBranch(branchname);
+ if (branch) {
+ branch->SetAddress(&fRecPoints);
+ }
+ else {
+ snprintf(branchname,29,"%sRecPointsF",namedet);
+ branch = treeR->GetBranch(branchname);
+ if (branch) {
+ branch->SetAddress(&fRecPoints);
+ }
+ }
+}
+//____________________________________________________________________
+void AliITSDetTypeRec::AddRecPoint(const AliITSRecPoint &r){
+ // Add a reconstructed space point to the list
+ // Inputs:
+ // const AliITSRecPoint &r RecPoint class to be added to the tree
+ // of reconstructed points TreeR.
+ // Outputs:
+ // none.
// Return:
- // Nothing.
+ // none.
+ TClonesArray &lrecp = *fRecPoints;
+ new(lrecp[fNRecPoints++]) AliITSRecPoint(r);
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::DigitsToRecPoints(TTree *treeD,TTree *treeR,Int_t lastentry,Option_t *opt, Int_t optCluFind){
+ // cluster finding and reconstruction of space points
+ // the condition below will disappear when the geom class will be
+ // initialized for all versions - for the moment it is only for v5 !
+ // 7 is the SDD beam test version
+ // Inputs:
+ // TTree *treeD Digits tree
+ // TTree *treeR Clusters tree
+ // Int_t lastentry Offset for module when not all of the modules
+ // are processed.
+ // Option_t *opt String indicating which ITS sub-detectors should
+ // be processed. If ="All" then all of the ITS
+ // sub detectors are processed.
+
+ const char *all = strstr(opt,"All");
+ const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
+ strstr(opt,"SSD")};
+ if(optCluFind==0){
+ SetDefaultClusterFindersV2();
+ AliDebug(1,"V2 cluster finder has been selected \n");
+ }else{
+ SetDefaultClusterFindersV2(kFALSE,kTRUE);
+ AliDebug(1,"SPD and SSD V2 Cluster Finder - SDD fast Cluster Finder \n");
+ }
+
+
+ // Reset Fast-OR fired map
+ ResetFastOrFiredMap();
+
+ if (all || det[0]) { // SPD present
+ // Get the FO signals for this event
+ AliRunLoader* runLoader = AliRunLoader::Instance();
+ AliITSLoader* itsLoader = (AliITSLoader*) runLoader->GetLoader("ITSLoader");
+ if (!itsLoader) {
+ AliError("ITS loader is NULL.");
+ }
+ else {
+ fFOSignals = (AliITSFOSignalsSPD*)itsLoader->TreeD()->GetUserInfo()->FindObject("AliITSFOSignalsSPD");
+ if(!fFOSignals) AliError("FO signals not retrieved");
+ }
+
+ }
+
+
+ AliITSClusterFinder *rec = 0;
+ Int_t id,module,first=0;
+ for(module=0;module<GetITSgeom()->GetIndexMax();module++){
+ id = GetITSgeom()->GetModuleType(module);
+ if (!all && !det[id]) continue;
+ if(det[id]) first = GetITSgeom()->GetStartDet(id);
+ rec = (AliITSClusterFinder*)GetReconstructionModel(id);
+ TClonesArray *itsDigits = DigitsAddress(id);
+ if (!rec){
+ AliFatal("The reconstruction class was not instanciated!");
+ return;
+ }
+ ResetDigits(); // MvL: Not sure we neeed this when rereading anyways
+ if (all) {
+ treeD->GetEvent(lastentry+module);
+ }
+ else {
+ treeD->GetEvent(lastentry+(module-first));
+ }
+ Int_t ndigits = itsDigits->GetEntriesFast();
+ if (ndigits>0 || id==0) { // for SPD we always want to call FindRawClusters (to process FO signals)
+ rec->SetDetTypeRec(this);
+ rec->SetDigits(DigitsAddress(id));
+ // rec->SetClusters(ClustersAddress(id));
+ rec->FindRawClusters(module);
+ } // end if
+ treeR->Fill();
+ ResetRecPoints();
+ }
+
+ // Remove PIT in-active chips from Fast-OR fired map
+ if (all || det[0]) { // SPD present
+ RemoveFastOrFiredInActive();
+ // here removing bits which have no associated clusters
+ RemoveFastOrFiredFromDead(GetFiredChipMap(treeR));
+ }
+
+ AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
+ Int_t nClu[6];
+ nClu[0]=rpcont->GetNClustersInLayer(1,treeR);
+ for(Int_t iLay=2; iLay<=6; iLay++) nClu[iLay-1]=rpcont->GetNClustersInLayerFast(iLay);
+ AliInfo(Form("Number of RecPoints in ITS Layers = %d %d %d %d %d %d",
+ nClu[0],nClu[1],nClu[2],nClu[3],nClu[4],nClu[5]));
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader,TTree *treeR,Option_t *opt){
+ // cluster finding and reconstruction of space points
+ // the condition below will disappear when the geom class will be
+ // initialized for all versions - for the moment it is only for v5 !
+ // 7 is the SDD beam test version
+ // Inputs:
+ // AliRawReader *rawReader Pointer to the raw-data reader
+ // TTree *treeR Clusters tree
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ const char *all = strstr(opt,"All");
+ const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
+ strstr(opt,"SSD")};
+
+ Int_t id=0;
+ AliITSRecPointContainer* rpc = AliITSRecPointContainer::Instance();
+ rpc->FullReset();
+ TClonesArray* array = rpc->UncheckedGetClusters(0);
+ TBranch *branch = treeR->Branch("ITSRecPoints",&array);
+ DigitsToRecPoints(rawReader,opt);
+
+ Int_t nClusters =0;
+ for(Int_t iModule=0;iModule<GetITSgeom()->GetIndexMax();iModule++){
+ id = GetITSgeom()->GetModuleType(iModule);
+ if (!all && !det[id]) continue;
+ array = rpc->UncheckedGetClusters(iModule);
+ if(!array){
+ AliDebug(1,Form("data for module %d missing!",iModule));
+ }
+ branch->SetAddress(&array);
+ treeR->Fill();
+ nClusters+=array->GetEntriesFast();
+ }
+
+ rpc->FullReset();
+
+ AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
+ Int_t nClu[6];
+ nClu[0]=rpcont->GetNClustersInLayer(1,treeR);
+ for(Int_t iLay=2; iLay<=6; iLay++) nClu[iLay-1]=rpcont->GetNClustersInLayerFast(iLay);
+ AliInfo(Form("Number of RecPoints in ITS Layers = %d %d %d %d %d %d, Total = %d",
+ nClu[0],nClu[1],nClu[2],nClu[3],nClu[4],nClu[5],nClusters));
}
-//----------------------------------------------------------------------
+//______________________________________________________________________
+void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader,Option_t *opt){
+ // cluster finding and reconstruction of space points
+ // the condition below will disappear when the geom class will be
+ // initialized for all versions - for the moment it is only for v5 !
+ // 7 is the SDD beam test version
+ // Inputs:
+ // AliRawReader *rawReader Pointer to the raw-data reader
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ const char *all = strstr(opt,"All");
+ const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
+ strstr(opt,"SSD")};
+
+ // Reset Fast-OR fired map
+ ResetFastOrFiredMap();
+
+ AliITSClusterFinder *rec = 0;
+ Int_t id=0;
+
+ for(id=0;id<3;id++){
+ if (!all && !det[id]) continue;
+ rec = (AliITSClusterFinder*)GetReconstructionModel(id);
+ if (!rec){
+ AliFatal("The reconstruction class was not instantiated");
+ return;
+ }
+ rec->SetDetTypeRec(this);
+ rec->RawdataToClusters(rawReader);
+ }
+
+ // Remove PIT in-active chips from Fast-OR fired map
+ if (all || det[0]) { // SPD present
+ RemoveFastOrFiredInActive();
+ // here removing bits which have no associated clusters
+ RemoveFastOrFiredFromDead(GetFiredChipMap());
+
+ }
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDNoise(const TObjArray *array,
+ AliITSNoiseSSDv2 *noiseSSD) {
+ //Reads the old SSD calibration object and converts it to the new format
+ const Int_t fgkSSDSTRIPSPERMODULE = 1536;
+ const Int_t fgkSSDPSIDESTRIPSPERMODULE = 768;
+
+ Int_t gNMod = array->GetEntries();
+ AliInfo("Converting old calibration object for noise...\n");
+
+ //NOISE
+ Double_t noise = 0.0;
+ for (Int_t iModule = 0; iModule < gNMod; iModule++) {
+ AliITSNoiseSSD *noiseModule = (AliITSNoiseSSD*) (array->At(iModule));
+ for(Int_t iStrip = 0; iStrip < fgkSSDSTRIPSPERMODULE; iStrip++) {
+ noise = (iStrip < fgkSSDPSIDESTRIPSPERMODULE) ? noiseModule->GetNoiseP(iStrip) : noiseModule->GetNoiseN(1535 - iStrip);
+ if(iStrip < fgkSSDPSIDESTRIPSPERMODULE)
+ noiseSSD->AddNoiseP(iModule,iStrip,noise);
+ if(iStrip >= fgkSSDPSIDESTRIPSPERMODULE)
+ noiseSSD->AddNoiseN(iModule,1535 - iStrip,noise);
+ }//loop over strips
+ }//loop over modules
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDBadChannels(const TObjArray *array,
+ AliITSBadChannelsSSDv2 *badChannelsSSD) {
+ //Reads the old SSD calibration object and converts it to the new format
+ Int_t gNMod = array->GetEntries();
+ AliInfo("Converting old calibration object for bad channels...");
+ for (Int_t iModule = 0; iModule < gNMod; iModule++) {
+ //for (Int_t iModule = 0; iModule < 1; iModule++) {
+ AliITSBadChannelsSSD *bad = (AliITSBadChannelsSSD*) (array->At(iModule));
+ TArrayI arrayPSide = bad->GetBadPChannelsList();
+ for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++)
+ badChannelsSSD->AddBadChannelP(iModule,
+ iPCounter,
+ (Char_t)arrayPSide.At(iPCounter));
+
+ TArrayI arrayNSide = bad->GetBadNChannelsList();
+ for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++)
+ badChannelsSSD->AddBadChannelN(iModule,
+ iNCounter,
+ (Char_t)arrayNSide.At(iNCounter));
+
+ }//loop over modules
+}
+
+//______________________________________________________________________
+void AliITSDetTypeRec::ReadOldSSDGain(const TObjArray *array,
+ AliITSGainSSDv2 *gainSSD) {
+ //Reads the old SSD calibration object and converts it to the new format
+
+ Int_t gNMod = array->GetEntries();
+ AliInfo("Converting old calibration object for gain...\n");
+
+ //GAIN
+ for (Int_t iModule = 0; iModule < gNMod; iModule++) {
+ AliITSGainSSD *gainModule = (AliITSGainSSD*) (array->At(iModule));
+ TArrayF arrayPSide = gainModule->GetGainP();
+ for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++)
+ gainSSD->AddGainP(iModule,
+ iPCounter,
+ arrayPSide.At(iPCounter));
+ TArrayF arrayNSide = gainModule->GetGainN();
+ for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++)
+ gainSSD->AddGainN(iModule,
+ iNCounter,
+ arrayNSide.At(iNCounter));
+ }//loop over modules
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::RemoveFastOrFiredInActive() {
+ // Removes the chips that were in-active in the pixel trigger (from fast-or fired map)
+
+ if (fTriggerConditions==NULL) {
+ AliError("Pixel trigger conditions are missing.");
+ return;
+ }
+ Int_t eq = -1;
+ Int_t hs = -1;
+ Int_t chip = -1;
+ while (fTriggerConditions->GetNextInActiveChip(eq,hs,chip)) {
+ UInt_t chipKey = AliITSRawStreamSPD::GetOfflineChipKeyFromOnline(eq,hs,chip);
+ fFastOrFiredMap.SetBitNumber(chipKey,kFALSE);
+ }
+}
+//______________________________________________________________________
+TBits AliITSDetTypeRec::GetFiredChipMap() const {
+
+ //
+ // TBits of the fired chips
+ //
+
+ AliITSRecPointContainer* rpc = AliITSRecPointContainer::Instance();
+
+ TBits isfiredchip(1200);
+
+ AliITSsegmentationSPD *segSPD = (AliITSsegmentationSPD*)GetSegmentationModel(0);
+ if(!segSPD) {
+ AliError("no segmentation model for SPD available, the fired chip map is empty. Exiting");
+ return isfiredchip;
+ }
+
+
+ for(Int_t imod =0; imod < fgkDefaultNModulesSPD; imod++){
+ TClonesArray *array = rpc->UncheckedGetClusters(imod);
+ if(!array) continue;
+ Int_t nCluster = array->GetEntriesFast();
+
+ while(nCluster--) {
+ AliITSRecPoint* cluster = (AliITSRecPoint*)array->UncheckedAt(nCluster);
+ if (cluster->GetLayer()>1)continue;
+ Float_t local[3]={-1,-1};
+ local[1]=cluster->GetDetLocalX();
+ local[0]=cluster->GetDetLocalZ();
+
+ Int_t eq = AliITSRawStreamSPD::GetOnlineEqIdFromOffline(imod);
+ Int_t hs = AliITSRawStreamSPD::GetOnlineHSFromOffline(imod);
+ Int_t row, col;
+ segSPD->LocalToDet(0.5,local[0],row,col);
+ Int_t chip = AliITSRawStreamSPD::GetOnlineChipFromOffline(imod,col);
+ Int_t chipkey = AliITSRawStreamSPD::GetOfflineChipKeyFromOnline(eq,hs,chip);
+ isfiredchip.SetBitNumber(chipkey,kTRUE);
+ }
+
+ }
+
+ return isfiredchip;
+
+}
+//______________________________________________________________________
+TBits AliITSDetTypeRec::GetFiredChipMap(TTree *treeR) const{
+ //
+ // TBits of the fired chips
+ //
+ TBits isfiredchip(1200);
+
+ if(!treeR) {
+ AliError("no treeR. fired chip map stays empty. Exiting.");
+ return isfiredchip;
+ }
+
+ AliITSRecPointContainer* rpcont=AliITSRecPointContainer::Instance();
+ TClonesArray *recpoints = NULL;
+ rpcont->FetchClusters(0,treeR);
+ if(!rpcont->GetStatusOK() || !rpcont->IsSPDActive()){
+ AliError("no clusters. fired chip map stays empty. Exiting.");
+ return isfiredchip;
+ }
+
+ AliITSsegmentationSPD *segSPD = (AliITSsegmentationSPD*)GetSegmentationModel(0);
+
+ for(Int_t imod =0; imod < fgkDefaultNModulesSPD; imod++){
+ recpoints = rpcont->UncheckedGetClusters(imod);
+ Int_t nCluster = recpoints->GetEntriesFast();
+
+ // loop over clusters
+ while(nCluster--) {
+ AliITSRecPoint* cluster = (AliITSRecPoint*)recpoints->UncheckedAt(nCluster);
+ if (cluster->GetLayer()>1)continue;
+ Float_t local[3]={-1,-1};
+ local[1]=cluster->GetDetLocalX();
+ local[0]=cluster->GetDetLocalZ();
+
+ Int_t eq = AliITSRawStreamSPD::GetOnlineEqIdFromOffline(imod);
+ Int_t hs = AliITSRawStreamSPD::GetOnlineHSFromOffline(imod);
+ Int_t row, col;
+ segSPD->LocalToDet(0.5,local[0],row,col);
+ Int_t chip = AliITSRawStreamSPD::GetOnlineChipFromOffline(imod,col);
+ Int_t chipkey = AliITSRawStreamSPD::GetOfflineChipKeyFromOnline(eq,hs,chip);
+ isfiredchip.SetBitNumber(chipkey,kTRUE);
+ }
+ }
+
+ return isfiredchip;
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::RemoveFastOrFiredFromDead(TBits firedchipmap){
+ //
+ // resetting of the fast-or bit on cluster basis.
+ // fast-or bits can be remnant from SPD ideal simulation (no dead channels)
+ //
+
+ for(Int_t chipKey=0; chipKey<1200; chipKey++){
+ // FO masked chips have been previously removed
+ if(!fFastOrFiredMap.TestBitNumber(chipKey)) continue;
+ if(!firedchipmap.TestBitNumber(chipKey)) {
+ fFastOrFiredMap.SetBitNumber(chipKey,kFALSE);
+ AliDebug(2,Form("removing bit in key %i \n ",chipKey));
+ }
+ }
+
+}
+//______________________________________________________________________
+void AliITSDetTypeRec::SetFastOrFiredMapOnline(UInt_t eq, UInt_t hs, UInt_t chip) {
+ // Set fast-or fired map for this chip
+ Int_t chipKey = AliITSRawStreamSPD::GetOfflineChipKeyFromOnline(eq,hs,chip);
+ return SetFastOrFiredMap(chipKey);
+}
+