1 /***************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Conributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
20 ////////////////////////////////////////////////////////////////////////
21 // This class defines the "Standard" reconstruction for the ITS //
24 ////////////////////////////////////////////////////////////////////////
25 #include "TObjArray.h"
28 #include "AliCDBManager.h"
29 #include "AliCDBStorage.h"
30 #include "AliCDBEntry.h"
31 #include "AliITSClusterFinder.h"
32 #include "AliITSClusterFinderV2.h"
33 #include "AliITSClusterFinderV2SPD.h"
34 #include "AliITSClusterFinderV2SDD.h"
35 #include "AliITSClusterFinderV2SSD.h"
36 #include "AliITSClusterFinderSPD.h"
37 #include "AliITSClusterFinderSDD.h"
38 #include "AliITSClusterFinderSSD.h"
39 #include "AliITSDetTypeRec.h"
40 #include "AliITSgeom.h"
41 #include "AliITSRawCluster.h"
42 #include "AliITSRawClusterSPD.h"
43 #include "AliITSRawClusterSDD.h"
44 #include "AliITSRawClusterSSD.h"
45 #include "AliITSRecPoint.h"
46 #include "AliITSCalibrationSDD.h"
47 #include "AliITSsegmentationSPD.h"
48 #include "AliITSsegmentationSDD.h"
49 #include "AliITSsegmentationSSD.h"
53 const Int_t AliITSDetTypeRec::fgkNdettypes = 3;
54 const Int_t AliITSDetTypeRec::fgkDefaultNModulesSPD = 240;
55 const Int_t AliITSDetTypeRec::fgkDefaultNModulesSDD = 260;
56 const Int_t AliITSDetTypeRec::fgkDefaultNModulesSSD = 1698;
58 ClassImp(AliITSDetTypeRec)
60 //________________________________________________________________
61 AliITSDetTypeRec::AliITSDetTypeRec(): TObject(),
77 // Standard Constructor
85 fReconstruction = new TObjArray(fgkNdettypes);
86 fDigits = new TObjArray(fgkNdettypes);
87 for(Int_t i=0; i<3; i++){
88 fClusterClassName[i]=0;
90 fRecPointClassName[i]=0;
92 fNdtype = new Int_t[fgkNdettypes];
93 fCtype = new TObjArray(fgkNdettypes);
94 fNctype = new Int_t[fgkNdettypes];
95 fNMod = new Int_t [fgkNdettypes];
96 fNMod[0] = fgkDefaultNModulesSPD;
97 fNMod[1] = fgkDefaultNModulesSDD;
98 fNMod[2] = fgkDefaultNModulesSSD;
99 fRecPoints = new TClonesArray("AliITSRecPoint",3000);
102 for(Int_t i=0;i<fgkNdettypes;i++){
110 //______________________________________________________________________
111 AliITSDetTypeRec::AliITSDetTypeRec(const AliITSDetTypeRec & rec):TObject(rec),
113 fITSgeom(rec.fITSgeom),
114 fReconstruction(rec.fReconstruction),
115 fSegmentation(rec.fSegmentation),
116 fCalibration(rec.fCalibration),
117 fPreProcess(rec.fPreProcess),
118 fPostProcess(rec.fPostProcess),
119 fDigits(rec.fDigits),
120 fNdtype(rec.fNdtype),
122 fNctype(rec.fNctype),
123 fRecPoints(rec.fRecPoints),
124 fNRecPoints(rec.fNRecPoints),
125 fSelectedVertexer(rec.fSelectedVertexer),
126 fFirstcall(rec.fFirstcall)
132 //______________________________________________________________________
133 AliITSDetTypeRec& AliITSDetTypeRec::operator=(const AliITSDetTypeRec& source){
134 // Assignment operator.
135 this->~AliITSDetTypeRec();
136 new(this) AliITSDetTypeRec(source);
141 //_____________________________________________________________________
142 AliITSDetTypeRec::~AliITSDetTypeRec(){
146 fReconstruction->Delete();
147 delete fReconstruction;
151 fSegmentation->Delete();
152 delete fSegmentation;
156 AliITSresponse* rspd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSPD()))->GetResponse();
157 AliITSresponse* rsdd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSDD()))->GetResponse();
158 AliITSresponse* rssd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSSD()))->GetResponse();
159 if(rspd) delete rspd;
160 if(rsdd) delete rsdd;
161 if(rssd) delete rssd;
162 fCalibration->Delete();
166 if(fPreProcess) delete fPreProcess;
167 if(fPostProcess) delete fPostProcess;
175 fRecPoints->Delete();
188 if (fITSgeom) delete fITSgeom;
192 //___________________________________________________________________
193 void AliITSDetTypeRec::SetReconstructionModel(Int_t dettype,AliITSClusterFinder *clf){
195 //Set reconstruction model for detector type
197 if(fReconstruction==0) fReconstruction = new TObjArray(fgkNdettypes);
198 if(fReconstruction->At(dettype)!=0) delete fReconstruction->At(dettype);
199 fReconstruction->AddAt(clf,dettype);
201 //______________________________________________________________________
202 AliITSClusterFinder* AliITSDetTypeRec::GetReconstructionModel(Int_t dettype){
204 //Get reconstruction model for detector type
205 if(fReconstruction==0) {
206 Warning("GetReconstructionModel","fReconstruction is 0!");
209 return (AliITSClusterFinder*)fReconstruction->At(dettype);
212 //______________________________________________________________________
213 void AliITSDetTypeRec::SetSegmentationModel(Int_t dettype,AliITSsegmentation *seg){
215 //Set segmentation model for detector type
217 if(fSegmentation==0) fSegmentation = new TObjArray(fgkNdettypes);
218 if(fSegmentation->At(dettype)!=0) delete fSegmentation->At(dettype);
219 fSegmentation->AddAt(seg,dettype);
222 //______________________________________________________________________
223 AliITSsegmentation* AliITSDetTypeRec::GetSegmentationModel(Int_t dettype){
225 //Get segmentation model for detector type
227 if(fSegmentation==0) {
228 Warning("GetSegmentationModel","fSegmentation is 0!");
231 return (AliITSsegmentation*)fSegmentation->At(dettype);
234 //_______________________________________________________________________
235 void AliITSDetTypeRec::SetCalibrationModel(Int_t iMod, AliITSCalibration *cal){
237 //Set calibration (response) for the module iMod of type dettype
238 if (fCalibration==0) {
239 fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
240 fCalibration->SetOwner(kTRUE);
241 fCalibration->Clear();
244 if (fCalibration->At(iMod) != 0)
245 delete (AliITSCalibration*) fCalibration->At(iMod);
246 fCalibration->AddAt(cal,iMod);
249 //_______________________________________________________________________
250 AliITSCalibration* AliITSDetTypeRec::GetCalibrationModel(Int_t iMod){
252 //Get calibration model for module type
254 if(fCalibration==0) {
255 Warning("GetalibrationModel","fCalibration is 0!");
259 return (AliITSCalibration*)fCalibration->At(iMod);
262 //______________________________________________________________________
263 void AliITSDetTypeRec::SetTreeAddressD(TTree *treeD){
264 // Set branch address for the tree of digits.
266 const char *det[4] = {"SPD","SDD","SSD","ITS"};
273 if (fDigits == 0x0) fDigits = new TObjArray(fgkNdettypes);
274 for (i=0; i<fgkNdettypes; i++) {
275 digclass = GetDigitClassName(i);
276 if(!(fDigits->At(i))) {
277 fDigits->AddAt(new TClonesArray(digclass,1000),i);
281 if (fgkNdettypes==3) sprintf(branchname,"%sDigits%s",det[3],det[i]);
282 else sprintf(branchname,"%sDigits%d",det[3],i+1);
284 branch = treeD->GetBranch(branchname);
285 if (branch) branch->SetAddress(&((*fDigits)[i]));
290 //_______________________________________________________________________
291 TBranch* AliITSDetTypeRec::MakeBranchInTree(TTree *tree, const char* name,
292 const char *classname,
293 void* address,Int_t size,
297 // Makes branch in given tree and diverts them to a separate file
303 Error("MakeBranchInTree","Making Branch %s Tree is NULL",name);
306 TBranch *branch = tree->GetBranch(name);
311 branch = tree->Branch(name,classname,address,size,splitlevel);
314 branch = tree->Bronch(name, "TClonesArray", address, size, splitlevel);
320 //____________________________________________________________________
321 void AliITSDetTypeRec::SetDefaults(){
323 //Set defaults for segmentation and response
326 Warning("SetDefaults","null pointer to AliITSgeomGeom !");
330 AliITSsegmentation* seg;
331 if(!GetCalibration()) {AliFatal("Exit");exit(0);}
333 for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
335 seg = new AliITSsegmentationSPD(GetITSgeom());
336 SetSegmentationModel(dettype,seg);
337 SetDigitClassName(dettype,"AliITSdigitSPD");
338 SetClusterClassName(dettype,"AliITSRawClusterSPD");
342 AliITSCalibrationSDD* res=(AliITSCalibrationSDD*) GetCalibrationModel(GetITSgeom()->GetStartSDD());
343 seg = new AliITSsegmentationSDD(GetITSgeom(),res);
344 SetSegmentationModel(dettype,seg);
345 const char *kopt = ((AliITSresponseSDD*)res->GetResponse())->ZeroSuppOption();
346 if((!strstr(kopt,"2D"))&&(!strstr(kopt,"1D"))) SetDigitClassName(dettype,"AliITSdigit");
347 else SetDigitClassName(dettype,"AliITSdigitSDD");
348 SetClusterClassName(dettype,"AliITSRawClusterSDD");
352 AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD(GetITSgeom());
353 seg2->SetAngles(0.0075,0.0275); // strip angels rad P and N side.
354 seg2->SetAnglesLay5(0.0075,0.0275); // strip angels rad P and N side.
355 seg2->SetAnglesLay6(0.0275,0.0075); // strip angels rad P and N side.
356 SetSegmentationModel(dettype,seg2);
357 SetDigitClassName(dettype,"AliITSdigitSSD");
358 SetClusterClassName(dettype,"AliITSRawClusterSSD");
363 //______________________________________________________________________
364 Bool_t AliITSDetTypeRec::GetCalibration() {
365 // Get Default calibration if a storage is not defined.
368 AliITSCalibration* cal = GetCalibrationModel(0);
375 // SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
376 // Int_t run=GetRunNumber();
378 Bool_t cacheStatus = AliCDBManager::Instance()->GetCacheFlag();
379 if (fCalibration==0) {
380 fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
381 fCalibration->SetOwner(!cacheStatus);
382 fCalibration->Clear();
385 AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD");
386 AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD");
387 AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD");
388 AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD");
389 AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD");
390 AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD");
392 if(!entrySPD || !entrySDD || !entrySSD || !entry2SPD || !entry2SDD || !entry2SSD){
393 AliFatal("Calibration object retrieval failed! ");
397 TObjArray *calSPD = (TObjArray *)entrySPD->GetObject();
398 if(!cacheStatus)entrySPD->SetObject(NULL);
399 entrySPD->SetOwner(kTRUE);
401 AliITSresponseSPD *pSPD = (AliITSresponseSPD*)entry2SPD->GetObject();
402 if(!cacheStatus)entry2SPD->SetObject(NULL);
403 entry2SPD->SetOwner(kTRUE);
405 TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
406 if(!cacheStatus)entrySDD->SetObject(NULL);
407 entrySDD->SetOwner(kTRUE);
409 AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
410 if(!cacheStatus)entry2SDD->SetObject(NULL);
411 entry2SDD->SetOwner(kTRUE);
413 TObjArray *calSSD = (TObjArray *)entrySSD->GetObject();
414 if(!cacheStatus)entrySSD->SetObject(NULL);
415 entrySSD->SetOwner(kTRUE);
417 AliITSresponseSSD *pSSD = (AliITSresponseSSD*)entry2SSD->GetObject();
418 if(!cacheStatus)entry2SSD->SetObject(NULL);
419 entry2SSD->SetOwner(kTRUE);
421 // DB entries are deleted. In this way metadeta objects are deleted as well
431 if ((!pSPD)||(!pSDD)||(!pSSD) || (!calSPD) || (!calSDD) || (!calSSD)) {
432 AliWarning("Can not get calibration from calibration database !");
436 fNMod[0] = calSPD->GetEntries();
437 fNMod[1] = calSDD->GetEntries();
438 fNMod[2] = calSSD->GetEntries();
439 AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
440 fNMod[0], fNMod[1], fNMod[2]));
441 AliITSCalibration* cal;
442 for (Int_t i=0; i<fNMod[0]; i++) {
443 cal = (AliITSCalibration*) calSPD->At(i);
444 cal->SetResponse((AliITSresponse*)pSPD);
445 SetCalibrationModel(i, cal);
447 for (Int_t i=0; i<fNMod[1]; i++) {
448 cal = (AliITSCalibration*) calSDD->At(i);
449 cal->SetResponse((AliITSresponse*)pSDD);
450 Int_t iMod = i + fNMod[0];
451 SetCalibrationModel(iMod, cal);
453 for (Int_t i=0; i<fNMod[2]; i++) {
454 cal = (AliITSCalibration*) calSSD->At(i);
455 cal->SetResponse((AliITSresponse*)pSSD);
456 Int_t iMod = i + fNMod[0] + fNMod[1];
457 SetCalibrationModel(iMod, cal);
464 //________________________________________________________________
465 void AliITSDetTypeRec::SetDefaultClusterFinders(){
467 //set defaults for standard cluster finder
470 Warning("SetDefaults","null pointer to AliITSgeom!");
474 AliITSClusterFinder *clf;
476 for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
479 if(!GetReconstructionModel(dettype)){
480 TClonesArray *dig0 = DigitsAddress(0);
481 TClonesArray *rec0 = ClustersAddress(0);
482 clf = new AliITSClusterFinderSPD(this,dig0,rec0);
483 SetReconstructionModel(dettype,clf);
490 if(!GetReconstructionModel(dettype)){
491 TClonesArray *dig1 = DigitsAddress(1);
492 TClonesArray *rec1 = ClustersAddress(1);
493 clf = new AliITSClusterFinderSDD(this,dig1,rec1);
494 SetReconstructionModel(dettype,clf);
500 if(!GetReconstructionModel(dettype)){
501 TClonesArray* dig2 = DigitsAddress(2);
502 clf = new AliITSClusterFinderSSD(this,dig2);
503 SetReconstructionModel(dettype,clf);
512 //________________________________________________________________
513 void AliITSDetTypeRec::SetDefaultClusterFindersV2(Bool_t rawdata){
515 //Set defaults for cluster finder V2
518 Warning("SetDefaults","Null pointer to AliITSgeom !");
522 AliITSClusterFinder *clf;
524 for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
527 if(!GetReconstructionModel(dettype)){
528 clf = new AliITSClusterFinderV2SPD(this);
530 if(!rawdata) clf->SetDigits(DigitsAddress(0));
531 SetReconstructionModel(dettype,clf);
537 if(!GetReconstructionModel(dettype)){
538 clf = new AliITSClusterFinderV2SDD(this);
540 if(!rawdata) clf->SetDigits(DigitsAddress(1));
541 SetReconstructionModel(dettype,clf);
548 if(!GetReconstructionModel(dettype)){
549 clf = new AliITSClusterFinderV2SSD(this);
551 if(!rawdata) clf->SetDigits(DigitsAddress(2));
552 SetReconstructionModel(dettype,clf);
559 //______________________________________________________________________
560 void AliITSDetTypeRec::MakeBranch(TTree* tree, Option_t* option){
562 //Creates branches for clusters and recpoints
563 Bool_t cR = (strstr(option,"R")!=0);
564 Bool_t cRF = (strstr(option,"RF")!=0);
568 if(cR) MakeBranchR(tree);
569 if(cRF) MakeBranchRF(tree);
573 //___________________________________________________________________
574 void AliITSDetTypeRec::AddCluster(Int_t id, AliITSRawCluster *c){
576 // Adds a raw cluster to the list
577 TClonesArray &lc = *((TClonesArray*)fCtype->At(id));
580 new(lc[fNctype[id]++]) AliITSRawClusterSPD(*((AliITSRawClusterSPD*)c));
583 new(lc[fNctype[id]++]) AliITSRawClusterSDD(*((AliITSRawClusterSDD*)c));
586 new(lc[fNctype[id]++]) AliITSRawClusterSSD(*((AliITSRawClusterSSD*)c));
590 //___________________________________________________________________
591 void AliITSDetTypeRec::ResetDigits(){
592 // Reset number of digits and the digits array for the ITS detector.
595 for(Int_t i=0;i<fgkNdettypes;i++){
599 //___________________________________________________________________
600 void AliITSDetTypeRec::ResetDigits(Int_t branch){
601 // Reset number of digits and the digits array for this branch.
603 if(fDigits->At(branch)) ((TClonesArray*)fDigits->At(branch))->Clear();
604 if(fNdtype) fNdtype[branch]=0;
608 //__________________________________________________________________
609 void AliITSDetTypeRec::ResetClusters(){
611 //Resets number of clusters and the cluster array
612 for(Int_t i=0;i<fgkNdettypes;i++){
617 //__________________________________________________________________
618 void AliITSDetTypeRec::ResetClusters(Int_t i){
620 //Resets number of clusters and the cluster array for this branch
622 if (fCtype->At(i)) ((TClonesArray*)fCtype->At(i))->Clear();
623 if (fNctype) fNctype[i]=0;
625 //__________________________________________________________________
626 void AliITSDetTypeRec::MakeBranchR(TTree *treeR, Option_t *opt){
628 //Creates tree branches for recpoints
630 // cont char *file File name where RecPoints branch is to be written
631 // to. If blank it write the SDigits to the same
632 // file in which the Hits were found.
637 // only one branch for rec points for all detector types
638 Bool_t oFast= (strstr(opt,"Fast")!=0);
640 Char_t detname[10] = "ITS";
644 sprintf(branchname,"%sRecPointsF",detname);
646 sprintf(branchname,"%sRecPoints",detname);
649 if(!fRecPoints)fRecPoints = new TClonesArray("AliITSRecPoint",1000);
651 MakeBranchInTree(treeR,branchname,0,&fRecPoints,buffsz,99);
653 //______________________________________________________________________
654 void AliITSDetTypeRec::SetTreeAddressR(TTree *treeR){
655 // Set branch address for the Reconstructed points Trees.
657 // TTree *treeR Tree containing the RecPoints.
663 Char_t namedet[10]="ITS";
666 if(fRecPoints==0x0) fRecPoints = new TClonesArray("AliITSRecPoint",1000);
668 sprintf(branchname,"%sRecPoints",namedet);
669 branch = treeR->GetBranch(branchname);
671 branch->SetAddress(&fRecPoints);
673 sprintf(branchname,"%sRecPointsF",namedet);
674 branch = treeR->GetBranch(branchname);
676 branch->SetAddress(&fRecPoints);
681 //____________________________________________________________________
682 void AliITSDetTypeRec::AddRecPoint(const AliITSRecPoint &r){
683 // Add a reconstructed space point to the list
685 // const AliITSRecPoint &r RecPoint class to be added to the tree
686 // of reconstructed points TreeR.
692 TClonesArray &lrecp = *fRecPoints;
693 new(lrecp[fNRecPoints++]) AliITSRecPoint(r);
696 //______________________________________________________________________
697 void AliITSDetTypeRec::DigitsToRecPoints(TTree *treeD,TTree *treeR,Int_t lastentry,Option_t *opt, Bool_t v2){
698 // cluster finding and reconstruction of space points
699 // the condition below will disappear when the geom class will be
700 // initialized for all versions - for the moment it is only for v5 !
701 // 7 is the SDD beam test version
703 // TTree *treeD Digits tree
704 // TTree *treeR Clusters tree
705 // Int_t lastentry Offset for module when not all of the modules
707 // Option_t *opt String indicating which ITS sub-detectors should
708 // be processed. If ="All" then all of the ITS
709 // sub detectors are processed.
711 const char *all = strstr(opt,"All");
712 const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
715 SetDefaultClusterFinders();
716 AliInfo("Original cluster finder has been selected\n");
719 SetDefaultClusterFindersV2();
720 AliInfo("V2 cluster finder has been selected \n");
723 AliITSClusterFinder *rec = 0;
724 Int_t id,module,first=0;
725 for(module=0;module<GetITSgeom()->GetIndexMax();module++){
726 id = GetITSgeom()->GetModuleType(module);
727 if (!all && !det[id]) continue;
728 if(det[id]) first = GetITSgeom()->GetStartDet(id);
729 rec = (AliITSClusterFinder*)GetReconstructionModel(id);
730 TClonesArray *itsDigits = DigitsAddress(id);
732 AliFatal("The reconstruction class was not instanciated!");
733 ResetDigits(); // MvL: Not sure we neeed this when rereading anyways
735 treeD->GetEvent(lastentry+module);
737 treeD->GetEvent(lastentry+(module-first));
739 Int_t ndigits = itsDigits->GetEntriesFast();
741 rec->SetDetTypeRec(this);
742 rec->SetDigits(DigitsAddress(id));
743 // rec->SetClusters(ClustersAddress(id));
744 rec->FindRawClusters(module);
751 //______________________________________________________________________
752 void AliITSDetTypeRec::DigitsToRecPoints(AliRawReader* rawReader,TTree *treeR){
753 // cluster finding and reconstruction of space points
754 // the condition below will disappear when the geom class will be
755 // initialized for all versions - for the moment it is only for v5 !
756 // 7 is the SDD beam test version
758 // AliRawReader *rawReader Pointer to the raw-data reader
759 // TTree *treeR Clusters tree
764 AliITSClusterFinderV2 *rec = 0;
767 TClonesArray *array=new TClonesArray("AliITSRecPoint",1000);
768 TBranch *branch = treeR->Branch("ITSRecPoints",&array);
771 TClonesArray** clusters = new TClonesArray*[GetITSgeom()->GetIndexMax()];
772 for (Int_t iModule = 0; iModule < GetITSgeom()->GetIndexMax(); iModule++) {
773 clusters[iModule] = NULL;
776 rec = (AliITSClusterFinderV2*)GetReconstructionModel(id);
778 AliFatal("The reconstruction class was not instanciated");
779 rec->SetDetTypeRec(this);
780 rec->RawdataToClusters(rawReader,clusters);
783 TClonesArray *emptyArray=new TClonesArray("AliITSRecPoint");
784 for(Int_t iModule=0;iModule<GetITSgeom()->GetIndexMax();iModule++){
785 array = clusters[iModule];
787 AliDebug(1,Form("data for module %d missing!",iModule));
790 branch->SetAddress(&array);
792 nClusters+=array->GetEntriesFast();
794 if (array != emptyArray) {
802 Info("DigitsToRecPoints", "total number of found recpoints in ITS: %d\n",